C ++ ожидается постоянное выражение - PullRequest
7 голосов
/ 15 марта 2010
#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]. Почему?

Ответы [ 8 ]

12 голосов
/ 15 марта 2010
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
8 голосов
/ 15 марта 2010

Массив будет выделен во время компиляции, и поскольку size не является константой, компилятор не может точно определить его значение.

4 голосов
/ 15 марта 2010

Вы не можете иметь массивы переменной длины (как они вызываются в C99) в C ++. Вам необходимо использовать динамически размещаемые массивы (если размер варьируется) или статическое целочисленное константное выражение для размера.

2 голосов
/ 15 марта 2010

Строка float x[size][2] не будет работать, потому что массивы должны быть выделены во время компиляции (с некоторыми исключениями, специфичными для компилятора). Если вы хотите иметь возможность легко изменять размер массива x в время компиляции , вы можете сделать это:

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

Если вы действительно хотите выделить массив на основе информации, имеющейся у вас только во время выполнения, вам нужно динамически выделить массив с помощью malloc или new.

1 голос
/ 03 января 2011

Потому что ожидалось постоянное выражение!

Размеры массива в C (игнорируя VLA в C99) и C ++ должны быть величинами, известными во время компиляции. Это не означает, что они помечены const: они имеют для жесткого кодирования в программе.

Используйте динамическое выделение или std::vector (который является оболочкой для динамического выделения массива) для определения размеров массива во время выполнения.

1 голос
/ 15 марта 2010

Размер автоматического массива должен быть константой времени компиляции.

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

Если размер не был известен во время компиляции (например, введенный пользователем, определенный из содержимого файла), вам необходимо использовать динамическое выделение, например:

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

(Вместо пары, выделенная структура / класс Point будет иметь смысл.)

1 голос
/ 15 марта 2010

Вы не присвоили никакое значение размеру; таким образом, компилятор не может выделить память для массива. (Массив нулевого размера? Что?)

Кроме того, вам нужно сделать SIZE константой, а не переменной.

РЕДАКТИРОВАТЬ: К сожалению, этот ответ больше не имеет смысла, так как постер изменил свой вопрос.

1 голос
/ 15 марта 2010

Это ограничение языка. Размеры массива должны быть постоянными выражениями. Вот частичное jsutification от cplusplus.com

ПРИМЕЧАНИЕ. Поле элементов в скобках [], представляющее число элементов, которые будет содержать массив, должно быть постоянным значением, поскольку массивы представляют собой блоки нединамической памяти, размер которых должен быть определен до выполнения. Для создания массивов с переменной длиной требуется динамическая память, что объясняется далее в этих уроках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...