Undeclared arguments in C
-
30-06-2021 - |
Question
I am trying to compile my program in C, and these are the errors I get: (Please note that I am a beginner at this language.)
Excer3.c: In function `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
My code looks like this. The function doesn't recognize the arguments it was given. :
#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;
}
La solution
The existing answers are correct: student
isn't a type name in your program at the moment, but struct student
is. You're already using this correctly, so just make it consistent.
At the risk of digressing into code review territory, addstudent
still won't do what you want.
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;
}
so this is trying to append to the end of a linked list, which is fine, but there are some errors:
the
newS
declaration should bestruct student *newS = malloc(sizeof(*newS));
- we fix the struct name your compiler was complaining about
- malloc returns a pointer, so
newS
has to be a pointer as well p = malloc(sizeof(*p))
is a common idiom that avoids bugs when you change the type ofp
in the future, but forget to edit the sizeof expression
you're currently declaring
newS
only inside the scope of the if statement - this means the following lines which refer tonewS
won't compile, as they can't see that variable. We can extend the scope with braces like so:if (prev) { ... } return 1;
newS->next
is always set to NULL, so ifprev->next
already has a value, it's discarded. This means your linked list can only ever be one student long. If you want to keep your list linked together, it should benewS->next = prev->next; prev->next = newS;
you're mixing up
struct student **
(which is the type passed inreaddb(&students)
) andstruct student *
... you need to figure out which you want, and stick with it. The currentaddstudent
code will only work if you have astruct student
instance (not a pointer) with next initialized to NULL as the head of your list.
Autres conseils
You're using student
instead of struct student
If you want to use just student
then you need to have typedef struct student student;
in your code.
In addstudent
, you declare
student newS = (student*)malloc(sizeof(student));
That should be struct student newS
.