2010-03-19 3 views
0

Я работал над программой в Netbeans в Linux, используя компилятор gcc, когда при переходе на Visual C++ в Windows 7 код не удалось скомпилировать, так как Visual C++ говорит об этом expected constant expression на нескольких строках. На Netbeans, я просто сделал что-то похожее на char name[fullName.size()];, в то время как на Visual C++, я пытался, среди прочего,Создание массива с константой

const int position = fullName.size(); 
char Name[position]; 

Как я могу создать константу использовать для массива?

Примечание: Я знаю о this question, но есть ли способ получить эту работу без использования векторов, поскольку для этого потребуется переписать многие части программы?

+1

Фактический вопрос здесь: «Как создать массив из не заданного размера в стеке?» И ответ: вы не можете в VC++. –

+0

Что такое fullname.size()? выглядит как вызов функции, который был бы вызовом во время выполнения и, следовательно, не постоянным выражением. –

+0

fullname.size() - длина строки. Это вызов функции – wrongusername

ответ

1

В VC++ вы не можете делать заявления среды выполнения размеров стека массивов, но вы можете сделать выделение стека через _alloca

так это:

const int position = fullName.size(); 
char Name[position]; 

становится этим:

const int position = fullName.size(); 
char * Name = (char*)_alloca(position * sizeof(char)); 

Это не совсем то же самое, но это так близко, как вы собираетесь попасть в VC++.

+4

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

+0

@George: куча могла бы стать лучшим выбором для массива объектов, но для простой строки буфер, это худший выбор. –

+0

Почему бы просто не использовать std :: string? Он говорит, что он новичок, это самая простая вещь для использования. –

2

Это невозможно в VC++. Я знаю, довольно грустно :(

Решения включают в себя:

  • Создать его в куче
  • Сделать постоянным

Новый C++ стандарт (C++ 0x) предлагает функция «постоянного выражения» для этого. Для получения дополнительной информации проверьте this.

+0

Спасибо! Я не могу сделать это постоянным, так как не знаю, какой будет размер строки. Что вы подразумеваете под «созданием его в куче?» Извините, я все еще новичок в программировании. – wrongusername

+0

Выделить память с помощью 'new' и бесплатно с' delete' –

+1

Что действительно означает использование 'vector'.Существует никаких причин, по которым они несут необработанные распределения памяти, они утечки и затрудняют жизнь. – GManNickG

1

C++ требует, чтобы размер массива был известен во время компиляции. Если вы не против usin g нестандартное расширение, gcc позволяет использовать код, как вы делаете (обратите внимание, что, хотя он не является стандартным C++, он равен в C, начиная с C99).

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

0

Ваш char name[fullName.size()]; является примером variable-length array, который, насколько я знаю, не стандартизирован на C++, поэтому вы находитесь на милость компилятора. [Немного не по теме они являются частью стандарта C99]

Смежные вопросы