表达式没有评估为常量c ++

时间:2015-10-29 19:59:04

标签: 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;
}

4 个答案:

答案 0 :(得分:26)

char ansString[sizeOfRetNum]; 

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

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

char* ansString = new char[sizeOfRetNum];

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

答案 1 :(得分:6)

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

如果要分配内存并且在运行时之前不知道该值,则需要使用动态内存分配。这是使用operator new在C ++中完成的。您使用new分配的内存也需要使用deletedelete[]释放。

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

答案 2 :(得分:0)

以上所有解决方案都适用于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);

希望这会有所帮助。干杯

答案 3 :(得分:0)

如果要将malloc用于C实现,则可以使用malloc代替new。如果不这样做的话,可以适当地使用@NathanOliver指出的std :: string。

char * ansString; // ********第10 ********行

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