Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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:

Geschrieben

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?

Geschrieben

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.

Geschrieben

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.

Geschrieben

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;

}

}

Geschrieben

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

Geschrieben

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);

};

Geschrieben

@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...

Geschrieben

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.

Geschrieben

@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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...