C ++ ожидается постоянное выражение
-
20-09-2019 - |
Вопрос
#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
(Это обертка вокруг динамического распределения массива) для определения размеров массива во время выполнения.
Вы не присвоили никакого значения размеру; Таким образом, компилятор не может выделить память для массива. (Массив нулевого размера? Что?)
Кроме того, вам нужно сделать размер постоянным, а не переменной.
РЕДАКТИРОВАТЬ: К сожалению, этот ответ больше не имеет смысла, так как плакат изменил их вопрос.