HELLmut Geschrieben 14. März 2002 Teilen Geschrieben 14. März 2002 der debugger (von vc++6.0) bringt mir folgende fehler: Loaded symbols for 'X:\USER\Jahrgang 2001\Martin Weinitschke\c++\projecte oo kurs\menge\Debug\menge.exe' Loaded 'C:\WINNT\system32\NTDLL.DLL', no matching symbolic information found. Loaded 'C:\WINNT\system32\KERNEL32.DLL', no matching symbolic information found. The thread 0x528 has exited with code 0 (0x0). in der zeile: if(pMenge->enthalten_in(pZeiger->nummer)!=true) aus der emthode: void CMenge::schneiden_mit(CMenge *pMenge) { struct Menge *pZeiger; pZeiger=pMenge->pAnfang; while(pZeiger!=NULL) { if(this->enthalten_in(pZeiger->nummer)!=true) { this->entnehmen(pZeiger->nummer); } pZeiger=pZeiger->pNaechster; } pZeiger=this->pAnfang; while(pZeiger!=NULL) { if(pMenge->enthalten_in(pZeiger->nummer)!=true) { this->entnehmen(pZeiger->nummer); } pZeiger=pZeiger->pNaechster; } } Versteh nicht ganz was das soll, hab erst gemeint es ist ein speicherzugriffsfehler, aber da passen die meldungen irgendwie net so dazu... könnt ihr mir da helfen??? bin am verzweifeln :confused: :confused: :confused: :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. März 2002 Teilen Geschrieben 14. März 2002 Die Meldungen sind völlig normal, die dürften bei jedem Debuggen auftauchen. Die Frage dürfte vielmehr sein: Sind pMenge und pZeiger gültige Zeiger? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
HELLmut Geschrieben 14. März 2002 Autor Teilen Geschrieben 14. März 2002 ja sind die sind gültig kann dir auch mal die ganze datei posten - is nur so wenn ich die methode nicht aufrufe, also im hauptprogramm auskomentiere kommen die meldungen nicht. folgende fehlermeldung hab ich vergessen zu erwähnen: ... der vorgang "read" konnte nicht auf dem speicher durchgeführt werden... das prog: // Menge.cpp: implementation of the CMenge class. // ////////////////////////////////////////////////////////////////////// #include "Menge.h" #include "iostream.h" #include "malloc.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMenge::CMenge() { } CMenge::~CMenge() { } void CMenge::init() { pAnfang=NULL; } void CMenge::vereinigen_mit(CMenge *pMenge) { struct Menge *pZeiger; pZeiger=pMenge->pAnfang; if(pZeiger!=NULL) { do { if(this->enthalten_in(pZeiger->nummer)!=true) { this->zufuegen(pZeiger->nummer); } pZeiger=pZeiger->pNaechster; }while(pZeiger!=NULL); } } void CMenge::schneiden_mit(CMenge *pMenge) { struct Menge *pZeiger; pZeiger=pMenge->pAnfang; while(pZeiger!=NULL) { if(this->enthalten_in(pZeiger->nummer)!=true) { this->entnehmen(pZeiger->nummer); } pZeiger=pZeiger->pNaechster; } pZeiger=this->pAnfang; while(pZeiger!=NULL) { if(pMenge->enthalten_in(pZeiger->nummer)!=true) { this->entnehmen(pZeiger->nummer); } pZeiger=pZeiger->pNaechster; } } void CMenge::zufuegen(int nr) { struct Menge *pZeiger; if(enthalten_in(nr)==true) { cout<<nr<<" ist schon in Menge enthalten und kann somit nicht hinzugefuegt werden"<<endl; } else { pZeiger=pAnfang; if(pAnfang==NULL) { pAnfang=(struct Menge*)malloc(sizeof(struct Menge)); pZeiger=pAnfang; pZeiger->pNaechster=NULL; pZeiger->nummer=nr; } else { while(pZeiger->pNaechster!=NULL) { pZeiger=pZeiger->pNaechster; } pZeiger->pNaechster=(struct Menge*)malloc(sizeof(struct Menge)); pZeiger=pZeiger->pNaechster; pZeiger->pNaechster=NULL; pZeiger->nummer=nr; } } } void CMenge::entnehmen(int nr) { struct Menge *pZeiger,*pSpeicher; if(enthalten_in(nr)==true) { pZeiger=pAnfang; if(pZeiger->nummer==nr) { pAnfang=pZeiger->pNaechster; pSpeicher=pZeiger; pZeiger->pNaechster=pZeiger->pNaechster->pNaechster; free(pSpeicher); } else { while(pZeiger->pNaechster->nummer!=nr) { pZeiger=pZeiger->pNaechster; } pSpeicher=pZeiger->pNaechster; pZeiger->pNaechster=pZeiger->pNaechster->pNaechster; free(pSpeicher); } } else { cout<<nr<<" ist nicht enthalten und kann somit auch nicht entfern werden!"<<endl; } } void CMenge::zeige_inhalt() { struct Menge *pZeiger; pZeiger=pAnfang; cout<<"Inhalt der Menge:"<<endl; do { cout<<pZeiger->nummer<<endl; pZeiger=pZeiger->pNaechster; }while(pZeiger!=NULL); cout<<endl; } bool CMenge::enthalten_in(int nr) { struct Menge *pZeiger; bool wert=false; if (pAnfang!=NULL) { pZeiger=this->pAnfang; do { if(pZeiger->nummer==nr) { wert=true; } pZeiger=pZeiger->pNaechster; }while(pZeiger!=NULL); } return wert; } die anderen methoden funktionieren alle, da die eine andere den gleichen zeiger verwendet sollte es daran nicht liegen, oder? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Olli_Master Geschrieben 14. März 2002 Teilen Geschrieben 14. März 2002 Check doch mal, ob im letzten Element der Kette das Element pNaechster wirklich auf NULL steht oder ob du es vielleicht vergessen hast mit NULL zu initialisieren (und der Zeiger irgendwohin in den Speicher zeigt, was diesen Fehler verursacht)! Fehlermeldung? Loaded symbols for 'X:\USER\Jahrgang 2001\Martin Weinitschke\c++\projecte oo kurs\menge\Debug\menge.exe' Loaded 'C:\WINNT\system32\NTDLL.DLL', no matching symbolic information found. Loaded 'C:\WINNT\system32\KERNEL32.DLL', no matching symbolic information found. The thread 0x528 has exited with code 0 (0x0). Das ist keine Fehlermeldung sondern nur ein Hinweis. Es bedeuted, dass keine Symbolinformationen in den System-DLLS vorhanden sind und du diese nicht debuggen kannst. Die Letzte Meldung kommt wenn das Programm (oder ein Teil-Thread) beendet wurde. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. März 2002 Teilen Geschrieben 14. März 2002 void CMenge::schneiden_mit(CMenge *pMenge) { struct Menge *pZeiger; pZeiger=pMenge->pAnfang; while(pZeiger!=NULL) { if(this->enthalten_in(pZeiger->nummer)!=true) { this->entnehmen(pZeiger->nummer); } pZeiger=pZeiger->pNaechster; } pZeiger=this->pAnfang; while(pZeiger!=NULL) { if(pMenge->enthalten_in(pZeiger->nummer)!=true) { this->entnehmen(pZeiger->nummer); <--- Hier ist der Fehler } pZeiger=pZeiger->pNaechster; } } Nach dem Entnehmen zeigt pZeiger auf freigegebenen Speicher, denn genau die Struct mit der angegebenen Nummer hast Du ja gerade aus der Liste entfernt. Der letztendliche Absturz des Programms ist dann wohl ein Folgefehler. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
HELLmut Geschrieben 14. März 2002 Autor Teilen Geschrieben 14. März 2002 das dürfte es wohl sein! danke dir, wär da glaub ich heut nicht mehr drauf gekommen - probiers glaich mal aus.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
HELLmut Geschrieben 14. März 2002 Autor Teilen Geschrieben 14. März 2002 ja geht !!! die methode sieht jetzt so aus: void CMenge::schneiden_mit(CMenge *pMenge) { struct Menge *pZeiger,*pSpeicher; pZeiger=pMenge->pAnfang; while(pZeiger!=NULL) { pSpeicher=pZeiger->pNaechster; if(this->enthalten_in(pZeiger->nummer)!=true) { this->entnehmen(pZeiger->nummer); } pZeiger=pSpeicher; } pZeiger=this->pAnfang; while(pZeiger!=NULL) { pSpeicher=pZeiger->pNaechster; if(pMenge->enthalten_in(pZeiger->nummer)!=true) { this->entnehmen(pZeiger->nummer); } pZeiger=pSpeicher; } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Olli_Master Geschrieben 14. März 2002 Teilen Geschrieben 14. März 2002 Ich glaube, ich habe den Code nicht ganz verstanden, weil mir die Deklaration vom Struct Menge fehlt bzw. der Teil vom Code, indem die "Menge" angelegt wird. Du must doch eine Stelle haben wo du ein oder mehrer Mengen-Structs anlegst. Dann sagst du welches von wem der Nachfolger (pNaechster) ist. Das was ich eigentlich sagen wollte, ist dass du jedes neu angelegte Struct initialisieren sollst (am besten mit 0 überall) ----- Aber wenn es jetzt funktioniert dann ist es auch gut - trotzdem denke ich, dass wir aneinander vorbeigeredet haben. MfG Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
HELLmut Geschrieben 14. März 2002 Autor Teilen Geschrieben 14. März 2002 hier der teil mit dem struct: class CMenge { private: struct Menge{ int nummer; struct Menge *pNaechster; }; struct Menge *pAnfang; public: CMenge(); virtual ~CMenge(); void zufuegen(int nr); void entnehmen(int nr); bool enthalten_in(int nr); void zeige_inhalt(); void init(); void schneiden_mit(CMenge *pMenge); void vereinigen_mit(CMenge *pMenge); }; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
HELLmut Geschrieben 14. März 2002 Autor Teilen Geschrieben 14. März 2002 @olli: weiß jetzt nicht genau was du meinst, aber das stichwort lautet "verkettete liste" initialisieren kann ich die soweit ich weiß so gar nicht, da der speicher nach bedarf allokiert wird... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. März 2002 Teilen Geschrieben 14. März 2002 Aber Du könntest der struct Menge einen Konstruktor verpassen, der z.B. pNaechster auf NULL setzt. Wenn Du das nämlich irgendwo vergisst, dann hast Du ein Problem. Allerdings müsstest Du, damit der auch ausgeführt wird, die neuen Strukturen mit new holen und mit delete freigeben. Aber wenn Du sowieso C++ benutzt, ist das ohnehin empfehlenswert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Olli_Master Geschrieben 14. März 2002 Teilen Geschrieben 14. März 2002 @sub7 Das was ich gemeint habe steckt schon in der Zeile pZeiger->pNaechster=NULL; der Methode zufuegen(..) drin. Da allokierst du den Speicher mit malloc() und setzt pNaechster auf NULL. Ich dachte die Zeile hättest du vergessen... ------------------ Jetzt tritt der Fehler ja nicht mehr auf . Tschüss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
HELLmut Geschrieben 14. März 2002 Autor Teilen Geschrieben 14. März 2002 axo @ olli und mit dem konstrukt da mache ich mich morgen drüber ... danke für die vielen tips Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.