tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
657
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Rubilak Rubilak ist offline Rookie
    Registriert seit
    Aug 2007
    Beiträge
    6
    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.
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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:
    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");
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Rubilak Rubilak ist offline Rookie
    Registriert seit
    Aug 2007
    Beiträge
    6
    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;
    }

    }
    }

     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Rubilak Beitrag anzeigen
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Rubilak Rubilak ist offline Rookie
    Registriert seit
    Aug 2007
    Beiträge
    6
    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)
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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

  1. Antworten: 2
    Letzter Beitrag: 25.11.10, 18:27
  2. Antworten: 0
    Letzter Beitrag: 03.02.10, 11:25
  3. Innerhalb einer Klasse eine Instanz einer anderen Klasse
    Von HackerNeo im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 17.11.09, 13:08
  4. Antworten: 4
    Letzter Beitrag: 09.07.05, 00:19
  5. [C++] Probleme mit einer template-Klasse
    Von Suehprom im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 08.03.04, 22:29