# Strukturvariablen zur laufzeit erstellen



## SebastianHL (5. Oktober 2004)

Hi,

ich habe ein kleines Programm geschrieben, welches zur Eingabe einer Bestellung auffordert. 
Hier mal der Quelltext :


```
#include <iostream.h>
#include <stdlib.h>>
#include <string>



struct adresse
{
std::string Lieferanschrift_Firma ;
std::string Lieferanschrift_Strasse ;
int Lieferanschrift_Nr ;
int Lieferanschrift_PLZ ;
std::string Lieferanschrift_Stadt ;
long int Kreditkartennummer ;
std::string Ablaufdatum ;
std::string land  ;
};

enum land
{
Deutschland , Oesterreich, Schweiz
};

struct Bestellung
{
adresse Adresse;
std::string Ware;
int Warennummer ;

};

int main()
{
Bestellung BNummer;
cout<<"BITTE TRAGEN SIE IHRE BESTELLUNG EIN."<<endl;
cout<<"\nWarennummer:";        cin >>BNummer.Warennummer;
cout<<"\nWarennamen:";         cin >>BNummer.Ware;
cout<<"\nLieferfirma:";        cin >>BNummer.Adresse.Lieferanschrift_Firma;
cout<<"\nStrasse:";            cin >>BNummer.Adresse.Lieferanschrift_Strasse;
cout<<"\nHausnummer:";         cin >>BNummer.Adresse.Lieferanschrift_Nr;
cout<<"\nPostleitzahl:";       cin >>BNummer.Adresse.Lieferanschrift_PLZ;
cout<<"\nStadt:";              cin >>BNummer.Adresse.Lieferanschrift_Stadt;
cout<<"\nKreditkartennummer:"; cin >>BNummer.Adresse.Kreditkartennummer;
cout<<"\nAblaufdatum (Bitte im Format: TTMMJJ:"; cin >>BNummer.Adresse.Ablaufdatum;
cout<<"\nLand(Nur Deutschland, Oesterreich, Schweiz möglich!):";
cin >>BNummer.Adresse.land;

system("cls");

cout <<"Ware:           "<<BNummer.Ware << endl;
cout <<"Warennummer:    "<<BNummer.Warennummer << endl;
cout <<"Firma:          "<<BNummer.Adresse.Lieferanschrift_Firma << endl;
cout <<"Strasse:        "<<BNummer.Adresse.Lieferanschrift_Strasse << endl;
cout <<"Nr.:            "<<BNummer.Adresse.Lieferanschrift_Nr << endl;
cout <<"Postleitazhl:   "<<BNummer.Adresse.Lieferanschrift_PLZ << endl;
cout <<"Stadt:          "<<BNummer.Adresse.Lieferanschrift_Stadt << endl;
cout <<"Land:           "<<BNummer.Adresse.land << endl;
cout <<"Kreditkartennr.:"<<BNummer.Adresse.Kreditkartennummer << endl;
cout <<"Ablaufdatum:    "<<BNummer.Adresse.Ablaufdatum << endl;



system("PAUSE");
```




Nun will ich die Varablen zur laufzeit erstellen z.b gibt mann oben die Bestellnummer ein und dann soll er das unter dieser nummer speichern. Quasi soll (quelltext) BNummer zur laufzeit erstellt werden. Ich habe bei google nichts dazu gefunden.

Kann mir jemmand helfen ?

danke schonmal im vorraus
Sebastian


----------



## C Coder (5. Oktober 2004)

Was du haben willst ist ein Programm das selber lernen kann... 

Aber ich hätte folgenden Vorschlag:
du kannst eine Variable als Pointer deklarieren:

```
Bestellung * b = 0;
```
zur Laufzeit kannst du dir jetzt hier neuen Speicher reservieren und damit praktisch beliebig viele Werte aufnehmen.
(bis der Speicher - der sogennante Heap - voll ist)

```
b = new Bestellung[BELIEBIG_VIELE];
```
Auf diese neuen Speicherbereiche kannst du dann mit

```
b[0].Warennummer = 10;
b[1].Warennummer=12;
```
zugreifen.

Bei Terminierung deines Programmes solltest du diesen Speicher aber wieder freigeben:

```
delete b; //Falls nur eins reserviert wurde
delete[] b; //falls ein ganzes Array reserviert wurde
```


----------



## SebastianHL (5. Oktober 2004)

ja stimmt ! 

danke für den tip werde ich mal ausprobieren ! 


gruß
Sebastian


----------



## RedWing (5. Oktober 2004)

Anmerkung:
und um die Sache noch dynamischer zu machen, sprich Elemente beliebig löschen 
und einfügen zu können, kann man sich eine verkettete Liste schreiben 
oder gleich Vektoren benutzen...

Gruß

RedWing


----------



## C Coder (5. Oktober 2004)

*Perfomance*

Ist es performanter eine Liste zu nutzen anstatt z.B. ein Array mit 100 Plätzen, welches, wenns voll wird, 
vergrößert wird (also neues mit 200 erstellen, altes in neues kopieren, altes löschen)?


----------



## Daniel Toplak (6. Oktober 2004)

> Nun will ich die Varablen zur laufzeit erstellen z.b gibt mann oben die Bestellnummer ein und dann soll er das unter dieser nummer speichern. Quasi soll (quelltext) BNummer zur laufzeit erstellt werden. Ich habe bei google nichts dazu gefunden.


Das geht in C/C++ nicht, denn da wird der Sourcecode übersetzt und nicht erst zur leufzeit interpretiert. Bei sog. Interpretersprachen oder auch Skriptsprachen ist sowas meist über einen Befehl wie "eval" möglich (z.B. bei JS, Perl, ...).



> Ist es performanter eine Liste zu nutzen anstatt z.B. ein Array mit 100 Plätzen, welches, wenns voll wird,
> vergrößert wird (also neues mit 200 erstellen, altes in neues kopieren, altes löschen)?


Ja, da ist schneller.
Unterschied von Listen/Arrays:
Bei Listen hat man keinen wahlfreien Zugriff auf Element n, sondern muss "vorwärts" oder (bei doppelt verketteten Listen) "rückwärts" durch iterieren.
Dafür kann man bei Listen sehr performant vorne, hinten oder zwischendrin Elemente einfügen ohne andere Elemente im Speicher umzukopieren.
Arrays hingegen eigenen sich besser für einen wahlfreien Zugriff auf Element n.

Gruß Homer


----------



## RedWing (6. Oktober 2004)

Hi,


			
				C Coder hat gesagt.:
			
		

> z.B. ein Array mit 100 Plätzen, welches, wenns voll wird,
> vergrößert wird (also neues mit 200 erstellen, altes in neues kopieren, altes löschen)?



Du forderst Speicherplatz für ein Array an, wo der Speicher vielleicht gar nicht gebraucht 
werden könnte. Ausserdem musst du dann in ner Schleife die alten 100 Array Elemente in
dein neues Feld umkopieren, wenn die Struktur mal etwas größer wird, ist dies auf jeden
Fall unrentabel.  Vor allen Dingen kannst du den Speicher für ein einzelnes Element
nicht wieder löschen, sondern du müsstest dein ganzes Array löschen...
Viel eleganter ist es doch da ein Datentyp zu konstruieren der am Anfang leer ist und je nach 
belieben jeweils um ein Datenelement deiner gewünschten Struktur vergößert/verkleienert
werden kann. Und eben dazu ist eine Liste in der Lage.



			
				Daniel Topak hat gesagt.:
			
		

> Bei Listen hat man keinen wahlfreien Zugriff auf Element n, sondern muss "vorwärts" oder (bei doppelt verketteten Listen) "rückwärts" durch iterieren.



Antwort:


			
				RedWing hat gesagt.:
			
		

> oder gleich Vektoren benutzen...



Da hat maan den wahlfreien Zugriff gleich inklusive. 

Gruß

RedWing


----------

