Vivo
Dreamworker
|
Urks ... jetzt seh ich erst dass du da Strings übergibst ... klar das es nicht funzt ... Ehrlich gesagt hab ich mit string noch nie gearbeitet, und weiss deshalb nicht genau wie die sich verhalten. Ich hab alles immer mit char - Arrays gemacht und im vc++ eben mit cstrings.
hmm ... also falls du es auch nicht weisst, oder sich keiner deinem traurigen schicksal annimmt würd ich dir raten das ganze mit simplen char arrays zu machen.
Wobei du darauf achten musst dass der Name dieses Strings dann automatisch der Pointer auf das erste Element ist und du kannst dir somit die & bei meiner Funtkion sparen (nur bei den strings, bei den int müssen sie klarerweise bleiben). Weiters kannst du dann nicht einfach mit = zuweisen sondern musst dir die string.h includieren und das ganze mit stringcpy erledigen ...
::btw. wenn ich raten müsste, würd ich sagen string verhaltet sich gleich wie ein char - Array, ... aber probieren geht über studieren ...
|
XeroXs
doh
|
hm.. hab grad um zu probiern obs echt an den Strings liegt alle Strings ausgeschlossen, und das ganze nur mit den Integern gemacht.. fehler kommt aber trotzdem
|
Vivo
Dreamworker
|
hmm ... Also da ich da jetzt bei mir ( in der getall - Funktion) keinen Fehler seh der mir unterlaufen ist würd ich dir folgendes vorschlagen : Du gehst mit dem Debugger die Funktion step by step durch und schaust ob die Adressen, die an die Funktion übergeben werden stimmen bzw. in welcher Zeile genau der Error auftritt ... Sonst kann ich dir so leider nicht weiterhelfen ... vielleicht taucht noch aus heiterem himmel ein borland c++ programmierer auf und kann dir sagen was der fehler ist ...
|
XeroXs
doh
|
nagut.. thx amal *hoff dass da wer auftaucht*
|
Ringding
Pilot
|
Die Strings sind definitiv nicht das Problem. Die hier beschriebenen Sachen sollten genauso auch auf Strings funktionieren.
|
Vivo
Dreamworker
|
Die Strings sind definitiv nicht das Problem. Die hier beschriebenen Sachen sollten genauso auch auf Strings funktionieren. Die Strings sind definitiv nicht das Problem. Die hier beschriebenen Sachen sollten genauso auch auf Strings funktionieren.
Naja, ich meinte diese Funktion ... Wenn sich die Strings hier so verhalten wie ich meine (nämlich dass der name des strings ein pointer auf das erste element ist) dann wird beim aufruf der getall - funktion die adresse des pointers auf das erste element in die Funktion geliefert, was nicht so optimal ist .. Edit : Wenn du auch keinen Fehler mehr findest, dann hats wohl xeroxs in mit der umsetzung verbockt ...
|
XeroXs
doh
|
kann auch sein, allerdings wüsst i ned was i da verbockt ham könnt
|
Ringding
Pilot
|
Vivo, so ist es aber nicht. Es werden ganz normale Pointer auf String Objekte übergeben, und deren =-Operator wird dann in der Funktion aufgerufen.
|
XeroXs
doh
|
hm Ringding.. du siehst auch keinen fehler?
|
Vivo
Dreamworker
|
Vivo, so ist es aber nicht. Es werden ganz normale Pointer auf String Objekte übergeben, und deren =-Operator wird dann in der Funktion aufgerufen. Aha, 'string' ist eine klasse ... *check*
|
Ringding
Pilot
|
Poste noch mal die relevanten Teile, dann kann ich es mir anschauen.
|
XeroXs
doh
|
ok die Aktuelle Version sieht nun so aus: [b]//Das Objekt und seine Konstruktoren und Methoden[/b]
class KKartei {
protected:
String name;
String adresse;
String telnr;
int knr;
int kkonto;
public:
KKartei *next;
KKartei *prev;
KKartei(int, int, String, String, String, int, KKartei*);
KKartei* getprev();
void getall(int*, String*, String*, String*, int*);
};
KKartei::KKartei(int m, int kn, String n, String a, String t, int kk, KKartei *prv) {
if(m==1) {
name=n;
adresse=a;
telnr=t;
knr=kn;
kkonto=kk;
prev=prv;
}
}
KKartei* KKartei::getprev() {
return 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;
}
[b]//Erstellen einer neuen Instanz des Objektes per Konstruktor[/b]
KKartei *help;
KKartei *aktuell;
help=aktuell;
aktuell=new KKartei(first, Edit1->Text.ToInt(), Edit2->Text, Edit3->Text, Edit4->Text, Edit5->Text.ToInt(),help);
[b]//Laden des vorherigen eintrags[/b]
neu=aktuell->getprev();
neu->getall(&temp_nr, &temp_n, &temp_a, &temp_t, &temp_kk);
[b]//Ausgabe vom String temp_n[/b]
Edit2->Text=temp_n;
Bearbeitet von XeroXs am 25.05.2003, 19:34
|
Ringding
Pilot
|
help ist ein nicht initialisierter Pointer, den du prev zuweist. Danach rufst damit getall auf, das kann nicht gehen.
|
XeroXs
doh
|
also.. beim allerersten erzeugen eines objekts passiert dies nicht (eh klar, gibt ja kein prev).. passiert erst beim 2ten mal. gedacht isses so.. die adresse der alten instanz wird gesichert (Zeile help=aktuell; ), dann eine neue erstellt und die alte adresse als *prev* reingeschrieben falls das nicht so geht, bitte helfen
|
Vivo
Dreamworker
|
Ja, aber beim ersten Elemnt hast du dann einen Pointer der ins Nirvana zeigt ... du solltest den Pointer des ersten Objekts auf NULL setzen. und was Ringding gemeint hat : -->ATI Radeon 8500 -->512 ( 2x256 MB) MB SDRam 133 -->19" Belinea Monitor 98Khz
Du legst den ersten pointer an. Du legst den 2ten Pointer. (beide zeigen auf kein Objekt. Und jetzt weist du help auf aktuell -> folglich help zeigt weiterhin auf nichts. Deshalb wird prev immer auf einen nicht vorhandenen Speicherbereich zeigen ...
|