【问题标题】:expression did not evaluate to a constant- c++表达式未计算为常量- c++
【发布时间】:2015-10-29 19:59:04
【问题描述】:

我编写了以下代码,用于将十进制数转换为 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;
}

【问题讨论】:

    标签: c++


    【解决方案1】:
    char ansString[sizeOfRetNum]; 
    

    Variable Length Array,在 C++ 中不是标准的。像 GCC 等一些编译器允许它们作为扩展,但 MSVS 不会编译它们。

    为了获得动态数组,您需要使用指针和new

    char* ansString = new char[sizeOfRetNum];
    

    或者更好的是,重新编写函数以使用 std::string,它会为您处理内存管理。

    【讨论】:

    • 如果类型是 double 而不是 char 怎么办?我得到了同样的错误
    • 类型无关紧要。您不能在可移植代码中使用可变长度数组。对非字符串类型使用std::vector&lt;double&gt;,对那些类型使用std::string
    【解决方案2】:

    sizeOfRetNum 不是一个常量值 - 换句话说,它的值在编译时是未知的。

    当您要分配内存并且直到运行时才知道值时,您需要使用动态内存分配。这是在 C++ 中使用operator new 完成的。您使用new 分配给自己的内存也需要使用deletedelete[] 释放。

    char ansString[sizeOfRetNum]; 更改为char * ansString = new char[sizeOfRetNum];。不要忘记在函数返回之前调用delete [] ansString;,否则会发生内存泄漏。

    【讨论】:

      【解决方案3】:

      如果你想将它用于 C 实现,你可以使用 malloc 而不是 new。如果你不这样做,你可以适当地使用 @NathanOliver 指出的 std::string 。

      char* 字符串; // ********第 10 行********

      ansString = (char*)malloc(sizeOfRetNum*sizeof(char)); // ********第 11 行********

      【讨论】:

        【解决方案4】:

        上述解决方案适用于 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);
        

        希望这会有所帮助。干杯

        【讨论】:

          猜你喜欢
          • 2016-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-26
          • 1970-01-01
          • 1970-01-01
          • 2014-04-09
          相关资源
          最近更新 更多