0

我正在尝试编译应该是工作代码的代码。我收到几个错误;

joystick.c: In function ‘open_joystick’:
joystick.c:14:1: error: number of arguments doesn’t match prototype
joystick.h:45:12: error: prototype declaration
joystick.c: In function ‘get_joystick_status’:
joystick.c:57:16: error: ‘struct wwvi_js_event’ has no member named ‘stick1_x’
joystick.c:59:16: error: ‘struct wwvi_js_event’ has no member named ‘stick1_y’
joystick.c:61:16: error: ‘struct wwvi_js_event’ has no member named ‘stick2_x’
joystick.c:63:16: error: ‘struct wwvi_js_event’ has no member named ‘stick2_y’
joystick.c: In function ‘open_joystick’:
joystick.c:21:1: warning: control reaches end of non-void function [-Wreturn-type]

这是代码

操纵杆.h:

/* 
    (C) Copyright 2007,2008, Stephen M. Cameron.

    This file is part of wordwarvi.

    wordwarvi is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    wordwarvi is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with wordwarvi; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

 */
#include <stdio.h>
#ifndef __JOYSTICK_H__
#define __JOYSTICK_H__

#define JOYSTICK_DEVNAME "/dev/input/js0"

#define JS_EVENT_BUTTON         0x01    /* button pressed/released */
#define JS_EVENT_AXIS           0x02    /* joystick moved */
#define JS_EVENT_INIT           0x80    /* initial state of device */


struct js_event {
    unsigned int time;  /* event timestamp in milliseconds */
    short value;   /* value */
    unsigned char type;     /* event type */
    unsigned char number;   /* axis/button number */
};

struct wwvi_js_event {
    int button[11];
    int stick_x;
    int stick_y;
};

extern int open_joystick(char *joystick_device);
extern int read_joystick_event(struct js_event *jse);
extern void set_joystick_y_axis(int axis);
extern void set_joystick_x_axis(int axis);
extern void close_joystick();
extern int get_joystick_status(struct wwvi_js_event *wjse);

#endif

操纵杆.C:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#include "joystick.h"

static int joystick_fd = -1;

int open_joystick()
{
    joystick_fd = open(JOYSTICK_DEVNAME, O_RDONLY | O_NONBLOCK); /* read write for force feedback? */
    if (joystick_fd < 0)
        return joystick_fd;

    /* maybe ioctls to interrogate features here? */

    return joystick_fd;
}

int read_joystick_event(struct js_event *jse)
{
    int bytes;

    bytes = read(joystick_fd, jse, sizeof(*jse)); 

    if (bytes == -1)
        return 0;

    if (bytes == sizeof(*jse))
        return 1;

    printf("Unexpected bytes from joystick:%d\n", bytes);

    return -1;
}

void close_joystick()
{
    close(joystick_fd);
}

int get_joystick_status(struct wwvi_js_event *wjse)
{
    int rc;
    struct js_event jse;
    if (joystick_fd < 0)
        return -1;

    // memset(wjse, 0, sizeof(*wjse));
    while ((rc = read_joystick_event(&jse) == 1)) {
        jse.type &= ~JS_EVENT_INIT; /* ignore synthetic events */
        if (jse.type == JS_EVENT_AXIS) {
            switch (jse.number) {
            case 0: wjse->stick1_x = jse.value;
                break;
            case 1: wjse->stick1_y = jse.value;
                break;
            case 2: wjse->stick2_x = jse.value;
                break;
            case 3: wjse->stick2_y = jse.value;
                break;
            default:
                break;
            }
        } else if (jse.type == JS_EVENT_BUTTON) {
            if (jse.number < 10) {
                switch (jse.value) {
                case 0:
                case 1: wjse->button[jse.number] = jse.value;
                    break;
                default:
                    break;
                }
            }
        }
    }
    // printf("%d\n", wjse->stick1_y);
    return 0;
}

#if 0
/* a little test program */
int main(int argc, char *argv[])
{
    int fd, rc;
    int done = 0;

    struct js_event jse;

    fd = open_joystick();
    if (fd < 0) {
        printf("open failed.\n");
        exit(1);
    }

    while (!done) {
        rc = read_joystick_event(&jse);
        usleep(1000);
        if (rc == 1) {
            printf("Event: time %8u, value %8hd, type: %3u, axis/button: %u\n", 
                jse.time, jse.value, jse.type, jse.number);
        }
    }
}
#endif

谁能告诉我错误的原因是什么,我已经尝试调试了半个小时,但无济于事。

4

2 回答 2

2

错误消息非常简单:

joystick.c:14:1: error: number of arguments doesn’t match prototype
joystick.h:45:12: error: prototype declaration

您的函数原型open_joystick具有与实现不同的函数签名。在您的.h文件中,您的原型具有签名:

int open_joystick(char *joystick_device);

但是在您的.c文件中,您的函数定义具有签名:

int open_joystick()


签名不匹配- 因此错误告诉您它们不匹配。

于 2013-04-15T00:55:38.913 回答
2

看起来很简单——例如,这个声明:

struct wwvi_js_event {
    int button[11];
    int stick_x;
    int stick_y;
};

这个语句,给定wjse的是 type struct wwvi_js_event*

wjse->stick1_x = jse.value;

确实会结合产生这个错误:

joystick.c:57:16:错误:“struct wwvi_js_event”没有名为“stick1_x”的成员</p>

您的头文件和文件之间必须存在版本不匹配.c

于 2013-04-15T00:56:12.093 回答