Почему привязка массива не является целочисленной константой перед маркером ']', хотя размер объявлен глобально? - PullRequest
2 голосов
/ 09 апреля 2020

Я пробовал топологическую сортировку, но я получил ошибку с объявлением массива. Я прикрепил часть, в которой я получил ошибку. Если я заменю n в посещаемом массиве значением 6, то алгоритм будет работать нормально. Я не понимаю, почему это происходит? Вот код, в котором я получаю ошибку: Код на Ideone

#include<iostream>
#include<vector>
using namespace std;

int n=6;
int visited[n]={0};
int main()
{
    cout<<visited[0];
}

Ответы [ 3 ]

3 голосов
/ 09 апреля 2020

В вашем коде есть две вещи

 int visited[n]={0};

Однако, следуя определению константного выражения в C ++, вы можете сделать что-то вроде

 const int n=6;
 int visited[n]={0};  //not a VLA anymore
0 голосов
/ 09 апреля 2020

В то время как другие ответы верны в том, чтобы рассказать вам, в чем проблема, они упускают возможность дать вам реальный способ объявить динамические c массивы.
Из топи c, являющихся "топологической сортировкой", я Предположим, что вы тестировали только тогда, когда объявляли свою переменную n и позже она могла быть реальной переменной (а не константой).

Если это так, пожалуйста, посмотрите Как создать динамический c массив целых чисел .

Короче говоря: Вы можете создать указатель, который указывает на начало массива в куче:

int* visited = new int[n];

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

Лучше использовать контейнерный класс, который сделает это за вас:

std::vector<int> visited(n);

Поставьте любую строку в вашем коде, и она будет работать как положено.
В качестве общей рекомендации вам следует Прочтите руководства по работе с STL, включая обзор классов контейнеров.

0 голосов
/ 09 апреля 2020

Определение массива таким образом означает, что вы хотите, чтобы его память имела длительность c, потому что это глобальная переменная. Кроме того, вы намереваетесь использовать C -подобный массив. Система типов C ++ работает так, что visited в рабочей ситуации имеет тип int[6] !! Т.е. количество элементов является частью типа. Следовательно, эта информация должна быть первой, доступной во время компиляции и второй, чтобы быть неизменной . n вашего примера может измениться в любое время и поэтому не подходит для использования в типе массива .

Вместо этого вы можете сделать следующее:

constexpr unsigned int n {6};
int visited[n]={0};

... или, если вы также хотите правильно инициализировать массив, используйте это, например:

int visited[]={0, 0, 0, 0, 0, 0};
...