2010-08-06 4 views
2

Как говорится в заголовке, продолжайте получать эту ошибку при попытке скомпилировать. От погуглить эту ошибку люди говорят, что он не объявлен в заголовочном файле, но моя функция является статическим и не в заголовочном файле, я it.`Ошибка компилятора в C: ожидается ')' перед '*' token

прототип
#include <recGbl.h> 
#include <devSup.h> 
#include <devLib.h> 
#include <drvIpac.h> 
#include <dbScan.h> 
#include <epicsExport.h> 

static int cardinit(cardinfo *card); // <-- line that gives the error 

typedef struct cardinfo{ 
    struct cardinfo *next; 

    struct io_mem_read *pMem; /* IP register (A16) mem address */ 
    word *rambase;    /* RAM conversion memory mem address*/ 

    int isconfigured; 
    int doram; /* 1 if we are using the RAM to output data. 
      0 if we are writing to registers (AO style) */ 

    int cardnum; 
    int vmeslotnum; 
    int ipslotnum; 


    /* these values mirror the hardware registers */ 
    word csr; 
    word offset; 
    word numconv; 
    word clockrate; 
    word vectnum; 


    word dacval[MAXSIGNAL]; 

    word oldispresent; 
    /* used to detect a reinsertion of a carrier card. 
    see subroutine ispresent() below. */ 

    /* use to update process variables */ 
    IOSCANPVT ioscanpvt; 
} cardinfo; 

static int Hy8402init(int vmeslot, int ipslot, int clockrate) { 
    cardinfo *card; 

    card->vmeslotnum = vmeslot; 
    card->ipslotnum = ipslot; 
    card->cardnum = 1; 

    card->clockrate = clockrate; 
    card->vectnum = 10; 

    cardinit(card); 

return TRUE; 
} 

static int cardinit(cardinfo *card){ 
    word rprobe; 
    int res; 
    volatile word *ramptr; 

    card->pMem= ipmBaseAddr(card->vmeslotnum, 
       card->ipslotnum,ipac_addrIO); 
    if (card->pMem==NULL){ 
    printf("Error in %s",devstr); 
    printf("%s: Cannot determine base address\n",devstr); 
    return FALSE; 
    } 

    res=devReadProbe(sizeof (word),(char *) card->pMem,(char *) &rprobe); 
    if (res!=OK){ 
    printf("%s: NO DEVICE at %x (vmeslot %d, ipslot %d)\n",devstr, 
     (int)card->pMem, 
     card->vmeslotnum,card->ipslotnum); 
    return FALSE; 
    } 
return TRUE; 
} 

`

ответ

16

cardinfo struct по-прежнему не определен в строке с ошибкой. Поместите опережающее объявление перед ним:

struct cardinfo; 
static int cardinit(struct cardinfo *card); 
+0

Beat me to the;) –

+1

В C90 необходимо указать 'static int cardinit (struct cardinfo * card);' с объявлением вперед. Это все еще верно в C99? –

+0

скомпилированный фиктивный код как C++ изначально, изменил его на c и да, кажется, что «структура» действительно требуется – Vladimir

8

Эта линия код:

static int cardinit(cardinfo *card); 

следует добавить после определения вашей структуры cardinfo.

4

Вам нужно положить линии

static int cardinit(cardinfo *card); 

после определение cardinfo структуры.

1

В этой строке компилятор еще не знает, что cardinfo является структурой. Предпримите его с помощью строки struct cardinfo;

0

Вы объявили функцию, которая имеет входную переменную типа, который компилятор не знает при ее анализе. т. е. раскрытие структуры следует за объявлением вашей функции. Итак, пожалуйста, сделайте объявление вперед структуры, когда вы хотите скомпилировать такой код.

В компьютерном программировании, вперед декларация декларация идентификатора (обозначающем объект, такие как тип, переменная или функции), для которых программист еще не дан полное определение.

Этот link имеет хорошую статью, когда полные декларации не требуются.

Смежные вопросы