Использование констант в C ++

0

Я работаю над программой, которая должна загрузить 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*;

но поскольку моя программа должна искать в файле размер, я не уверен, как это сделать. Какие-либо предложения? Кроме того, как я уже сказал, я на самом деле новичок в этом, поэтому, если вы обнаружите что-то еще в моем коде, которое нужно исправлять, это было бы также оценено.

  • 1
    C99 поддерживает это, C ++ - нет. Используйте std::vector .
  • 0
    Вы должны использовать int [r][c] в своем коде? В C ++ есть std::vector , который сделает это проще.
Показать ещё 4 комментария
Теги:
arrays

6 ответов

1
Лучший ответ

Это должно сработать. Смотрите, вы просто используете цикл for.

for(i = 0; i < size; i++) {
    for(j = 0; j < size; j++) {
        cout <<numArray[i][j] << " ";
    }
    cout << endl;
 }
  • 0
    Хорошо, это по крайней мере что-то отображает, однако, это не распечатка массива, это просто набор случайных чисел. Он печатает -042150451 снова и снова, поэтому я думаю, что он не загружает массив правильно (очевидно, ха)
  • 0
    Можете ли вы показать, где, по вашему мнению, проблема?
Показать ещё 5 комментариев
4

Когда вы определяете массив в C++, размер должен быть известен во время компиляции. Поэтому компилятор создает ошибку для строки:

int numArray[size][size];

Вы можете использовать std::vector для создания динамических массивов.

std::vector<std::vector<int>> numArray(size, std::vecot<int>(size));

Теперь numArray можно использовать точно так же, как статически определенный массив.

2

Это невозможно. Поскольку вы не знаете размер массива во время компиляции, вы должны распределять память динамически.

Используйте std::vector:

std::vector<std::vector<int> > numbers;
  • 0
    Я знаю, что вектор был бы наилучшим путем, но часть направлений - использовать двумерный массив, так что подумайте, что мне лучше придерживаться попытки сделать это таким образом, мой профессор чрезвычайно разборчив. Даже если мы получим тот же самый точный результат, если мы не сделаем это так, как он того хотел, мы не получим никакого кредита.
  • 0
    также обратите внимание, что std :: map может быть чем-то, на что стоит обратить внимание, если вы хотите 2D
Показать ещё 1 комментарий
1

Ответы, относящиеся к векторам, верны, и предпочтительный метод создания динамических массивов в C++, однако; ваш код может работать. Проблема заключается в том, что вы пытаетесь определить динамический массив в стеке, и вы не можете этого сделать. Вам нужно создать массив в куче.

Вот хороший пример того, как это сделать: Как объявить 2d-массив в C++ с помощью нового?

0

Вы также можете сделать это, объявив numArray как указатель на указатель на int, затем выделите numArray и его содержимое при загрузке размера.

Будьте осторожны, чтобы правильно освободить память после использования, т. К.

0

Константы могут означать либо переменную, которая не изменяется, либо буква, которая представляет собой любое значение, а не переменную, такую как 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];
}    
  • 0
    Это исправило проблему, с которой я столкнулся, однако теперь я получаю несколько других ошибок в той части кода, где я пытаюсь отобразить массив. К ошибкам относятся «необъявленный идентификатор i и j» и «идентификатор неопределенный i и j». Я просто пытаюсь отобразить массив в неправильном месте?
  • 0
    Ваши переменные i и j находятся вне области видимости. Объявления должны выходить за рамки цикла for. Прямо сейчас вы можете использовать их только внутри цикла for. Просто объявите их вне цикла for.
Показать ещё 26 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню