Ошибка: объект переменного размера не может быть инициализирован на языке c.Имеет ли константа int какое-либо отношение к этому? - PullRequest
0 голосов
/ 10 февраля 2019

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

const int n=20, d=11; 
int pergjigjet[n]={1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7}; 
int denduri[ d ]={0};

for( int p=0; p<n; p++)
  ++denduri[pergjigjet[p]]; 

printf("vleresimi\tdenduria\n"); 
for(int v=1; v<d; v++)
  printf("%d\t\t\%d\n", v, denduri[v]);

Ошибка, которую он показывает:

Compilation failed due to following error(s). main.c: In function ‘main’:
main.c:15:5: error: variable-sized object may not be initialized
     int pergjigjet[n]={1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7}; 
     ^
main.c:15:24: warning: excess elements in array initializer
     int pergjigjet[n]={1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7}; 
                    ^

1 Ответ

0 голосов
/ 10 февраля 2019

Этот учебник ошибочен;код недействителен C.

Per 6.7.9 Инициализация , ¶3:

Тип объекта, который должен быть инициализирован, должен быть массивомнеизвестный размер или полный тип объекта, который не является типом массива переменной длины.

Массив pergjigjet является массивом переменной длины, поскольку выражение для числа элементов, n, имеет видне целочисленное константное выражение .const - квалифицированные объекты не являются константами;это просто объекты, для которых попытки изменить их являются (в зависимости от используемого метода) нарушениями ограничений или неопределенным поведением.

Вы можете исправить это, заменив const int n=20, d=11; на enum { n=20, d=11 }; или используя макросы препроцессора (#define n 20) но это обычно считается плохим стилем.

Как заметил Майк Кристенсен в комментарии, кажется, что этот учебник довольно плохой.Вполне вероятно, что автор фактически писал в C-подобном подмножестве C ++, а не в C. Этот код был бы допустим в C ++, поскольку в C ++ такой n является константой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...