【问题标题】:Using a variable defined in another function使用在另一个函数中定义的变量
【发布时间】:2013-11-05 07:40:47
【问题描述】:

所以我试图控制一个操纵杆,使用 API 编写了一些代码来做到这一点。 我已经使用ioctl(fd, JSIOCGAXES, &axes); 读取了函数 a 中操纵杆上的轴数,然后想打印在事件处理函数(函数 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 中定义。 所以我的问题是,我如何使用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);
}

【问题讨论】:

  • 请发布一些详细信息(定义的函数和函数b)。
  • printf("%c%c |%8hd\n",whichjs,whichaxis,jse.value); whichaxis 应该是whichaxis[jse.number]whichaxis 是一个指针。
  • 好点 - 更改了代码

标签: c linux api function variables


【解决方案1】:

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

如果不能作为参数传递(因为它是一个回调),那么你可以使用诸如GetAxes()之类的函数来给出当前坐标轴或使用全局变量。

【讨论】:

  • 我会说使用全局或非常量指向轴的指针,因此您可以对其进行修改。
  • 另外,如何将轴作为参数传递?
  • @theoB610:在您的情况下,作为参数传递给处理函数似乎是个问题。您可以使用全局变量。
【解决方案2】:

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'};
    ...

【讨论】:

  • 怎么样?从逻辑上讲,在设备信息函数中定义它是有意义的
  • @theoB610 int axes in function print_device_info() 具有本地范围,使变量有效并且可以在该函数中使用。如果这被声明为全局,则它可以在多个范围内访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多