2015-10-29 21 views
8

Bir ondalık sayıyı taban2'ye dönüştürmek için aşağıdaki kodu yazdım. muhtemelen en iyi değil, ama tutulma üzerinde çalıştı. Ancak, görsel stüdyosunda çalıştırmayı denediğimde, bu hata iletisini satır 10 (vurgulanan): "ifade bir sabit olarak değerlendirilmedi". Neden?ifadesi, bir sabit + için değerlendirilmedi ++

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; 
} 

cevap

13
char ansString[sizeOfRetNum]; 

bir Variable Length Array mi ve C++ standart değildir. GCC gibi bazı derleyiciler onları bir uzantı olarak kabul eder ancak MSVS bunları derlemez. Eğer, daha iyisi bir işaretçi ve new

char* ansString = new char[sizeOfRetNum]; 

Veya kullanmak sizin için bellek yönetimini işleyen bir std::string, kullanımı işlevini yeniden çalışmanız gerekir dinamik bir dizi elde etmek için

.

6

sizeOfRetNum sabit bir değer değildir - diğer bir deyişle, değeri derleme zamanında bilinmemektedir.

Belleği ayırmaya ve çalışma süresi kadar değer bilmiyorum istiyorum

, dinamik bellek ayırmayı kullanmak gerekir. Bu, C++ 'da operator new ile yapılır. Kendinizi new ile ayırdığınız bellek de delete veya delete[] ile serbest bırakılmalıdır. char * ansString = new char[sizeOfRetNum]; için

Değişim char ansString[sizeOfRetNum];. İşlev geri gelmeden önce delete [] ansString; numaralı telefonu aramayı unutmayın ya da bir bellek sızıntınız olacaktır.