0

だから私はジョイスティックを制御しようとしており、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 で定義されていないため、これはエラーを返します。私の質問は、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 に答える