C++ ожидал константное выражение

#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++;
}

Эта программа дает мне ожидаемую ошибку константного выражения на строке, где я объявляю плавание x [размер] [2]. Почему?

7
задан Peter Alexander 15 March 2010 в 17:46
поделиться

7 ответов

float x[size][2];

Это не работает, потому что объявленные массивы не могут иметь размеры во время выполнения. Попробуйте вектор:

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

Или используйте new

// 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.

Если у вас нет boost, сделайте свой собственный тип массива, который можно вставить в vector

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, который фактически является in-place typedef (также доступен в boost)

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

Если вы хотите, вы также можете использовать вектор из std: :pair

std::vector< std::pair<float, float> > x(size);
// syntax: x[i].first, x[i].second
12
ответ дан 6 December 2019 в 06:03
поделиться

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

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

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

2
ответ дан 6 December 2019 в 06:03
поделиться

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

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

1
ответ дан 6 December 2019 в 06:03
поделиться

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

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

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

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

(Вместо пары, выделенный Point struct/class имел бы смысл)

.
1
ответ дан 6 December 2019 в 06:03
поделиться

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

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

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

1
ответ дан 6 December 2019 в 06:03
поделиться

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

8
ответ дан 6 December 2019 в 06:03
поделиться

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

4
ответ дан 6 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: