XeroXs
doh
|
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 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;
Bearbeitet von XeroXs am 23.05.2003, 21:24
|
Vivo
Dreamworker
|
hmmm ... also das ganze sieht noch etwas unbeholfen aus, aber ich versuch mal alle deine Fehler möglichst aufzulisten : - 1. die getall Funktion kann nicht funktionieren, weil die argumente einer funktion nach dem ende gelöscht werden -> du musst pointer reinliefern
2. bei deiner getprev funktion greifst du auf den inhalt des pointers zu .. und nicht auf die adresse auf die er zeigt -> vom prinzip her selber fehler wie 1 ... 3. ich seh den überladenen konstruktor der KKartei Klasse nicht (nur den Prototypen) ... wenn du den rausgeschnitten hast erübrigt sich das.
Besser mal die Fehler so gut es geht aus ... ich hab auch sicher noch etwas übersehn, aber mal sehn wies bei dir weitergeht
Bearbeitet von Vivo am 23.05.2003, 20:08 (Ausprobieren von dem List - Tag .. nujo, schon mehr gelacht )
|
XeroXs
doh
|
welche 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-..
Auweh ja wie gsagt grad damit angefangen.. leider muss ich sagen das ich echt keine ahnung hab was du meinst zu 1.) hm.. ich start doch die funktion, bekomme den zeiger und geb ihn wieder zurück an das unterprogramm oder zu 2.) hm.. ich will ja auf die inhalte des objekts zugreifen.. und der pointer zeigt ja aufs objekt, sollt also passn zu 3.) nochmal bitte, bissi einfacher? thx
|
moidaschl
Vollzeit-Hackler
|
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!
|
Vivo
Dreamworker
|
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 ...
|
Vivo
Dreamworker
|
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! Auf Anhieb seh ich da nicht was eine Include - Datei erfort ... Ausserdem hat er ja geschrieben dass der Debugger keinen Fehler meldet, also ist das hinfällig ...
|
XeroXs
doh
|
richtig, der debugger meldet keinen fehler, das programm crasht dann weil ich auf einen unerlaubten speicherbereich zugreife..
|
XeroXs
doh
|
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
|
moidaschl
Vollzeit-Hackler
|
richtig, der debugger meldet keinen fehler, das programm crasht dann weil ich auf einen unerlaubten speicherbereich zugreife.. ah ja richtig des meldet der compiler ned..
|
Vivo
Dreamworker
|
1.) //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);
2.) Nicht ganz ... Du willst dir ja nicht den Inhalt des Objektes holen, sondern die die Adresse, also muss das folgendermasen aussehn : In der Methode : "return prev;" und im Aufruf "neu = getprev();" Es könnte auch so funktionieren wie du es geschrieben hast, aber bei deiner Version werden die Werte kopiert und nicht die Adresse -> Doch der Sinn einer doppelt verketteten Liste ist es nur mit Pointern auf die Objekte zu arbeiten und nicht ständig den Inhalt zu kopieren ... Viel Spaß ...
|
XeroXs
doh
|
werd ich testem danke ich meld mich
|
XeroXs
doh
|
Hm... function getprev() could not return a value ?
|
Vivo
Dreamworker
|
KKartei* KKartei::getprev()
{
return prev;
}
Sieht sie so aus ... ?
|
XeroXs
doh
|
ah hm... jetzt compiliert er, aba crasht wieder... die funktion getall daugt eam ned
|
XeroXs
doh
|
3.) Du verwendest diesen Code "KKartei(first, Edit1->Text.ToInt(), Edit2->Text, Edit3->Text, Edit4->Text, Edit5->Text.ToInt(),help);".... ahja das war a irrtum, is doch kein überbleibsel gibts tatsächlich, sieht dann so aus: 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;
}
erstellt das neue objekt und übergibt die daten ins objekt.. bzw solls zumindest
|