Avatar billede zerohero Nybegynder
21. april 2004 - 06:01 Der er 5 kommentarer

Dynamisk Array: C++ vs Delphi

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!
Avatar billede arne_v Ekspert
21. april 2004 - 09:03 #1
Der er ingen måde hvorpå du i C++ kan finde længden af et dynamisk allokeret
array (udfra pointeren).

Jeg vil formode at mens C++ kun bruger adressen, så bruger Delphi en descriptor
af en slags.

Og derfor kan du næppe heller "bare" kalde fra C++ til Delphi med et
dynamisk array.

Men måske kan man finde noget der forklarer hvilken data struktur der
skal sættes op.
Avatar billede borrisholt Novice
21. april 2004 - 09:09 #2
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;


Jens B
Avatar billede segmose Nybegynder
21. april 2004 - 09:22 #3
Hvordan set kaldet helt nøjagtigt ud?
hvis det er en class kan du arve fra den og bruge dens methoder i C++.
Avatar billede zerohero Nybegynder
21. april 2004 - 16:49 #4
Jeg fandt et link det er så godt nok dynamiske arrays VB -> C++ via en DLL fil!

http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q207/9/31.asp&NoWebContent=1&NoWebContent=1

Er der nogen der kan gennemskue om det også kan gøres med Delphi's  dynamiske arrays?
Avatar billede zerohero Nybegynder
21. april 2004 - 21:36 #5
segmose>> funktionen i DLL filen ser således ud (Delphi):

CreateSphere(VArray, FArray, NFArray, NVArray : Pointer; Segments : Word; Size : Single);
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester