0

所以我试图控制一个操纵杆,使用 API 编写了一些代码来做到这一点。我已经在函数 a using 中读取了操纵杆上的轴数,ioctl(fd, JSIOCGAXES, &axes);然后想打印在事件处理函数(函数 b)中移动的轴:

char whichaxis[axes] = {'X','Y','Y','X'};
printf("%c%c |%8hd\n",whichjs,whichaxis[jse.number],jse.value);

此代码应打印类似LX| -32768的内容,表示左操纵杆已沿 x 方向移动。

但是,这会返回一个错误,因为我axes在函数 b 中调用但它没有在函数 b 中定义。axes所以我的问题是,尽管它没有在函数 b 中定义,我怎么能使用它?

这是代码

// Returns info about the joystick device
void print_device_info(int fd) {
    int axes=0, buttons=0;
    char name[128];
    ioctl(fd, JSIOCGAXES, &axes);
    ioctl(fd, JSIOCGBUTTONS, &buttons);
    ioctl(fd, JSIOCGNAME(sizeof(name)), &name);
    printf("%s\n  %d Axes %d Buttons\n", name, axes, buttons);
}

// Event handler
void process_event(struct js_event jse) {
     // Define which axis is which
     //        Axis number {0,1,2,3} */
     char whichaxis[axes] = {'X','Y','Y','X'};
     //Define which joystick is moved
     char whichjs = '*';
     switch(jse.number) {
         case 0: case 1:
             whichjs = 'L';
             break;
         case 2: case 3:
             whichjs = 'R';
             break;
         default:
             whichjs = '*';
             break;
     }
     // Print which joystick, axis and value of the joystick position
     printf("%c%c |%8hd\n",whichjs,whichaxis[jse.number],jse.value);
}
4

2 回答 2

2

或者,您可以使用全局变量axes或将轴作为参数传递给两个或一个函数。

如果不能作为参数传递(因为它是回调),那么您可以创建函数,例如GetAxes()提供当前轴或使用全局变量。

于 2013-11-05T07:47:52.403 回答
1

axes是在函数内部声明的局部变量。局部变量只能在声明它的函数中使用。全局变量是在所有函数之外声明的变量。所以制作axes一个可以在所有函数中使用的全局变量。

int axes; // Global declaration makes axes which as scope in all below functions

void print_device_info(int fd) {
    ...
    ioctl(fd, JSIOCGAXES, &axes);
    ...

void process_event(struct js_event jse) {
    char whichaxis[axes] = {'X','Y','Y','X'};
    ...
于 2013-11-05T07:51:15.903 回答