2013-05-09 186 views
0

我在CodeBlocks(使用gcc)中编译了一个程序,它工作正常。 现在我试图从命令行使用gcc编译相同的程序。它产生这样的错误:gcc与complex.h的编译器选项

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不会发生任何变化。

回答

1

你看到的错误几乎肯定是因为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::cerrby using gbd