C ++ espera expresión constante

#include  #include  #include  #include  #include  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>(x[count][0]); //cout<<"x= "<<(x[count][0])<>(x[count][1]); //cout<<"y= "<<(x[count][1])<<endl;//read in y value count++; } 

Este progtwig me está dando error de expresión constante esperado en la línea donde declaro float x [tamaño] [2]. ¿Por qué?

 float x[size][2]; 

Eso no funciona porque las matrices declaradas no pueden tener tamaños de tiempo de ejecución. Pruebe un vector:

 std::vector< std::array > x(size); 

O usa nuevo

 // identity::type *px = new float[size][2]; float (*px)[2] = new float[size][2]; // ... use and then delete delete[] px; 

Si no tiene disponible C ++ 11, puede usar boost::array lugar de std::array .

Si no tiene impulso disponible, cree su propio tipo de matriz y adhiérase al vector

 template struct array { T data[N]; T &operator[](ptrdiff_t i) { return data[i]; } T const &operator[](ptrdiff_t i) const { return data[i]; } }; 

Para facilitar la syntax de los new , puede usar una plantilla de identity que efectivamente es un typedef in situ (también disponible en boost )

 template struct identity { typedef T type; }; 

Si lo desea, también puede usar un vector de std::pair

 std::vector< std::pair > x(size); // syntax: x[i].first, x[i].second 

La matriz se asignará en tiempo de comstackción, y dado que el size no es una constante, el comstackdor no puede determinar con precisión su valor.

No puede tener matrices de longitud variable (como se llaman en C99) en C ++. Necesita utilizar matrices asignadas dinámicamente (si el tamaño varía) o una expresión de constante integral estática para el tamaño.

La línea float x[size][2] no funcionará, porque las matrices deben asignarse en tiempo de comstackción (con algunas excepciones específicas del comstackdor). Si desea poder cambiar fácilmente el tamaño de la matriz x en tiempo de comstackción , puede hacer esto:

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

Si realmente desea asignar la matriz en función de la información que solo tiene en tiempo de ejecución, debe asignar dinámicamente la matriz con malloc o new .

Es una restricción del lenguaje. Los tamaños de matriz deben ser expresiones constantes. Aquí hay una jutificación parcial de cplusplus.com

NOTA: El campo de elementos entre corchetes [] que representa el número de elementos que la matriz va a contener, debe ser un valor constante, ya que las matrices son bloques de memoria no dinámica cuyo tamaño debe determinarse antes de la ejecución. Para crear matrices con una longitud variable, se necesita memoria dinámica, que se explica más adelante en estos tutoriales.

El tamaño de una matriz automática debe ser una constante en tiempo de comstackción.

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

Si no se conocía el tamaño en tiempo de comstackción (por ejemplo, ingresado por el usuario, determinado a partir del contenido del archivo), necesitaría usar la asignación dinámica, por ejemplo:

 std::vector > x(somesize); 

(En lugar de un par, una estructura / clase de punto específica tendría mucho sentido).

Porque esperaba una expresión constante!

Las dimensiones del array en C (ignorando los VLA de C99) y C ++ deben ser cantidades conocidas en tiempo de comstackción. Eso no significa que solo esté etiquetado con const : tienen que estar codificados en el progtwig.

Use la asignación dinámica o std::vector (que es un envoltorio alrededor de la asignación de matriz dinámica) para determinar los tamaños de matriz en tiempo de ejecución.

No ha asignado ningún valor al tamaño; por lo tanto, el comstackdor no puede asignar la memoria para la matriz. (¿Una matriz de tamaño nulo? ¿Qué?)

Además, necesitarías hacer TAMAÑO constante, y no una variable.

EDITAR: Desafortunadamente, esta respuesta ya no tiene sentido ya que el póster ha cambiado su pregunta.