Dynamisch wachsende Struktur
-
Hallo,
ich habe letztens in der Berufsschule ein dynamisch wachsendes Feld programmiert und dachte mir, dass das ganze auch mit einer Struktur funktionieren muss. Bin mir aber jetzt gar nciht mehr so sicher, ob das überhaupt so sinnvoll ist was ich vorhabe.
Ich möchte gerne eine dynamische Schülerverwaltung programmieren. Ist der Ansatz von mir so richtig oder komplett falsch? Zudem bekomme ich in 2 Zeilen einen Fehler und ich weiß nicht warum.
#include <iostream> #include <string> using namespace std; struct T_AzubiDaten { char str_Name[15]; char str_Vorname[15]; int i_AWP[4]; // AWP = Anwendungsentwicklung und Programmierung (Schulfach) -> 4 Noten }; T_AzubiDaten* schuelerHinzufuegen(T_AzubiDaten* azubis, int& counter){ counter++; if(azubis != NULL){ T_AzubiDaten* temp_azubi = new T_AzubiDaten[counter]; // Einlesen des neuen Azubis, in die letzte Struktur schreiben cout << "Name: "; cin >> (temp_azubi + (counter-1))->str_Name; cout << "Vorname: "; cin >> (temp_azubi + (counter-1))->str_Vorname; for(int i = 0; i < counter; i++){ cout << i+1 << ". Note: "; cin >> (temp_azubi + (counter-1))->i_AWP[i]; } // alte Azubis in temp Struktur kopieren for(int i = 0; i < counter - 2; i++){ (temp_azubi + i)->str_Name = (azubis + i)->str_Name; // ###### Fehler ####### (temp_azubi + i)->str_Vorname = (azubis + i)->str_Vorname; // ###### Fehler ####### for(int k = 0; k < 4; k++) (temp_azubi + i)->i_AWP[k] = (azubis + i)->i_AWP[k]; } azubis = temp_azubi; delete [] temp_azubi; temp_azubi = NULL; } else{ azubis = new T_AzubiDaten[counter]; // neuen Schueler in die letzte Struktur eintragen cout << "Name: "; cin >> (azubis + (counter-1))->str_Name; cout << "Vorname: "; cin >> (azubis + (counter-1))->str_Vorname; for(int i = 0; i < 4; i++){ cout << i+1 << ". Note: "; cin >> (azubis + (counter-1))->i_AWP[i]; } } return azubis; } int main(){ int counter = 0; T_AzubiDaten* gespeicherteAzubis = new T_AzubiDaten; schuelerHinzufuegen(gespeicherteAzubis, counter); schuelerHinzufuegen(gespeicherteAzubis, counter); // Ausgabe aller Azubis for(int i = 0; i < 2; i++){ cout << (gespeicherteAzubis + i)->str_Name; cout << (gespeicherteAzubis + i)->str_Vorname; for(int k = 0; k < 4; k++){ cout << (gespeicherteAzubis +i)->i_AWP[k]; } } system("Pause"); return 0; }
-
Welche Fehlermeldung?

-
Oh man.. wo hast du das denn gelernt? oO
Fang am besten noch mal ganz von vorne an. Lies dir ein bisschen was zu Klassen und zu std::vector (oder std::list) durch. (Und zu std::string..)
-
Blacky666 schrieb:
Hallo,
...
int i_AWP[4];
...Wenn es nur 4 Felder sein sollen ist das falsch.Du hast vergessen das es bei [0] anfängt.
-
7xCore schrieb:
Blacky666 schrieb:
Hallo,
...
int i_AWP[4];
...Wenn es nur 4 Felder sein sollen ist das falsch.Du hast vergessen das es bei [0] anfängt.
Quatsch, was hat das denn mit der Definition zu tun? oO
-
müsstest du in main nicht die azubis mit NULL initialisiern? (Zeile 55)
Außerdem erstellst du temp_azubi, kopierst dann die Addresse nach azubis, und gibts dann den Speicher an dieser Adresse frei (delete[] temp_azubi). Danach hast du dann:
1. Ein Speicherleak (der speicher von azubis wird nicht frei gegeben)
2. In azubis steht eine Adresse auf den freigegebenen Speicher -> Segmentation faultIch glaube du wolltest *azubis=*temp_azubi schreiben?
Aber verwende am besten std::vector.
-
pyhax schrieb:
Aber verwende am besten std::vector.
Na ja, "verwende" ist so eine Sache, wenn er lernen soll mit Speicher umzugehen. Aber er könnte sich ja zumindest mal die Struktur von std::vector/std::list angucken, und dann versuchen etwas ähnliches für seine Zwecke zu implementieren.
-
7xCore schrieb:
Blacky666 schrieb:
Hallo,
...
int i_AWP[4];
...Wenn es nur 4 Felder sein sollen ist das falsch.Du hast vergessen das es bei [0] anfängt.
Wow, deklarierst du immer mit einem Element zuwenig?
Lieber nur Tipps geben, wenn du dir sicher bist.Btw, ein Feld ist ein Array. Du meinst eher Elemente des Feldes/Arrays.
-
Hallo,
Mal auf die Schnelle habe ich folgende Fehler gefunden:
1. In den Zeilen 29 und 30 ersetze die Zuweisung jeweils durch einen Aufruf von strcpy. Merke: Arrays sind keine LValues, dürfen daher nicht auf der linken Seite einer Zuweisung stehen.
2. In Zeile 35 gibst Du den Speicher, dessen Adresse Du eine Zeile vorher noch im Zeiger azubis gespeichert, frei. Damit wird nicht nur der Zeiger temp_azubis wertlos sondern auch der Zeiger azubis.
3. schuelerHinzufuegen gibt zwar die neue Adresse Deines Arrays zurück, main interessiert das aber nicht die Bohne sondern verwendet stattdessen einfach die Adresse des Speichers den es selbst angefordert hat, der aber von schuelerHinzufuegen schon längst freigegeben wurde.
Kein Fehler, aber ungewöhnlich:
Ersetze
(temp_azubi + i)->...
durch
temp_azubi[i]. ...Tip für das Verständnis von Zeigern:
Zeiger sind wie Visitenkarten. Wenn der Bewohner umzieht, weil er ein größeres Haus braucht, muß er neue Visitenkarten drucken. Alle alten sind wertlos.
Wenn Du deine Visitenkarten kopierst und dann umziehst, mußt Du nicht nur deine altern Visitenkarten wegwerfen, sondern auch die neuen.
Wenn Du eine Visitenkarte zum Aktualisieren hergibst. die neuen aber gleich wegwirfst sondern stattdessen die alten weiter benutzt, hast Du auch ein Problem.
mfg Martin
-
Vielen dank für die vielen Antworten. Zu der Frage, wo man so was lernt -> Berufsschule Fachinformatiker... Ich habe mir das schon gedacht, dass man mein Vorhaben viel einfacher lösen kann. Aber auf solche Fragen, haben meine Lehrer keine Antwort und so versuche ich mir das alles selbst zusammen zu reimen.
@ cooky451: Ganz von vorne?! Ich hoffe du meinst nur das Verständnis von Zeigern...
Ich habe jetzt angefangen ein wenig mit std::vector zu arbeiten. Sobald ich zu einem Ergebnis gekommen bin, sage ich euch bescheid.
