AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer eines dynamischen Arrays übergeben

Ein Thema von HalloVonMir · begonnen am 10. Jan 2018 · letzter Beitrag vom 10. Jan 2018
Antwort Antwort
HalloVonMir

Registriert seit: 3. Jun 2007
4 Beiträge
 
#1

Pointer eines dynamischen Arrays übergeben

  Alt 10. Jan 2018, 15:36
Delphi-Version: 7
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!!
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Pointer eines dynamischen Arrays übergeben

  Alt 10. Jan 2018, 15:39
.. soweit ich das weiß, ist das Dynamische Array schon ein Pointer.

Grüße
Klaus
Klaus

Geändert von Klaus01 (10. Jan 2018 um 16:42 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Pointer eines dynamischen Arrays übergeben

  Alt 10. Jan 2018, 15:44
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Pointer eines dynamischen Arrays übergeben

  Alt 10. Jan 2018, 16:02
Hallo,

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

Tdateien = Array of Teinedatei; heißen.

Dann funktioniert auch
Delphi-Quellcode:
Setlength(Tdateien(p),1); //geht doch
Tdateien(p)[0].url:='123';
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (10. Jan 2018 um 16:04 Uhr)
  Mit Zitat antworten Zitat
HalloVonMir

Registriert seit: 3. Jun 2007
4 Beiträge
 
#5

AW: Pointer eines dynamischen Arrays übergeben

  Alt 10. Jan 2018, 16:32
Dann funktioniert auch
Delphi-Quellcode:
Setlength(Tdateien(p),1); //geht doch
Tdateien(p)[0].url:='123';
das funktioniert bei mir nicht.

Hingegen funktioniert super:
   Setlength(Tdateienpointer(p)^, 1); // müsste gehen Ich danke euch vielmals für die Hilfe!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Pointer eines dynamischen Arrays übergeben

  Alt 10. Jan 2018, 22:57
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.

@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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 12:38 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