Я работаю над программой, которая должна загрузить 2D-массив из файла.
Мой файл выглядит так: первый номер указывает размер массива:
10
7 6 9 4 5 4 3 2 1 0
6 5 5 5 6 5 4 3 2 1
6 5 6 6 7 6 8 4 3 2
1 5 6 7 7 7 6 5 4 3
5 5 6 7 6 7 7 6 5 9
5 6 7 6 5 6 6 5 4 3
5 6 7 9 5 5 6 5 4 3
5 5 6 7 6 6 7 6 5 4
5 9 5 6 7 6 5 0 3 2
5 5 5 5 6 5 4 3 2 7
И вот мой код:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream prog;
prog.open("../prog1.dat");
//If file can't be opened, exit
if (!prog) {
cerr << "File could not be opened" << endl;
exit(EXIT_FAILURE);
}
else {
while (!prog.eof()) {
int size = 100, i, j;
prog >> size;
int **numArray = new int* [size];
for(i = 0; i < size; i++) {
numArray[i] = new int[size];
for(j = 0; j < size; j++) {
cout <<numArray[i][j] << " ";
}
cout << endl;
}
prog.close();
return 0;
}
}
}
Но одна из ошибок, которые я получаю, говорит, что выражение должно иметь постоянное значение на
int numArray[size][size];
часть моего кода.
Моя проблема в том, что я не знаю, как сделать это постоянным, так как я получаю размер из файла, как будто я еще не знаю размер массива.
Это моя первая C++ программа, и я довольно много учу ее себе, поскольку я иду с тех пор, как мой профессор, похоже, думает, что, поскольку мы должны знать, как делать эти вещи на Java, что нам не нужно перебирать ее в класс. Приведенные мной примеры использования констант говорят, что это должно быть примерно так:
const int size = *value*;
но поскольку моя программа должна искать в файле размер, я не уверен, как это сделать. Какие-либо предложения? Кроме того, как я уже сказал, я на самом деле новичок в этом, поэтому, если вы обнаружите что-то еще в моем коде, которое нужно исправлять, это было бы также оценено.
Это должно сработать. Смотрите, вы просто используете цикл for.
for(i = 0; i < size; i++) {
for(j = 0; j < size; j++) {
cout <<numArray[i][j] << " ";
}
cout << endl;
}
Когда вы определяете массив в C++, размер должен быть известен во время компиляции. Поэтому компилятор создает ошибку для строки:
int numArray[size][size];
Вы можете использовать std::vector
для создания динамических массивов.
std::vector<std::vector<int>> numArray(size, std::vecot<int>(size));
Теперь numArray
можно использовать точно так же, как статически определенный массив.
Это невозможно. Поскольку вы не знаете размер массива во время компиляции, вы должны распределять память динамически.
Используйте std::vector
:
std::vector<std::vector<int> > numbers;
Ответы, относящиеся к векторам, верны, и предпочтительный метод создания динамических массивов в C++, однако; ваш код может работать. Проблема заключается в том, что вы пытаетесь определить динамический массив в стеке, и вы не можете этого сделать. Вам нужно создать массив в куче.
Вот хороший пример того, как это сделать: Как объявить 2d-массив в C++ с помощью нового?
Вы также можете сделать это, объявив numArray
как указатель на указатель на int, затем выделите numArray
и его содержимое при загрузке размера.
Будьте осторожны, чтобы правильно освободить память после использования, т. К.
Константы могут означать либо переменную, которая не изменяется, либо буква, которая представляет собой любое значение, а не переменную, такую как 1, 4, 5. Это целые литералы. В этом контексте компилятор говорит, что значение для delcaraing размера массива принимает литерал. Замените "Размер" на целое число.
Еще лучше, используйте
#define SIZE 100
Макрос в C/C++ - это только значения, которые расширяются во время компиляции.
Или, если вы хотите изменить массив во время выполнения, вы можете использовать указатели.
int *array[10000]; // make the array large enough for most cases
// note the '*' that is a what makes a pointer
// read the size from file
for (int i = 0, i < size; ++i)
{
array[i] = new int [size]; // use 'new' to dynamically create an array
}
Указатели позволяют создавать массивы с переменными и литералами.
Вот версия вашей программы с использованием указателей. Изучите его, чтобы узнать, как это работает.
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream prog;
prog.open("prog1.dat");
//If file can't be opened, exit
if (!prog) {
cerr << "File could not be opened" << endl;
exit(EXIT_FAILURE);
}
int size = 100, i, j;
//prog >> size;
int **numArray = new int*; // pointers used here
for(i = 0; i < size; i++) {
numArray[i] = new int[size]; // pointer used here
for(j = 0; j < size; j++) {
prog >> numArray[i][j];
}
}
return 0;
cout << numArray[i][j];
}
std::vector
.int [r][c]
в своем коде? В C ++ естьstd::vector
, который сделает это проще.