Frage zu SetLength



  • Hallo. Ich habe folgende Funktion aus einem Delphi-Beispiel und benötige diese in meinem C++Builder2009 ebenfalls, allerdings sagt dieser mir immer diese sei undefiniert, obwohl es diese auch für C++ geben soll.

    http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_SetLength.html

    Ich habe auch #include <system.hpp> eingebunden, das hat allerdings auch nicht weitergeholfen. Kann mir jemand bitte sagen was ich falsch mache. 😉



  • Ups, vergessen zu erwähnen was ich machen möchte. Ich habe eine Delphi-Komponente die folgende Variable hat.

    TRegValues = array of Word;
    

    und möchte diese jetzt in C++ nutzen:

    TRegValues RegValues;
    SetLength(RegValues, 100);
    

    Das soll dann sowas sein wie TRegValues RegValues[100] nur eben dynamisch. 😉



  • Nimm std::vector :

    #include <vector>
    
    // initialisiere v mit 100 Elementen
    std::vector<TRegValues> v( 100 );
    


  • Vielen Dank, daran dachte ich auch bereits. Die Frage die sich mir hier mehr stellt ist warum das obige nicht funktioniert. Es ist nicht das erste mal das ich Sachen probiere die laut Doku gehen sollen, aber doch nicht funktionieren. Ist die RAD Studio Doku so fehlerhaft oder mache ich da was falsch?



  • Hallo

    Das ist eben eine Delphi-spezifische Implementation von dynamischen Arrays, das kannst du nicht direkt in C++ Syntax umschreiben. In C++ werden dynamische Arrays anders verwendet, DocShoe hat ja schon die im allgemeinen beste Variante gezeigt.

    Es ist wie beim Übersetzen von Deutsch nach Englisch : Nicht die einzelnen Wörter übersetzen, sondern den Sinn verstehen und übertragen.

    bis bald
    akari



  • Dem möchte ich jetzt nicht so wirklich zustimmen. IntToStr() ist auch nichts von C++, sondern Delphi und kann man im C++Builder verwenden. Zumal in der Doku es so präsentiert wird, als ob es für den C++Builder ebenfalls gilt:

    Pascal
    procedure SetLength(var S; NewLength: Integer);
    C++
    SetLength( S, int NewLength);

    Pascal
    function StrToInt(const S: string): Integer; overload;
    C++
    int StrToInt(const UnicodeString S);

    Meine letzte Frage war ja nur, wie erkennt man nun was geht und was nicht, wenn es immer so dargestellt wird als könne man es verwenden. Eine ordentliche Doku hätte bei C++ dann als ein Beispiel vector verlinkt, wenn es SetLength nicht in C++Builder gibt. Oder ich missverstehe hier was. 😉



  • Starwing schrieb:

    Dem möchte ich jetzt nicht so wirklich zustimmen. IntToStr() ist auch nichts von C++, sondern Delphi und kann man im C++Builder verwenden.

    Strings und dynamische Arrays sind in Delphi spracheigene Typen, in C++ allerdings Klassen. Das führt dazu, daß in Delphi externe Funktionen wie Length() und SetLength() verwendet werden, um auf die Eigenschaften von Strings oder dynamischen Arrays zuzugreifen, wohingegen man in C++ einfach Methoden (bei String) bzw. Properties (bei dynamischen Arrays) dafür definiert hat:

    String s;
    s.SetLength (s.Length () + 2);
    
    DynamicArray<int> a;
    a.Length = a.Length + 2;
    

    Starwing schrieb:

    Zumal in der Doku es so präsentiert wird, als ob es für den C++Builder ebenfalls gilt:

    Das ist ein Fehler in der 2009er-Dokumentation. Die aktuelle Dokumentation macht das richtig:
    System.SetLength (Delphi) / System.DynamicArray.Length (C++)

    Starwing schrieb:

    Meine letzte Frage war ja nur, wie erkennt man nun was geht und was nicht, wenn es immer so dargestellt wird als könne man es verwenden.

    Nur in die aktuelle Doku schauen 😉

    Starwing schrieb:

    Eine ordentliche Doku hätte bei C++ dann als ein Beispiel vector verlinkt, wenn es SetLength nicht in C++Builder gibt.

    std::vector<> ist natürlich die bessere Option, wenn du nur C++-Code schreibst, aber wenn du mit Delphi-Komponenten zu tun hast, die dynamische Arrays oder Strings verwenden, kannst du mit std::vector<> natürlich nichts anfangen, weil es dazu inkompatibel ist. So ein Verweis wäre also nicht hilfreich.


Anmelden zum Antworten