2015-10-29 21 views
8

Ho scritto il seguente codice per convertire un numero decimale in base2. probabilmente non il migliore, ma ha funzionato su Eclipse. tuttavia, quando provo a eseguirlo su Visual Studio, ottengo questo messaggio di errore sulla riga 10 (sottolineato): "l'espressione non ha valutato una costante". Perché è quello?espressione non valutata a una costante- C++

long base2(int number) { 
    int remainder, sizeOfRetNum, isNegative = 0; 
    if (number<0) 
     isNegative = 1; 
    int temp = number; 
    while (temp != 0) { 
     sizeOfRetNum++; 
     temp = temp/2; 
    } 
    char ansString[sizeOfRetNum]; // ********line 10******** 
    int j = sizeOfRetNum - 1; 
    while (number != 0) { 
     remainder = number % 2; 
     number = number/2; 
     if (remainder == 0) 
      ansString[j] = '0'; 
     else 
      ansString[j] = '1'; 
     j--; 
    } 
    long ansNum = atol(ansString); 
    if (isNegative == 1) 
     ansNum = -ansNum; 
    return ansNum; 
} 

risposta

13
char ansString[sizeOfRetNum]; 

È un Variable Length Array e non è standard in C++. Alcuni compilatori come GCC li consentono come estensioni ma MSVS non li compila.

Al fine di ottenere una matrice dinamica è necessario usare un puntatore e new

char* ansString = new char[sizeOfRetNum]; 

O meglio ancora, rielaborare la funzione di usare un std::string, che si occupa della gestione della memoria per voi.

6

sizeOfRetNum non è un valore costante, in altre parole, il suo valore non è noto al momento della compilazione.

Quando si desidera allocare memoria e non si conosce il valore fino al runtime, è necessario utilizzare l'allocazione dinamica della memoria. Questo viene fatto in C++ con operator new. Anche la memoria allocata con new deve essere liberata con delete o delete[].

Modifica char ansString[sizeOfRetNum]; a char * ansString = new char[sizeOfRetNum];. Non dimenticare di chiamare delete [] ansString; prima che la funzione ritorni, o si verificherà una perdita di memoria.

Problemi correlati