2015-10-29 50 views
8

10進数をbase2に変換する次のコードを記述しました。 おそらく最高のものではありませんが、それは日食で働いていました。 しかし、私はVisual Studio上でそれを実行しようとすると、10行目(強調表示)にこのエラーメッセージが表示されます。「式が定数に評価されませんでした」 なぜですか?式が定数に評価されていない

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

答えて

13
char ansString[sizeOfRetNum]; 

Variable Length Arrayであり、C++での標準ではありません。 GCCのようなコンパイラの中には拡張機能としてそれらを許可していますが、MSVSはそれらをコンパイルしません。あなたはあなたのためのメモリ管理を扱うstd::stringを、使用する機能を手直し、まだポインタとnew

char* ansString = new char[sizeOfRetNum]; 

またはそれ以上を使用する必要があります動的配列を得るために

6

sizeOfRetNumは一定値ではない - つまり、その値は、コンパイル時に知られていません。

メモリを割り当て、実行時まで値がわからない場合は、動的メモリ割り当てを使用する必要があります。これはC++でoperator newで行われます。あなたがnewで自分自身を割り当てるメモリは、deleteまたはdelete[]で解放する必要があります。 char * ansString = new char[sizeOfRetNum];

変更char ansString[sizeOfRetNum];。関数が戻る前にdelete [] ansString;に電話することを忘れないでください。そうしないと、メモリリークが発生します。

関連する問題