#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]. Почему?
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
Строка float x [size] [2]
не будет работать, потому что массивы должны быть выделены во время компиляции (с несколько исключений, специфичных для компилятора). Если вы хотите иметь возможность легко изменять размер массива x
во время компиляции , вы можете сделать это:
#define SIZE 100
float x[SIZE][2];
Если вы действительно хотите выделить массив на основе информации у вас есть только во время выполнения, вам необходимо динамически выделить массив с помощью malloc
или new
.
Это ограничение языка. Размеры массивов должны быть постоянными выражениями. Вот частичное подтверждение от cplusplus.com
ПРИМЕЧАНИЕ. Поле elements в скобках [], которое представляет количество элементов, которые будет содержать массив, должно быть постоянным значением, поскольку массивы представляют собой блоки нединамической памяти, размер которых должно быть определено перед казнью. Для создания массивов с переменной длиной необходима динамическая память, что будет объяснено позже в этих руководствах.
Размер автоматического массива должен быть константой времени компиляции.
const int size = 100;
float x[size][2];
Если бы размер не был известен во время компиляции (например, введен пользователем, определен из содержимого файла), вам нужно было бы использовать динамическое распределение, например:
std::vector<std::pair<float, float> > x(somesize);
(Вместо пары, выделенный Point struct/class имел бы смысл)
.Вы не присвоили никакого значения размеру; таким образом, компилятор не может выделить память для массива. (Массив нулевого размера? Что?)
Кроме того, вам нужно сделать SIZE константой, а не переменной.
РЕДАКТИРОВАТЬ: К сожалению, этот ответ больше не имеет смысла, поскольку автор изменил свой вопрос.
Массив будет выделен во время компиляции, и поскольку размер
не является константой, компилятор не может точно определить его значение.
Вы не можете иметь массивы переменной длины (как они называются в C99) в C ++. Вам необходимо использовать динамически выделяемые массивы (если размер меняется) или статическое интегральное постоянное выражение для размера.