использование указателей на функции для создания системы, управляемой меню

#c #pointers

#c #указатели

Вопрос:

Я пытаюсь использовать указатели на функции для создания системы, управляемой меню, но при ее компиляции я получил предупреждение

 [Warning] initialization from incompatible pointer type 

void (*gradeProcess[4])(int)={printArray,minimum,maximum,average};
  

Я не смог это исправить, кто-нибудь может мне помочь?

Вот код:

 #include <stdio.h>
#define  STUDENTS 3
#define EXAMS 3

void printArray(const int grades[][EXAMS],int pupils,int tests);
void minimum(const int grades[][EXAMS],int pupils,int tests);
void maximum(const int grades[][EXAMS],int pupils,int tests);
void average(const int grades[][EXAMS],int pupils,int tests);

int main(void)
{
int examGrades[STUDENTS][EXAMS];
int choice;
int i,j;
void (*gradeProcess[4])(int)={printArray,minimum,maximum,average};

for(i=0;i<STUDENTS;i  ){
    printf("Enter the grades of student %d:n",i);
    for(j=0;j<EXAMS;j  ){
        scanf("%d",amp;examGrades[i][j]);
    }
}

printf("nn0 to print arrayn1 to find the lowest graden2 to find the highest graden3 to find average for each studentn4 to end programnn");

printf("Enter the number of operation you want to process:");
scanf("%d",amp;choice);

while(choice>=0 amp;amp; choice<4){
    (*gradeProcess[choice])(choice);

    printf("Enter the number of operation you want to process:");
    scanf("%d",amp;choice);
}

printf("nnProgram execution completedn");

system("PAUSE");
return (0);
}

void printArray(const int grades[][EXAMS],int pupils,int tests)
{
printf("You chose to print arraynn");
printf("            [0]  [1]  [2]");

for(pupils=0;pupils<STUDENTS;pupils  ){
    printf("nstudent[%d]= ",pupils);
    for(tests=0;tests<EXAMS;tests  ){
        printf("M",grades[pupils][tests]);
    }
}
}

void minimum(const int grades[][EXAMS],int pupils,int tests)
{
int lowest=0;

printf("The lowest grade will be displayed");

for(pupils=0;pupils<STUDENTS;pupils  ){
    for(tests=0;tests<EXAMS;tests  ){
        if(lowest>grades[pupils][tests]){
            lowest=grades[pupils][tests];
        }
    }
}

printf("nThe lowest grade is %d",lowest);
}

void maximum(const int grades[][EXAMS],int pupils,int tests)
{
int highest=0;

printf("The highest grade will be displayed");

for(pupils=0;pupils<STUDENTS;pupils  ){
    for(tests=0;tests<EXAMS;tests  ){
        if(highest>grades[pupils][tests]){
            highest=grades[pupils][tests];
        }
    }
}

printf("nThe highest grade is %d",highest);
}

void average(const int grades[][EXAMS],int pupils,int tests)
{
int total;
double average;

printf("You chose to display average of each studentnn");

for(pupils=0;pupils<STUDENTS;pupils  ){
    printf("The average for student[%d]:",pupils);
    for(tests=0;tests<EXAMS;tests  ){
        total =grades[pupils][tests];
    }
    average=(double)total/tests;
    printf("%.2lf",average);
}
}
  

Ответ №1:

Сделайте себе одолжение, используйте typedef:

 typedef void (*fptr)(const int [][EXAMS], int, int);

//...

fptr gradeProcess[4] = { printArray, minimum, maximum, average };
  

Ответ №2:

Все функции, для которых вы хотите использовать указатели на функции, имеют подпись void foo(const int [][EXAMS], int, int) , но указатель функции, который вы объявили, предназначен для подписи void foo(int) , из-за чего вы получаете это предупреждение. Измените объявления с void (*gradeProcess[4])(int) на void (*gradeProcess[4])(const int [][EXAMS], int, int) , чтобы они соответствовали подписи. Лучшим вариантом будет то, что предложил Kerrek SB. Рекомендуется следовать предложениям typedef , предоставленным. Как только вы это сделаете, вам нужно изменить способ использования указателя на функцию. Вероятно, вы имели в виду использовать (*gradeProcess[choice])(examGrades, STUDENTS, EXAMS); или (*gradeProcess[choice]) ( (const int (*)[EXAMS])examGrades, STUDENTS, EXAMS); или gradeProcess[choice]( (const int (*)[EXAMS])examGrades, STUDENTS, EXAMS);
Дополнительно изучите логику инициализации минимальных и максимальных ваших функций minimum amp; maximum. Также в функции average вы используете неинициализированную переменную total, которая должна была быть инициализирована.
Надеюсь, это поможет!