Announcement

Collapse
No announcement yet.

TList

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TList

    Hi!

    Was mache ich falsch? Ich habe eine Klasse geschrieben, deren Zeiger (von den Objekten) ich in einer TList speichern möchte. Aber beim Hinzufügen erhalte ich eine "Zugriffverletzung bei Adresse XXXX im Modul VCL50.BPL beim Lesen von XXXX".

    Hier die Klasse eren Instanzen gespeichert werden sollen:

    --------------------------------------------------------------
    class CStudent : protected CAnschrift
    {
    protected:
    long int mLI_Nr;
    long int mLI_MatrNr;
    long int mLI_PersNr;
    AnsiString mAS_Name;
    TStringList* Vornamen; // Liste mit Vornamen, Achtung Typ muss TString sein! (Statt AnsiString)
    TList* Anschriften;

    public:
    CStudent();
    ~CStudent();

    // Student
    void AddNr(const long int &liTemp);
    void AddMatrNr (const long int &liTemp);
    void AddName(const AnsiString &asTemp);
    void AddPersNr(const long int &liTemp);

    long int GetNr() const;
    long int GetMatrNr() const;
    AnsiString GetName() const;
    long int GetPersNr() const;

    // Vorname
    void AddVorname (const AnsiString &asTemp);

    int VornameCount(); // Gibt die Anzahl der vorhandenen Vornamen an
    AnsiString GetVorname(int i) const; // Gibt einen Vornamen, zugriff über index i, 0 = erster Name
    void DeleteVorname(int i) const;

    // Anschrift
    void AddAnschrift(const long int &iTempNr, const AnsiString &asTempOrt, const AnsiString &asTempStrasse, const int &iTempHausNr, const int &iTempPLZ);

    int GetCountAnschriften() const;
    AnsiString GetOrt(int i) const;
    AnsiString GetStrasse(int i) const;
    int Get_HausNr(int i) const;
    int Get_PLZ(int i) const;
    void DeleteAdresse(int i);
    };

    ----------------------------------------------------------

    und hier ein Auszug der Klasse die speichern soll

    Konstrucktor:

    try
    {
    TList* pListStudenten = new TList();
    pListStudenten->Clear();
    }
    catch (TList&)
    {
    OutMSG("TList Studenten konnte nicht angelegt werden",1);
    }

    --------------------

    gespeichert soll dann so werden:

    CStudent *pStudentTemp = new CStudent;
    pListStudenten->Add(pStudentTemp);

    --------------------------
    Auch direktes Casten mit: pListStudenten->Add((void*)pStudentTemp); brachte keinen Erfolg.

    Wäre toll, wenn mir jemand helfen könnte: [email protected].
    Vielen Dank

    MFG Christian

  • #2
    Naja, wäre es für die anderen nicht schön, wenn man Quelltext wie folgt einfügt:

    'PRE'

    ..Quelltext

    '<PRE>'
    wobei die ' ' durch < .. > zu ersetzen sind
    So bleibt die Formatierung erhalten.

    Die ADD-Funktion erwartet vielleicht ein String-Objekt.Also den Zeiger vor ADD in eine String verwandeln??

    Add(InttoStr(pStudentTemp))
    Christian

    Comment


    • #3
      Mhhh. Okay, das mit der Formatierung wusste ich nicht ... sorry. Kann die Files aber bei Bedarf auch zusenden.

      Das mit dem String ist keine gute Idee. es handelt sich um eine reine TList und nicht um eine TStringList. TList sind dazu da Zeiger zu speichern.

      Chri

      Comment


      • #4
        Ist das der Originalquellecode?<br>
        CStudent *pStudentTemp = new CStudent;<br> pListStudenten->Add(pStudentTemp);<br>
        <br>
        Falls ja, wundert es mich, daß der Compiler keine Fehler meldet.<br>
        Probiere mal<br>
        CStudent *pStudentTemp = new CStudent(); // Funktionen haben in C/C++ immer Klammern<br>
        pListStudenten->Add(pStudentTemp)

        Comment


        • #5
          Ach ... nein.

          Im Quellcode steht es richtig drinne - so wie Du es schreibst.

          also
          CStudent *pStudentTemp = new CStudent();

          Sorry - das war es nicht. Vielleicht hat jemand noch ne andere Idee. Kann auch den gesamten Quellcode freigeben.

          Chri

          Comment


          • #6
            Am besten schickst Du mir mal den Quellcode<br>
            [email protected]<br&gt

            Comment


            • #7
              Der Fehler liegt vermutlich im Konstruktor<br>
              Du legst lokal nochmal eine Variable an<br>
              <br>
              try<br>
              { <br>
              TList* pListStudenten = new TList(); <br>
              pListStudenten->Clear(); <br>
              } <br>
              <br>
              richtig ist:<br>
              <br>
              try <br>
              { <br>
              pListStudenten = new TList(); <br>
              pListStudenten->Clear(); <br>
              } <br>
              <br&gt

              Comment


              • #8
                Hi,<BR>catch (TList&) bringt nichts<BR>catch (Exception&) ist besser<BR>Der Fehler deutet auf nicht initialisierte Zeiger.<BR>Statt TList würde ich lieber std::list< Meine-Klasse * > verwenden.<BR>MFG Pete

                Comment


                • #9
                  Hi Christian!<br>

                  Sende mir mal bitte deinen Source, damit ich ihn besser lesen <br>
                  kann.<br>
                  Wenn Du hier im Forum suchst(unter TList), wirst Du sehen das ich<br>
                  mich mit diesem Problem cshon vor einiger Zeit beschäftigt habe.<br>
                  Bei der Ableitung einer eigenen Klasse von TList muß man<br>
                  einiges beachten.<br>

                  Soweit ich es auf die schnelle erkannt habe, initialisierst Du<br>
                  Deine TStringList garnicht!!!!
                  Desweitere sehe ich TList* Anschriften welcher auch <br>
                  so im Raum steht.<br>

                  Gruß Fred

                  [email protected]

                  Comment


                  • #10
                    Danke an Alle die mir geholfen haben.

                    Aber der Christian Wende hats gefunden. Ich habe die TList ausversehen (ich alter Schusselpeter) ein zweites mal declariert. Das gab den Ärger.

                    Vielen Dank,
                    Chris

                    -> 4 Augen sehen halt mehr

                    Comment

                    Working...
                    X