Jeg har en DLL fil der er kompilet i Delphi! En af funktionerne har nogle parametre, hvor der indegår unsigned pointers! Disse pointers forventes at pege på dynamiske arrays, hvorefter funktionen vil behandle dem med at sætte en længde og fylde dem op med data! Problemet er at i C++ fungere dynamiske arrays lidt anderledes end i Delphi! Et hurtigt eksempel er:
Delphi...
var A : array of Integer; begin SetLength(A,10); // Sætter længden på den dynamiske array if High(A) = 9 then //Finder længden på array'en via High() //Gør et eller andet end;
Tilsvarende i C++...
{ int Size = 10; //Bestemmer længden int *A; //Definere A som pointer til en Integer A = new int[Size]; //Skaber array'en med new
if (Size == 10) //Finder længden på A med den allerede givne størrelse //Gør et eller andet }
Mit spørgsmå, er, i stedet for at bruge Size (C++ eksemplet) til at finde længden på A, kan jeg så ikke bruge andet noget andet - altså en High() funktion bare i C++? Eller kan jeg på en eller anden måde bygge en klasse i C++, der virker præcist som Delphi's dynamiske array?
Hvis jeg sender en C++ dynamisk array i DLL funktionen, får jeg en ubehagelig error! Åbenbart fordi de to typer arrays ikke fungere ens!
Et alternativ var at give længden med som en ekstra parameter med længden.
Ellers kunne du skele lidt til hvordan Boland gør :
procedure _DynArrayLength; asm { FUNCTION _DynArrayLength(const a: array of ...): Longint; } { ->EAX Pointer to array or nil } { <-EAX High bound of array + 1 or 0 } TEST EAX,EAX JZ @@skip MOV EAX,[EAX-4] @@skip: end;
procedure _DynArrayHigh; asm { FUNCTION _DynArrayHigh(const a: array of ...): Longint; } { ->EAX Pointer to array or nil } { <-EAX High bound of array or -1 } CALL _DynArrayLength DEC EAX end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.