2013-04-15 96 views
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] 

下面是代碼

Joystick.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 

Joystick.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 

誰能告訴我什麼是錯誤的原因是我有一直試圖調試半小時,但無濟於事。

回答

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() 


的簽名不匹配 - 因此錯誤告訴你他們不匹配。

2

看起來非常簡單 - 例如,這個聲明:

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

及本聲明,鑑於wjse的類型是struct wwvi_js_event*

wjse->stick1_x = jse.value; 

確實會結合,產生這個錯誤:

joystick.c:57:16: error: ‘struct wwvi_js_event’ has no member named ‘stick1_x’

必須有版本不匹配的下注刪除您的標題和.c文件。