LINUX.ORG.RU

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

 ,


0

1

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

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

sometype somelist[N]

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

Ответ на: комментарий от WizardOfOz

и кажется, в C++11 тоже

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

Pavval ★★★★★
()
Ответ на: комментарий от WizardOfOz

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

test.c:4:5: error: variable length array declaration not allowed at file scope
int foobar[N];
    ^      ~

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

WizardOfOz
()
Ответ на: комментарий от WizardOfOz

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

float read_and_process(int n)
{
    float vals[n];

    for (int i = 0; i < n; i++)
        vals[i] = read_val();
    return process(n, vals);
}

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

mix_mix

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

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от WizardOfOz

глобальные VLA таки не разрешены

Вот и я о том же.

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от al_exquemelin

можно ли это значение задавать из пользовательского ввода, скажем?

Разумеется, нет.

как у него с видимостью?

Глобальная.

mix_mix ★★★★★
()
Ответ на: комментарий от WizardOfOz

Оказывается, глобальные VLA таки не разрешены.

Разумеется, нет. В функциях на стеке место выделяется, а в .bss ты как предлагаешь?

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

А глобальный scope тождественно равен размещению в .bss? Я специально об этом не задумывался раньше, но сейчас как раз подумал, что если речь идет о global VLA, то можно в рантайме у ядра попросить нужное количество нулевых страниц замапить.

WizardOfOz
()
Ответ на: комментарий от mix_mix

Разумеется, нет.

А жаль-с. Похоже, придётся писать что-то типа calloc(N, sizeof(sometype));, или как там правильно.

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от WizardOfOz

Как ты его сделаешь глобально?
Локалиный - понятно, стекпойнтер сдвигает как это было бы при рекурсии.
А как ты хочешь в статической секции выделить заранее не зная сколько байт?

mittorn ★★★★★
()
Ответ на: комментарий от vromanov

mittorn

Ну, если бы я знал, как, то уже бы писал proposal или патч фигачил:) Я ж говорю, что я и раньше знал о связи global scope'а и .bss, но всерьез об этом никогда не задумывался, и подозревал, что возможны исключения.

WizardOfOz
()

а потом почему то выскакивает stack overflow...

quest ★★★★
()
Ответ на: комментарий от WizardOfOz

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

mittorn ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.