Pregunta

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;

}
¿Fue útil?

Solución

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 be struct student *newS = malloc(sizeof(*newS));

    1. we fix the struct name your compiler was complaining about
    2. malloc returns a pointer, so newS has to be a pointer as well
    3. p = malloc(sizeof(*p)) is a common idiom that avoids bugs when you change the type of p 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 to newS 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 if prev->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 be

    newS->next = prev->next;
    prev->next = newS;
    
  • you're mixing up struct student ** (which is the type passed in readdb(&students)) and struct student * ... you need to figure out which you want, and stick with it. The current addstudent code will only work if you have a struct student instance (not a pointer) with next initialized to NULL as the head of your list.

Otros consejos

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top