AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Dynamisches Array als Rückgabewert von function ?
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamisches Array als Rückgabewert von function ?

Ein Thema von Blamaster · begonnen am 21. Jun 2010 · letzter Beitrag vom 21. Jun 2010
Antwort Antwort
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#1

Dynamisches Array als Rückgabewert von function ?

  Alt 21. Jun 2010, 14:50
Delphi-Version: 2005
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

Geändert von mkinzler (21. Jun 2010 um 14:51 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Dynamisches Array als Rückgabewert von function ?

  Alt 21. Jun 2010, 14:54
Zitat:
SetLength(Result, text_list.Count - 1);
Das ist ein Element zu wenig.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#3

AW: Dynamisches Array als Rückgabewert von function ?

  Alt 21. Jun 2010, 15:26
Immer diese blöde -1. Danke für den Hinweis und sorry für die dumme Frage

Mfg Yannic
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Dynamisches Array als Rückgabewert von function ?

  Alt 21. Jun 2010, 16:07
"Dumm" ist halt das der Index als Offset genommen wird, also Startadresse + Index * Feldgröße. Deshalb hat der erste Eintrag den Index 0
Markus Kinzler
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

AW: Dynamisches Array als Rückgabewert von function ?

  Alt 21. Jun 2010, 17:50
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.
Andreas
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#6

AW: Dynamisches Array als Rückgabewert von function ?

  Alt 21. Jun 2010, 19:35
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Dynamisches Array als Rückgabewert von function ?

  Alt 21. Jun 2010, 19:46
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).
$2B or not $2B
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#8

AW: Dynamisches Array als Rückgabewert von function ?

  Alt 21. Jun 2010, 20:03
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Dynamisches Array als Rückgabewert von function ?

  Alt 21. Jun 2010, 20:29
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 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