Pregunta

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

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

¿Fue útil?

Solución

float x[size][2];

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

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

O usar nuevo

// identity<float[2]>::type *px = new float[size][2];
float (*px)[2] = new float[size][2];

// ... use and then delete
delete[] px;

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

Si no tiene un impulso disponible, haga su propio tipo de matriz, puede quedarse en 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]; }
};

Para facilitar la sintaxis de new, puedes usar un identity plantilla que efectivamente es un typedef en el lugar (también disponible en boost)

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

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

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

Otros consejos

La matriz se asignará en el momento de la compilación, y desde size no es una constante, el compilador no puede determinar con precisión su valor.

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

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

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

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

Es una restricción del idioma. Los tamaños de matriz deben ser expresiones constantes. Aquí hay una jsutificación parcial de Cplusplus.com

Nota: El campo de elementos dentro de los soportes [] que representa el número de elementos que la matriz va a mantener, 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 memoria dinámica de longitud variable, que se explica más adelante en estos tutoriales.

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

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

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

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

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

¡Porque esperaba una expresión constante!

Las dimensiones de matriz en C (ignorando los VLA de C99) y C ++ deben ser cantidades conocidas en el tiempo de compilación. Eso no significa simplemente etiquetado con const: ellos tener para ser dura en el programa.

Usar 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 compilador no puede asignar la memoria para la matriz. (¿Una variedad de tamaño nulo? ¿Qué?)

Además, necesitaría hacer que el tamaño sea constante y no una variable.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top