Ошибка компиляции в объявлении функции в C - PullRequest
1 голос
/ 22 февраля 2020

Я получаю ошибки во время компиляции этой программы C и связана с объявлением функции. В чем здесь проблема? Когда я объявляю void display(student);, это показывает предупреждение, но если я изменяю на void display(struct student st), это показывает некоторые ошибки.

#include<stdio.h>
void display(student);
void read_student(student);
struct student{
    int roll;
    char name[20],depart[20],sex,result;

    float percent,marks[5],total; 

};

void main(){
    int n;
    printf("enter the no of data you want to enter ??");
    scanf("%d",&n);

     struct student s[n];
     for(int i=0;i<n;i++)
        read_student(&s[i]);
        printf("\n---------------------------------------------------Result Sheet --------------------------------------------------------------------");
        printf("\nRoll No.\tName\t\tSex\tDepartment\t\tMarks\t\t\t\tTotal\tPercentage\tResult ");
    printf("\n----------------------------------------------------------------------------------------------------------------------------------------");
    printf("\n                              \t\t\t\tA\tB\tC\tD\tE\n");
    printf("----------------------------------------------------------------------------------------------------------------------------------------");

     for(int i=0;i<n;i++)  
        display(s[i]);


}
 void display(struct student st){


    printf("\n%2d\t%10s\t\t%c\t%10s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%4.2f\t  %2.2f\t\t%c\n",st.roll,st.name,st.sex,st.depart,st.marks[0],st.marks[1],st.marks[2],st.marks[3],st.marks[4],st.total,st.percent,st.result);


}
 void read_student(struct student *std){
     int c=0,i;
    printf("Enter the roll no:");
    scanf("%d",&std->roll);
     printf("enter the name:\n");
     scanf("%s",std->name);
     printf("enter Sex:\n");
     scanf(" %c",&std->sex);
     printf("Enter the department:\n");
     scanf("%s",std->depart);
     printf("enter the marks in 5 subjects:\n");
     for(i=0;i<5;i++){
      scanf("%f",&std->marks[i]);
      std->total=std->total+std->marks[i];
      if(std->marks[i]>=40)
      c++;
     }
      if(c==5)
      std->result='p';
      else
        std->result='f';



     std->percent=(std->total/500)*100;


}

1 Ответ

3 голосов
/ 22 февраля 2020

Компилятору необходимо знать, что такое struct student, при использовании его в другом месте кода, например, объявив функцию с этим типом аргумента / параметра. Компилятор читает исходный файл сверху вниз. Вы должны объявить структуру перед тем, как использовать ее как тип в объявлении функции:

struct student;   // forward declaration of structure `student`.

void display(struct student);       // ok, because `struct student` is declared before.
void read_student(struct student*); // ok, because `struct student` is declared before.

struct student{                     // definition of structure `student`.
    int roll;
    char name[20],depart[20],sex,result;
    float percent,marks[5],total; 
};

В качестве альтернативы, вы можете определить структуру перед объявлением функций:

struct student{    // define the structure `student` before the function declarations.
    int roll;
    char name[20],depart[20],sex,result;
    float percent,marks[5],total; 
};

void display(struct student);
void read_student(struct student*);

Другим способом было бы поместить определения функций read_student и display до main(), но после определения структуры student. Таким образом, вы можете опустить отдельные объявления функций read_student и display и, конечно, предварительное объявление структуры student:

#include<stdio.h>

struct student{
    int roll;
    char name[20],depart[20],sex,result;
    float percent,marks[5],total; 
};

void read_student(struct student *std){
     int c=0,i;
     printf("Enter the roll no:");
     scanf("%d",&std->roll);
     printf("enter the name:\n");
     scanf("%s",std->name);
     printf("enter Sex:\n");
     scanf(" %c",&std->sex);
     printf("Enter the department:\n");
     scanf("%s",std->depart);
     printf("enter the marks in 5 subjects:\n");
     for(i=0;i<5;i++){
      scanf("%f",&std->marks[i]);
      std->total=std->total+std->marks[i];
      if(std->marks[i]>=40)
      c++;
     }
      if(c==5)
      std->result='p';
      else
        std->result='f';

     std->percent=(std->total/500)*100;
}

void display(struct student st){
    printf("\n%2d\t%10s\t\t%c\t%10s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%4.2f\t  %2.2f\t\t%c\n",st.roll,st.name,st.sex,st.depart,st.marks[0],st.marks[1],st.marks[2],st.marks[3],st.marks[4],st.total,st.percent,st.result);
}

int main(){
    int n;
    printf("enter the no of data you want to enter ??");
    scanf("%d",&n);

    struct student s[n];

    for(int i=0;i<n;i++)
        read_student(&s[i]);

    printf("\n---------------------------------------------------Result Sheet --------------------------------------------------------------------");
    printf("\nRoll No.\tName\t\tSex\tDepartment\t\tMarks\t\t\t\tTotal\tPercentage\tResult ");
    printf("\n----------------------------------------------------------------------------------------------------------------------------------------");
    printf("\n                              \t\t\t\tA\tB\tC\tD\tE\n");
    printf("----------------------------------------------------------------------------------------------------------------------------------------");

    for(int i=0;i<n;i++)  
        display(s[i]);
}

При объявлении Функции, которые вы можете опустить идентификаторы параметров, но не тип параметров.

Также недопустимо использовать структуру student без предшествующего ключевого слова struct, как вы его пытались:

void display(student);

, так как вы используете структуру student по ее определение:

struct student{
...
};

Если вы используете typedef, например, например:

typedef struct student{
...
} student;

Вы можете опустить ключевое слово struct, но если вы используете typedef или просто использовать структуру как есть, это своего рода спор topi c среди сообщества в отношении читабельности. Все ссылки на это вы можете увидеть в ответах на эти вопросы:

typedef struct vs struct определений

Почему мы должны так часто печатать def в C?

Я лично рекомендую продолжать использовать вариант struct, даже если это требует немного большего набора текста с помощью клавиш, но делает ваш код немного более понятным.

...