[英]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.