Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

C++ Array initialisieren

KiLLa-T - 32
Champion (offline)

Dabei seit 06.2007
4586 Beiträge

Geschrieben am: 19.11.2012 um 07:19 Uhr

Hi,

uns hat man in Programmieren ständig eingetrichtert, dass man Arrays nur mit Konstanten Längen initialisieren darf, also so etwas:

Zitat:

const int lg=5;
int array[lg];


Und es wurde mehrfach gesagt, dass eine Länge lg nicht eingelesen werden darf.

Aber so etwas muss doch eigentlich zulässig sein:

Zitat:

#include <cstdlib>
#include <iostream>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{
int x;
cin>>x;
const int L=x;
int feld[L];
for(int i=0; i<L; i++)
feld[i]=i+1;

for(int i=0; i<L; i++)
cout<<feld[i]<<" ";

cout<<endl<<endl;


getch();
}


Ich les die Länge ein BEVOR ich mein Array initialisier. Und dann setz ich den eingelesen Wert praktisch auf const. So müsste das doch erlaubt sein, oder?
BlackRock - 47
Experte (offline)

Dabei seit 02.2007
1148 Beiträge
Geschrieben am: 19.11.2012 um 07:50 Uhr

Nein, das geht nicht.

Der Compiler muss die Größe des Arrays kennen, wenn er das Programm übersetzt. In diesem Beispiel ist die Größe erst zur Laufzeit des Programms bekannt.

Nimm std::vector statt eines Arrays, dann geht es.

"It is more important that innocence be protected than it is that guilt be punished." (John Adams)

KiLLa-T - 32
Champion (offline)

Dabei seit 06.2007
4586 Beiträge

Geschrieben am: 19.11.2012 um 13:24 Uhr
Zuletzt editiert am: 19.11.2012 um 13:26 Uhr

Diese Aussage kommt mir bekannt vor.
Das heißt beim kompilieren wird dem Array eine zufällige Länge zugeordnet.

Und wenn ich Pech habe und ich auf Stellen zugreife, die es überhaupt nicht gibt, stürtzt mein Programm ab.

Danke ;-)
BlackRock - 47
Experte (offline)

Dabei seit 02.2007
1148 Beiträge
Geschrieben am: 19.11.2012 um 15:03 Uhr

Die genaue Antwort steht übrigens hier:
http://stackoverflow.com/questions/737240/c-c-array-size-at-run-time-w-o-dynamic-allocation-is-allowed

Zusammenfassung: im C++ Standard funktioniert es nicht, im C99 Standard funktioniert es. Wenn ein C++ Compiler es trotzdem akzeptiert, ist es aus Nettigkeit und nichts worauf du dich verlassen solltest wenn du dein Programm mal in einen anderen Compiler stecken willst.

Außerdem wird das Array dann auf dem Stack erzeugt, was bei großen Arrays zu Absturz oder Fehlfunktion führt.

"It is more important that innocence be protected than it is that guilt be punished." (John Adams)

Klischeepunk - 40
Champion (offline)

Dabei seit 01.2005
8907 Beiträge

Geschrieben am: 19.11.2012 um 16:40 Uhr

Würde sich btw. durch "new" lösen lassen. Legt das Ding außerdem auf dem Heap an.

Dieser Post wurde 2 mal ROT-13 verschlüsselt.

SUMOGI - 36
Anfänger (offline)

Dabei seit 12.2006
3 Beiträge
Geschrieben am: 19.11.2012 um 16:47 Uhr

Also du darfst nur Konstanten verwenden und Konstanten sind Konstant und dürfen zur Laufzeit nicht geändert werden, wenn du ein Array brauchst, deren Länge du zur Laufzeit festlegen willst, dann geht das mit

int *variable=new int[laenge];


  [Antwort schreiben]

Forum / Bits und Bytes

(c) 1999 - 2025 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -