7
#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#include <iomanip>
using std::ifstream;
using namespace std;

int main (void)

{
int count=0;
float sum=0;
float maximum=-1000000;
float sumOfX;
float sumOfY;
int size;
int negativeY=0;
int positiveX=0;
int negativeX=0;
ifstream points; //the points to be imported from file
//points.open( "data.dat");
//points>>size;
//cout<<size<<endl;

size=100;
float x[size][2];
while (count<size) {



points>>(x[count][0]);
//cout<<"x= "<<(x[count][0])<<"  ";//read in x value
points>>(x[count][1]);
//cout<<"y= "<<(x[count][1])<<endl;//read in y value


count++;
}

这个程序在我声明 float x[size][2] 的行上给了我预期的常量表达式错误。为什么?

4

8 回答 8

12
float x[size][2];

这不起作用,因为声明的数组不能具有运行时大小。尝试一个向量:

std::vector< std::array<float, 2> > x(size);

或者使用新的

// identity<float[2]>::type *px = new float[size][2];
float (*px)[2] = new float[size][2];

// ... use and then delete
delete[] px;

如果您没有可用的 C++11,则可以boost::array使用std::array.

如果您没有可用的提升,请制作您自己的数组类型,您可以坚持使用向量

template<typename T, size_t N>
struct array {
  T data[N];
  T &operator[](ptrdiff_t i) { return data[i]; }
  T const &operator[](ptrdiff_t i) const { return data[i]; }
};

为了简化 的语法new,您可以使用一个identity有效地是就地 typedef 的模板(也可用于boost

template<typename T> 
struct identity {
  typedef T type;
};

如果你愿意,你也可以使用一个向量std::pair<float, float>

std::vector< std::pair<float, float> > x(size);
// syntax: x[i].first, x[i].second
于 2010-03-15T15:47:50.263 回答
8

该数组将在编译时分配,由于size不是常量,编译器无法准确确定其值。

于 2010-03-15T15:43:27.057 回答
4

在 C++ 中不能有可变长度数组(在 C99 中称为)。您需要使用动态分配的数组(如果大小不同)或大小的静态整数常量表达式。

于 2010-03-15T15:44:10.003 回答
2

该行float x[size][2]不起作用,因为必须在编译时分配数组(有一些编译器特定的异常)。如果您希望能够x编译时轻松更改数组的大小,可以这样做:

 #define SIZE 100
 float x[SIZE][2];

如果您真的想根据仅在运行时拥有的信息分配数组,则需要使用mallocor动态分配数组new

于 2010-03-15T15:46:47.867 回答
2

自动数组的大小必须是编译时常量。

 const int size = 100;
 float x[size][2];

如果在编译时不知道大小(例如,由用户输入,由文件内容确定),则需要使用动态分配,例如:

std::vector<std::pair<float, float> > x(somesize);

(而不是一对,专用的 Point 结构/类将非常有意义。)

于 2010-03-15T15:55:39.777 回答
2

因为它需要一个常量表达式!

C(忽略 C99 的 VLA)和 C++ 中的数组维度必须是编译时已知的数量。这并不意味着只标有const:它们必须被硬编码到程序中。

使用动态分配或std::vector(它是动态数组分配的包装器)在运行时确定数组大小。

于 2011-01-02T23:00:44.720 回答
1

您没有为 size 分配任何值;因此编译器无法为数组分配内存。(一个空大小的数组?什么?)

此外,您需要将 SIZE 设为常量,而不是变量。

编辑:不幸的是,由于张贴者改变了他们的问题,这种回应不再有意义。

于 2010-03-15T15:47:31.657 回答
1

这是语言的限制。数组大小必须是常量表达式。这是来自 cplusplus.com 的部分解释

注意:括号 [] 中的元素字段表示数组将要保存的元素数量,必须是一个常量值,因为数组是非动态内存块,其大小必须在执行前确定。为了创建具有可变长度的动态内存的数组,需要在这些教程后面进行解释。

于 2010-03-15T15:45:07.163 回答