Probleme einer TStringList in einer Struct-Klasse

Rubilak

Grünschnabel
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.
 
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:
C++:
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");
}
Gruß
 
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)
Code:
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;
       }
    
    }
}
 
Hi.
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.
Das ist noch lange kein Grund dafür.

Wo bekommst du denn die Speicherverletzung? Immer noch in der AddAsso Methode?!

Bitte verwende Code Tags wenn du Quellcode postest.

Gruß
 
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.
 
Zuletzt bearbeitet:
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ß
 

Neue Beiträge

Zurück