создайте двойной массив с размером, взятым из файла

#c

#c

Вопрос:

Привет, у меня возникли проблемы с этой частью кода:

 ifstream inputfile;
inputfile.open ("input.txt");

int n;

inputfile >> n;

int dist[n][n]{};

for (int i = 0; i < n; i  ){
        for (int j = 0; j < n; j  ){
            inputfile >> dist[i][j];
        }
}
  

это не выполняется, но это:

 ifstream inputfile;
inputfile.open ("input.txt");

int n;

inputfile >> n;

int dist[6][6]{};

for (int i = 0; i < n; i  ){
        for (int j = 0; j < n; j  ){
            inputfile >> dist[i][j];
        }
}
  

выполняет…

Я хочу взять размер двойного массива из входного файла, однако я получаю этот код ошибки компиляции:

внутренняя ошибка компилятора: в make_decl_rtl, в varasm.c:1322″

Спасибо

Комментарии:

1. Что вы подразумеваете под «не работает»? Не компилируется? Не связывается? Не запускается? Выполняется некорректно? Вам выдаются сообщения с описанием проблемы?

2. Извините, я не объяснил. Он не запускается. У меня эта ошибка: «внутренняя ошибка компилятора: в make_decl_rtl, в varasm.c: 1322»

3. Вы не можете определять размеры массива динамически. Это не разрешено C , хотя некоторые компиляторы позволят вам. Тем не менее, он не переносим. Скорее всего, вы используете тот, который не предоставляет это расширение.

4. @LauraPinguicha Это возможно и просто. 1) Прочитайте о динамических массивах 2) Используйте динамические массивы

5. Вероятно, вам следует сообщить об этом разработчикам вашего компилятора. Если компилятор разрешает массивы переменной длины, это должно сработать. Если нет, вы должны получить значимое сообщение об ошибке. Вы не должны иметь возможности аварийно завершить работу компилятора.

Ответ №1:

Как заявил Дуг, в C вы не можете создавать массивы динамически; размеры простого массива должны быть предопределены и известны во время компиляции.

Чтобы получить массив с размерами, которые являются переменными во время выполнения, вам необходимо использовать тип, который использует динамическое распределение, std::vector.

Комментарии:

1. Использование STL для определения контейнеров из стандартной библиотеки является анахронизмом.

Ответ №2:

Самой базовой версией будет:

 ifstream inputfile;
inputfile.open ("input.txt");

int n;

inputfile >> n;

int* dist = new int[n*n];

for (int i = 0; i < n; i  ){
        for (int j = 0; j < n; j  ){
            inputfile >> dist[i*n j];
        }
}
delete[] dist;
  

Но это, как только вы захотите сделать с массивом больше: лучше переключиться на std::vector , который обрабатывает все распределение и перераспределение за вас.