tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
8735
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Indian Indian ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    116
    Hi

    ich hab ein problem. Ich habe eine Klasse in dem Daten in einer Variable vom Typ
    CList<CString,CString> speichere. Diese heist

    Code :
    1
    
    CList<CString,CString> list;

    wie kann ich diese Variable einer Funktion überben wie muss der Funktionskopf deklariert sein. Bin momentan echt ratlos, denn ich hab schon vieles versucht.

    kann ich dann überhaupt

    Code :
    1
    
    "return list;"

    machen


    Thx Indian
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    return list geht.

    Beim Übergeben würde ich wenn möglich Referenzen benutzen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    void FunktionTuWas( const CList<CString,CString>& liste )
    {
      // dann einfach damit arbeiten
      liste.wullewatz();
     
    }
     
    // Aufruf
    FunktionTuWas( list );

    Wenn du die übergebene Liste ändern willst, entferne das const.
     

  3. #3
    Indian Indian ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    116
    danke

    1. aber wie initalsiert bzw. schreibt man denn Datentyp des Funktionkopfes ? so ?

    CList<CString,CString> Funktion(int a)


    2. wie kann ich eine CList<CString,CString> list z.B. zuweisen zu einer anderen CList<CString,CString list2 ?

    list2= list;

    ^ So geht das nicht da ich eine Fehlermeldung bekomme
     

  4. #4
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    1) So sollte das aussehen, aber da ich Punkt 2 sehe, denke ich, dass Punkt1 auch nicht geht. Hat CList keinen Zuweisungsoperator? (Hab nachgesehen, hat tatsächlich keinen)

    Ohne Zuweisungsoperator wird Punkt 2 nicht, oder wenn, dann nur fehlerhaft funktionieren (Vom Compiler erzeugter Zuweisungsoperator gibt einfach die Pointer per Wert weiter, wenn dann eine der Listen zerstört wird, hat die andere nur noch Schrott).

    In dem Fall würde ich das zurückgeben als Returnwert komplett vergessen.

    Wenn du eine Liste in einer Funktion füllen willst, mach es so:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    void FunktionTuWas( CList<CString,CString>& liste )
    {
      // dann einfach damit arbeiten
      liste.AddHead( ... );
    }
     
     
    // Aufruf:
     
    CList<CString,CString>   meineListe;
     
    FunktionTuWas( meineListe );
     
    // meineListe ist jetzt gefüllt..

    Nachtrag zu Punkt 2:

    Es scheint ja nicht mal einen Copy-Befehl für CList zu geben. Wenn du eine zweite Liste mit den Werten füllen willst, musst du wohl die Elemente einzeln rüberpacken.

    Versuch doch mal die STL std::list, die kann das alles. Die Handhabung ist zwar manchmal besch......eiden, aber dafür kann sie die wichtigen Dinge für Zuweisung.
    Geändert von Endurion (21.10.04 um 10:30 Uhr)
     

  5. #5
    Indian Indian ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    116
    vielen dank, eine frage noch

    CList<CString,CString> list;

    list ermöglicht mir doch das ich 2 Strings abspeichern kann oder ? kann ich auch CList<CString> list benutzen ?


    Denn ich habe ein CListCtrl Steuerelement, wo ich jedes Spalte bzw Zeilde editieren kann (ausgenommen der ersten). Deshalb möchte ich denn index, welcher in der ersten Spalte steht, merken bzw. zwischenspeichern. Ziel ist es denn Speichervorgang in die Datenbank zu beschleunigen. Es wird nur das abgespeichert was verändert wurde.
     

  6. #6
    Avatar von dorado
    dorado dorado ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Beiträge
    122
    Nein,

    CList<CString, CString> ist ein Template einer Liste mit String Objekten. Das erste CString gibt den Typ an, der in der Liste verwaltet wird, das zweite den Argumenttyp, den du z.B. bei AddHead als Argument an die Methode übergibst.


    Übrigens gibt es die Klasse CStringList mit derselben Funktionalität, aber nicht als Template.
     

  7. #7
    Indian Indian ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    116
    d.h. ich kann dann für meine obige Anwendung CStringList verwenden...
     

  8. #8
    Avatar von dorado
    dorado dorado ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Beiträge
    122
    Ja, tut dasselbe.

    Zu deinem Index zurück.
    Wenn es sich um lange Listen handelt und du dir den Index der geänderten Einträge merken willst, solltest du CMap verwenden, anstelle von CList. Dann kannst du schnell eindeutige Einträge darin ablegen ohne auf Duplikate prüfen zu müssen.
     

  9. #9
    Indian Indian ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    116
    geil

    dass muss man schon wissen.. und wie ist das mit denn Datentypen für CMap ?
    Die Index die ich benutze sind vom Typ CString.. funktioniert das mit CMap ?

    ich hab eine klasse in der die CStringList gefüllt werden soll. CMap sieht kompliziert aus und hab auch keine Ahnung wie ich das hier mit CMap realisieren soll.

    Initialisierung
    Code :
    1
    2
    3
    4
    
    ..
    public: 
           CStringList Index;
    ..

    Code:
    Code :
    1
    2
    3
    4
    
    void Funktion (CString string)
    {
    Index.AddTail(string);
    }

    Ein Object dieser Klasse wird schliesslich in meine anderen klasse erzeugt. Das problem ist .. wie habe ich zugriff dann auf CMap Wie kann ich nun auf Index in einer anderen Klasse zugreifen ?

    Am besten ich baue ne Funktion die mir Index zurückliefert oder ?

    Code :
    1
    2
    3
    4
    
    CStringList GetIndex()
    {
       return Index;
    }
    Geändert von Indian (21.10.04 um 16:54 Uhr)
     

  10. #10
    Avatar von dorado
    dorado dorado ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Beiträge
    122
    CList und CMap besitzen keinen Copykonstruktor und keinen Copy Operator. Das heisst, du kannst diese Objekte nicht bei value übergeben bzw zurückgeben.

    Entweder du gibst eine Referenz auf das Objekt zurück oder du kopierst es um.

    const CStringList &GetIndex(void)
    {
    return Index;
    }

    oder

    void GetIndex(CStringList &ndx)
    {
    ndx.AddTail(Index);
    }



    Wenn du in diesem Index **eindeutige** Strings speichern musst, würde ich mit CMap arbeiten und erst beim zurückgeben diese CMap in eine Stringlist kopieren.

    z.B. mit CMapStringToPtr wobei du den Ptr Anteil nicht brauchst.

    CMapStringToPtr Index;

    OnIndexChanged(const CString &str)
    {
    Index.SetAt(str, NULL); // Duplikate werden ersetzt, Ptr Anteil nicht genutzt
    }

    void GetIndex(CStringList &ndx)
    {
    CString str; // index string
    void *ptr = NULL; // dummy

    // hole alle eingetragenen Strings und kopiere sie in die Stringliste
    for(POSITION pos = Index.GetStartPosition(); pos != NULL; Index.GetNextAssoc(pos, str, ptr))
    {
    ndx.AddTail(str);
    }
    }

    In der Map könntest du zu jedem String weitere Daten speichern, da der String ein weiteres Objekt bestimmt. Das ist abhängig von der Art der Map. CMapStringToOb, CMapStringToString ...
    Mit der Templateversion kannst du dir auch eigene Maps erstellen, was aber meistens nicht notwendig ist.
     

  11. #11
    Indian Indian ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    116
    Vielen dank für die ausführliche Erklärung. Ich habe es genauso gemacht wie du es hier geschildert hast.

    Bis hier her wird der wert richtig übergeben. Jedoch kann ich beim Debuggen nicht feststellen ob der mit SetAt auch richtig abgespeichert wird. Wenn ich Index im Debug überwache steht unter Objekt - __vfptr CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden *


    Code :
    1
    2
    3
    4
    
    OnIndexChanged(const CString &str)
    {
             Index.SetAt(str, NULL); // Duplikate werden ersetzt, Ptr Anteil nicht genutzt
    }

    Beim Aufruf bekomme ich die Werte auch nicht zurück.
    Mein Aufruf
    Code :
    1
    2
    3
    4
    
                      CStringList EditedRows;
            m_IDCList.GetEditedRowIndexList(EditedRows);
            for(POSITION pos = EditedRows.GetHeadPosition(); pos != NULL; )
                CString articelNr = EditedRows.GetNext(pos); //get index of edited row
    Geändert von Indian (26.10.04 um 10:32 Uhr)
     

  12. #12
    Avatar von dorado
    dorado dorado ist offline Mitglied Gold
    Registriert seit
    Oct 2004
    Beiträge
    122
    CMapStringToPtr hat ein Member m_pHashTable, das deine Objekte verwaltet und ein m_nCount anhand dessen du siehst wieviele Objekte eingetragen sind.
    Wenn du das nicht siehst, ist die Map dort, wo du sie im Debugger betrachtest, nicht mehr gültig.
    Ich nehm mal an, dass du in der m_IDCList die geänderten Strings in einer Map speicherst.
    Wenn du diese Liste mit GetEditedRowIndexList(EditedRows) holst, musst du sie dort in die Stringliste kopieren.
    ...::GetEditedRowIndexList(CStringList &EditedRows)
    {
    CString str;
    void *ptr = NULL;
    for(pos = Index.GetStartPosition(); pos != NULL; )
    {
    Index.GetNextAssoc(pos, str, ptr);
    EditedRows.AddTail(str);
    }
    }
     

  13. #13
    Indian Indian ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    116
    also ich habs sie so kopiert

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    void CSortListCtrl::GetEditedRowIndexList(CStringList &strList)
    {
        CString str; // index string
        void *ptr = NULL; // dummy
     
        // hole alle eingetragenen Strings und kopiere sie in die Stringliste
        for(POSITION pos = Index.GetStartPosition(); pos != NULL; Index.GetNextAssoc(pos, str, ptr))
        {
            strList.AddTail(str); 
        }
    }//end GetEditedRowIndexList

    irgendwas läuft schief und beim Debuggen bekomme ich auch keine Werte angezeigt. Auch in der Hash Tabelle nicht.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    void CSortListCtrl::SetEditedRowIndex(const CString &str)
    {
        Index.SetAt(str, NULL);
     
     
    // eingebaut wegen debug
    String test;
    test = "Hallo";
    test = test + "du";
     
    }//end SetEditedRowIndex

    leider bekam ich hier unter debug auch keine werte angezeigt
    Geändert von Indian (26.10.04 um 12:25 Uhr)
     

  14. #14
    Indian Indian ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    116
    ich denk das die geänderten Strings nicht abgespeichert werden.

    Ich denke das hier evtl etwas falsch läuft.

    void CSortListCtrl::SetEditedRowIndex(const CString &str)
    {
    Index.SetAt(str, NULL);
    }//end SetEditedRowIndex
     

  15. #15
    Indian Indian ist offline Mitglied Gold
    Registriert seit
    May 2004
    Beiträge
    116
    weist du was. Ich denke das ich hier etwas falsch machen wenn ich versuche die Werte von dem Objekt, des Typs CStringList, abzufragen.

    CStringList EditedRows;
    m_IDCList.GetEditedRowIndexList(EditedRows);
    for(POSITION pos = EditedRows.GetHeadPosition(); pos != NULL; )
    CString articelNr = EditedRows.GetNext(pos); //
     

Ähnliche Themen

  1. CString mittels c_str() als Pointer übergeben?
    Von Cappaja im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 24.06.09, 13:48
  2. CString in int
    Von thodtie im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 04.11.04, 16:55
  3. CString von dll dem progamm übergeben
    Von Executer im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 10.10.04, 20:33
  4. CString
    Von kerian im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 09.10.03, 20:36
  5. Antworten: 2
    Letzter Beitrag: 26.09.03, 13:04