我编写了以下用于将十进制数转换为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;
}
答案 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
分配的内存也需要使用delete
或delete[]
释放。
将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 ********行