Wie funktionieren Arrays bei BCB?



  • Hallo zusammen,

    ich programmiere sehr viel in PHP und bin wahrscheinlich von der Vielseitigkeit der Funktionen verwöhnt.

    Bei BCB ist dies eine ganz schön Umgewöhnung. Jedoch sollte es auch möglich sein, ein Array vom Typ AnsiString anzulegen und dann auf bestimmte Einträge abzufragen.

    Hier mein Ansatz:

    AnsiString aExt[] = { "jpg", "jpeg", "gif", "png" } ;
    
    //---------------------------------------------------------------------------
    bool __fastcall TMainFrm::in_array( AnsiString sText, AnsiString sArray ) {
            for ( int i = 0 ; i < sizeof(sArray) ; i++ ) {
                    if ( sArray[i] == sText ) {
                            return true ;
                    }
            }
            return false ;
    }
    

    In der Funktion in_array soll geprüft werden, ob sText in sArray vorhanden ist. Nur durch die Abfrage sArray[i] == sText sollte ich sicherlich nie eine Übereinstimmung bekommen, da sArray[i] bestimmt den Einzelnen Charakter zurück gibt und nicht "jpg", "gif" und Co.

    Daher meine Frage wie das ganze Funktionieren kann oder ob der ein oder andere eventuell ein Schnipsel für mich hat.

    Vielen Dank für Eure Aufmerksamkeit,
    Heinz



  • Erstmal ist "sArray" nur ein einzelner String und kein Array. (ein Array würdest du per AnsiString sArray[] oder AnsiString* sArray (Zeiger-Syntax) übergeben)

    Zweitens kann man in C++ nicht (portabel) herausfinden, wieviele Elemente ein übergebenes Array hat (im Hauptprogramm kannst du noch sizeof(aExt)/sizeof(aExt[0] verwenden, aber in der Funktion hast du nur einen Zeiger und sizeof liefert dessen Größe). Da mußt du im Ernstfall der Funktion verraten, wie groß das Array ist - oder Containerklassen ala std::vector verwenden.



  • Hallo

    Du hast zwar das Array aExt[] angelegt, aber die Suche bezieht sich auf den Parameter sArray. Und dieser Parameter ist vom Typ AnsiString, deshalb liefert der []-Operator auch einen char. Auserdem liefert sizeof auf einen AnsiString nicht das Ergebnis was dir vorschwebt.
    Du must den Parameter eben auch als Array übergeben :

    bool __fastcall TMainFrm::in_array( AnsiString sText, AnsiString* sArray, int Size ) {
            for ( int i = 0 ; i < Size ; i++ ) {
                    if ( sArray[i] == sText ) {
                            return true ;
                    }
            }
            return false ;
    }
    ...
    in_array("jpeg", aExt, 4);
    

    /Edit : Zu langsam aber mit Code 😉

    bis bald
    akari



  • Okay, das mit der Übergabe verstehe ich schon.
    Doch wie bekomme ich jetzt die Anzahl der Elemente von aExt heraus und kann ich aExt auch dynamisch erweitern?

    aExt[] = { "bmp" } ;
    // aExt würde dann aus 5 Elementen bestehen
    // "jpg", "jpeg", "gif", "png", "bmp"
    

    @akari: Code ist immer gut. 😉



  • Hallo

    Die Berechnung der Elemente eines statisches Array hat CStoll ja schon gezeigt

    int Size = sizeof(aExt)/sizeof(aExt[0]);
    

    Achtung das geht nicht bei dynamischen Arrays, also wenn du einen Pointer auf das erste Element hast! Da must du die Größe manuell mitspeichern.
    Deshalb ist es in C++ üblich für solche dynamischen Arrays das ebenfalls angesprochene std::vector zu verwenden. Das verwaltet den Speicher seiner Elemente selber und kennt auch deren Anzahl. Siehe den Magazin-Artikel "STL-Container" hier im Forum.

    bis bald
    akari


Anmelden zum Antworten