Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Pointer eines dynamischen Arrays übergeben (https://www.delphipraxis.net/194817-pointer-eines-dynamischen-arrays-uebergeben.html)

HalloVonMir 10. Jan 2018 14:36

Delphi-Version: 7

Pointer eines dynamischen Arrays übergeben
 
Hallo,

Ich möchte gerne einen Inhalt dynamisch zurückgeben, da meine Funktion mehrere Ausgaben haben soll (werden mittels Thread verarbeitet, was dann die Übergabe eines Pointers verlange). U.a. möchte ich gerne, dass eine Dateienliste übergeben wird.

Meine Typen sind:
Type
Teinedatei=record
Url:string;
Bla:integer;
...
End;
Tdateien:Array of Teinedatei;
Tdateienpointer:^Tdateien;

In einer Procedure wollte ich dann gerne die Länge festlegen und die Daten einfügen. Das funktioniert aber nicht :(

Procedure setzen(p:pointer);
Begin
... // Berechnung etc.
Setlength(Tdateien(p),1); //geht nicht
Setlength(p,1); // geht auch nicht
Tdateien(p)[0].url:='123'; //geht natürlich nicht
End;

Aufruf mittels:
var dateien:Tdateien;
Begin
Setzen (@dateien);
Showmessage (dateien[0].url);
End;

Wie ist dafür die richtige Syntax? Denn für einen "normalen" Pointer (Teinedateipointer) funktioniert das. Geht das wegen dem dynamischen Array garnicht, oder gibt ist dort Kniffe wie ich das machen kann?

Vielen Dank schonmal für eure Hilfe!! :-)

Klaus01 10. Jan 2018 14:39

AW: Pointer eines dynamischen Arrays übergeben
 
.. soweit ich das weiß, ist das Dynamische Array schon ein Pointer.

Grüße
Klaus

Medium 10. Jan 2018 14:44

AW: Pointer eines dynamischen Arrays übergeben
 
Dereferenzieren mit Circumflex:
Delphi-Quellcode:
Procedure setzen(p:pointer);
Begin
  ... // Berechnung etc.
  Setlength(Tdateienpointer(p)^, 1); // müsste gehen
End;
Aber wie Klaus schon schrieb ist der Umweg nicht nötig. Du kannst direkt dein Array übergeben, da es eh schon ein Pointer ist. Zur Sicherheit als var-Parameter - ich weiß nicht ob Delphi bei dyn. Arrays sonst copy-on-write macht.

Neutral General 10. Jan 2018 15:02

AW: Pointer eines dynamischen Arrays übergeben
 
Hallo,

Du hast Tdateien als Variable und nicht als Typ deklariert.
Es sollte wahrscheinlich

Delphi-Quellcode:
Tdateien = Array of Teinedatei;
heißen.

Dann funktioniert auch
Delphi-Quellcode:
Setlength(Tdateien(p),1); //geht doch
Tdateien(p)[0].url:='123';

HalloVonMir 10. Jan 2018 15:32

AW: Pointer eines dynamischen Arrays übergeben
 
Zitat:

Zitat von Neutral General (Beitrag 1390729)
Dann funktioniert auch
Delphi-Quellcode:
Setlength(Tdateien(p),1); //geht doch
Tdateien(p)[0].url:='123';

das funktioniert bei mir nicht.

Hingegen funktioniert super:
Delphi-Quellcode:
   Setlength(Tdateienpointer(p)^, 1); // müsste gehen
Ich danke euch vielmals für die Hilfe!! :-)

himitsu 10. Jan 2018 21:57

AW: Pointer eines dynamischen Arrays übergeben
 
Delphi-Quellcode:
Pointer(ArrayVariable)
ist der interne Zeiger auf den ArrayInhalt.
So lange später nur auf den Inhalt zugegriffen und die Länge nicht mehr geändert wird, ist dieser Zeiger gültig und entspricht TDateien.

Delphi-Quellcode:
@ArrayVariable
ist der Zeiger auf "diese" Variable und entspricht somit PDateien bzw. ^TDateien.
Hier kann auch die Länge/Referenz des Arrays geändert werden, aber nur so lange, wie diese Variable existiert.


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