Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer auf Array of record (https://www.delphipraxis.net/32614-pointer-auf-array-record.html)

tommie-lie 26. Okt 2004 10:54

Re: Pointer auf Array of record
 
Zitat:

Zitat von egal
Ich habe schon Beispiele gesehen, wo Pointer auf dynamische Array oder auf record in einer Dll realisiert wurden

Auf Record okay, ist ja kein Kuststück, aber auf ein dynamisches Array? Das Beispiel würde ich auch gerne sehen, hast du einen Link dazu?

egal 26. Okt 2004 11:09

Re: Pointer auf Array of record
 
Zitat:

Zitat von tommie-lie
Zitat:

Zitat von egal
Ich habe schon Beispiele gesehen, wo Pointer auf dynamische Array oder auf record in einer Dll realisiert wurden

Auf Record okay, ist ja kein Kuststück, aber auf ein dynamisches Array? Das Beispiel würde ich auch gerne sehen, hast du einen Link dazu?

Z.B. so:
Delphi-Quellcode:
type
  PDynamicArray = ^TDynamicArray;

  TKlasse = class
  private
    FPArray: PDynamicArray;
  public
    constructor Create(AArray: TDynamicArray);
  end;

  constructor TKlasse.Create(AArray: TDynamicArray);
  begin
    FPArray := @AArray;
  end;
es waren auch andere Beispiele, wenn ich Zeit habe, finde ich noch was.

tommie-lie 26. Okt 2004 11:53

Re: Pointer auf Array of record
 
Und das hat in einer DLL in Verbindung mit einer Hostanwendung in C und ohne ShareMem funktioniert? :shock:

/me trägt das mal in seine Liste der wissenswerten Dinge über Delphi-DLLs ein...

jim_raynor 26. Okt 2004 11:54

Re: Pointer auf Array of record
 
Das Problem ist nicht der Record ansich, sondern die Strings dadrin. Diese werden genau wie dynamische Arrays behandelt und somit hast du die gleichen Probleme.

Hier noch was um C++ artige Arrays zu verwenden:

Delphi-Quellcode:
type
  PStaticArray = ^TStaticArray;
  TStaticArray = Array[0..high(Integer)] of Integer;
Wenn du jetzt in der DLL einen Pointer vom Type PStaticArray übergibst, sollte es normal funktionieren:

Delphi-Quellcode:
procedure Test(DynArray: PStaticArray);
begin
  DynArray^[0] ...
end;
P.S: Natürlich darfst du keine Variable vom Typ TStaticArray anlegen, da dann der Arbeitsspeicher voll ist.

Jetzt bekommst du nur noch Probleme mit den Strings, aber wenn die in Fortran genauso gehandt werden wie in C++, dann versuche doch einfach mal im record statt String PChar.

egal 26. Okt 2004 11:55

Re: Pointer auf Array of record
 
Zitat:

Zitat von tommie-lie
Und das hat in einer DLL in Verbindung mit einer Hostanwendung in C und ohne ShareMem funktioniert? :shock:

/me trägt das mal in seine Liste der wissenswerten Dinge über Delphi-DLLs ein...

keine Ahnung, ich habe es nicht ausprobiert.

tommie-lie 26. Okt 2004 12:05

Re: Pointer auf Array of record
 
Zitat:

Zitat von jim_raynor
P.S: Natürlich darfst du keine Variable vom Typ TStaticArray anlegen, da dann der Arbeitsspeicher voll ist.

Naja, da das mindestens 4GB an Daten werden, wäre nicht nur der Arbeitsspeicher voll, sondern der gesamte Adressbereich, daß Anlegen der Variable dürfte also schon äußerst schwer fallen :mrgreen:

Zitat:

Zitat von jim_raynor
Jetzt bekommst du nur noch Probleme mit den Strings, aber wenn die in Fortran genauso gehandt werden wie in C++, dann versuche doch einfach mal im record statt String PChar.

Alle Programmiersprachen, die direkte Speicherzugriffe erlauben (über Pointer oder über Speicherzugriffsfunktionen), kommen auch mit PChar ohne Probleme zurecht.

Zitat:

Zitat von egal
keine Ahnung, ich habe es nicht ausprobiert.

/me streicht es wieder aus seiner Liste der wissenswerten Dinge über Delphi-DLLs :mrgreen:

egal 26. Okt 2004 12:10

Re: Pointer auf Array of record
 
Und noch eine Frage, wie soll ich diese Funktion in meinem Hauptprogramm aufrufen, zuerst versuche ich es in Delphi:

Delphi-Quellcode:
type
  TValue = record
    StrValue: String[6];
    IntValue: Integer;
  end;
  TValues = array of TValue;
var
  VDIINT: TValues;
  PVDIINT: ^TValues;
function VDIIWERT(PVDIINT: TValues; Feldnummer: integer): integer; external 'VDIDLL.dll'; stdcall;

my func;
begin
SetLength(VDIINT,Length(VDIINT)+1);
VDIINT[High(VDIINT)].StrValue := 'test';
VDIINT[High(VDIINT)].IntValue := 2;
cRet := IntToStr(VDIIWERT(PVDIINT, StrToInt(res1)));
end;
Wenn ich so mache, bekomme ich Fehlemeldung: "Inkompatible Typen TValues und Array", in der Zeile "cRet:=..". Soll man den Pointer irgenwie anders deklarieren?

egal 26. Okt 2004 16:39

Re: Pointer auf Array of record
 
jetzt habe ich die Code bisschen geändert, aber ich kriege doch die falschen Werte und danach Zugriffsverletzung. Hier ist die Code:
Delphi-Quellcode:
type
  TValue = record
    StrValue: String[6];
    IntValue: Integer;
  end;
  TValues = array of TValue;
  PVDIINT: ^TValues;
var
  VDIINT: TValues;
  PVDIIN: PVDIINT;
  function VDIIWERT(PVDIIN: PVDIINT; Feldnummer: integer): integer; external 'VDIDLL.dll'; stdcall;

my func;
begin
SetLength(VDIINT,Length(VDIINT)+1);
VDIINT[High(VDIINT)].StrValue := 'test';
VDIINT[High(VDIINT)].IntValue := 2;
PVDIIN := @VDIINT;
cRet := IntToStr(VDIIWERT(PVDIIN, StrToInt(res1)));
end;
Und in der Dll:
Delphi-Quellcode:
type
  TValue = record
    StrValue: String[6];
    IntValue: Integer;
  end;
  TValues = array of TValue;
  PVDIINT: ^TValues;

function VDIIWERT(PVDIIN: PVDIINT; Feldnummer: integer): integer;
var
  j: Integer;
  arStri : array[1..10] of String;
  arInt : array[1..10] of Integer;
begin
  temp;
  j:= 0;
  VDIINT := @PVDIIN;
  arStri[1] := VDIINT[0].StrValue;
end;
Ich mache bestimmt was falsches, aber was? Vielleicht muss ich noch einen record machen und da mein TValues deklarieren und noch einen Pointer auf neuen record machen oder?

egal 28. Okt 2004 16:02

Re: Pointer auf Array of record
 
die Hilfe brauche ich immer noch? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.
Seite 2 von 2     12   

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