Funktion Pascal to C++Builder
-
Ich habe eine Delphi.Komponente die beim compilieren automatisch den C++Header erstellt hat.
Pascal:
function ReadFunc(const Number: Word; const Blocks: Word; out Data: array of Word): Boolean;
Aufruf:
Data: array[0..4096] of Word; ReadFunc(3, 2, Data);
C++Bilder Header
bool __fastcall ReadFunc(const System::Word Number, const System::Word Blocks, /* out */ System::Word *Data, const int Data_Size);
Aufruf:
Word Data[4096]; ReadFunc(3, 2, Data, sizeof(Data));
Das funktioniert so, aber mach ich es auch wirklich richtig?
Data ist vom Typ Word und damit 2Byte.. sizeof(Data) ist also 4096*2=8192. Soll dort nun sizeof(Data) rein oder die Anzahl der Array mit 4096? Kann mir hier jemand sagen ob ich es richtig mache? Wieso hat die C++Header mehr Parameter als die Pascal Unit? Danke!
-
Sieht gut aus.
Die C++ Variante hat deswegen einen Parameter mehr, da Delphi DatentypArray
in C++ durch einen Zeiger auf einen Speicherbereich und die Größe des Speicherbereichs abbildet. Das ist in C üblich, in C++ sollte man aber besservector
oderarray
benutzen. Wahrscheinlich erwartet die Funktion aber einen Zeiger auf einen Speicherbereich, weswegen die C++ Variante nicht funktioniert.
-
Hallo
Meiner Ansicht nach müßte die Anzahl der Elemente übergeben werden, nicht sizeof.
Das ist die übliche Vorgehensweise, wie sie auch die WinAPI verwendet.
In deinem konkreten Fall verschafft dir aber nur die Doku der Funktion Klarheit.bis bald
akari
-
Danke für eure Antworten. Leider zwei unterschiedliche Aussagen und ich finde auch keine Dokumentation in der Komponente. Zumal Delphi Komponenten nie C++ Eigenarten erklären.
Eigentlich sollte man das vielleicht irgendwo in den tiefen von Rad Studio finden, denn der Compiler macht ja dies automatisch, nicht die Komponente. Bisher habe ich dazu leider nichts finden können.
-
Ich habe diesen Link erhalten: http://docwiki.embarcadero.com/RADStudio/XE4/en/Open_Arrays
Damit hat wohl akari Recht behalten und "4096" bzw. "ARRAYSIZE(Data) - 1" muss rein und nicht wie angenommen "sizeof(Data)".
-
Sylba schrieb:
Ich habe diesen Link erhalten: http://docwiki.embarcadero.com/RADStudio/XE4/en/Open_Arrays
Damit hat wohl akari Recht behalten und "4096" bzw. "ARRAYSIZE(Data) - 1" muss rein und nicht wie angenommen "sizeof(Data)".
Beachte, daß
ARRAYSIZE(Data) - 1 == 4095
, nicht4096
. Das ist ein dämliches Implementierungsdetail in Delphi, daß bei Arraygrößen immer der letzte mögliche Index und nicht die Elementzahl übergeben wird; in Delphi ist es für den Programmierer nicht sichtbar, aber in C++Builder muß man sich leider damit rumschlagen.