Ошибка в инициализации массива указателей на функции - C (СИ)
Формулировка задачи:
Как правильно инициализировать массив указателей на функции?
Компилятор указывает ошибку в этой строчке после знака равно
void (*processGrades[4]) (int(*)[4], int, int) = (f0, f1, f2, f3);
#include <stdio.h>
#define STUDENTS 3
#define EXAMS 4
void f0 (const int [][EXAMS], int, int);
void f1 (const int [][EXAMS], int, int);
void f2 (const int [][EXAMS], int, int);
void f3 (const int [][EXAMS], int, int);
int main ()
{
int a;
void (*processGrades[4]) (int(*)[4], int, int) = (f0, f1, f2, f3);
int studentsGrades [STUDENTS] [EXAMS] = {{77, 68, 86, 73},
{96, 87, 89, 78},
{70, 90, 86, 81}};
printf ("\n0 - massiv ocenok\n1 - min ocenka\n2 - max ocenka\n3 - sredny ocenka po vsem testam dly kagdogo studenta\n4 - viti iz programmi\n");
scanf ("%d", &a);
while (a >= 0 && a < 4)
{
(*processGrades[a])(studentsGrades, STUDENTS, EXAMS);
printf ("\n0 - massiv ocenok\n1 - min ocenka\n2 - max ocenka\n3 - sredny ocenka po vsem testam dly kagdogo studenta\n4 - viti iz programmi\n");
scanf ("%d", &a);
}
printf ("You entered 4 to end\n");
return 0;
}
/* Выводит массив оценок */
void f0 (const int grades [][EXAMS], int peoplse, int tests)
{
int i, j;
printf (" [0] [1] [2] [3]");
for (i = 0; i <= peoplse - 1; i++)
{
printf ("\nstudentGrades[%d] ", i);
for (j = 0; j <= tests - 1; j++)
printf("%-5d", grades[i][j]);
}
}
/* Выводит минимальную оценку */
void f1 (const int grades [][EXAMS], int peoplse, int tests)
{
int i, j, lowGrade = 100;
for (i = 0; i <= peoplse - 1; i++)
for (j = 0; j <= tests -1; j++)
if (grades[i][j] < lowGrade)
lowGrade = grades[i][j];
printf("Lowest grade: %d\n", lowGrade);
}
/* Выводит максимальную оценку */
void f2 (const int grades [][EXAMS], int peoplse, int tests)
{
int i, j, highGrade = 0;
for (i = 0; i <= peoplse - 1; i++)
for (j = 0; j <= tests -1; j++)
if (grades[i][j] < highGrade)
highGrade = grades[i][j];
printf("Highest grade: %d\n", highGrade);
}
/* Выводит среднюю оценку для каждого студента */
void f3 (const int grades [][EXAMS], int peoplse, int tests)
{
int j, i, total = 0;
for (j = 0; j <= peoplse - 1; j++)
{
for (i = 0; i <= tests - 1; i++)
total += grades [j][i];
printf ("The average grade for students %d is %d\n", i, total);
total = 0;
}
}Решение задачи: «Ошибка в инициализации массива указателей на функции»
textual
Листинг программы
void (*processGrades[]) (const int[][EXAMS], int, int) = {f0, f1, f2, f3};
const int studentsGrades [STUDENTS] [EXAMS] = {{77, 68, 86, 73},
{96, 87, 89, 78},
{70, 90, 86, 81}};
Объяснение кода листинга программы
- Объявляется массив указателей на функции с именем processGrades.
- В качестве инициализации для этого массива перечисляются функции f0, f1, f2, f3.
- Объявляется массив с именем studentsGrades, который состоит из STUDENTS строк, каждая из которых, в свою очередь, состоит из EXAMS элементов.
- Каждая строка массива studentsGrades инициализируется значениями, представляющими оценки студентов.
- Первая строка массива studentsGrades инициализируется значениями {77, 68, 86, 73}.
- Вторая строка массива studentsGrades инициализируется значениями {96, 87, 89, 78}.
- Третья строка массива studentsGrades инициализируется значениями {70, 90, 86, 81}.
- Массив studentsGrades содержит оценки студентов по четырем экзаменам.
- Массив processGrades содержит указатели на функции, которые будут использоваться для обработки оценок студентов.
- Функции f0, f1, f2, f3 предназначены для обработки оценок студентов в соответствии с определенными правилами или алгоритмами.
- Значения переменных STUDENTS и EXAMS определяют размер массива studentsGrades и количество экзаменов соответственно.
- Значения переменных f0, f1, f2, f3 являются адресами функций, которые будут вызываться для обработки оценок студентов.
- Значения переменных 77, 68, 86, 73, 96, 87, 89, 78, 70, 90, 86, 81 являются оценками студентов по различным экзаменам.
- Каждая оценка представляет собой результат, полученный студентом по соответствующему экзамену.
- Массив processGrades используется для вызова функций, которые будут обрабатывать оценки студентов в соответствии с определенными правилами или алгоритмами.
- Каждый элемент массива processGrades содержит указатель на функцию, которая будет вызываться для обработки оценок студентов.
- Функции, на которые указывают элементы массива processGrades, могут выполнять различные операции, такие как расчет среднего значения, определение максимальной или минимальной оценки и т. д.
- Значения переменных 77, 68, 86, 73, 96, 87, 89, 78, 70, 90, 86, 81 являются входными данными для функций, на которые указывают элементы массива processGrades.
- Результатом работы функций, на которые указывают элементы массива processGrades, могут быть измененные значения оценок студентов или другие результаты, в зависимости от правил или алгоритмов, определенных для каждой функции.
- Значения переменных STUDENTS и EXAMS могут быть изменены в процессе работы программы, что может привести к изменению размера массива studentsGrades и количества экзаменов.