CString und verkettete Listen ?
-
Hi Leute ich hab einen seltsamen Fehler den ich mir nicht erklären kann:
Ich schreibe an einem Programm in welchen ich einfachverkettete Listen verwende. Ich definiere dementsprechend im Public meiner Klasse zwei Structuren die ich benötigestruct datanode { int zahl; CString name; }; struct masternode { CString mname; struct datanode daten1; struct masternode *next; }; struct masternode *next; struct masternode *anfang;
im OnInitDialog() werden die "next" und "anfang" mit NULL initialisiert . Soweit so gut. Anschließend kann der User in eine Maske Daten eingeben die per Button in die Liste eingetragen werden sollen. Dazu habe ich eine entsprechende Funktion:
int CLinklistDlg::data_add() { struct masternode *pointer; if(anfang == NULL) //ist die Liste leer { if( (anfang = (struct masternode *)malloc(sizeof(masternode))) == NULL) { MessageBox("Fehler! Es konnte kein Speicher für den ersten Eintrag in der Liste reserviert werden!", "schwerer Fehler !", MB_OK); return 1; } GetDlgItemText(IDC_NAME,m_name); anfang->mname = m_name;
Bis zu GetDlgItemText läuft auch alles wunderbar doch wenn ich versuche den CString aus m_name in das Lsitenobjekt zu kopieren bekomme ich eine unbehandelte Ausnahme.
Kann ich CString nicht in verketteten Listen verwenden ? Im dem Tut welches ich durchgearbeitet und nach MFC umgearbeitet habe verwendet der Auto Char[] für Text. Muß das sein oder wo liegt der Fehler. Ich hab das Ding schon debugged und ich kann mir den Fehler nicht erklären.Hilfe....
-
malloc verwendet man ja auch nicht in MFC-Programmen. Versuchs mal mit new.
Mal davon abgesehen, dass die MFC und/oder STL dir schon verkettete Listen bieten.
-
Wenn thomas80d auch soweit recht hat, bringt dich das wohl nicht dahin, wo du hin willst. Der Austausch von "(struct masternode *)malloc(sizeof(masternode))" durch "new masternode" ist ok. Aber das Verhalten des Programms sollte sich nicht ändern.
Folgende Fragen zur Fehlereingrenzung:
Hast du getestet ob nach "GetDlgItemText(IDC_NAME,m_name);" m_name korrekt belegt ist.
Falls ja: Versuch mal die Zuweisung "CString strTemp = m_name;". Falls das alles korrekt läuft, prüfe dein anfang ....
-
Hallo,
mag schon sein, das man mit malloc keine Klasse anlegen kann
Wie sollte das auch gehenWie gesagt,
new
ist Dein Freund :p
und ändere es mal so abif( (anfang = (struct masternode *)malloc(sizeof(masternode))) == NULL) anfang = new struct masternode;
Mit CPtrList kannst Du Dich wohl immer noch nicht anfreunden
[ Dieser Beitrag wurde am 06.08.2002 um 14:31 Uhr von ByteSlider editiert. ]
-
Hi Leute,
@Kautz01
GetDlgItemText liefert genau den CString an die Variable m_name den ich eingebe. Ich kann diesen Inhalt auch zwischen beliebigen CString variablen hin und her kopieren ohne porb.
"anfang" wird bei der Initialisierung auf NULL gesetzt genau wie "next". Sollte also auch i.O. sein.
Ich hab mal zum Spass den CString gegen ein char[] getauscht(sowohl als Variable als auch in der Listenstruktur) und mit strcpy was in das char[] copiert und das programm stürtzt nicht ab.@BYTESLIDER & thomas80d:
hat "new" einen return - wert für ungenügenden Speicher . Ich verwende eigentlich "malloc" weil ich bei der Speicherbelegung einfach auf "NULL" prüfe um weiß ob ich den Speicher habe oder nicht.malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available.
@ByteSlider
ne CPtrList will ich nicht. Ich mach das um was zu lernen und wenn ich zuviele vorgefertigte Klassen nehme geht mir das Verständnis für die Materie verloren und gerade bei verkettete Listen etc. sollte man wissen was man tut (ich dachte ich wüsste es bis ich ein CString in die Liste eingefügt habe ).Vielleicht hat ja nochjemand ne Idee solange debugg ich weiter und such nach der Ursache des Fehlers (wenn auch bis jetzt erfolglos)
-
ByteSlider hat es doch gesagt nim new
und ob new was zurückt gibt kanst du doch wohl selber nachschauen
-
Hi Leute ,
ich zieh alles zurück und behaupte das Gegenteil wenn es um den "new " Operator geht. Ja man kann ihn auf "NULL" prüfen und ja mein Fehler ist weg auch wenn ich noch nicht verstehe warum da ja eigentlich mit "new" genau das selbe gemacht werden sollte wie beim "malloc(sizeof(...))"-Statment.
Fakt ist es läuft warum auch immer . Wenn jemand erklären kann warum ich in MFC "new" nehmen muß für die Speicherbereitstellung in einer Lined List in der CString's vorkommen währe ich sehr dankbar.
-
ich bin nicht 100% sicher:
malloc reserviert speicherplatz
new auch, aber ruft den Konstructor auf!
und CString ist ja ne Klasse
-
nach einem kleinen Test bin ich mir sicher
leg mal ne Klasse an und schreib in Konstruktor AfxMessageBox("Jo");
CMy* p; CMy a; p = new CMy(); delete p; p=NULL; p= (CMy*) malloc(sizeof(CMy)); free(p);
weiß jemand mehr??
[ Dieser Beitrag wurde am 06.08.2002 um 15:52 Uhr von WurstNuss editiert. ]
-
Erst mal zum new:
In C++ (und mit der MFC befindest du dich in dem Bereich), ist es üblich "new" und "delete" für die Speicherallokation zu verwenden. Das hat tiefere Gründe, die ich aber auch wieder nachlesen müsste. Wenn der Speicher nicht reicht bekommst du, genau wie bei malloc oder calloc, den Null-Pointer zurück.Noch was, was ich beim Debuggen probieren würde:
Versuch malCString & strStore = anfang->mname
und eine Zuweisung auf die Referenz. Ist auch nur ein Schuss ins Blaue.
Falls du den Fehler gefunden hast, bin ich auch neugierig.
-
Hi Leute,
danke für eure vielseitige und inovative Hilfe. Ich hab das Prob jetzt glaub ich im Griff ("new" is ne tolle sache ).
Ich werde mich in den nächsten Tagen nochmal in meine Bücher vergraben und einige Sachen zum Speicher nachlesen da ich dort wohl wirklich noch ne Lücke habe .Also nochmal danke an alle