Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Virgil Mini JLI'ler
Anmeldedatum: 09.10.2003 Beiträge: 8 Wohnort: Düsseldorf Medaillen: Keine
|
Verfasst am: 11.02.2005, 19:22 Titel: Am verzweifeln :) |
|
|
Wenn der User gefragt wird, ob er einen weiteren eintrag durchführen will, hängt sich das Prog auf.
Glaube das liegt daran, dass ich den Speicher nicht wieder freigebe oder ?
Könntet ihr mir bitte helfen und mir sagen wie ich den Speicher wieder freigebe ?
Vielen Dank im vorraus,
Virgil
CPP: | #include <iostream>
#include <string>
#include <stdio.h>
#include <fstream>
using namespace std;
struct daten
{
std::string vorname;
std::string nachname;
std::string adresse;
std::string telefonnummer;
unsigned int alter;
//Pointer auf Nachfolgendes Element in der Liste
daten *nachfolger; //Pointer-Erstellung der auf Daten zeigt
};
daten kopf;
//Funktionsprototypen
void NeuerEintrag(string vorname, string nachname, string adresse, string telefonnummer, int alter);
void ausgabe(void);
bool fortsetzen(void);
daten *last(void);
int main()
{
char auswahl;
// Begrüßungsbildschirm...
cout << "#######################################################\n";
cout << "# #\n";
cout << "# Mini-Telefonbuch <ALPHA> #\n";
cout << "# #\n";
cout << "# Willkommen, bitte treffen Sie zun" << (char)132 << "chst ihre Auswahl #\n";
cout << "# #\n";
cout << "# [N] - Neuen Eintrag schreiben #\n";
cout << "# [L] - Geschriebene Eintr" << (char)132 << "ge lesen #\n";
cout << "# [B] - Beschreibung anzeigen #\n";
cout << "# [Q] - Programm verlassen #\n";
cout << "# #\n";
cout << "# #\n";
cout << "# (c)2004 by Virgil G #\n";
cout << "# #\n";
cout << "#######################################################\n";
cout << "\nIhre Auswahl: ";
cout << "\nVorname: ";
cin >> kopf.vorname;
cout << "Nachname: ";
cin >> kopf.nachname;
cout << "Adresse: ";
cin >> kopf.adresse;
cout << "Telefonnummer: ";
cin >> kopf.telefonnummer;
cout << "Alter: ";
cin >> kopf.alter;
if(fortsetzen())
{
do{
// Deklaration der Variablen vorname und nachname...
std::string eintrag_vorname;
std::string eintrag_nachname;
std::string eintrag_adresse;
std::string eintrag_telefonnummer = 0;
int eintrag_alter = 0;
cout << "Vorname: ";
cin >> eintrag_vorname;
cout << "Nachname: ";
cin >> eintrag_nachname;
cout << "Adresse: ";
cin >> eintrag_adresse;
cout << "Telefonnummer: ";
cin >> eintrag_telefonnummer;
cout << "Alter: ";
cin >> eintrag_alter;
NeuerEintrag(eintrag_vorname, eintrag_nachname, eintrag_adresse, eintrag_telefonnummer, eintrag_alter);
}while(fortsetzen());
}
ausgabe(); // Ausgabe aller einträge
return 0;
}
void ausgabe(void)
{
int i = 0;
int eintragszahl = 0;
daten *p = 𝕜 // Adresse von Listenkopf wird an den Pointer *p übergeben => Knoten
while(p != 0) // Wenn p = 0 ist, ist kein Nachfolger mehr vorhanden => Listenende
{
if (i==0)
{
cout << "\n\nAusgabe der Daten:\n\n";
}
i++;
eintragszahl++;
cout << "\nDaten fuer Person " << eintragszahl << ": \n";
cout << "\nVorname: " << p->vorname << "\nNachname: " << p->nachname << "\nAdresse: " << p->adresse << "\nTelefonnummer: " << p->telefonnummer << "\nAlter: " << p->alter << '\n';
p = p->nachfolger;
}
cout << "\n";
system("PAUSE");
}
bool fortsetzen(void)
{
char JaNein = 'j';
cout << "\nWollen Sie einen weiteren Eintrag hinzufuegen ? j/n\n";
cout << "Auswahl: ";
cin >> JaNein;
if(JaNein == 'j')
{
return true;
}
else
{
return false;
}
}
void NeuerEintrag(string vorname, string nachname, string adresse, string telefonnummer, int alter)
{
daten *pElement = new daten;
pElement->vorname = vorname;
pElement->nachname = nachname;
pElement->adresse = adresse;
pElement->telefonnummer = telefonnummer;
pElement->alter = alter;
pElement->nachfolger = 0;
daten *p = last();
p->nachfolger = pElement;
}
daten *last(void)
{
daten *p = 𝕜
while(p->nachfolger != 0)
{
p = p->nachfolger;
}
return p; // P = 0 wird zurückgegeben
}
|
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 11.02.2005, 19:41 Titel: |
|
|
aufhängen? Das wäre dann doch wohl eher eine Endlosschleife, oder?
beim falschen freigeben, etstehen entwerder MemoryLekas, was man net merkt, oder es gibt ne Acess Violation. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 11.02.2005, 19:42 Titel: |
|
|
Hi,
das das delete fehlt ist schon schlimm genug aber ich würd mal diesen do-while ansatz überdenken Nur so als Tipp, vielleicht kommste ja selber drauf _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Virgil Mini JLI'ler
Anmeldedatum: 09.10.2003 Beiträge: 8 Wohnort: Düsseldorf Medaillen: Keine
|
Verfasst am: 11.02.2005, 19:43 Titel: |
|
|
tut mir leid ,meinte nicht aufhängen
Könntest Du mir vielleicht sagen, wie ich das wieder "freigebe" ?
Danke im vorraus,
virgil
Edit: @Patrick... Was ist denn mit der do-while falsch ? Funktionieren sollte sie doch oder ? |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
Virgil Mini JLI'ler
Anmeldedatum: 09.10.2003 Beiträge: 8 Wohnort: Düsseldorf Medaillen: Keine
|
Verfasst am: 11.02.2005, 19:51 Titel: |
|
|
okey, optimierung vorgenommen
Danke Dir
Aber wie lös ich nun mein Problem mit dem "freigeben" ?
Virgil |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 11.02.2005, 19:57 Titel: |
|
|
tjo, anscheinend versuchst du ja gar net was freizugeben, habe kein deltet gefunden.
also, vieleicht eine rekursive Funktion, die mti dem ersten Gleid der liste anfängt, sich so lange selber aufruft, bist es keinen Nachfolger merh gibt, und dann die Struktur mit delete löschen, so das von hinten nach vorne alles gelöscht wird. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 11.02.2005, 20:07 Titel: |
|
|
Code: |
void Clean()
{
while(last())
delete last();
}
|
sollte funktionieren, aber ich gebe keine Garantie, dazu bin ich zu müde.
[edit]
= "0"; wäre besser _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
|
Virgil Mini JLI'ler
Anmeldedatum: 09.10.2003 Beiträge: 8 Wohnort: Düsseldorf Medaillen: Keine
|
Verfasst am: 11.02.2005, 21:56 Titel: |
|
|
Fehler ist nun behoben
es lang an:
CPP: | std::string eintrag_telefonnummer = 0;
|
es muss
CPP: | std::string eintrag_telefonnummer = "0";
|
heißen
Und danke Black für deine "Lösung"
Edit:
BlackLordOfDragons hat Folgendes geschrieben: | Code: |
void Clean()
{
while(last())
delete last();
}
|
|
Scheint nicht zu funktionieren
Wenn die funktion aufgerfen wird, kommt ein "komsicher" Fehler (während der Programmausführung).
Kennt sonst noch jemand eine Lösung ?
Danke,
virgil |
|
Nach oben |
|
|
|