Ваша функция inputScores
объявлена следующим образом
int *inputScores(int *studentList, int numTests, int count)
, что означает, что studentList
- это указатель на int
(который можно рассматривать как массив). Далее в функции вы попытаетесь сделать это:
studentList[count].tests = new int[numTests];
Если studentList
- это int*
(или int
массив), тогда studentList[count]
- это просто int
. Вы пытаетесь получить доступ к переменной-члену tests
из int
. Но int
является примитивным типом.
Когда вы вызывали эту функцию в main, вы правильно передали int*
:
studentList[i].tests = inputScores(studentList[i].tests, numTests, i);
Таким образом, обрабатывая переменную, как на самом деле int *
вместо Grade *
должно решить первую из ваших проблем. Вам также следует изменить имя переменной, поскольку вы на самом деле не передаете studentList
, это скорее переменная tests
. Это должно помочь уменьшить некоторую путаницу.
int *inputScores(int *tests, int numTests, int count)
После этого вы поймете, что даже если вы передадите studentList[i].tests
своей функции inputScores
, у вас будет память утечка и не сможет получить доступ к памяти, которую вы думали, что вы только что заполнены. Вы ДОЛЖНЫ заполнить память, но когда вы попытались присвоить новое значение tests
через tests = new int[numTests];
, это изменило только локальную копию tests
.
Чтобы исправить эту проблему, вам нужно передать tests
по ссылке, например:
int *inputScores(int*& tests, int numTests, int count)
Это позволит любым изменениям, которые вы вносите в свою функцию в int*
, tests
, сохраняться вне функции.