簡體   English   中英

表達式沒有計算為常量 - C++

[英]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分配的內存也需要用deletedelete[]釋放。

更改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM