Zum Inhalt springen

c++ problem in methode


HELLmut

Empfohlene Beiträge

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

}

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

};

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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