Frage

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

Dieses Programm gibt mir einen erwarteten ständigen Ausdrucksfehler in der Zeile, in der ich Float X [Größe] [2] deklariere. Wieso den?

War es hilfreich?

Lösung

float x[size][2];

Das funktioniert nicht, da deklarierte Arrays keine Laufzeitgrößen haben können. Versuchen Sie es mit einem Vektor:

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

Oder neu verwenden

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

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

Wenn Sie keine C ++ 11 verfügbar haben, können Sie verwenden boost::array Anstatt von std::array.

Wenn Sie keinen Boost zur Verfügung haben, erstellen Sie Ihren eigenen Array -Typ, den Sie in Vector festhalten können

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]; }
};

Für die Lockerung der Syntax von new, Sie können eine verwenden identity Vorlage, die effektiv ein In-Place-Typedef ist (ebenfalls in verfügbaren in boost)

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

Wenn Sie möchten, können Sie auch einen Vektor von verwenden std::pair<float, float>

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

Andere Tipps

Das Array wird zur Kompilierungszeit zugewiesen und seitdem size ist keine Konstante, der Compiler kann seinen Wert nicht genau bestimmen.

Sie können keine variablen Längenarrays (wie in C99 genannt) in C ++ haben. Sie müssen dynamisch zugewiesene Arrays (falls die Größe variiert) oder einen statischen integralen konstanten Ausdruck für die Größe verwenden.

Die Linie float x[size][2] Wird nicht funktionieren, da Arrays zur Kompilierungszeit zugewiesen werden müssen (mit einigen Compiler-spezifischen Ausnahmen). Wenn Sie in der Lage sein möchten, die Größe des Arrays leicht zu ändern x bei kompilieren Zeit können Sie dies tun:

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

Wenn Sie das Array wirklich basierend auf Informationen zuordnen möchten, die Sie nur zur Laufzeit haben, müssen Sie das Array dynamisch zuweisen malloc oder new.

Es ist eine Einschränkung der Sprache. Arraygrößen müssen konstante Ausdrücke sein. Hier ist eine teilweise JSutifikation von cplusplus.com

Hinweis: Das Feld Elemente in Klammern [], das die Anzahl der Elemente darstellt, die das Array halten wird, muss ein konstanter Wert sein, da Arrays Blöcke des nicht-dynamischen Speichers sind, deren Größe vor der Ausführung bestimmt werden muss. Um Arrays mit einem dynamischen Speicher der variablen Länge zu erstellen, wird später in diesen Tutorials erläutert.

Die Größe eines automatischen Arrays muss eine Kompilierungskonstante sein.

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

Wenn die Größe zur Kompilierungszeit nicht bekannt war (z. B. vom Benutzer eingegeben, ermittelt aus dem Inhalt der Datei), müssen Sie beispielsweise die dynamische Zuordnung verwenden:

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

(Anstelle eines Paares würde eine dedizierte Punktstruktur/Klasse vollkommen sinnvoll sein.)

Weil es einen ständigen Ausdruck erwartet hatte!

Array-Dimensionen in C (Ignorieren von C99-VLAs) und C ++ müssen zur Kompilierungszeit bekannt sein. Das bedeutet nicht nur mit beschriftet mit const: sie haben hart in das Programm zu sein.

Verwenden Sie dynamische Zuweisung oder std::vector (Dies ist ein Wrapper um die dynamische Array-Allokation), um die Array-Größen zur Laufzeit zu bestimmen.

Sie haben keinen Wert der Größe zugewiesen. Somit kann der Compiler den Speicher für das Array nicht zuweisen. (Eine Reihe von Nullgröße? Was?)

Darüber hinaus müssten Sie die Größe zu einer Konstanten und nicht zu einer Variablen machen.

BEARBEITEN: Leider ist diese Antwort nicht mehr sinnvoll, da das Poster ihre Frage verändert hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top