#c #structure #dynamic-allocation
#c #структура #динамическое распределение
Вопрос:
Итак, у меня здесь проблемы. Программа отлично работает, когда я ввожу 1 для numStudents, но получаю ошибку сегментации: 11, когда я ввожу больше, чем 1 для numstudents. Я делаю что-то не так с динамическим распределением? Я просто потерян, сделал все, что мог придумать.
#include <iostream>
#include <string>
#include <cstdlib>
#include <iomanip>
using namespace std;
//Structure Declaration
struct Student
{
string name;
long long ID;
double *score;
};
//Function prototypes
void calcAvg (int loc, Student test[], double average[], int tests);
int main()
{
int numStudents, numTests; //Get from user
double *averages; //For Dynamic allocation of averages
Student *info; //For Dynamic Allocation
cout << "Enter the number of students you will enter ";
cin >> numStudents;
info = new Student[numStudents];
averages = new double[numStudents];
cout << "nEnter the number of tests that were taken by the students ";
cin >> numTests;
info->score = new double[numTests];
for(int s = 0; s < numStudents; s )
{
cout << "Enter student #" << (s 1) << "'s name ";
cin.ignore();
getline(cin, info[s].name);
cout << "Enter " << info[s].name << "'s ID number ";
cin >> info[s].ID;
cout << endl;
for(int t = 0; t < numTests; t )
{
cout << "nEnter " << info[s].name << "'s score for test #" <<(t 1) << " ";
cin >> info[s].score[t];
while(info[s].score[t] > 100 || info[s].score[t] < 0)
{
cout << "The score you entered is invalid, try again. ";
cin >> info[s].score[t];
}
}
calcAvg(s, info, averages, numTests);
}
return 0;
}
void calcAvg (int loc, Student test[], double average[], int tests)
{
double total = 0;
for(int i = 0; i < tests; i )
{
total = test[loc].score[i];
}
average[loc] = total/tests;
cout << average[loc] << endl;
}
Ответ №1:
Вам нужно повторить это для каждого учащегося
info->score = new double[numTests];
Таким образом, вы могли бы переместить его в цикл:
for(int s = 0; s < numStudents; s )
{
info[s].score = new double[numTests];
...
}
Но все это очень подвержено ошибкам — я предлагаю вам изучить структуры, которые могут обрабатывать все это для вас std::vector
.
Комментарии:
1. Это не сработало, все та же ошибка сегментации. И это для класса, и мы не должны использовать что-то вроде std::vector, я полагаю. У меня были другие люди, которые тоже смотрели на это, и они не видят в этом ничего плохого, и я тоже … так что не уверен
2. @JordanMcPeek: Этот ответ не только имеет смысл, но я только что протестировал его, и он работает. С вашим исходным кодом я получаю ошибку segfault, если я ввожу более 1 учащегося. Удаляя ваши
info->score = new double[numTests];
и добавляяinfo[s].score = new double[numTests];
в начало цикла, он успешно выполняется до конца. Итак … если это не работает для вас, вы почти наверняка сделали что-то не так. Опубликуйте фактический код, который вы тестируете, и где он терпит неудачу.3. упс, я думаю, я понимаю, что я сделал, я просто скопировал info->score в свой цикл и не поместил info.score
4. Для меня это отлично работает, используя исправление Майкла Андерсона (см. Здесь для 3 студентов). Что я нахожу немного забавным в дизайне, так это то, что среднее значение хранится отдельно от структур, хотя это всего лишь среднее значение для каждого учащегося , а не глобальное. Но, возможно, вам нужно сделать это так из-за какой-то детали в вашем назначении, которую мы не знаем.
5. Большое вам всем спасибо за вашу помощь, после этого исправления я смог завершить свою программу.