Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Delphi Var Parameter in C++

  Alt 9. Jul 2011, 12:02
Delphi-Dynamische Arrays sind Compilermagic, die C so nicht kennt. Der übliche Weg in C ist entweder ein "byte[0]"-Array plus separater Längenangabe, oder ein Pointer auf den Array-Elementtyp, auch mit separater Längenangabe.
Beides ist dann zu Delphi kompatibel, wenn man in den Methoden einen Pointer auf das erste Element des Delphi-Arrays übergibt (@MyArray[0]), aber du musst in jedem Fall Länge separat mit übergeben lassen.

So ein Funktionskopf könnte in einer Delphi-DLL dann so aussehen:
Delphi-Quellcode:
procedure Foo(myArray: PByte; aLength: Integer);
var
  bytes: TByteArray;
begin
  SetLength(bytes, aLength);
  Move(bytes[0], myArray, aLength);
.
.
end;
Danach solltest du eine Kopie in "bytes" haben, die man mit den ganzen Komfort von Delphi ansprechen kann, obgleich nur ein Pointer plus Länge übergeben wurden. Falls das übergebene Array verändert werden soll, musst du es nachher natürlich zurück kopieren. Etwas "undelphiischer" wäre gleich die Verwendung von Pointerarithmetik wie in C, nicht ganz sooo schmuck, aber auch kein Beinbruch.

Ah, ich sehe grad, dass du das Array befüllen willst! Dann wirst du nicht umhin kommen eine Funktion anzubieten, die die erwartete Länge vorab liefert, weil das Array muss vom Host-Programm zuvor ja komplett reserviert werden. Üblich ist es dafür die selbe Funktion zu nehmen, welche die Länge als result hat, und wenn für den Container ein NULL (nil) übergeben wird, gibt's eben nur Länge ohne Daten. Der Host muss dann also 2x aufrufen, ein mal mit NULL, und danach mit korrekt dimensioniertem Array (=Pointer auf sein erstes Element).
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 9. Jul 2011 um 12:05 Uhr)
  Mit Zitat antworten Zitat