我编写了以下代码,用于将十进制数转换为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;
}
Run Code Online (Sandbox Code Playgroud)
Nat*_*ica 29
char ansString[sizeOfRetNum];
Run Code Online (Sandbox Code Playgroud)
是可变长度数组,在C++中不是标准的.像GCC这样的编译器允许它们作为扩展,但MSVS不会编译它们.
为了获得动态数组,您需要使用指针和 new
char* ansString = new char[sizeOfRetNum];
Run Code Online (Sandbox Code Playgroud)
或者更好的是,重做函数以使用a std::string,它为您处理内存管理.
sizeOfRetNum 不是一个常量值 - 换句话说,它的值在编译时是不知道的.
如果要分配内存并且在运行时之前不知道该值,则需要使用动态内存分配.这是在C++中完成的operator new.你自己分配的内存new也需要用delete或释放delete[].
更改char ansString[sizeOfRetNum];到char * ansString = new char[sizeOfRetNum];.delete [] ansString;在函数返回之前不要忘记调用,否则会发生内存泄漏.
| 归档时间: |
|
| 查看次数: |
27577 次 |
| 最近记录: |