Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamisches Array als Rückgabewert von function ? (https://www.delphipraxis.net/152397-dynamisches-array-als-rueckgabewert-von-function.html)

Blamaster 21. Jun 2010 13:50

Delphi-Version: 2005

Dynamisches Array als Rückgabewert von function ?
 
Hi,

ich mlchte eine function mit einem Array als Rückgabewert nutzen:

Delphi-Quellcode:
function GiveMeTheArray(text: string): TFilteredLinksArray; stdcall;
var
  i: integer;
  text_list: TStringList;
begin
  text_list := TStringList.Create;

  GetText(text_list);
 
  SetLength(Result, text_list.Count - 1);

  for i := 0 to text_list.Count - 1 do
    Result[i] := text_list.Strings[i];

  text_list.Free;
end;
TFilteredLinksArray ist als type TFilteredLinksArray = array of string deklariert.

Wenn ich die function nun aufrufe, gibt es den Fehler "Invalid Pointer Operation".
Dieser tritt an dieser Stelle auf Result[i] := text_list.Strings[i]; was stimmt da nicht ?

Mfg Yannic

DeddyH 21. Jun 2010 13:54

AW: Dynamisches Array als Rückgabewert von function ?
 
Zitat:

Delphi-Quellcode:
SetLength(Result, text_list.Count - 1);

Das ist ein Element zu wenig.

Blamaster 21. Jun 2010 14:26

AW: Dynamisches Array als Rückgabewert von function ?
 
Immer diese blöde -1. Danke für den Hinweis und sorry für die dumme Frage ;)

Mfg Yannic

mkinzler 21. Jun 2010 15:07

AW: Dynamisches Array als Rückgabewert von function ?
 
"Dumm" ist halt das der Index als Offset genommen wird, also Startadresse + Index * Feldgröße. Deshalb hat der erste Eintrag den Index 0

shmia 21. Jun 2010 16:50

AW: Dynamisches Array als Rückgabewert von function ?
 
Zitat:

Zitat von Blamaster (Beitrag 1030647)
TFilteredLinksArray ist als type TFilteredLinksArray = array of string deklariert

Du wärst besser mit der Klasse TStrings bzw. TStringList bedient.
Mit TStrings lässt sich einfach viel mehr anfangen als mit einem array of string.

Blamaster 21. Jun 2010 18:35

AW: Dynamisches Array als Rückgabewert von function ?
 
Hi,

an TStrings hatte ich garnicht gedacht. TStringlist wollte ich nicht nehmen, da die function in einer Dll steckt, und die Plugins sollen unabhängig von Delphi geschrieben werden können.

Mfg Yannic

himitsu 21. Jun 2010 18:46

AW: Dynamisches Array als Rückgabewert von function ?
 
Das hatte ich schon befürchtet ... RTTI und DLL verträgt sich nicht wirklich.

DLL und EXE nutzen ihre eigene RTTI und standardmäßig auch noch einen eigenen Speichermanager (abgesehn man nutzt dat Thema SharedMemoryManager).

Heißt also es ist eigentlich nicht möglich Klassen und auch dynamisches Arrays zwischen DLLs und/oder einer EXE zu übergeben (gemeinsam zu nutzen).

Blamaster 21. Jun 2010 19:03

AW: Dynamisches Array als Rückgabewert von function ?
 
Hi,

wenn ich nun annehme das du Plugins alle mit Delphi geschrieben werden.

Wie gehe ich das ganze dann am schlausten an ?

Reicht es einfach die FastMM Units einzubinden ? Wenn ja auf welcher Seite ? Dll, Exe oder beide ?

Mfg Yannic

himitsu 21. Jun 2010 19:29

AW: Dynamisches Array als Rückgabewert von function ?
 
Für den Speichermanager reicht FastMM,
aber für die RTTI nicht.

Bei der RTTI wäre es in diesem Array-Fall wichtig, daß EXE und DLLs möglichst mit der selbem Delphi-/Compilerversion und auch noch möglichst mit den selbem Projekt-/Compileroptionen compiliert sind.

Besser kommst du mit Interfaces und Array-Property (das sind keine Arrays, auch wenn die so klingen),
was auch den Vorteil hat, daß die Plugins nicht drauf beschrenkt sind, daß sie unbedingt in Delphi geschrieben werden.

Dann noch WideString für alle Strings und sonst keine Klassen und dynamischen Arrays verwenden und du bist ganz sicher.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14: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