статически определить массив на основе значения переменной C / C ++ - PullRequest
1 голос
/ 03 мая 2011

Я хочу определить 2D-массив статически. Размер массива определяется переменной. Как мне это сделать? Я не хочу динамически определять массив. Я слышал, что есть способ сделать это.

Ответы [ 5 ]

3 голосов
/ 03 мая 2011

Ответ Нет, вы не можете в C ++ .
Размеры массива должны быть известны во время компиляции.

int my_array[6][7];   // okay  
int my_array[H][7];   // ISO C++ forbids variable length array 
int my_array[6][W];   // ISO C++ forbids variable length array 
int my_array[H][W];   // ISO C++ forbids variable length array 

Некоторые компиляторы поддерживают Variable Length Arrays (VLA) через собственное расширение, но VLA не определены в стандарте C ++, поэтому использование VLA не будет соответствовать стандарту C ++.

VLA были введены в стандарте C99 C. C ++ был разветвлен от стандарта C C98. К тому времени, когда C представил VLA, в C ++ уже были Векторы, и ему не нужно было поддерживать или поощрять VLA. Следовательно, VLA никогда не был официально принят в стандарте C ++, некоторые компиляторы C ++ все еще поддерживают VLA через расширения компилятора.

С тех пор вы пометили свой Q C, а также C ++, чтобы суммировать ответ:

In C99 & versions after that : You Can  
Versions before C99: You Can't
In C++(Any version): You can(through compiler extensions) but You should'nt

Вот легендарный C ++ FAQ , который объясняет все о массивах.
Я многому научился от этого. :)

1 голос
/ 03 мая 2011

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

1 голос
/ 03 мая 2011

Я не думаю, что вы можете определить это статически! Тем не менее, вы можете использовать вектор, но под ним тоже выполняется динамическое распределение

0 голосов
/ 03 мая 2011

Это зависит от того, где и когда переменная инициализируется.Если что-то сделано во время компиляции, вы можете использовать шаблоны, чтобы сделать это: template </* args */> struct ConstExpr{enum{value = /* math goes here */};};, иначе это невозможно без самомодифицирующегося кода (и я уверен, что это будет очень опасно, потому что вам нужно изменить PE, чтобы выможет каким-то образом получить изменение выделенного пространства до его виртуализации).

0 голосов
/ 03 мая 2011

Под "переменной" я предполагаю, что вы говорите о непостоянном значении.

В C99, да:

int size = ...;
int array[size][size];

В C ++ вы не можете. Альтернативой является использование указателей и динамического выделения (или, что еще лучше, векторов).

В версиях C до C99 это также невозможно. Используйте malloc().

...