所以我正在尝试控制操纵杆,使用API编写一些代码来执行此操作。
我在函数a中使用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方向移动。
然而,这会返回一个错误,因为我在函数b中调用axes
但它没有在函数b中定义。
所以我的问题是,尽管没有在函数b中定义,我怎么能使用axes
?
这是代码
// 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);
}
答案 0 :(得分:2)
或者,您可以使用全局变量axes
或将轴作为参数传递给两个函数或其中一个函数。
如果无法作为参数传递(因为它是回调),那么您可以使GetAxes()
等函数给出当前轴或使用全局变量。
答案 1 :(得分: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'};
...