использование указателей на функции для создания системы на основе меню - PullRequest
0 голосов
/ 18 октября 2011

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

[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",&examGrades[i][j]);
    }
}

printf("\n\n0 to print array\n1 to find the lowest grade\n2 to find the highest grade\n3 to find average for each student\n4 to end program\n\n");

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

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

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

printf("\n\nProgram execution completed\n");

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

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

for(pupils=0;pupils<STUDENTS;pupils++){
    printf("\nstudent[%d]= ",pupils);
    for(tests=0;tests<EXAMS;tests++){
        printf("%4d",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 student\n\n");

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);
}
}

Ответы [ 2 ]

1 голос
/ 18 октября 2011

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

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

//...

fptr gradeProcess[4] = { printArray, minimum, maximum, average };
0 голосов
/ 18 октября 2011

Все функции, для которых вы хотите использовать указатели функций, имеют подпись 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);
Дополнительно изучите логику инициализации минимальных и максимальных функций.Также в функции усреднения вы используете неинициализированную переменную итого, которая должна была быть инициализирована.
Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...