Динамически распределяемые структуры

#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. Большое вам всем спасибо за вашу помощь, после этого исправления я смог завершить свою программу.