vector Inhalt ploetzlich weg



  • Hi,

    Ich programmiere zwar unterm BCB, denke aber dass die Frage eher hierhin
    gehoert, ansonsten einfach verschieben.

    Auf der Arbeit habe ich eine Klasse, welche eine Membervariable vom Typ vector<>
    enthaelt:

    class MyClass
    {
         private:
               vector < AnsiString >    m_Values;
         //...
    };
    

    Kurz zur Klasse:
    Ich habe eine Statusbar, die in mehrere Teile unterteilt ist. Bevor ich in der
    Statusbar eine ProgressBar erzeuge, speichere ich die Texte der einzelnen
    Teile in dem Vector 'm_Values'.

    Diese Funktion sieht so aus:

    void MyClass::SaveValues ()
    {
         for ( int i = 0; i < 12; ++i )
               this -> m_Values.push_back ( this -> Panels -> Items[i] -> Text );
    }
    

    Soweit so gut. Laut Debugger werden die Texte der einzelnen Abschnitte auch
    schoen in 'm_Values' gespeichert. Nur, sobald ich die Funktion aufrufe, um
    diese Texte wiederherzustellen, ist 'm_Values' leer.

    Wie kann das sein?

    Danke schon mal im Voraus

    mfg
    v R



  • 1. Warum verwendest du den Objectzeiger(this) um auf Membervariablen zuzugreifen? (Formsache)
    2. vector ist der aus der std ? also hast irgendwo namespace std; angegeben ? (Kenn mich mit borland ned so aus)
    3. was ist AnsiString ???
    4. Debugge mal und schau was nach deinem einfuegen ein m_Values.size() zurueckliefert
    5. Ich hab mit den STD-containerklassen unter MS und ATL auch meine Probleme .... besonders wenn ich direkt von den klassen ableite. (class CMyContainerclass: public std:vector<CMyClass *> ) Ich hoffe nur deine Implementation ist besser 🙂 Aber such erst mal den Fehler in deinem Prog

    Cio ...



  • 1. Warum verwendest du den Objectzeiger(this) um auf Membervariablen zuzugreifen?
    (Formsache)

    Hab ich mir so angewoehnt, faellt mir schwer es abzugewoehnen.

    2. vector ist der aus der std ? also hast irgendwo namespace std; angegeben ?
    (Kenn mich mit borland ned so aus)

    Jepp, gibts denn sonst noch einen? Hab in der Klassenheader ein
    'using std::vector' stehn.

    3. was ist AnsiString ???

    Ist eine Stringklasse von Borland (die schmieden ja immer ihr eigenes Zeug)

    4. Debugge mal und schau was nach deinem einfuegen ein m_Values.size()
    zurueckliefert

    Warum auch immer, aber wenn ich mir diese Variable anschaue, steht da "100%",
    obwohl es sich um einen Integer handelt

    5. Ich hab mit den STD-containerklassen unter MS und ATL auch meine Probleme
    .... besonders wenn ich direkt von den klassen ableite. (class
    CMyContainerclass: public std:vector<CMyClass *> ) Ich hoffe nur deine
    Implementation ist besser 🙂 Aber such erst mal den Fehler in deinem Prog

    Naja, von der Klasse hab ich ja nicht geerbt, sondern ich hab mir lediglich
    ne Membervariable angelegt.

    Aussteigen tut er, sobald ich ueber einen Iterator lesend zugreife:

    std::vector < AnsiString >::const_iterator It = m_Values.begin ();
          for ( int i = 0; i < 12; ++i )
               this -> Panels -> Items[i] -> Text = *It++;
    

    Der Zugriff ist doch korrekt, oder?

    mfg
    v R

    [ Dieser Beitrag wurde am 19.03.2003 um 13:07 Uhr von virtuell Realisticer editiert. ]



  • Benutze niemals 'using' in einem Header.



  • Hi virtuell Realisticer ,

    Warum quaelst Du Dich mit vector ... 'rum??? 😕

    Wenn Du mit BCB arbeitest, nimm doch besser in Deine Klasse ein TStringList auf!
    😉
    im Constructor mit TStringList *SL=new TStringList; erzeugen
    im destructor delete SL; vernichten.

    Zum Fuellen:
    SL->Clear();
    SL->Add("Neuer Test");
    .
    .
    .

    Beim Auslesen gibt's da kaum Probleme! :p

    PS: Anderes Forum waere doch besser!(?)



  • Benutze niemals 'using' in einem Header.

    Hatt ich auch schon wieder rueckgaengig gemacht und durch ein

    std::vector < AnsiString > m_Values;
    

    ersetzt (Hab doch gestern erst wieder die Stelle in Marc++s Buch gelesen 🙄 )

    PS: Anderes Forum waere doch besser!(?)

    Wenn ich es mit TStringList mache, dann ja. Aber vector gehoert doch eher hier
    herein.

    mfg
    v R

    PS: Werd es jetzt erstmal mit TStringList ausprobieren, dennoch find ich es
    sehr merkwuerdig, dass der vector ploetzlich leer ist 😞



  • Hallo,

    @DerAltenburger
    warum kein vector? Als quälen würde ich das nicht gerade bezeichnen.

    @virtuell Realisticer

    Die Schleife würde ich aber so machen

    for(std::vector < AnsiString >::iterator i=m_Values.begin(); i!=m_Values.end(); i++)
               this -> Panels -> Items[i] -> Text = *i;
    

    Meinst du mit leer, das kein Element mehr im Vektor ist, oder das die enthaltenden Elemente leer sind?
    Wenn die Elemente leer sind, so musst du bedenken, dass AnsiString mit Referenzzähler arbeitet, das also bei Kopien kein wirklich neuer String erzeugt wird. Wenn du also das Orginal löschst ist auch die Kopie leer. Die Referenz kannst du mit der MemberMethode Unique() auflösen.

    Ciao

    [ Dieser Beitrag wurde am 19.03.2003 um 13:31 Uhr von Braunstein editiert. ]



  • Die Schleife würde ich aber so machen

    for(std::vector < AnsiString >::iterator i=m_Values.begin(); i!=m_Values.end(); i++)
    this -> Panels -> Items[i] -> Text = *i;

    Ne, das kann nicht gehn, da 'i' ja vom Typ 'AnsiString *' ist. Der Zugriff auf
    'Items[i] -> Text' funktioniert dann nicht mehr.

    mfg
    v R



  • Doch das müsste schon gehen.
    i ist ein Iterator auf AnsiString



  • @Braunstein

    Ob 'Quaelerei' oder nicht, ist Ansichtssache, da haste Recht.

    Ich meinte nur, wenn er mit BCB arbeitet, macht sich das besser auch BCB- Funktionen/ Klassen zu benutzen (Da passt (fast 😉 )alles direkt zusammen).

    Bei 'ner BCB- Stringliste weis ich was d'rin ist - KOPIEN der Strings.

    Deine Aussage mit dem Referenzzaehler bei AnsiString se' ich aber nicht ganz so:

    Wenn ( IM BCB!!!) einer AnsiString- Variablen der Inhalt einer anderen zugeordnet wird, ist der Inhalt auch noch da, wenn die andere geaendert wird!!!
    Deine Aussage stimmt nur, wenn einer Zeigervariablen (auf AnsiString) die Adresse einer anderen verpasst wird. Das macht der Realisticer aber nicht!(?)

    @Realisticer

    Das mit dem vector muesste gehen!(hab's mit BCB 4.0 probiert!)
    Du musst vector.h includieren

    [ Dieser Beitrag wurde am 19.03.2003 um 13:51 Uhr von DerAltenburger editiert. ]



  • Probier mal das hier und schau ob es dann noch probleme gibt

    for(std::vector < AnsiString >::iterator i=m_Values.begin() , int n = 0; i!=m_Values.end(); ++i,++n)
               this -> Panels -> Items[n] -> Text = *i;
    


  • @DerAltenburger

    Das bei AnsiString Zuweisungen nur Referenzen übergeben werden, hat nix mit Pointern zu tun. Prinzipiell hast du natürlich recht.
    Wenn du einem AnsiString einen Anderen zuweist wird der Referenzzähler um 1 erhöht aber keine echte Kopie angelegt. Wenn du dann allerdings den ersten AnsiString änderst, müsste die Referenz aufgehoben werden und der Zähler wieder derkrementiert werden.
    siehe auch
    http://ourworld.compuserve.com/homepages/praxisservice/kapit3.htm



  • @Braunstein

    Da sind wir uns ja einig 😉 .

    Nur erklaert das jetzt nicht das Problem vom Realisticer???

    Bei mir funktioniert sein Code, komisch!



  • So, ich hab jetzt diese beiden Funktionen ganz rausgenommen und korrigiere
    einfach nur die groesser der Teilbereiche nachdem die Progressbars weg sind.

    Jetzt steht dort wieder alles korrekt.

    Danke fuer die Hilfe von euch allen.

    mfg
    v R



  • vielleicht hast du den vektor kaputt gemacht in dem eine andere funktion in den speicherbereich dieses vektors schreibt. da gibt es überhaupt keine probleme bei AnsiString in vector. Mach mal ein Minimalbeispiel. Bestimmt macht ne andere Stelle in deinem Programm den Fehler



  • Hi,

    also in einem Minibeispiel sind die Daten in vector auch enthalten, wenn sich
    die Daten in nem Text-Element eines Panels aendert oder geloescht wird.

    Naja, ich werd mir den Quellcode nochmal durchlesen muessen.

    mfg
    v R


Anmelden zum Antworten