Error variably modified at file scope

Модератор: Модераторы разделов

Массив с переменной длиной (объявленный глобальным и локальным. Чем обусловлена разница?)

Модератор: Модераторы разделов

promov

Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Массив с переменной длиной

Проще говоря, эта программа работает

Код: Выделить всё

#include <stdio.h>
int main () {
 int j= 4;
 int h [j];
 return 0;
}

а эта нет

Код: Выделить всё

#include <stdio.h>
int j= 4;
int h [j];
int main () {
 return 0;
}

Комментировать не стал, всё ясно, как день, по моему. Во втором случае машина выдаёт информацию variably modified ‘h’ at file scope.
Всё же правильно вроде… Ну пусть во втором случае массив объявлен глобальным, ну и что?
Переменная j заранее ведь определена. И синтаксис соблюдён. И вот ещё: чем таким принципиальным отличается вторая программа от третьей?:

Код: Выделить всё

#include <stdio.h>
int h [4];
int main () {
 return 0;
}

Третья-то работает. В дебри, наверное, влазить надо… Надеюсь на помощь. C уважением promov.
Или так: в языке C существует правило- массив неопределённой длины не может быть глобальным. Если бы кто-нибудь указал мне на место где это правило* прописано я был бы ему очень благодарен.

*само собой это не разумеется.

Зачем хорёк пошел в ларёк, зачем барсук полез на сук…
Мораль легко уразуметь: зачем на бал пришёл медведь?

Аватара пользователя

m11

Сообщения: 147
ОС: Gentoo Linux ~x86
Контактная информация:

Re: Массив с переменной длиной

Сообщение

m11 » 11.10.2007 21:48

promov писал(а): ↑

11.10.2007 20:35

в языке C существует правило- массив неопределённой длины не может быть глобальным.

почему не может?
кто мешает объявить глобальную переменную указателем,
выделеть под нее память на несколько элементов,
и использовать ее как полноценный массив?

Аватара пользователя

Uncle_Theodore

Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Массив с переменной длиной

Сообщение

Uncle_Theodore » 11.10.2007 22:04

m11 писал(а): ↑

11.10.2007 21:48

promov писал(а): ↑

11.10.2007 20:35

в языке C существует правило- массив неопределённой длины не может быть глобальным.

почему не может?
кто мешает объявить глобальную переменную указателем,
выделеть под нее память на несколько элементов,
и использовать ее как полноценный массив?

Извините, коллега, но ссылка и массив — это все-таки две большие разницы. Под массив Вы руками память не выделяете, а хотите, чтобы это сделала программа.

Аватара пользователя

m11

Сообщения: 147
ОС: Gentoo Linux ~x86
Контактная информация:

Re: Массив с переменной длиной

Сообщение

m11 » 11.10.2007 22:27

Uncle_Theodore писал(а): ↑

11.10.2007 22:04

Извините, коллега, но ссылка и массив — это все-таки две большие разницы. Под массив Вы руками память не выделяете, а хотите, чтобы это сделала программа.

Разница между тем, что я описал и объявлением массива с помощью [ ],
лишь в способе выделения памяти — динамический и статический соответственно (со всеми вытекающими последствиями).
А результат один и тот же — указатель на начало выделенного куска памяти заданной длины.

Аватара пользователя

Uncle_Theodore

Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Массив с переменной длиной

Сообщение

Uncle_Theodore » 11.10.2007 22:32

m11 писал(а): ↑

11.10.2007 22:27

Uncle_Theodore писал(а): ↑

11.10.2007 22:04

Извините, коллега, но ссылка и массив — это все-таки две большие разницы. Под массив Вы руками память не выделяете, а хотите, чтобы это сделала программа.

Разница между тем, что я описал и объявлением массива с помощью [ ],
лишь в способе выделения памяти — динамический и статический соответственно (со всеми вытекающими последствиями).
А результат один и тот же — указатель на начало выделенного куска памяти заданной длины.

В случае указателя Вы выделяете память. А в случае [] — выделяет память программа. Соответственно, компилятор устанавливает правила того, как можно объявлять массив, а как нет.
Давайте не будем таблицу умножения наизусть цитировать. Я знаю, как устроены массивы с Сях. И результат не совсем одно и то же…

Аватара пользователя

Liksys

Сообщения: 2910

Re: Массив с переменной длиной

Сообщение

Liksys » 11.10.2007 22:36

Внесу и свои пять копеек :)
То, что массивы и указатели — это разные вещи уже сказали, результат кстати получается разным, к именам массива арифметика указателей не применима в полном объеме.

promov

Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Массив с переменной длиной

Сообщение

promov » 11.10.2007 22:50

Спасибо, конечно, но я лучше на веру приму, что

promov писал(а): ↑

11.10.2007 20:35

в языке C существует правило- массив неопределённой длины не может быть глобальным.

Если это правда- хорошо. Если неправда- ну что ж, рано или поздно,( как прижмёт, что называется) придётся мне такое своё знание пересматривать. Пока оно работает, буду им руководствоваться и помнить, что правило выведено мной опытным путём и в любом случае может дать осечку.
Это альтернатива изучению английского языка.

Зачем хорёк пошел в ларёк, зачем барсук полез на сук…
Мораль легко уразуметь: зачем на бал пришёл медведь?

Аватара пользователя

m11

Сообщения: 147
ОС: Gentoo Linux ~x86
Контактная информация:

Re: Массив с переменной длиной

Сообщение

m11 » 11.10.2007 23:01

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

А под словом массив, насколько я знаю, принято иметь ввиду все же каким-либо образом проиндексированный набор подобных единиц информации, а не вот эту конструкцию с использованием [ ]. (хотя вопрос тоже спорный)

v04bvs

Сообщения: 636
ОС: Debian GNU/Linux

Re: Массив с переменной длиной

Сообщение

v04bvs » 12.10.2007 07:32

m11 писал(а): ↑

11.10.2007 23:01

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

А под словом массив, насколько я знаю, принято иметь ввиду все же каким-либо образом проиндексированный набор подобных единиц информации, а не вот эту конструкцию с использованием [ ]. (хотя вопрос тоже спорный)

В С++ массив и указатель это разные типы, что проявляется, в частности, при перегрузке функций. К массиву можно применять sizeof и он вернёт размер массива.

sergio

Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Массив с переменной длиной

Сообщение

sergio » 12.10.2007 11:40

Маленькое юридическое уточнение:

в языке C существует правило- массив неопределённой длины не может быть глобальным.

Дело не в глобальности, а в классе хранения. Массив неопределённой длины не может иметь статический класс хранения. Грубо говоря, при компиляции такой массив будет зашит в сегмент данных вашего выполняемого файла, в куче со всеми литералами и глобальными константами, есессно его размер на момент компиляции должен быть известен, иначе сколько зашивать-то? :)
Массивы с автоматическим хранением получаются сдвигом указателя стэка во время выполнения, там все просто (хотя десять лет назад и для них требовался константный на момент компиляции размер). Неглобальный но статический массив внутри функции GCC тоже не дает объявить зависимым от переменной.

Вернее, он будет зашит, если чем-то инициализирован. Если нет, то видимо GCC генерит для него разворачивание-размещение после загрузки (до входа в main и пр.). Но возможно это все детали реализации, надо стандарты смотреть. :)

Debian GNU/Linux 4 — AMD Athlon64 3000+ / Asus 7600GS — Gnome
Debian GNU/Linux 5 — Dell (Vostro) 500 (Celeron M560 / iGM965) — Gnome

promov

Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Массив с переменной длиной

Сообщение

promov » 13.10.2007 17:15

Вот, кажется, ответ на мой вопрос:
«Внутри функции или блока можно задавать размер массива с помощью выражений, содержащих переменные. В этом случае размер массива вычисляется во время выполнения программы. Например, в функции

int makeValis (int n) {
int valArray [n];

}

объявляетсяавтоматически массив с именем valArray и размером n элементов, где значение n вычисляется во время выполнения и может изменяться при отдельных вызовах этой функции. Массивы переменного размера нельзя инициализировать во время объявления.»
Cтефан Кочан, «Программирование на языке С», Москва- Санкт-Петербург- Киев, 2007 год.
Естественно, в конце книги, среди перечня чего-то там, мелкими буквами.

Я это пишу для таких же бедолаг, как я, благо название темы гвоворит само за себя и им легко (относительно) будет найти ответ на этот вопрос, если, конечно, второй возникнет.

Зачем хорёк пошел в ларёк, зачем барсук полез на сук…
Мораль легко уразуметь: зачем на бал пришёл медведь?

v04bvs

Сообщения: 636
ОС: Debian GNU/Linux

Re: Массив с переменной длиной

Сообщение

v04bvs » 13.10.2007 19:27

На всякий случай напишу — массивы такого рода допустимы только в C, по стандарту С++ они не допустимы (хотя многие компиляторы поддерживают эту возможность в качестве расширений).

You can not have static array which size is given as a variable

Thats why constants should be #defined:

#define a 6

This way preprocessor will replace a with 6, making it valid declaration.

Simple answer variable modified array at file scope is not possible.

Detailed :

make it compile time integral constant expression, since array length must be specified at the compile time.

like this :

#define a 6
#define b 3

Or, follow c99 standard. and compile like for gcc.

gcc -Wall -std=c99 test.c -o test.out

The problem here is variable length array with providing length may not be initialized so you are getting this error.

simply

static int a =6;
static int b =3;

void any_func()
{
int Hello [a][b]; // no need of initialization no static array means no file scope.
}

Now use for loop or any loop to fill the array.

For more info just a DEMO :

#include <stdio.h>
static int a = 6; 
int main()
{
int Hello[a]={1,2,3,4,5,6}; // see here initialization of array Hello its in function
                            //scope but still error
return 0;
}


[email protected]:~/c# clang -std=c99 vararr.c -o vararr
vararr.c:8:11: error: variable-sized object may not be initialized
int Hello[a]={1,2,3,4,5,6};
          ^
1 error generated. 

If you remove static and provide initialization then it will generate error as above.

But if you keep static as well as initialization the still will be error.

But if you remove initialization and keep static the below error will come.

error: variable length array declaration not allowed at file scope
static int Hello[a];
           ^     ~
1 error generated.

So variable length array declaration not allowed at file scope so make it function or block scope inside any function (but remember making it function scope must remove initialization)

NOTE : Since its C tagged so making a and b as const wont help you but in C++ const will work fine.

variably modified array at file scope in C

When using CLANG/LLVM the following works:

static const int a = 6;
static const int b = 3;

static int Hello[a][b] =
{
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3},
    { 1,2,3}
}; 

(To see it in the generated assembly, one needs to use Hello so it will not be optimized out)

However, this will generate an error if C99 mode is selected (-std=c99),
it will only generate a warning (Wgnu-folding-constant) if -pedantic is selected.

GCC does not seem to allow this (const is interpreted as read-only)

See explanation in this thread:

Initializer element is not constant error for no reason in Linux GCC, compiling C

Related posts on array :

  • Difference between ArrayIterator, ArrayObject and Array in PHP
  • postgresql – Querying Postgres 9.6 JSONB array of objects
  • python 2.7 – Doing an NDB IN query with an array
  • Return Largest Numbers in Arrays in javascript
  • set – No Java implementations for arrayset
  • java – Finding the second smallest integer in array
  • Correct way to synchronize ArrayList in java
  • c# – Remove element of a regular array

Содержание

  1. unixforum.org
  2. Массив с переменной длиной (объявленный глобальным и локальным. Чем обусловлена разница?)
  3. Массив с переменной длиной
  4. Re: Массив с переменной длиной
  5. Re: Массив с переменной длиной
  6. Re: Массив с переменной длиной
  7. Re: Массив с переменной длиной
  8. Re: Массив с переменной длиной
  9. Re: Массив с переменной длиной
  10. Re: Массив с переменной длиной
  11. Re: Массив с переменной длиной
  12. Re: Массив с переменной длиной
  13. Re: Массив с переменной длиной
  14. Re: Массив с переменной длиной
  15. Варианты задания размера массива
  16. Error variably modified at file scope что это

unixforum.org

Форум для пользователей UNIX-подобных систем

  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума

Массив с переменной длиной (объявленный глобальным и локальным. Чем обусловлена разница?)

Массив с переменной длиной

Сообщение promov » 11.10.2007 20:35

Комментировать не стал, всё ясно, как день, по моему. Во втором случае машина выдаёт информацию variably modified ‘h’ at file scope.
Всё же правильно вроде. Ну пусть во втором случае массив объявлен глобальным, ну и что?
Переменная j заранее ведь определена. И синтаксис соблюдён. И вот ещё: чем таким принципиальным отличается вторая программа от третьей?:

Третья-то работает. В дебри, наверное, влазить надо. Надеюсь на помощь. C уважением promov.
Или так: в языке C существует правило- массив неопределённой длины не может быть глобальным. Если бы кто-нибудь указал мне на место где это правило* прописано я был бы ему очень благодарен.

*само собой это не разумеется.

Re: Массив с переменной длиной

x86 Контактная информация:

Re: Массив с переменной длиной

Сообщение m11 » 11.10.2007 21:48

Re: Массив с переменной длиной

x86 Контактная информация:

Re: Массив с переменной длиной

Сообщение m11 » 11.10.2007 22:27

Re: Массив с переменной длиной

Re: Массив с переменной длиной

Сообщение Liksys » 11.10.2007 22:36

Re: Массив с переменной длиной

Сообщение promov » 11.10.2007 22:50

Спасибо, конечно, но я лучше на веру приму, что

x86 Контактная информация:

Re: Массив с переменной длиной

Сообщение m11 » 11.10.2007 23:01

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

А под словом массив, насколько я знаю, принято иметь ввиду все же каким-либо образом проиндексированный набор подобных единиц информации, а не вот эту конструкцию с использованием [ ]. (хотя вопрос тоже спорный)

Re: Массив с переменной длиной

Сообщение v04bvs » 12.10.2007 07:32

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

А под словом массив, насколько я знаю, принято иметь ввиду все же каким-либо образом проиндексированный набор подобных единиц информации, а не вот эту конструкцию с использованием [ ]. (хотя вопрос тоже спорный)

В С++ массив и указатель это разные типы, что проявляется, в частности, при перегрузке функций. К массиву можно применять sizeof и он вернёт размер массива.

Re: Массив с переменной длиной

Сообщение sergio » 12.10.2007 11:40

Дело не в глобальности, а в классе хранения. Массив неопределённой длины не может иметь статический класс хранения. Грубо говоря, при компиляции такой массив будет зашит в сегмент данных вашего выполняемого файла, в куче со всеми литералами и глобальными константами, есессно его размер на момент компиляции должен быть известен, иначе сколько зашивать-то?
Массивы с автоматическим хранением получаются сдвигом указателя стэка во время выполнения, там все просто (хотя десять лет назад и для них требовался константный на момент компиляции размер). Неглобальный но статический массив внутри функции GCC тоже не дает объявить зависимым от переменной.

Вернее, он будет зашит, если чем-то инициализирован. Если нет, то видимо GCC генерит для него разворачивание-размещение после загрузки (до входа в main и пр.). Но возможно это все детали реализации, надо стандарты смотреть.

Re: Массив с переменной длиной

Сообщение promov » 13.10.2007 17:15

Вот, кажется, ответ на мой вопрос:
«Внутри функции или блока можно задавать размер массива с помощью выражений, содержащих переменные. В этом случае размер массива вычисляется во время выполнения программы. Например, в функции

int makeValis (int n) <
int valArray [n];
.
>

объявляетсяавтоматически массив с именем valArray и размером n элементов, где значение n вычисляется во время выполнения и может изменяться при отдельных вызовах этой функции. Массивы переменного размера нельзя инициализировать во время объявления.»
Cтефан Кочан, «Программирование на языке С», Москва- Санкт-Петербург- Киев, 2007 год.
Естественно, в конце книги, среди перечня чего-то там, мелкими буквами.

Я это пишу для таких же бедолаг, как я, благо название темы гвоворит само за себя и им легко (относительно) будет найти ответ на этот вопрос, если, конечно, второй возникнет.

Источник

Варианты задания размера массива

Я смотрю, трекер в последние дни запестрел вопросами по C, подброшу свой.

Есть «глобальный» массив, к нему много обращений из разных файлов:

Как я вижу, gcc -std=gnu11 , в отличие от g++, не принимает const int N и требует #define . А есть ли ещё варианты, которые позволили бы работать с разными N? calloc и free ? Ещё что-нибудь?

Лень проверять сейчас мини-примеры, но VLA точно есть в C99 и кажется, в C++11 тоже.

Как опциональное. Потому расчитывать не стоит.

Черт, век живи — век учись:

Оказывается, глобальные VLA таки не разрешены. Хотя мне почему-то казалось, что запилить локальные VLA сложнее, чем глобальные.

VLA должен быть в gnu11 , но я так понял, что внутри функции. Вот, пример с вики:

А если попытаться такое проделать в начале файла, то будет variably modified at file scope .

mix_mix

Да, так срабатывает. Не пользовался таким вариантом раньше, поэтому 2 вопроса, пока не зарылся в дальнейший код: 1)можно ли это значение задавать из пользовательского ввода, скажем? 2)как у него с видимостью? Можно ли в другом файле сделать цикл: for(int i=0; i ?

Источник

Error variably modified at file scope что это

есть такой, прекрасно работающий на clang код:

однако gcc 6.3.0 отказывается его компилировать с вот такой замечательной ошибочкой:

к сожалению развернуть llvm на этом устройстве (uname -a
Linux nserv 3.10.102 #15101 SMP Mon May 22 10:01:45 CST 2017 armv7l GNU/Linux synology_armada38x_ds116 ) пока невозможно,

соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?

От: rg45
Дата: 25.05.17 08:29
Оценка: -1

Здравствуйте, Quarter-123, Вы писали:

Q1>однако gcc 6.3.0 отказывается его компилировать с вот такой замечательной ошибочкой:
Q1>
Q1>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?

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

От: niXman https://github.com/niXman
Дата: 25.05.17 08:35
Оценка: 5 (1)
От: Quarter-123
Дата: 25.05.17 08:46
Оценка:

Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Quarter-123, Вы писали:

Q1>>однако gcc 6.3.0 отказывается его компилировать с вот такой замечательной ошибочкой:
Q1>>
Q1>>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?

R>У меня есть смутные подозрения, что дело не в константе. Проверь, пожалуйста, устраняется ли проблема в таком варианте:

R>

Увы, даже вот так валится

должно быть какое-то расширение, которое заставит gcc поддерживать стандарт (?) clang, но я не могу его найти.

От: niXman https://github.com/niXman
Дата: 25.05.17 08:50
Оценка:

либо баг компилятора, либо я хз.
у меня даже в Си режиме компилится этот код:
http://coliru.stacked-crooked.com/a/b9b1b7452ce3547d

От: Quarter-123
Дата: 25.05.17 08:55
Оценка:

X>либо баг компилятора, либо я хз.
X>у меня даже в Си режиме компилится этот код:
X>http://coliru.stacked-crooked.com/a/b9b1b7452ce3547d

А какая у вас версия gcc/OS?

От: rg45
Дата: 25.05.17 08:56
Оценка:

Здравствуйте, Quarter-123, Вы писали:

R>>

Q1>Увы, даже вот так валится

То есть, когда SZ определен при помощи макроса, работает, а по-другому нет? Это действительно странно.
А если так:

От: niXman https://github.com/niXman
Дата: 25.05.17 08:59
Оценка: 2 (1)

Здравствуйте, Quarter-123, Вы писали:

Q1>А какая у вас версия gcc/OS?
сорри, мой косяк, ввел в заблуждение %)

От: niXman https://github.com/niXman
Дата: 25.05.17 09:00
Оценка: +1
От: Quarter-123
Дата: 25.05.17 09:03
Оценка: +1

Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Quarter-123, Вы писали:

R>>>

Q1>>Увы, даже вот так валится

R>То есть, когда SZ определен при помощи макроса, работает, а по-другому нет? Это действительно странно.
R>А если так:
R>
R>?

Именно. Про макросы то компилятор не знает.

с constexpr ожидаемо валится ввиду непонятного ключевого слова

От: rg45
Дата: 25.05.17 09:03
Оценка:

Здравствуйте, niXman, Вы писали:

R>>static constexpr int SZ = 100;
X>а разве constexpr есть в сях? оО

Пардон, ступил. Рефлексы-с

От: Quarter-123
Дата: 25.05.17 09:08
Оценка:

Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Quarter-123, Вы писали:

Q1>>А какая у вас версия gcc/OS?
X>сорри, мой косяк, ввел в заблуждение %)

X>вот правильный тест:
X>http://coliru.stacked-crooked.com/a/d20f1d4624cb547b
X>и да, не компилится. GCC-7.1.0.

X>вот фикс:
X>http://coliru.stacked-crooked.com/a/4971e04b243d9395

Ну вот, значит уже общий знаменатель есть

Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.

От: niXman https://github.com/niXman
Дата: 25.05.17 09:14
Оценка:
От: niXman https://github.com/niXman
Дата: 25.05.17 09:15
Оценка:
От: Quarter-123
Дата: 25.05.17 09:30
Оценка:

Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Quarter-123, Вы писали:

Q1>>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.
X>а чем enum не подходит? это тоже интегральний тип, его можно использовать так же, как и const int.

безусловно, равно как и определить через #define, но это достаточно некислое изменение многих файлов. Чего бы крайне не хотелось.

От: rg45
Дата: 25.05.17 09:47
Оценка:

Здравствуйте, Quarter-123, Вы писали:

Q1>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.

Да уж, вопрос стоит так, что в С не работает даже предельно упрощенный вариант:

От: Quarter-123
Дата: 25.05.17 10:03
Оценка:

Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Quarter-123, Вы писали:

Q1>>Фикс классный, но вопрос, увы, не так стоит. А как заставить именно с const int заработать.

R>Да уж, вопрос стоит так, что в С не работает даже предельно упрощенный вариант:

R>http://ideone.com/uHFQYX
R>
R>

я бы сказал таки в gcc, в clang всё работает и, как я понимаю, по С11 должно работать.

От: Zhendos
Дата: 25.05.17 10:10
Оценка: 1 (1)

Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Quarter-123, Вы писали:

R>>>

Q1>>Увы, даже вот так валится

R>То есть, когда SZ определен при помощи макроса, работает, а по-другому нет? Это действительно странно.

А что в этом странного? В C `const` это просто readonly, это не константа времени
выполнения:

От: Zhendos
Дата: 25.05.17 10:14
Оценка:

Здравствуйте, Quarter-123, Вы писали:

Q1>есть такой, прекрасно работающий на clang код:

Q1>

Q1>однако gcc 6.3.0 отказывается его компилировать с вот такой замечательной ошибочкой:

Q1>

Q1>к сожалению развернуть llvm на этом устройстве (uname -a
Q1>Linux nserv 3.10.102 #15101 SMP Mon May 22 10:01:45 CST 2017 armv7l GNU/Linux synology_armada38x_ds116 ) пока невозможно,

Q1>соответственно вопрос к специалистам, можно ли как-то заставить gcc признать, что константа это константа и создать структуру?

Насколько я знаю нет, использование `const` в качестве размера массива не соотвествует стандарту,
`clang` то со скрипом можно заставить не принимать этот код:
`clang -std=c11 -pedantic -Werror test.c`

А среди расшерений языка С не соотвествующих стандарту нет ничего подходящего: https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
Единственный вариант переписать код в соответствии со стандартом или компилировать C код C++ компилятором (g++).

От: Quarter-123
Дата: 25.05.17 10:17
Оценка:

Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, rg45, Вы писали:

R>>Здравствуйте, Quarter-123, Вы писали:

R>>>>

Q1>>>Увы, даже вот так валится

R>>То есть, когда SZ определен при помощи макроса, работает, а по-другому нет? Это действительно странно.

Z>А что в этом странного? В C `const` это просто readonly, это не константа времени
Z>выполнения:

Z>https://stackoverflow.com/questions/34997660/defining-the-size-of-an-array-using-a-const-int
Z>https://stackoverflow.com/questions/18848537/can-a-const-variable-be-used-to-declare-the-size-of-an-array-in-c

Допустим, не хочу тут софистики. Как-то (ключ?) можно заставить gcc сжевать это?

Очевидно все данные для создания типа у него есть, а если я каким-то образом в ран-тайме изменю содержимое SZ — это мои проблемы.

Источник

Pete F

Starting Member

  • Total Posts : 77
  • Reward points : 0
  • Joined: 2018/07/18 07:49:10
  • Location: 0
  • Status: offline

 

I am setting up some variables to do an FFT on:

 //FFT Variables
int log2N =8;    //log2(256)=8 binary exponent of number of samples
int fftSamples = 256;
int32c *fftDin; //pointer to complex input array
int32c fftDout[fftSamples]; //complex output array
int32c scratch[fftSamples]; //complex scratch pad buffer
int32c fftCoefs[fftSamples]; //complex array of FFT factors, also called twiddles
int32c *fftc;
fftc=&fftCoefs;
//end FFT Variables

 (See page 37 of Voulme 5 #2 of the MPLAB Harmony v2.06 for the reference)

 The first error I get is: 
variably modified ‘fftDout’ at file scope
I don’t mind fixing errors, but I have no idea what this means.

post edited by Pete F — 2019/01/16 09:40:57

qhb

Superb Member

  • Total Posts : 9999
  • Reward points : 0
  • Joined: 2016/06/05 14:55:32
  • Location: One step ahead…
  • Status: offline

Re: what does «variably modified ‘fftDout’ at file scope» mean?


2019/01/15 13:56:55

(permalink)

Try changing
int fftSamples = 256;
to
#define fftSamples 256

Pete F

Starting Member

  • Total Posts : 77
  • Reward points : 0
  • Joined: 2018/07/18 07:49:10
  • Location: 0
  • Status: offline

Re: what does «variably modified ‘fftDout’ at file scope» mean?


2019/01/16 09:40:37

(permalink)

Thanks, that worked!

 I also had to change 
   int log2N =8; 
to
   #define log2N 8

 That is quite an error for microchip to be putting out…

 There are other issues with
    fftc=&fftCoefs;
from there, but I will deal with that later.

 Still don’t know what the error meant to really say, but results matter.

 Interestingly I saw that the DSP.H file has that original code in there.
Also interestingly in harmony, v2_06, apps, audio, real_time_fft, firmware real_time_fft.x, src, app_freq_spectrum_task this is handled differently.  But I will deal with that later also.

malaugh

Super Member

  • Total Posts : 434
  • Reward points : 0
  • Joined: 2011/03/31 14:04:42
  • Location: San Diego
  • Status: offline

Re: what does «variably modified ‘fftDout’ at file scope» mean?


2019/01/16 11:38:41

(permalink)

Peter Fournier
Thanks, that worked!
That is quite an error for microchip to be putting out…

 This is a user code error not a Microchip error.  When you declare an array in C it must be of fixed size

 int32c fftDout[256];
is a fixed size array

 #define FFT_SAMPLES  256
int32c fftDout[FFT_SAMPLES];
is a fixed size array

 int fftSamples = 256; 
int32c fftDout[fftSamples];
is a variable size array, since the value of fftSamples can be changed by the rest of the code

Понравилась статья? Поделить с друзьями:
  • Error variable used without being declared как исправить
  • Error variable qapplication app has initializer but incomplete type
  • Error variable must be of type object что это
  • Error variable must be of type object что делать line 25226
  • Error variable must be of type object как исправить