Передача двумерного массива в функцию в переполнении стека

Я пытаюсь передать двумерный массив в numOfStudents функция, но Visual Studio выдаёт мне сообщение об ошибке:

ни один экземпляр перегруженного «numOfStudents» не соответствует списку аргументов

Я пытался все, и я не могу найти решение.

#include <stdio.h>
#include <cstring>

//Prototypes
int unsigned numOfStudents(char **namesArray, int *, FILE *);
void printArrays(char **namesArray, int *marksArray, int loopCounter);
int unsigned minMark(int);
int unsigned maxMark(int);
int unsigned averageMark(int);

//Two constants used later to create array of characters
const int MAX_SIZE = 10;
const int NAME_LENGTH = 30;

int main()
{
// Declaring array which will hold all names from file
char namesArray[MAX_SIZE][NAME_LENGTH];
int unsigned studentNumber = 0;
int loopCounter = 0;
int marksArray[MAX_SIZE]; //Array will hold the marks of students, it needs to be same size as the previous array

FILE *file; //creating pointer to a file
file = fopen("names.txt", "r"); //telling the pointer where the file is and how to access it

loopCounter = numOfStudents(namesArray, marksArray, file);
//System pause - will hold console window open
getchar();
return 0;
}

int unsigned numOfStudents(int *marksArray, char **namesArray, FILE *file)
{
char tempArrayName[50]; //Temporary array to hold names
char tempArrayLastName[50]; //Temporary array to hold last names
int i = 0; //Counter
bool stop = false;

if(file == NULL)
{
printf("\nFile has been not opened correctly\n");
}
else
{
while (stop == false)
{
//Reading the file in order to get 3 separate lines which are assumed as a single record of one student
fscanf(file, "%s\n%s\n%d", tempArrayName, tempArrayLastName, &marksArray[i]);
//Following lines are compying strings from temp arrays into main array and adding a space for better readability
strcpy(namesArray[i], tempArrayName);
strcat(namesArray[i], " ");
strcat(namesArray[i], tempArrayLastName);
//Chcecking if the sentinel value was read in order to stop the loop
stop = strcmp(tempArrayName, "****");
i++; //adding the counter
//Checking if file is too big, before program will crash with an internal error
if (i == MAX_SIZE)
{
printf("ERROR!!! FILE TOO BIG TO READ!");
stop == true;
}
}
}

return i;
}

1

Решение

Вы объявляете numOfStudents с этим списком аргументов:

int unsigned numOfStudents(char **namesArray, int *, FILE *);

Но затем вы определяете его с помощью другого списка аргументов:

int unsigned numOfStudents(int *marksArray, char **namesArray, FILE *file)

Обратите внимание, что ваша декларация имеет char** в качестве первого аргумента, но ваше определение имеет его в качестве второго аргумента (и наоборот для int*). Порядок аргументов очень важен и должен точно соответствовать, поэтому вам нужно изменить определение, чтобы оно соответствовало объявлению:

int unsigned numOfStudents(char **namesArray, int *marksArray, FILE *file)
{
....
}
4

Другие решения

2D-массивы могут быть боль обойти, почему ты не используешь std::string и передать массив (или ссылку на std::vector) из них вокруг?

0

int unsigned numOfStudents(char **namesArray, int *, FILE *);  // declaration

int unsigned numOfStudents(int *marksArray, char **namesArray, FILE *file) // definition

Проверьте порядок параметров в каждом. Второй параметр определения на самом деле является первым параметром декларации. Вам должно быть хорошо, если вы исправите заказ

0

Вы определили сигнатуру функции numOfStudents как:

int unsigned numOfStudents(char **namesArray, int *, FILE *);

и вы объявили функцию как:

int unsigned numOfStudents(int *marksArray, char **namesArray, FILE *file)
{

---*** Your Code Here ***---

}

Это проблема, заключающаяся в том, что «последовательность вызова параметра» подписи функции и объявления функции должна совпадать с передаваемым параметром. Так и должно быть:

int unsigned numOfStudents(char **namesArray, int *marksArray, FILE *file)
{

---*** Your Code Here ***---

}
0
По вопросам рекламы [email protected]