2010-03-15 23 views
7
#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 error de expresión constante esperado en la línea donde declaro float x [tamaño] [2]. ¿Por qué?C++ expresión constante esperada

Respuesta

11
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<float, 2> > x(size); 

O utilizar las nuevas

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

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

Si usted no tiene C++ 11 disponible, se puede utilizar en lugar de boost::arraystd::array.

Si usted no tiene impulso disponibles, hacer su propio tipo de matriz que puede pegarse en el 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, puede utilizar una plantilla de identity lo que efectivamente es un lugar en el typedef (también disponible en boost)

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

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

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

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

4

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.

1

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

NOTA: El campo elementos dentro de corchetes [] que representa el número de elementos de la matriz se va a celebrar, debe ser un valor constante, ya que las matrices son bloques de no dinámico memoria 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.

2

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

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

Si realmente desea asignar la matriz basada en la información es suficiente en tiempo de ejecución, debe asignar la matriz dinámicamente con malloc o new.

1

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

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

EDIT: Desafortunadamente, esta respuesta ya no tiene sentido ya que el cartel ha cambiado su pregunta.

1

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

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

Si el tamaño no se conoce en tiempo de compilación (por ejemplo, introducido por el usuario, determinado a partir de los contenidos del archivo), que había necesidad de utilizar 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).

1

¡Porque esperaba una expresión constante!

Las dimensiones de la matriz en C (que ignoran los VLA de C99) y C++ deben ser cantidades conocidas en tiempo de compilación. Eso no significa que solo esté etiquetado con const: tienen codificados en el programa.

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

Cuestiones relacionadas