ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
657
657
EMPFEHLEN
-
Hallo Leute.
Ich habe folgendes Problem:
struct dlvKnoten
{
TStringList * Asso; // Hier ist der Zeiger der auf eine TStringList zeigen soll
int Stelle;
AnsiString Content;
bool Startkn;
bool Endkn;
dlvKnoten * next;
dlvKnoten * prev;
void AddAsso(AnsiString Name,AnsiString OVKeller, AnsiString OVBand, AnsiString OWKeller);
void ReturnAsso(AnsiString Name, TStringList * &Uebergabe);
};
void dlvKnoten::AddAsso(AnsiString Name,AnsiString OVKeller, AnsiString OVBand, AnsiString OWKeller)
{
TStringList * Asso1 = new TStringList; // erzeuge neue TStringList
Asso1->AddStrings(Asso);
AnsiString Term = Name + "(" + OVKeller + "," + OVBand + "," + OWKeller + ")";
Asso1->Add(Term); // hier Adde ich den Inhalt
ShowMessage("bla");
Asso = Asso1; // Bei der Übergabe der TStringList tritt ein Speicherfehler auf
}
Also folgendes Problem.
Ich habe einen Zeiger auf eine TStringList in einer "Stuct - Klasse" angelegt.
Aber sobald ich in der Funktion "AddAsso" dem Zeiger eine TStringList zuweisen will bekomme ich eine Speicherverletzung.
Es wäre schön wenn ihr mir helfen könntet.
-
27.09.07 18:24 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Normalerweise würde man die Attribute in der OOP nicht öffentlich machen, also in dem Fall eine richtige Klasse erstellen. Und man würde im Konstruktor die TStringList instanzieren und im Desktruktor wieder freigeben:GrußCode cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
class dlvKnoten { TStringList * Asso; // Hier ist der Zeiger der auf eine TStringList zeigen soll ... public: divKnoten() { Asso = new TStringList; } ~divKnoten() { delete Asso; } void AddAsso(AnsiString Name,AnsiString OVKeller, AnsiString OVBand, AnsiString OWKeller); }; void dlvKnoten::AddAsso(AnsiString Name,AnsiString OVKeller, AnsiString OVBand, AnsiString OWKeller) { AnsiString Term = Name + "(" + OVKeller + "," + OVBand + "," + OWKeller + ")"; Asso->Add(Term); // hier Adde ich den Inhalt ShowMessage("bla"); }
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Danke für deine Idee, aber irgendwie kommt immer noch eine Speicherverletzung.
Ich hab eigentlich keine "Class" verwendet, weil das eine Header für eine Doppeltverkette Liste sein Soll. Ich kann ja mal den gesamten Programmtext der Header einfügen, vielleicht hilfts ja dabei mir zu helfen (geändert nach: deepthrout)
class dlvKnoten
{
TStringList * Asso;
public:
dlvKnoten() {
Asso = new TStringList;
}
~dlvKnoten() {
delete Asso;
}
int Stelle;
AnsiString Content;
bool Startkn;
bool Endkn;
dlvKnoten * next;
dlvKnoten * prev;
void AddAsso(AnsiString Name,AnsiString OVKeller, AnsiString OVBand, AnsiString OWKeller);
void ReturnAsso(AnsiString Name, TStringList * &Uebergabe);
};
void dlvKnoten::AddAsso(AnsiString Name,AnsiString OVKeller, AnsiString OVBand, AnsiString OWKeller)
{
AnsiString Term = Name + "(" + OVKeller + "," + OVBand + "," + OWKeller + ")";
ShowMessage("bla");
Asso->Add(Term);
}
void dlvKnoten::ReturnAsso(AnsiString Name, TStringList * &Uebergabe)
{
bool pruef = false;
AnsiString bla;
TStringList * Asso1 = new TStringList;
Asso1->AddStrings(Asso);
for (int i = 0; i < Asso->Count && pruef == false; i++)
{
bla = Asso1->Strings[i];
bool pruef1 = false;
for(int j = 1; j <= Name.Length() && pruef1 == false; j++)
{
if(Name[j] != bla[j])
pruef1 = true;
}
if (pruef1 != true)
pruef = true;
}
if(pruef == false)
Uebergabe->Add("E");
else
{
AnsiString EName ,OVKeller ,OVBand ,OWKeller;
int i;
for (i = 1; bla[i] != '('; i++)
EName = EName + bla[i];
for (i+1; bla[i] != ','; i++)
OVKeller = OVKeller + bla[i];
for (i+1; bla[i] != ','; i++)
OVBand = OVBand + bla[i];
for (i+1; bla[i] != ')'; i++)
OWKeller = OWKeller + bla[i];
Uebergabe->Add(EName);
Uebergabe->Add(OVKeller);
Uebergabe->Add(OVBand);
Uebergabe->Add(OWKeller);
}
}
dlvKnoten * souti(dlvKnoten * wufront, dlvKnoten * wuback,AnsiString Name)
{
if ((wufront != NULL) && (wuback != NULL))
{
dlvKnoten * hilf = wufront;
bool fertsch = false;
for(int i = 0; hilf != NULL && fertsch == false; i++)
{
if (hilf->Content == Name)
{
fertsch = true;
return hilf;
}
hilf = hilf->next;
}
if (fertsch == false)
return NULL;
}
else
return NULL;
}
void buildtail(dlvKnoten * &wufront, dlvKnoten * &wuback,AnsiString Content,bool Startkn, bool Endkn)
{
dlvKnoten * neu;
neu = new dlvKnoten;
neu->Content=Content;
neu->Startkn = Startkn;
neu->Endkn = Endkn;
if ((wufront == NULL) && (wuback == NULL))
{
neu->next = wufront;
wufront = neu;
neu->prev = wuback;
wuback = neu;
neu->Stelle = 1;
}
else
{
neu->next = NULL;
neu->prev = wuback;
wuback = neu;
wuback->prev->next = neu;
neu->Stelle = neu->prev->Stelle+1;
}
}
void killall(dlvKnoten * &wufront, dlvKnoten * &wuback)
{
do
{
if ((wufront != NULL) && (wuback != NULL))
{
dlvKnoten * fhilf = wufront;
wufront = wufront->next;
delete fhilf;
}
}
while ((wufront != NULL) && (wuback != NULL));
wuback = NULL;
}
void delone(dlvKnoten * &wufront, dlvKnoten * &wuback,AnsiString Name)
{
if ((wufront != NULL) && (wuback != NULL))
{
dlvKnoten * hilf = wufront;
bool fertsch = false;
for(int i = 0; hilf != NULL && fertsch == false; i++)
{
if (hilf->Content == Name)
{
if(hilf->prev == NULL)
{
wufront = hilf->next;
wufront->prev = NULL;
delete hilf;
hilf = wufront;
for (int i = 0; hilf != NULL; i++)
{
hilf->Stelle = i;
hilf = hilf->next;
}
}
else
{
if (hilf->next == NULL)
{
wuback = hilf->prev;
wuback->next = NULL;
delete hilf;
}
else
{
hilf->next->prev = hilf->prev;
hilf->prev->next = hilf->next;
delete hilf;
hilf = wufront;
for (int i = 0; hilf != NULL; i++)
{
hilf->Stelle = i;
hilf = hilf->next;
}
}
}
fertsch = true;
}
hilf = hilf->next;
}
}
}
-
27.09.07 22:31 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ja daran muss es liegen, denn ich habe ja vorher mit ShowMessage eine Nachrichtausgeben lassen. Und direkt danach kommt die Fehlermeldung. Nach dem Aufruf der Funktion im Hauptprogramm ist auch eine ShowMessage, die aber nicht angezeigt wird, statt dessen die Speicherverletzung.
Geändert von Rubilak (28.09.07 um 13:33 Uhr)
-
28.09.07 13:58 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Dann setz doch mal einen Haltepunkt und geh mit dem Debugger durch das Programm. Sind die Variablen (insbes. die Zeiger) alle initialisiert und valide?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
C# - Eine const variable von einer Klasse zu einer anderen übergeben.
Von Doppiboon im Forum C/C++Antworten: 2Letzter Beitrag: 25.11.10, 18:27 -
Probleme Instanz einer Klasse in einen vector oder eine ArrayList zu befördern
Von PaRoX im Forum VisualStudio & MFCAntworten: 0Letzter Beitrag: 03.02.10, 11:25 -
Innerhalb einer Klasse eine Instanz einer anderen Klasse
Von HackerNeo im Forum VisualStudio & MFCAntworten: 1Letzter Beitrag: 17.11.09, 13:08 -
Zugriff auf eine Klasseninstanz innerhalb einer Funktion einer anderen Klasse?
Von Bailor im Forum PHPAntworten: 4Letzter Beitrag: 09.07.05, 00:19 -
[C++] Probleme mit einer template-Klasse
Von Suehprom im Forum C/C++Antworten: 3Letzter Beitrag: 08.03.04, 22:29





Zitieren

Login






