繁体   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