2010-11-29 14 views
2

Dumme Frage. Aber kannst du das tun? (diese sind globale Variablen, die durch die Art und Weise)Array-Größe nicht definiert? C++

int size; 
double Values[size]; 

Wenn Im der Größe einer Datei zu bekommen?

Ich weiß, dass Sie wahrscheinlich nicht können, aber vielleicht ihre Art, die Größe basierend auf der Nummer neu zu justieren, die ich aus der Datei eingelesen habe (wie ich in 7 gelesen habe, weiß ich, dass Werte von Größe 7 sein müssen) .

Der Compiler beschwert sich, aber ich frage mich, ob es sich um eine Workaround handelt. (Diese haben als globale Variablen btw bleiben

+0

Müssen sie Globals sein? – helpermethod

+1

@Helper: Nichts * braucht * um global zu sein. Nun, "nichts ist immer" ist ein bisschen stark, aber Sie verstehen, was ich meine. –

+0

@ John Dies war eher eine ironische Frage. Traurigerweise ist es schwierig, Ironie in Textform einzubetten :-). – helpermethod

Antwort

6

Nein, können Sie nur Feldgrößen wie folgt angeben werden. konstante Integralausdrücke. Bedeutung zur Compile-Zeit bekannt.

Sie sollten wahrscheinlich das nicht tun, sowieso. Stattdessen sollten Sie einen Vektor verwenden.

Wenn Sie aus irgendeinem Grund keinen Vektor verwenden können (woran ich ernsthaft zweifeln würde), wäre Ihre nächste Option die Verwendung dynamisch zugewiesener Arrays. Aber bitte, für die Liebe zu allem, was in der Welt gut ist, benutze einen intelligenten Zeiger, wenn du das tust.

+1

Sie können auch das nicht standardmäßige, aber anscheinend sehr häufige alloca() für stackbasierte dynamische Arrays verwenden. – Puppy

+0

Ya Ich würde einen Vektor verwenden .... aber aus irgendeinem Grund kann ich nicht für die Welt von mir finden, wie man nur eine einzelne Zeile in einen Vektor liest. Wenn ich weiß, wie lange der Vektor sein muss (nachdem ich den ersten Wert eingelesen habe) –

+1

@Mercfh: Sende eine separate Frage dazu. Ich schätze, Sie erhalten innerhalb von 42 Sekunden eine Antwort. Vielleicht sogar von mir. –

2

Sie können es tun, wenn Sie sie dynamisch zuweisen.

double *Values = new double[size]; 
... 

delete [] Values; 

aber nicht statisch

+0

Wie .... würde ich das machen? Ordnen Sie sie dynamisch zu. Wie sagen wir sagen Größe = 10, kann ich später die Größe später im Programm ändern, nachdem ich die Nummer aus der Datei eingelesen habe –

+0

Sorry, ich habe das Bit über globale Variablen verpasst. Machen Sie nicht das 'new', wo Sie Werte deklarieren (also' double * Values; '), und setzen Sie es dort, wo Sie die Größe aus der Datei lesen (d. H.' Values ​​= new double [size]; '). –

3

Sie können, eigentlich :)

C99 ermöglicht, dass. MSVC unterstützt C99 nicht, GCC tut es.

C++ Compiler neigt auch dass als Erweiterung ermöglichen (selbst beantworten, wenn Sie mit je nach Compiler-Erweiterungen sind OK). Die einzige Voraussetzung ist, dass Sie size zum Zeitpunkt der Deklaration von Values wissen müssen.

A std::vector ist in der Regel besser (und sicherer und einheitlich fest usw.) wie auch immer, es sei denn, Sie wirklich wirklich wollen, dass die Daten auf dem Stapel.

+1

Unterstützt C99 wirklich ** globale ** Arrays variabler Länge? – fredoverflow

+0

Ich erwähnte, dass "Größe" zum Zeitpunkt der Deklaration bekannt ist, also würde es für globale Arrays auf "zur Kompilierungszeit bekannt" reduziert werden, imho - es sei denn, ich habe hier etwas falsch gemacht? – Kos