![]() |
Re: Pointer auf Array of record
Zitat:
|
Re: Pointer auf Array of record
Zitat:
Delphi-Quellcode:
es waren auch andere Beispiele, wenn ich Zeit habe, finde ich noch was.
type
PDynamicArray = ^TDynamicArray; TKlasse = class private FPArray: PDynamicArray; public constructor Create(AArray: TDynamicArray); end; constructor TKlasse.Create(AArray: TDynamicArray); begin FPArray := @AArray; end; |
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... |
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:
Wenn du jetzt in der DLL einen Pointer vom Type PStaticArray übergibst, sollte es normal funktionieren:
type
PStaticArray = ^TStaticArray; TStaticArray = Array[0..high(Integer)] of Integer;
Delphi-Quellcode:
P.S: Natürlich darfst du keine Variable vom Typ TStaticArray anlegen, da dann der Arbeitsspeicher voll ist.
procedure Test(DynArray: PStaticArray);
begin DynArray^[0] ... end; 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. |
Re: Pointer auf Array of record
Zitat:
|
Re: Pointer auf Array of record
Zitat:
Zitat:
Zitat:
|
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:
Wenn ich so mache, bekomme ich Fehlemeldung: "Inkompatible Typen TValues und Array", in der Zeile "cRet:=..". Soll man den Pointer irgenwie anders deklarieren?
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; |
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:
Und in der Dll:
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;
Delphi-Quellcode:
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?
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; |
Re: Pointer auf Array of record
die Hilfe brauche ich immer noch? :gruebel:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz