"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Borland C++.. Objektorientierte Programmierung Hilfe :)

XeroXs 23.05.2003 - 19:36 2363 30
Posts

XeroXs

doh
Avatar
Registered: Nov 2000
Location: Lieboch
Posts: 10331
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 :confused:
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;
Bearbeitet von XeroXs am 23.05.2003, 21:24

Vivo

Dreamworker
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
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
Avatar
Registered: Nov 2000
Location: Lieboch
Posts: 10331
Zitat von Vivo
Zitat von moidaschl
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 :confused:

zu 2.) hm.. ich will ja auf die inhalte des objekts zugreifen.. und der pointer zeigt ja aufs objekt, sollt also passn :confused:

zu 3.) nochmal bitte, bissi einfacher? :)

thx

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
hast die include dateien einbunden ? :rolleyes:
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
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
Naja .. war nicht so gemeint, war nur ein bisschen erschrocken :p

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
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
Zitat von moidaschl
hast die include dateien einbunden ? :rolleyes:
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
Avatar
Registered: Nov 2000
Location: Lieboch
Posts: 10331
richtig, der debugger meldet keinen fehler, das programm crasht dann weil ich auf einen unerlaubten speicherbereich zugreife..

XeroXs

doh
Avatar
Registered: Nov 2000
Location: Lieboch
Posts: 10331
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
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
Zitat von XeroXs
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
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
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);

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
Avatar
Registered: Nov 2000
Location: Lieboch
Posts: 10331
werd ich testem danke :D

ich meld mich ;)

XeroXs

doh
Avatar
Registered: Nov 2000
Location: Lieboch
Posts: 10331
Hm... function getprev() could not return a value ? :(

Vivo

Dreamworker
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
Code:
KKartei* KKartei::getprev() 
{
return prev;
}

Sieht sie so aus ... ?

XeroXs

doh
Avatar
Registered: Nov 2000
Location: Lieboch
Posts: 10331
ah ;)

hm... jetzt compiliert er, aba crasht wieder... die funktion getall daugt eam ned

XeroXs

doh
Avatar
Registered: Nov 2000
Location: Lieboch
Posts: 10331
Zitat von Vivo
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:
Code:
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 ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz