2014-04-15 251 views
1

有一个问题,当我要定义一个复杂的阵列:复杂阵列初始化

#include<complex.h> 

int main(){ 

int matrix=1000; 
std::complex<double> y[matrix]; 

} 

的错误是“非POD元素类型‘的std ::复杂’的可变长度数组 是否有有毛病阵列这里的定义

+0

你可能想'',而不是''。 – chris

回答

0

你的编译器认为您声明一个变量长度数组,因为matrix是非const就让它不断,事情应该工作:?

const int matrix = 1000; 
std::complex<double> y[matrix]; 

该错误源于变长数组仅允许用于“哑”数据类型的事实,例如, int/char/void *和结构,但不是像std::complex这样的类。

+0

这个问题被标记为C++。不允许任何类型的VLA。 – juanchopanza

+0

这并不是正确的发布错误信息。 – juanchopanza

+0

我不知道MS VC++不支持VLA。他们使用g ++工作,所以如果这就是你需要的目标,他们将会完成这项工作。便利性是否超过便携性问题是另一个问题。 –

1

您不能静态分配大小为常规变量的C++数组,因为在执行程序之前不知道matrix的值。尝试动态地分配你的数组:

std::complex<double> y = new std::complex<double>[matrix]

当你用它做,请拨打:

delete[] y

+0

他为什么需要调用'delete []'?我只看到参考类型? –

2

这种阵列的只有一个长度是一个常量表达式的作品,即编译时必须知道长度。

为了得到一个可变长度的阵列,使用std::vector<std::complex<double>> y (matrix);

你应该(在某些情况下,或std::array)使用std::vector对C风格的数组反正。

1

在编译时必须知道数组的大小。它必须是一个不变的表达。矩阵的值只在运行时才知道。你必须使矩阵不变才能工作。

const int matrix=1000; 

另一种解决方法是使用大小可变的矢量,并在运行时初始化。

int matrix=1000; 
std::vector<std::complex<double>> y(matrix); 
+0

但我也有一行代码为 double yf [matrix]; 和编译器没有给出任何错误。有什么不同? –

1

C++不允许variable length arrays,无论这样做动态地,或者使用vector