带有complex.h的gcc编译器选项

时间:2013-05-09 05:37:55

标签: c++ gcc

我在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不会改变任何内容。

1 个答案:

答案 0 :(得分: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