[英]expression did not evaluate to a constant- c++
我編寫了以下代碼來將十進制數轉換為 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;
}
char ansString[sizeOfRetNum];
是一個可變長度數組,在 C++ 中不是標准的。 一些像 GCC 這樣的編譯器允許它們作為擴展,但 MSVS 不會編譯它們。
為了獲得動態數組,您需要使用指針和new
char* ansString = new char[sizeOfRetNum];
或者更好的是,重新編寫函數以使用std::string
,它為您處理內存管理。
sizeOfRetNum
不是一個常數值——換句話說,它的值在編譯時是未知的。
當你想分配內存並且直到運行時才知道值時,你需要使用動態內存分配。 這是在 C++ 中使用operator new
。 你用new
分配的內存也需要用delete
或delete[]
釋放。
更改char ansString[sizeOfRetNum];
to char * ansString = new char[sizeOfRetNum];
. 不要忘記調用delete [] ansString;
在函數返回之前,否則會出現內存泄漏。
以上解決方案適用於 char 類型。 如果您有不同的類型,例如 double 或 float 或任何其他用戶定義的類型,則不會
double sample_float_array (n+1) //suppose n is a number passed in the functions
為了完成你想要的,所以要在 MSVS 中編譯,你可能需要像下面這樣寫
std::vector <double> sample_float_array;
sample_float_array.resize (n+1);
希望這可以幫助。 干杯
如果您想將它用於 C 實現,您可以使用 malloc 而不是 new。 如果你不這樣做,你可以像@NathanOliver 指出的那樣使用 std::string 。
字符* ansString; // ********第 10 行********
ansString = (char*)malloc(sizeOfRetNum*sizeof(char)); // ********第 11 行********
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.