2012-06-12 4 views
0

Я пытаюсь написать систему сокетов, которая должна обрабатывать чрезвычайно длинные сообщения (она обрабатывает чат-систему). Я пытаюсь использовать const int для инициализации массива, который компилируется, но я предупрежден о том, что ISO C++ запрещает его. Может ли кто-то пролить свет на ситуацию?C++ Variable Array

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

const int BUFFERLEN = atoi(api_GETVALUE(1,inbuffer).c_str()); //that is my API call 
     if(BUFFERLEN != -1) { //it returns "-1" on error 
      char INBUFFER[BUFFERLEN]; 
      recv(SOCK,INBUFFER,sizeof(INBUFFER),0); 
     } 

Это приемлемо вообще, или я должен придерживаться метода многократного приема-до-завершения?

Спасибо, Collin

+0

Либо делать несколько меньших, либо динамически выделять буфер. –

ответ

5
const int BUFFERLEN = atoi(api_GETVALUE(1,inbuffer).c_str()); //that is my API call 
     if(BUFFERLEN != -1) { //it returns "-1" on error 
      std::vector<char> INBUFFER(BUFFERLEN); 
      recv(SOCK,INBUFFER.data(),INBUFFER.size(),0); 
     } 
+0

Большое спасибо всем, кто выложил, я понимаю сейчас. Я даже не понял, что могу использовать вектор для приема данных из сокета, это именно то, что мне нужно. Я пишу большую часть своего кода в стиле C, так как я еще не изучил некоторые из наиболее полезных функций STL. –

2

При использовании массива C++ размер должен быть известен во время компиляции. В противном случае вам необходимо использовать динамическое распределение. const не обязательно означает, что BUFFERLEN является константой времени компиляции.

1

Я пытаюсь использовать const int для инициализации массива, который скомпилируется, но я предупреждаю о том, что ISO C++ запрещает его. Может ли кто-то пролить свет на ситуацию?

Это происходит потому, что const int в вашей программе не является фактически постоянным выражением (значение, которое известно во время компиляции), что означает, что объявленный массив в вашей программе является переменной длиной Array (VLA), который не допускается ISO C++. Ваша программа компилируется, потому что ваш компилятор предоставляет VLA в качестве расширения.

То, что вы можете использовать, называется std::vector<char>.

Так вместо того,

char INBUFFER[BUFFERLEN]; //old code 

вы можете использовать

std::vector<char> INBUFFER(BUFFERLEN); //new code 

и вместо того, чтобы,

recv(SOCK,INBUFFER,sizeof(INBUFFER),0); //old code 

вы можете написать:

recv(SOCK, &INBUFFER[0], INBUFFER.size(),0); //new code 
0

C++ 98 не допускает массивы переменной длины. Не имеет значения, что ваш int является «const», потому что размер не может быть определен заранее. Допустимым решением является создание оболочки вокруг char *, которая управляет распределением и нераспределением собственной памяти.