Вопрос

#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]. Почему?

Это было полезно?

Решение

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 шаблон, который эффективно представляет 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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top