2012-09-08 120 views
0

我試圖編譯我的程序在C,而這些是我得到的錯誤:(請注意,我在這個語言初學者) 參數未聲明用C

Excer3.c:在功能` addstudent':

Excer3.c:50: error: `student' undeclared (first use in this function) 
Excer3.c:50: error: (Each undeclared identifier is reported only once 
Excer3.c:50: error: for each function it appears in.) 
Excer3.c:50: error: parse error before "newS" 
Excer3.c:50: error: `newS' undeclared (first use in this function) 
Excer3.c:50: error: parse error before ')' token 
Excer3.c:52: error: `studentName' undeclared (first use in this function) 
Excer3.c: At top level: 
Excer3.c:59: error: parse error before '*' token 
Excer3.c: In function `readdb': 
Excer3.c:70: error: `students' undeclared (first use in this function) 
Excer3.c:70: warning: passing arg 2 of `addstudent' makes integer from pointer without     a cast 

我的代碼看起來像這樣。該函數不識別它給出的參數。 :

#include <stdio.h> 

struct student { 
int studentnumber; 
char* Name; 
struct student* next; 
}; 

struct teacher { 
int teachernumber; 
char* Name; 
struct teacher* next; 
}; 

struct course { 
struct teacher teachers[5]; 
struct student students[50]; 
int semesternumber; 
struct course* next; 
}; 

int readline(char s[],int lim) 
{ 
    int c, i; 
    for (i=0; i < lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) 
    s[i] = c; 
    if (c == '\n') { 
    s[i] = c; 
    ++i; 
    } 
    s[i] = '\0'; 
    return i; 
} 

int addstudent (struct student* prev, int studentnumber, char* studentname) 
{ 
if (!(prev==NULL)) 
    student newS = (student*)malloc(sizeof(student)); 
    newS->studentnumber = studentnumber; 
    newS->firstname = strdup(studentName); 
    newS->next = NULL; 
    prev->next=newS; 

    return 1; 
} 

int readdb(student* students) 
{ 
char line[200]; 
int* studentnumber,coursenumber,teachernumber,semesternumber; 
char studentname[100],teachername[100],coursename[100]; 

while(readline(line,200) > 0) 
{ 
if(sscanf(line, "S %d %s", &studentnumber, studentname)==2) 
{ 
printf("Student. \n\tStudent number: %d, \n\tFirst name: %s\n", studentnumber, 
studentname); 
addstudent(students,&studentnumber,studentname); 
} 
else if(sscanf(line, "C %d %s %d", &coursenumber, coursename , &semesternumber)==3) 
    printf("Course. \n\tCourse number: %d \n\tCourse name: %s \n\tSemester: %d\n", 
coursenumber, coursename, semesternumber); 
else if(sscanf(line, "E %d %d", &studentnumber, &coursenumber)==2) 
printf("Enrolment. \n\tStudent number: %d, \n\tCourse number: %d\n", studentnumber, 
coursenumber); 
else if(sscanf(line, "T %d %s", &teachernumber, teachername)==2) 
printf("Teacher. \n\tTeacher number: %d, \n\tFirst name: %s\n", teachernumber, 
teachername); 
else if(sscanf(line, "A %d %s", &teachernumber, &coursenumber)==2) 
printf("Assignment. \n\tTeacher number: %d, \n\tCourse number: %d\n", teachernumber, 
coursenumber); 
} 

} 


int main() 
{ 
struct student* students = NULL; 

readdb(&students); 
return 0; 

} 
+1

對於將來的問題:請將您的代碼降低到最小,但仍會產生相同的錯誤。在你的問題中不應該有不活動的代碼或不相關的代碼。你也應該突出顯示錯誤發生的路線。 – stefan

回答

1

現有答案是正確的:student目前在您的程序中不是類型名稱,但是struct student是。你已經正確地使用這個,所以只要保持一致。

如果冒險離開代碼審查區域,addstudent仍然不會做你想要的。

int addstudent (struct student* prev, int studentnumber, char* studentname) 
{ 
    if (!(prev==NULL)) 
     student newS = (student*)malloc(sizeof(student)); 
    newS->studentnumber = studentnumber; 
    newS->firstname = strdup(studentName); 
    newS->next = NULL; 
    prev->next=newS; 

    return 1; 
} 

所以這是試圖將追加到一個鏈表,這是很好的結束,但也有一些錯誤:

  • newS聲明應該是struct student *newS = malloc(sizeof(*newS));

    1. 我們修復你的編譯器抱怨的struct name
    2. malloc返回一個指針,所以newS必須是一個指針,以及
    3. p = malloc(sizeof(*p))是一種常見的成語,當你改變的p在今後的類型,但忘記編輯的sizeof表達
  • 您目前宣佈newS避免錯誤只有在if語句的範圍內 - 這意味着下列行參考newS將不會編譯,因爲它們不能看到該變量。我們可以用括號擴大範圍,像這樣:if (prev) { ... } return 1;

  • newS->next總是設置爲NULL,所以如果prev->next已經有值,它丟棄。這意味着你的鏈表只能有一個學生長。如果你想保持你的列表連在一起的,它應該是

    newS->next = prev->next; 
    prev->next = newS; 
    
  • 你混了struct student **(這是readdb(&students)傳遞的類型)和struct student * ...你需要找出你想要的,並堅持下去。如果你有一個struct student實例(不是指針),而下一個初始化爲NULL作爲你的列表的頭部,那麼當前的addstudent代碼將只能工作。

1

addstudent,你聲明

student newS = (student*)malloc(sizeof(student)); 

這應該是struct student newS

3

如果你想使用你正在使用student代替struct student只是student那麼你需要有typedef struct student student;在你的代碼。