URL: https://www.overclockers.at/coding-stuff/borland_c_objektorientierte_programmierung_hilfe_79754/page_1 - zur Vollversion wechseln!
Hi 
Also gleich zum Problem...
Hab grad erst mit der Objektorientierten Programmierung angefangen... bin schon über einige Stolpersteine gestoßen, die ich denk ich gemeistert habe, aber hier häng ich einfach und komm ned weiter.. deshalb hoff ich auf eure Hilfe 
Das ganze ist eine Kartei.. das Objekt hat ein paar Eigenschaften (Name, Adresse, Telnr usw..).. und außerdem 2 pointer zum vorwärts und rückwärtsblättern in der kartei... also einfach eine übung zum dynamischen erzeugen eines objektes.
Jetzt passiert folgendes: Das Programm ansich läuft ohne fehler laut debugger, crasht aber...
Also, ich trage den ersten User in der Kartei ein.. diesen einmal ohne *rückwärts* zeiger, da er ja keinen vorgänger hat. Dann erzeuge ich ein zweites Objekt, in das ich die Adresse des ersten Objekts in den *rückwärts* zeiger speichere.
Um zurückzublättern hol ich mir über einen Konstruktor den zeiger des neuesten Objekts, und über den neuen zeiger und einen weiteren Konstruktor will ich mir die Daten des alten Objekts holen um sie darzustellen. genau hier Crasht das Programm..
Habe einmal die Zeiger darstellen lassen, dabei ist mir aufgefallen, dass die gespeicherte adresse und die geladene Adresse nicht übereinstimmen... Leider find ich keinen Ansatz wieso 
Unten die wichtigsten zeilen des sourcetextes.. ich hoffe ihr habts ne idee
Code:class KKartei { protected: String name; String adresse; String telnr; int knr; int kkonto; public: KKartei *next; KKartei *prev; void getprev(KKartei*); void getall(int, String, String, String, int); }; /cut/ void KKartei::getprev(KKartei *tmp) { tmp=prev; } void KKartei::getall(int tmp_nr, String tmp_n, String tmp_a, String tmp_t, int tmp_kk) { tmp_nr=knr; tmp_n=name; tmp_a=adresse; tmp_t=telnr; tmp_kk=kkonto; } KKartei *erstes; KKartei *aktuell; KKartei *help; /cut/ //Hier wird das Objekt erzeugt! help=aktuell; aktuell=new KKartei(first, Edit1->Text.ToInt(), Edit2->Text, Edit3->Text, Edit4->Text, Edit5->Text.ToInt(),help); /cut/ //Und hier will ich den vorherigen Eintrag laden int temp_nr; String temp_n; String temp_a; String temp_t; int temp_kk; KKartei *neu; aktuell->getprev(neu); neu->getall(temp_nr, temp_n, temp_a, temp_t, temp_kk); Edit2->Text=temp_n;
hmmm ... also das ganze sieht noch etwas unbeholfen aus, aber ich versuch mal alle deine Fehler möglichst aufzulisten :

AuwehZitat von VivoZitat von moidaschlwelche htl?
wenn er von einem gym kommt, oder aus einer haupt mit 1. lg kommt, braucht er keine machen..
aber wenn dann, dann is ned schwer-..
ja wie gsagt grad damit angefangen..



hast die include dateien einbunden ? 
wenns an der fehlermeldung liegt:
es ist meistens eine zeile drüber.. ich nehm den bb auch, kannst ja mal bitte die fehlermeldung postnen, dann kann ich dir evtl. weiterhelfen!
Naja .. war nicht so gemeint, war nur ein bisschen erschrocken 
zu 1.)
Du übergibst nicht den Zeiger sondern den Inhalt. Du musst entweder die Adresse der Variablen übergeben mit dem vorangestellen '&' oder du legst die variablen über einen pointer na und übergibst den Pointer. In beiden Fällen musst du die getall Funktion so umbaun, dann Pointer übergeben werden (vorangestellter '*' )
In deinem Fall werden jedoch die Variablen nach ablaufen der Funktion gelöscht und alles bleibt beim alten.
zu 2.)
Bei getprev machst du vom prinzip her den selben fehler. Du übergibst zwar den Pointer (der bekanntlicherweise eine Adresse enthält) greifst aber nicht auf den Speicher zu auf den der Pointer sonder auf den Pointer selbst (der lokal in der Variable ist). Du darfst in der Funktion also nicht den Inhalt des Pointers verändern sondern nur den Inhalt des Bereichs auf den der Pointer zeigt.
Bei dieser Funktion würde ich ganz einfach return verwenden, weil du ja nur 1 Variable zurückgibst.
3.)
Du verwendest diesen Code "KKartei(first, Edit1->Text.ToInt(), Edit2->Text, Edit3->Text, Edit4->Text, Edit5->Text.ToInt(),help);"
Diese Zeile setzt jedoch voraus dass du einen überladenen Konstruktor hast, was soviel bedeutet wie, dass du einen Konstruktor machen musst der die selben Argumente hat wie du in dieser Codezeile " KKartei(int, int, String, String, String, int, KKartei*);" angegeben hast.
Ich hoff das ist halbwegs rübergekommen ... 
Auf Anhieb seh ich da nicht was eine Include - Datei erfort ...Zitat von moidaschlhast die include dateien einbunden ?
wenns an der fehlermeldung liegt:
es ist meistens eine zeile drüber.. ich nehm den bb auch, kannst ja mal bitte die fehlermeldung postnen, dann kann ich dir evtl. weiterhelfen!
richtig, der debugger meldet keinen fehler, das programm crasht dann weil ich auf einen unerlaubten speicherbereich zugreife..
ok.. also @Vivo:
1.) das leuchtet mir einfach nicht ein, wär nett wennst ma ein beispiel geben könntest wies richtig geht
2.) gut.. d.h. i schreib dann einfach bei der Methode return *prev; und im Unterprogramm *neu=getprev(); ?
3.) ahja das is ein überbleibsel aus einem alten code... is scho weg 
ah ja richtig des meldet der compiler ned..Zitat von XeroXsrichtig, der debugger meldet keinen fehler, das programm crasht dann weil ich auf einen unerlaubten speicherbereich zugreife..
1.)
Code://getall Funktion void KKartei::getall(int *tmp_nr, String *tmp_n, String *tmp_a, String *tmp_t, int *tmp_kk) { *tmp_nr = knr; *tmp_n = name; *tmp_a = adresse; *tmp_t = telnr; *tmp_kk = kkonto; } //getall Aufruf neu->getall(&temp_nr, &temp_n, &temp_a, &temp_t, &temp_kk);

werd ich testem danke 
ich meld mich 
Hm... function getprev() could not return a value ? 
Code:KKartei* KKartei::getprev() { return prev; }
ah 
hm... jetzt compiliert er, aba crasht wieder... die funktion getall daugt eam ned
ahja das war a irrtum, is doch kein überbleibselZitat von Vivo3.)
Du verwendest diesen Code "KKartei(first, Edit1->Text.ToInt(), Edit2->Text, Edit3->Text, Edit4->Text, Edit5->Text.ToInt(),help);"....
erstellt das neue objekt und übergibt die daten ins objekt.. bzw solls zumindestCode:KKartei::KKartei(int m, int kn, String n, String a, String t, int kk, KKartei *prv) { name=n; adresse=a; telnr=t; knr=kn; kkonto=kk; prev=prv; }
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026