C++ Delphi arrays
Hallo,
ich habe eine C++ DLL, die folgendendermaßen aufgebaut ist:
Code:
In Delphi möcht ich nun die Funktion aufrufen und die Parameter übereben:
extern "C" short EXPORT test (double *x)
{ MessageBox (GetActiveWindow(), _fcvt(x[0], 2, &dec, &sign), "DLLTEST",MB_OK|MB_ICONINFORMATION); }
Delphi-Quellcode:
type
TExte = array of Extended; type TTest = function (x: TExte): Smallint; stdcall; var vekX : TExte; begin dll:= LoadLibrary('test.dll'); @test := GetProcAddress(dll,'test'); SetLength(vekX,1); vekX[0]:= 5; r:=test(vekX); end; Das klappt aber nicht, denn die MsgBox zeigt nichts an-was mach ich da falsch? Danke Tim |
Re: C++ Delphi arrays
Bitte packe erstmal [ Delphi ] - Tags um Deinen Code. Das macht den ungemein lesbarer.
|
Re: C++ Delphi arrays
Versuch mal
Delphi-Quellcode:
r:=test(@vekX[0]);
|
Re: C++ Delphi arrays
Ziemlich falsch. Erstens ist double = Double, zweitens ist die Delphi-Deklaration der Funktion falsch.
Delphi-Quellcode:
So sollte es gehen.
type
PDouble = ^Double; type TTest = function(x: PDouble): Smallint; stdcall; var vekX: array of Double; begin dll := LoadLibrary('test.dll'); @test := GetProcAddress(dll, 'test'); SetLength(vekX, 1); vekX[0] := 5; r := test(@vekX[0]); end; Willst du nicht ein array von Double-Werten handhaben, sondern nur genau einen Double-Wert, dann besser mit var arbeiten.
Delphi-Quellcode:
Auf C-Seite pruef mal nach ob EXPORT wirklich zu stdcall aufgeloest wird. Das sollte nicht nur in den Projektoptionen gesetzt sein.
type
TTest = function(var x: Double): Smallint; stdcall; var vekX: Double; begin dll := LoadLibrary('test.dll'); @test := GetProcAddress(dll, 'test'); vekX := 5; r := test(vekX); end; |
Re: C++ Delphi arrays
Super! Danke das funktioniert schonmal soweit
Wie würde es denn gehen das gesamte array zuübergeben?
Delphi-Quellcode:
Scheint da nicht zu funktionieren?
r := test(@vekX);
|
Re: C++ Delphi arrays
du verstehst den Quelltext nicht? Richtig? Es wird zur zeit die Adrese übergeben wo der Speicherbereich des Arrays beginnt. Es wird also nicht ein einzelnes Array-Element übergeben sondern die Adresse des gesamten Arrays (welche gleichzeitig die Adresse des ersten elementes ist)
|
Re: C++ Delphi arrays
Damit das richtig funktioniert muss natuerlich auch noch die Anzahl Elemente im array mit uebergeben werden. Dazu braucht man natuerlich einen zweiten Parameter.
|
Re: C++ Delphi arrays
Ja leider hab ich beim Arbeiten mit Arrays und Pointern noch ein kleines Verständnisproblem.
Ja, also die Adresse des Speicherbereichs, an dem das Array beginnt wird mittels
Delphi-Quellcode:
übergeben.
vekX[0]:=5; vekX[1]:=7;
r:= test(@vekX, 2); Nun dacht ich mit C++ via
Code:
wieder daraufzugreifen zu können?
short Test (double *x,int anz))
{ MessageBox (GetActiveWindow(), _fcvt(x[1],... //==7 } Danke [edit=SirThornberry]C-Code-Tags gesetzt - Mfg, SirThornberry[/edit] |
Re: C++ Delphi arrays
du übergibst doch nur einen Pointer auf einen Double. Du musst also den Pointer weiter rücken. Hier ein Beispiel
Code:
Es wird ein Pointer auf ein Array of float übergeben. In Der Schleife wird dann in den Float was geschrieben und Data wird auf das nächste Element des Arrays weiter gerückt.
void DoAnything2(float* Data)
{ for (int i = 0; i <= 10; i++) { *Data = i * 2; //i * 2 dem Arrayelement zuweisen Data = Data + sizeof(Data); //zum nächsten Arrayelement weiter rücken } } |
Re: C++ Delphi arrays
Zitat:
Code:
Ich will das ganze doch um die Größe des Inhalts weiterrücken. Oder?
Data = Data + sizeof(*Data);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz