2015-05-23 48 views
-1

我不知道我的代碼在這裏有什麼問題。我讀了一些有同樣問題的人的問題,但我沒有找到答案。 當我嘗試編譯我得到這個錯誤:錯誤:'DATA/*之前的期望表達式:typedef struct DATA DATA */

||In function 'main':|

|35|error: expected expression before 'DATA'|

||In function 'lecture_data':|

|59|error: expected expression before 'DATA'|

||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

我想也知道我應該怎麼做的,我該怎麼辦沒有這個代碼,如果有其他問題。

驗證碼:

#include <stdio.h> 
    #include <string.h> 
    #include <stdlib.h> 

    #define V 20 

    /* Structure */ 

    typedef struct DATA{ 
     char* NomP; 
     char* NomA; 
     int iNbr; 
     int iPix; 
     struct DATA *Next; 
    }DATA; 

    /* --------- */ 

    void* MALLOC(size_t nombre); 
    int lecture_data(FILE *fs,DATA* Data,DATA* ROOT); 
    void print_data(DATA* data,int len); 

    int main(void) 
    { 
     char FileName[V]; 
     puts("Data file ? : "); 
     gets(FileName); 

     FILE* fs = fopen(FileName,"r"); 
     if(fs == NULL) 
     { 
      perror("Error "); 
      exit(EXIT_FAILURE); 
     } 

     DATA *HEAD = MALLOC(sizeof DATA); 
     DATA *D_Store; 
     int len = lecture_data(fs,D_Store,HEAD); 
     print_data(D_Store,len); 
     return 0; 
    } 

    int lecture_data(FILE *fs,DATA *Data,DATA *ROOT) 
    { 
     char cNom[V],cArticle[V]; 
     int iNombre,iPrix; 
     int eofs=0;int i=0; 

     while(!eofs) 
     { 
      fscanf(fs,"%s %s %d %d",cNom,cArticle,&iNombre,&iPrix); 
      Data->iNbr=iNombre; 
      Data->iPix=iPrix; 
      Data->NomA = MALLOC(strlen(cArticle)+1); 
      Data->NomP = MALLOC(strlen(cNom)+1); 
      strcpy(Data->NomA,cArticle); 
      strcpy(Data->NomP,cNom); 
      if(i==0) 
      { 
       Data -> Next = MALLOC(sizeof DATA); 
       ROOT = Data ; 
      } 
      DATA *Ptr = ROOT ; 
      while(Ptr -> Next != NULL) 
      { 
       Ptr = ROOT -> Next; 
      } 
      Data -> Next = NULL ; 
      Ptr -> Next = Data ; 

      fprintf(stdout,"Data : N.%d: %s %s %d$\n",i,cNom,cArticle,iNombre*iPrix); 
      i++; 
      eofs = feof(fs) ; 

      if(ferror(fs)) 
      { 
       perror("Error "); 
       exit(EXIT_FAILURE); 
      } 
     } 
     fclose(fs); 
     return i; 
    } 

    void* MALLOC(size_t nombre) 
    { 
     void *MEMEORY = malloc(nombre); 
     if(NULL == MEMEORY) 
     { 
      perror("Error "); 
      exit(EXIT_FAILURE); 
     } 
     return MEMEORY; 
    } 
+0

'sizeof DATA'應該是'sizeof(DATA)'在'sizeof'中鍵入名字所需的括號 – BLUEPIXY

+0

我明白了,謝謝; sizeof unary_xpression;或sizeof(類型)是語法 –

回答

1

DATA *HEAD = MALLOC(sizeof(DATA)); 

代替

DATA *HEAD = MALLOC(sizeof DATA); 

正如你所看到的類型名稱必須用括號括起來sizeof操作符是指通過以下方式

sizeof unary-expression 
sizeof (type-name) 

從C標準(6.5.3.4 sizeof運算和alignof運營商)

2 The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type.

考慮到,如果e是一個表達式然後(e)也是一個表達式。因此,對於表達式可能寫任

sizeof e 

sizeof(e) 

和可變的標識符也形成一個表達式。

1

變化

DATA *HEAD = MALLOC(sizeof DATA); 

DATA *HEAD = MALLOC(sizeof (DATA)); 

類型名的操作數sizeof運營商必須要加上括號。使用

+0

這是我的問題,我讀到,當它不是一個基本類型(int,char ..)時,我不應該括住它,現在我的問題是:什麼時候應該用括號括起來,何時不用? –

+0

'sizeof'接受表達式或類型名稱操作數。對於表達式來說,括號是可選的(例如'sizeof 42'或'sizeof(42)'),對於類型名稱,它們是必需的(e..g,'sizeof(int)')。 – ouah