#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, которая должна была быть инициализирована.
Надеюсь, это поможет!