Domanda

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

Questo programma mi sta dando un errore di espressione costante atteso sulla riga in cui dichiaro float x [dimensione] [2]. Come mai?

È stato utile?

Soluzione

float x[size][2];

Non funziona perché gli array dichiarati non possono avere dimensioni di runtime. Prova un vettore:

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

O usa nuovo

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

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

Se non hai a disposizione C ++ 11, puoi usare boost::array invece di std::array.

Se non hai una spinta disponibile, crea il tuo tipo di array, puoi rimanere in 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]; }
};

Per alleviare la sintassi di new, puoi usare un identity modello che effettivamente è un typedef sul posto (disponibile anche in boost)

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

Se vuoi, puoi anche usare un vettore di std::pair<float, float>

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

Altri suggerimenti

L'array verrà assegnato al momento della compilazione e da allora size non è una costante, il compilatore non può determinare accuratamente il suo valore.

Non è possibile avere array di lunghezza variabile (come vengono chiamati in C99) in C ++. È necessario utilizzare array allocato dinamicamente (se la dimensione varia) o un'espressione costante integrale statica per dimensioni.

La linea float x[size][2] Non funzionerà, perché gli array devono essere assegnati al momento della compilazione (con alcune eccezioni specifiche del compilatore). Se vuoi essere in grado di cambiare facilmente le dimensioni dell'array x a compilare tempo, puoi farlo:

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

Se vuoi davvero allocare l'array in base alle informazioni che hai solo in fase di esecuzione, devi allocare l'array in modo dinamico con malloc o new.

È una restrizione della lingua. Le dimensioni dell'array devono essere espressioni costanti. Ecco una jsutificazione parziale da cplusplus.com

Nota: il campo Elements all'interno delle parentesi [] che rappresenta il numero di elementi che l'array sta per contenere, deve essere un valore costante, poiché gli array sono blocchi di memoria non dinamica la cui dimensione deve essere determinata prima dell'esecuzione. Al fine di creare array con una memoria dinamica a lunghezza variabile, che viene spiegata più avanti in questi tutorial.

La dimensione di un array automatico deve essere una costante a tempo di compilazione.

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

Se le dimensioni non erano conosciute al tempo di compilazione (ad esempio inserito dall'utente, determinato dal contenuto del file), ad esempio è necessario utilizzare l'allocazione dinamica:

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

(Invece di una coppia, una struttura/classe dedicata avrebbe perfettamente senso.)

Perché si aspettava un'espressione costante!

Le dimensioni dell'array in C (ignorando i VLA di C99) e C ++ devono essere quantità note al momento della compilazione. Ciò non significa solo etichettato con const: essi avere essere codificato nel programma.

Usa l'allocazione dinamica o std::vector (che è un wrapper attorno all'allocazione dell'array dinamico) per determinare le dimensioni dell'array in fase di esecuzione.

Non hai assegnato alcun valore alle dimensioni; Pertanto il compilatore non può allocare la memoria per l'array. (Una serie di dimensioni null? Cosa?)

Inoltre, dovresti rendere le dimensioni costanti e non una variabile.

MODIFICARE: Sfortunatamente, questa risposta non ha più senso poiché il poster ha cambiato la loro domanda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top