Внутренняя ошибка компилятора C1001 из-за векторной инициализации, такой как массивы - PullRequest
3 голосов
/ 17 января 2020
struct record
{
    double mid_exam;
    double fin_exam;
    double assignment[5];
    double score;
    char grade;
};

struct student
{
    string name;
    record math;
    record science;
};

int main()
{
    vector<student> students {
        // { name, math, science}
        { "John", {10.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Elton", {20.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Houston", {30.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Ashton", {40.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Lee", {50.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Jack", {60.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Christiano", {70.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Lukas", {80.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Sahid", {90.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Ryan", {90.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} }
    };
}

Я делаю программу управления оценкой учеников с вектором для ученика.

Я инициализировал векторные массивы. Я не написал оценку и номер оценки, которые будут вычисляться в функции вычисления оценок.

Visual Studio напечатало сообщение об ошибке, произошла внутренняя ошибка внутри компилятора.

Сначала я сделал это код с массивом

student students[10]

, и он работал нормально.

Я изменил только array на vector и не могу сейчас выяснить, что не так.

Ответы [ 4 ]

2 голосов
/ 17 января 2020

Основная проблема в том, что вы не заключили assignment в скобки в списке инициализаторов, но это не должно взломать sh вашего компилятора.

  • Нажмите на Feedback значок (вверху справа) в Visual Studio.
  • Нажмите Report a problem.
  • В поле поиска введите

    Internal error during IMAGE::BuildImage with improperly initialized std::vector

  • Нажмите на ссылку, соответствующую запросу. Это должно быть первое совпадение, и оно сообщается мной.

Что всплывает так:

Этот неправильно инициализированный std :: vector делает компилятор cra sh .

#include <string>
#include <vector>

struct record
{
    double mid_exam;
    double fin_exam;
    double assignment[5];
    double score;
    char grade;
};

struct student
{
    std::string name;
    record math;
    record science;
};

int main()
{
    std::vector<student> students{
        { "John", {10.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60}},
        { "Elton", {20.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60}}
    };
}

Обойти это легко. Я просто правильно его инициализирую.

std::vector<student> students{
    { "John", {10.5, 90, {80, 85, 20, 70, 60}, 0, 0}, {70.5, 90, {80, 85, 20, 70, 60}, 0, 0}},
    { "Elton", {20.5, 90, {80, 85, 20, 70, 60}, 0, 0}, {70.5, 90, {80, 85, 20, 70, 60}, 0, 0}}
};

Вы также можете проголосовать по этому вопросу.

Альтернатива, если вы не хотите вводить score и grade в вашем списке инициализатора, это добавить конструктор для record и использовать std::array вместо обычных массивов:

#include <array>

struct record
{
    record(double m, double f, const std::array<double, 5>& a) :
        mid_exam(m), fin_exam(f), assignment(a), score{}, grade{}
    {}
    record() : record({}, {}, {}) {} // default constructor, delegating to the above
    double mid_exam;
    double fin_exam;
    std::array<double, 5> assignment;
    double score;
    char grade;
};

Что позволяет нормально инициализировать его так:

std::vector<student> students{
    {"John", {10.5, 90, {80, 85, 20, 70, 60}}, {70.5, 90, {80, 85, 20, 70, 60}}},
    {"Elton", {20.5, 90, {80, 85, 20, 70, 60}}, {70.5, 90, {80, 85, 20, 70, 60}}        }
};

Демо

0 голосов
/ 17 января 2020

Измените строки, как показано ниже:

{ "John", record{10.5, 90, {80, 85, 20, 70, 60}, 0, ' '}, record{70.5, 90, {80, 85, 20, 70, 60}, 0 , ' '} }

Проблема связана с неопознанными значениями при создании объекта.
Попробуйте приведенный выше код, чтобы решить вашу проблему. Объект записи не создается должным образом.

Фактическая ошибка была воспроизведена, как показано ниже:

фатальная ошибка C1001: в компиляторе произошла внутренняя ошибка. 1> (файл компилятора 'd: \ agent_work \ 2 \ s \ src \ vctools \ compiler \ utc \ src \ p2 \ main. c', строка 187) 1> Чтобы обойти эту проблему, попробуйте упростить или изменить Программа рядом с местами, перечисленными выше.

0 голосов
/ 17 января 2020

При g cc (7.4.0) внутренняя ошибка компиляции отсутствует, но код не принят. Он работает путем простого определения различных уровней инициализации, как уже упоминалось в комментариях:

int main()
{
    vector<student> students {
        // { name, math, science}
        { "John", {10.5, 90, {80, 85, 20, 70, 60} }, {70.5, 90, {80, 85, 20, 70, 60} } },
        { "Elton", {20.5, 90, {80, 85, 20, 70, 60} }, {70.5, 90, {80, 85, 20, 70, 60} } }
    };
}

Редактировать: этот код все еще не компилируется с VS (см. Комментарий). Однако при g cc + options -Wall -pedantic предупреждение не выдается. То же самое с g cc 8.3.0

Edit 2: с clang -Wall -pedantic он также компилируется без предупреждения. Clang 7.0.1-8

Edit 3: появляется предупреждение с опцией Wextra, как указано Ted Lyngmo

0 голосов
/ 17 января 2020

Следующие работали на меня в VS2015:

struct record
{
    double mid_exam;
    double fin_exam;
    double assignment[5];
    double score;
    char grade;
};

struct student
{
    string name;
    record math;
    record science;
};

int main()
{
     student students[10] =  {
        // { name, math, science}
        { "John", {10.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Elton", {20.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Houston", {30.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Ashton", {40.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Lee", {50.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Jack", {60.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Christiano", {70.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Lukas", {80.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Sahid", {90.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} },
        { "Ryan", {90.5, 90, 80, 85, 20, 70, 60}, {70.5, 90, 80, 85, 20, 70, 60} }
    };
}```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...