0

我在 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更改为没有任何改变。

4

1 回答 1

1

您看到的错误几乎可以肯定是因为返回了实real()imag()或虚部的值;不是对它的引用。如果没有看到代码,就不可能确定,但​​它更有可能是这样定义的:

double real() const { return this->_real; }

比这样:

double& real() { return this->_real; }

对于后一种情况,您可以使用引用来执行分配。对于前一种情况,您拥有复数实部的副本,并且您不能用它来更改复数。如果你愿意,你可以阅读更多关于 lhvalues 和 rhvalues 的信息

至于为什么它一开始就不起作用,这几乎是不可能回答的。您提供的代码似乎缺少一种类型 - 换句话说,您似乎应该执行以下操作:

OutArray[Index[g]] = MyComplexNumberClass(TempVBF.FirstReal[g],TempVBF.FirstImag[g]);

为什么这些值是错误的可能是由于很多事情(记忆跺脚,索引“g”错误,复数没有您认为它们应该具有的值等)。要调试它,您可以尝试逐步打印事物的值,直到看到您不期望的东西,无论是使用 gbdstd::cerr还是使用 gbd

于 2013-05-09T06:30:52.387 回答