# struct an Funktion übergeben C++



## Puepue (11. April 2010)

*struct an Funktion übergeben C++*

Hallo zusammen,
ich habe ein Programm geschrieben, in dem man Vorname, Nachname und Note von xy Schülern eingeben kann. (Sowas denke ich mir natürlich nicht selber aus.)

Das Ganze funktioniert mit einem struct:

```
struct TSchueler
{
	short id;
	char * vorname;
	char * nachname;
	int note;
};
```


Das ganze struct funktioniert dynamisch, weil ich ja nicht weiß, wie viele Schueler ich habe:

```
TSchueler * person1 = new TSchueler [anzahl+1];
```


```
for (i = 0; i<anzahl; i++)
	{
		person1[i].vorname = new char [50];
		cin >> vorname;
		person1[i].vorname = strcpy( (person1[i].vorname),vorname );
.
.
.
.
```

Und am Ende gebe ich das ganze als Übersicht wieder aus:


```
/* Notenübersicht */

	cout << endl << "Die Notenuebersicht der Schueler:" << endl << endl;



	for (i = 0; i<anzahl; i++)
	{
		cout << person1[i].vorname << "\t";
		cout << person1[i].nachname << "\t\t";
		cout << person1[i].note << endl << endl;
	}
```

Dann lösche ich alle allokierten Speicher wieder.

Und so funktioniert das alles auch.

Jetzt möchte ich allerdings Funktionen bauen, also eine Funktion notenuebersicht, eine Funmktion eingabemaske etc.

Aber ich werde nicht schlau daraus wie ich das struct dann übergeben muss? Ich will ja nicht nur   person1[0], sondern auch person1[1], person1[2] ...(dynamisch) übergeben bzw. damit arbeiten


----------



## mattinator (11. April 2010)

*AW: struct an Funktion übergeben C++*

Strukturen werden in C mittels Zeigern (Adressen, Pointers) übergeben. Wichtig ist, wie Du schon richtig implementiert hast, dass Du die Instanz eines genügend großen Arrays zuerst erzeugst und in diesem Fall für die Elemente des Arrays den Speicher bereit stellst.


```
struct TSchueler
{
    short id;
    char * vorname;
    char * nachname;
    int note;
};

void Eingabemaske ( TSchueler * personen )
{
    for (i = 0; i<anzahl; i++)
    {
        personen[i].vorname = new char [50];
        cin >> vorname;
        personen[i].vorname = strcpy( (personen[i].vorname),vorname );
    }
    //
}

void Notenuebersicht ( TSchueler * personen )
{
/* Notenübersicht */
    cout << endl << "Die Notenuebersicht der Schueler:" << endl << endl;

    for (i = 0; i<anzahl; i++)
    {
        cout << personen[i].vorname << "\t";
        cout << personen[i].nachname << "\t\t";
        cout << personen[i].note << endl << endl;
    }
}

TSchueler * person1 = new TSchueler [anzahl+1];

Eingabemaske ( person1 );
Notenuebersicht ( person1 );
```


----------



## boerigard (11. April 2010)

*AW: struct an Funktion übergeben C++*

Zwei Anmerkungen (oder auch drei).

```
TSchueler * person1 = new TSchueler [anzahl+1];
```
Hier legst du dir Speicher für Anzahl der Schüler plus 1 an. Später initalisiert und draufzugegriffen wird nur auf Anzahl Schüler. Der letzte Schüler (das Schwarze Schafe) wird nicht mehr beachtet. Du kannst also oben die +1 löschen.

Die Namenseingabe ist unsauber und fehleranfällig. Das ist immer das Problem bei C (und weniger C++) Programmen. Einmal bricht cin >> bei Leerzeichen ab, also Peter Alexander (hier als zweiter Vorname ) wird nur als Peter eingegeben. Und dann schreibt dir cin auch dein ganzes Array voll (und mehr), wenn du zu viel eingibst.
Wenn es euer Lehrer nicht verbietet, nimm std:string statt char*.
Wenn es doch mit char* sein soll, dann ändere die Eingabe in cin.getline(person_.vorname,50,'\n');

In der Eingabefunktion erst das cin in die (lokale) Variable vorname und dann das strcpy in person.vorname ist auch ein unnötiger Schritt. Du kannst auch gleich den Eingabestrom in person.vorname lenken. Aber wie gesagt, cin in char* ist fehleranfällig.

Dürft ihr auch nicht std:vector nehmen? Wenn man schon C++ lernt, dann sollten sie euch auch C++ beibringen und nicht so ein Mix aus C und C++ ._


----------



## Puepue (11. April 2010)

*AW: struct an Funktion übergeben C++*

Ahhh also jetzt hats geklappt mit dem

```
void Eingabemaske ( TSchueler * personen, int anzahl );
```

was mir gefehlt hat war quasi nur die syntax zum Übergeben von structs 

die +1 habe ich jetzt gelöscht.

Dass cin total fehleranfällig ist stimmt aber hier geht es ja mehr um die Übung (POinter, structs, dynamische structs etc.) und eigentlich sollen wir eh nur Sachen benutzen, die wir in der Schule schon verwendet haben aber da hast du eigentlich Recht 

Jetzt hat alles ganz supi funktioniert


----------



## DarkMo (12. April 2010)

*AW: struct an Funktion übergeben C++*

naja function name(structTyp struct) oder? ^^


----------



## bingo88 (12. April 2010)

*AW: struct an Funktion übergeben C++*



> naja function name(structTyp struct) oder? ^^


Dann hast du aber nur eins übergeben. Es geht aber um mehrere, daher muss das schon nen Zeiger +  Anzahl sein.


----------

