我在 CodeBlocks(使用 gcc)中编译了一个程序,它运行良好。 现在我尝试从命令行使用 gcc 编译同一个程序。它产生了这个错误:
error: lvalue required as left operand of assignment
对于这四行:
OutArray[Index[g]].real() = TempVBF.FirstReal[g];
OutArray[Index[g]].imag() = TempVBF.FirstImag[g];
OutArray[Index[g]+ElementSize].real() = TempVBF.SecondReal[g];
OutArray[Index[g]+ElementSize].imag() = TempVBF.SecondImag[g];
在这些行中,我有四个值,包含 2 个复数的实部和虚部。我将这些值分配给 2 个复杂变量。 我试着这样做:
OutArray[Index[g]] = (TempVBF.FirstReal[g],TempVBF.FirstImag[g]);
编译但在运行时生成错误值
为什么它先编译但现在不编译??在不更改这些行的情况下,我可以使用什么选项来解决这个问题??
我正在使用命令:
gcc lib/Globals.cpp lib/Comp/SNT_FFT_Comp.cpp lib/Comp/ST_FFT_Comp.cpp lib/Comp/VNT_FFT_Comp.cpp lib/Comp/VT_FFT_Comp.cpp lib/Decomp/* test/main.cpp -lpthread -std=gnu++0x -o TEST
删除 -std=gnu++0x
会产生更多错误。将其更改为 -std=c++0x
不会有任何改变。
最佳答案
您看到的错误几乎可以肯定是因为 real()
和 imag()
返回实部或虚部的值;不是对它的引用。没有看到代码,就不可能确定,但更可能是这样定义的:
double real() const { return this->_real; }
像这样:
double& real() { return this->_real; }
对于后一种情况,您可以使用引用来执行赋值。对于前一种情况,您拥有复数实部的拷贝,并且不能用它来更改复数。你可以read more about lhvalues and rhvalues如果你愿意的话。
至于为什么它首先不起作用,这几乎是不可能回答的。您提供的代码似乎缺少类型——换句话说,看起来您应该这样做:
OutArray[Index[g]] = MyComplexNumberClass(TempVBF.FirstReal[g],TempVBF.FirstImag[g]);
为什么这些值是错误的可能是由于很多原因造成的(内存占用、索引“g”错误、复数没有您认为它们应该具有的值等)。要调试它,您可以尝试逐步打印事物的值,直到看到您不期望的东西,使用 std::cerr
或 by using gbd .
关于c++ - complex.h 的 gcc 编译器选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16455103/