TStringList Array an Methode übergeben?



  • Hello Again,

    Hab mal einen Allgemeine Frage:

    Ich hab eine TStringList-Array (hier: SuchListe) , das wollte ich an einen Funktion "Suchen" übergeben,
    damit diese darauf zugreifen kann, und die gefunden Treffer, in die SuchListe eintragen kann.

    Sobald er aus der Funktion zurückkommt, möchte ich gerne mit der SuchListe und den gefunden Einträgen arbeiten.

    Mom. sieht das ungefähr so aus:

    TStringList* SuchListe[4];
      for(int i3=0; i3<4; i3++) SuchListe[i3] = new TTntStringList();
    
      Suchen(SuchListe,"Bla");
    
      // Werte aus SuchListe anzeigen oder so..  :D
    

    Nach langen probieren habe ich herausgefunden, wie ich das TStringList-Array an die Funktion übergeben muss:

    void Suchen(TStringList **templist){
     //Suchen
     }
    

    Meine Frage: Ist das korrekt so, und wenn ja warum zwei Sterne in der Parameterliste?

    Ahoy Netzcowboy



  • Hallo

    ganz einfach, weil du ein Array von TStringList hast. C-Arrays sind auch nur Listen von aufeinanderfolgenden Speicheradressen, die mit einem Pointer dargestellt werden können. du kannst also auch schreiben

    void Suchen(TStringList *templist[], int Count){
     // Count = Anzahl Elemente im Array
     }
    

    Allerdings würde ich dir lieber zu einem höherwertigem Container raten, wie std::vector oder DynamicArray. Die sind wesentlich besser zu handhaben. Und du kannst die ganz einfach per referenz übergeben.

    bis bald
    akari



  • Danke akari!

    Ich less mir mal ein bisschen dazu durch.
    Was würdest du persönlich empfehlen?
    Mom. speichere ich WideStrings in der StringList, geht das mit std::vector bzw. DynamicArray auch?

    Ahoy



  • Hallo

    sicher geht das mit vector und DynamicArray auf. Da beides Templates sind, kannst du (fast) jeden Typ damit verwenden.
    Ich dachte aber eigentlich den Container als Ersatz für das C-Array, mit TStringList als Typ.

    Das kommt aber darauf an, ob du wirklich eine zweifach verschachtelte Verwaltung brauchst.

    bis bald
    akari



  • So mit dem Dynamischen Array funktioniert eigentlich ganz gut.

    Falls jemand noch einen guten Tipp hat, wo man mehr darüber lesen kann, als in der BCB Hilfe... her damit 😉

    Weil ich mich gerade frage, wie lösch ich mein DynamicArray wieder aus dem Speicher?

    Folgender Quellcode:

    DynamicArray<TTntStringList*> SuchListe;
      SuchListe.set_length(4);
      for(int i3=0; i3<SuchListe.Length; i3++) SuchListe[i3] = new TTntStringList();
    
      // usw...
    
      delete SuchListe;
    

    geht leider nicht ...

    Ahoy Netzcowboy



  • Hallo

    das DynamicArray selber must du nicht löschen.
    du must aber die in dem Array angelegten Instanzen selber löschen.

    bis bald
    akari



  • [cpp]
    typedef DynamicArray<TStringList*> SL;
    DynamicArray<SL> aSL;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    SL Test;
    Test.Length = 2;
    for (int i = 0;i<2;i++)
      {
      Test[i] = new TStringList;
      for (int j=0;j<10;j++)
      Test[i]->Add(IntToStr(i)+"->"+IntToStr(j));
      }
    aSL.Length=2;
    aSL[0] = Test;
    aSL[1] = Test;
    Memo1->Text = aSL[0][0]->Text;
    Memo1->Text = Memo1->Text+aSL[1][1]->Text;
    }
    [/cpp]
    


  • Hi,

    mir persönlich gefällt folgende Zeile nicht:

    //SuchListe.set_length(4); 
      SuchListe.Length=4; //würde ich so machen.
    

    Mal abgesehen davon würde ich es so machen:::
    unit1.h

    private:
         typdef struct{ TStringList *hallo;
                      } LIST;
         DaynamicArray<LIST> SuchListe;
         void machwas(DynamicArray<LIST> &liste);
         void loscheList(DynamicArray<LIST &liste);//muss auf jedenfall auch in TForm1::Dystroy(...) aufgerufen werden
    

    unit1.cpp

    void _fastcall TForm1::Button1Click(TObjekt *Sender)
    {
     //Instanzieren 
     SuchListe.Length=4;
     for(int i=0; i<SuchListe.Length; i++)
      {SuchListe[i].hallo=new TStringList();
      }
    
     machwas(SuchListe);
     loscheList(SuchListe);
    } 
    //-------------------------------------
    
    void TForm1::machwas(DynamicArray<LIST> &liste)
    {for(int i=0; i<liste.Length; i++)
      liste[i].hallo->Add("dlonra  = arnold");
    }
    //-------------------------------------
    
    void TForm1::loscheList(DynamicArray<LIST> &liste) 
    {
     //löschen, kommplett aus dem Speicher
    
     for(int i=0; i<liste.Length; i++)  
      {liste[i].hallo->Clear();  //sicher ist sicher :-)
       delete liste[i].hallo;
      }
     liste.Length=0; //der SuchListezeiger existiert noch zeigt aber auf Null, also Anfangszustand
    }
    //-------------------------------------
    

    das Beispiel arbeitet mit einem eindimensionallen Array !!!!!!!!

    Möchtest du ein 2 dimensionales Array...

    DynamicArray< DynamicArray <LIST>> SuchListe;
    
    //die for-Schleifen sehen dann so aus:
    
    for(int y=0; y<SuchListe.Length; y++)
     {for(int x=0; y<SuchList[y].Length; x++)
       {SuchList[y][x].hallo->Add("dlonra = arnold");
     } }
    
    //Der Funktionsrumpf sieht dann so aus
    //void machwas(DynamicArray < DynamicArray <LIST>> &liste)
    

    Grüsse


Anmelden zum Antworten