Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer of Array of Pointer (https://www.delphipraxis.net/164950-pointer-array-pointer.html)

Marcel2906 7. Dez 2011 12:35

Delphi-Version: 2010

Pointer of Array of Pointer
 
Hey Leute,

hab wiedermal ein Problem.
Und zwar...zunächst sollte ich ein einfaches Programm schreiben, in dem Zahlen in ein Array eingelesen werden, dann sortiert und wieder ausgegeben. Hab dies mit Quicksort gemacht. War auch kein Thema.
Um den Umgang mit Pointer zu üben, soll ich das jetzt so verändern, dass ein Pointer auf mein Array zeigt, und das Array wieder rum soll ein Array of Pointer sein. Also ich glaube das mit dem Array of Pointer habe ich hinbekommen:

Delphi-Quellcode:
Type
   TEintrag = Record
      Zahl: integer;
   End;
   PEintrag = ^TEintrag;

Type
   TForm1 = Class(TForm)
      ListBox1: TListBox;
      EingabeZahl: TEdit;
      Beenden: TButton;
      BtSort: TButton;
      Hinzufuegen: TButton;
      Procedure HinzufuegenClick(Sender: TObject);
      Procedure BeendenClick(Sender: TObject);
      Procedure BtShowClick(Sender: TObject);
      Procedure BtSortClick(Sender: TObject);

   private
      Liste: Array Of PEintrag;
      Procedure Output(LängeListe: integer);
      Procedure Input;
      Procedure Quicksort(erstes, letztes: integer);
      Procedure WertTauschen(StelleA, StelleB: Integer);
   End;
dazu die interessanten Proceduren:

Delphi-Quellcode:
Procedure TForm1.Input;
Var
   rec_p: PEintrag;
   x: integer;
Begin
   rec_p := Nil; // Init mit nichts
   new(rec_p); { Init eines Speicherbereches der Größe TRec und rec_P <> Nil und zeigt auf eine Adresse }

   //neuen Eintrag in Array eintragen
   rec_p^.Zahl := StrToInt(EingabeZahl.Text);
   SetLength(Liste, length(Liste) + 1);
   x := high(Liste);
   Liste[x] := rec_p;
End;

Procedure TForm1.Output(LängeListe: integer);
Var
   rec: TEintrag;
   rec_p: PEintrag;
   x: integer;
Begin
   rec_p := Nil; // Init mit nichts

   //ListBox leeren
   ListBox1.clear;
   For x := 0 To LängeListe Do
      ListBox1.Items.Strings[x] := IntToStr(Liste[x].Zahl);
End;
Doch wie schaffe ich es jetzt ein Pointer auf das Array zeigen zu lassen?
Mein erster Ansatz sieht so aus:

Delphi-Quellcode:
   Type
      TArray = Record
         Liste: Array Of PEintrag;
      End;
      PArray = ^TArray;
Doch so kann ich ja nicht mehr einfach auf meine "Liste" zugreifen..

Marcel2906 7. Dez 2011 12:48

AW: Pointer of Array of Pointer
 
eine weitere Idee wäre dieses hier, leider klappt es auch nicht:

Delphi-Quellcode:
Type
   TListe = Array Of PEintrag;
   Liste = ^TListe;

DeddyH 7. Dez 2011 13:18

AW: Pointer of Array of Pointer
 
Mal schnell heruntergetippt und kurz ausprobiert:
Delphi-Quellcode:
type
  PData = ^TData;
  TData = record
    Zahl: integer;
  end;
  TListe = array of PData;
  PListe = ^TListe;

  TForm1 = class(TForm)
    ...
  private
    { Private-Deklarationen }
    Liste: PListe;
...

//10 Einträge hinzufügen
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  NewData: PData;
begin
  for i := 1 to 10 do
    begin
      SetLength(Liste^, Length(Liste^) + 1);
      New(NewData);
      NewData^.Zahl := Length(Liste^);
      Liste^[High(Liste^)] := NewData;
    end;
end;

//alle enthaltenen Werte ausgeben
procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
begin
  for i := Low(Liste^) to High(Liste^) do
    ShowMessage(IntToStr(Liste^[i]^.Zahl));
end;

//Liste anlegen
procedure TForm1.FormCreate(Sender: TObject);
begin
  New(Liste);
end;

//Aufräumen
procedure TForm1.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  for i := Low(Liste^) to High(Liste^) do
    Dispose(Liste^[i]);
  Dispose(Liste);
end;

himitsu 7. Dez 2011 13:20

AW: Pointer of Array of Pointer
 
Hau dem Typen / der Typin, der/die dir das befohlen hat, ein paar auf die Pfoten.


Am Besten garnicht erst soviele verschachtelte schlimme Dinge mit Pointern anfangen.

Marcel2906 7. Dez 2011 13:42

AW: Pointer of Array of Pointer
 
Vielen Dank :-D

Ich kann meinem Ausbilder ja schlecht auf die Pfoten hauen :-P

Bummi 7. Dez 2011 14:11

AW: Pointer of Array of Pointer
 
oder Du gibst es Ihm so richtig, ich war so frei DeddyH's Code als Basis zu nehmen
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;



type
  PData = ^TData;
  TData = record
    Zahl: integer;
  end;
  TListe = array of PData;
  PListe = ^TListe;
  PPListe = ^PListe;


  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Liste: PPListe;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

//10 Einträge hinzufügen
procedure TForm2.Button1Click(Sender: TObject);
var
  i: integer;
  NewData: PData;
begin
  for i := 1 to 10 do
    begin
      SetLength(Liste^^, Length(Liste^^) + 1);
      New(NewData);
      NewData^.Zahl := Length(Liste^^);
      Liste^^[High(Liste^^)] := NewData;
    end;
end;

//alle enthaltenen Werte ausgeben
procedure TForm2.Button2Click(Sender: TObject);
var
  i: integer;
begin
  for i := Low(Liste^^) to High(Liste^^) do
    ShowMessage(IntToStr(Liste^^[i]^.Zahl));
end;

//Liste anlegen
procedure TForm2.FormCreate(Sender: TObject);
begin
  New(Liste);
  New(Liste^)
end;

//Aufräumen
procedure TForm2.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  for i := Low(Liste^^) to High(Liste^^) do
    Dispose(Liste^^[i]);
  Dispose(Liste^);
end;

end.

wer Bug's findet darf sie behalten ....

Marcel2906 9. Dez 2011 07:37

AW: Pointer of Array of Pointer
 
das ist ja dann quasi ein Pointer der auf einen Pointer zeigt der auf das Array zeigt, oder? :lol:

DeddyH 9. Dez 2011 07:41

AW: Pointer of Array of Pointer
 
Japp.


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