AGB  ·  Datenschutz  ·  Impressum  







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

Pointer verstehen

Ein Thema von wiwa · begonnen am 3. Aug 2004 · letzter Beitrag vom 17. Aug 2004
Antwort Antwort
Seite 1 von 2  1 2      
wiwa

Registriert seit: 8. Jul 2004
Ort: Berlin
6 Beiträge
 
Delphi 7 Enterprise
 
#1

Pointer verstehen

  Alt 3. Aug 2004, 16:08
Versuche gerade zwangsläufig Zeiger kennen zu lernen...
Wie gehe ich mit sowas um???

Delphi-Quellcode:
type
   TArray = array of string;
   pdata = ^tdata;
   tdata = record
     p: ^TArray;
   end;}


var
  fdat:pdata;

...
Wie komme ich an "p" ran, was muß ich wie mit New() erzeugen
und wie habe ich späterZugriff darauf ???
Oder macht sowas gar keinen Sinn ???
Wer lässt sich auf tiefere Diskussion mit einem Ahnungslosen ein?!
  Mit Zitat antworten Zitat
Giantics

Registriert seit: 17. Nov 2003
Ort: Langenbrettach
99 Beiträge
 
#2

Re: Pointer ???

  Alt 3. Aug 2004, 16:19
Warum speicherst du ein Pointer auf ein dynamisches Array?
Das dyn. Array selber muss ja auch erst erstellt werden. Ein Zeiger is da doch irgendwie überflüssig oder?
Ich würde das so machen:
Delphi-Quellcode:
type
   TArray = array of string;
   pdata = ^tdata;
   tdata = record
     p: TArray;
   end;


var
  fdat:pdata;

begin
  New(fdat);
  SetLength(fdat.p,5); // z.b 0 bis 4.
  //Zugriff mit:
  fdat.p[2]:= 'Hallo';

  //am Schluss nicht vergessen:
  SetLength(fdat.p,0);
  Dispose(fdat); // freigeben

...
T. Dieffenbach
"Delphi"-Version: Lazarus 0.9.22

Was ist der Unterschied zwischen Bill Gates und Gott?
-->Gott hält sich nicht für Bill Gates!
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Pointer ???

  Alt 3. Aug 2004, 16:25
Zitat von wiwa:
Delphi-Quellcode:
type
   TArray = array of string;
   pdata = ^tdata;
   tdata = record
     p: ^TArray;
   end;}


var
  fdat:pdata;

...

Du erstellst hier einen Pointer auf einen Pointer auf einen Pointer auf einen Pointer...

Weil:
array of ... ist ein Pointer.
^irgendwas ist ein Pointer, somit ist ^TArray schon ein Pointer auf einen Pointer.
record ist ein Pointer, also ist pdata ein Pointer auf einen Pointer, der einen Pointer auf einen Pointer enthält

Mir erschließst sich die Sinnhaftigkeit dessen grad nicht
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
paelesoft

Registriert seit: 3. Jul 2004
37 Beiträge
 
Delphi 7 Professional
 
#4

Re: Pointer ???

  Alt 3. Aug 2004, 16:57
Code:
begin
  New(fdat);
  New(fdat^.p);
  SetLength(fdat^.p^,3);
  fdat^.p^[2]:='ganz schön kompliziert';
end.
Gruß Erik
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: Pointer ???

  Alt 3. Aug 2004, 17:26
Du meinst wohl eher eine Liste. Was du vor hast ist schon eine bessere Lösung, als ein dyn. Array. Das ganze sieht normalerweise so aus :

Delphi-Quellcode:
Zeiger = ^Daten;

  Daten = record
    nr,
    artID : integer; (* wird benötigt für Lagerbestände etc.,       *)
                           (* um das erneute Lesen von Artikeln zu sparen *)
    bez : string [25];
    Nachfolger,
    Vorgaenger : Zeiger;
  end;

  TListe = class
  public
    Aktuell,
    First, // First = links ; Last = rechts
    Last : Zeiger;
    Anzahl : integer;
    constructor create;
    procedure Auflegen;
  end;
Allerdings muß ich dich warnen : solltest su völlig ahnungslos sein, dann mußt du dich mit der Theorie schon etwas beschäftigen. Vorerst dazu nur noch folgendes : wie man sieht wird Zeiger als ^Daten deklariert. "Daten" werden aber erst später deklariert. Und die Liste, die damit erzeugt wird ist völlig dynamisch und doppelt verkettet. Das bedeutet, sie kann vorwärts oder rückwärts durrchgeackert werden. Wie gesagt, so ganz einfach ist das nicht.
Gruß
Hansa
  Mit Zitat antworten Zitat
wiwa

Registriert seit: 8. Jul 2004
Ort: Berlin
6 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Pointer ???

  Alt 4. Aug 2004, 08:34
Hi,
danke für die fülle an hochinteressanten antworten und aspekten zu dem thema.
sinn und hintergrund ist eine meinem ^unwissenden hirn entsprungene idee:
ich entdecke aktuell die VirtualTreeView komponente von Mike Lischke (leicht
im web zu finden:
http://www.soft-gems.net/http://www.soft-gems.net/)
wer die kennt, kann das problem vielleicht nachvollziehen: es geht um eine
TreeView-Komponente, die in fast allen einzelheiten und details beeinflussbar ist.
die enthaltenen daten werden über einen statischen record implementiert. solange die daten
statisch sind, ist das ganze recht einfach zu handhaben. möchte man allerdings
dynamisch daten zur laufzeit in welcher form auch immer einfügen bleibt eigentlich
nur die pointer-strategie. der record ansich ist von dem konzept der VST-Komponente ein pointer
um ihn nun um dynamische daten zu erweitern benötige ich weitere pointer (^ auf ^ auf ^),
so hab ich mir das jedenfalls gedacht:


type
TArray = array of string;
pdata = ^tdata;
tdata = record
p: ^TArray;
end;

Was spricht dagegen?

Gruß
Willi
  Mit Zitat antworten Zitat
wiwa

Registriert seit: 8. Jul 2004
Ort: Berlin
6 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Pointer ???

  Alt 4. Aug 2004, 08:43
nochmal in dieser sache:
das problem scheint mir, dass der inhalt des record der VST Komponente zur design-
u. laufzeit fest vorgegeben sein muss, daher schließt sich p:TArray eigentlich aus,
da p hier noch keine größe hat, oder seh ich das falsch?
p:^TArray hat aber eine feste größe und gilt somit als "statisch", was dann später
ausserhalb des record mit p^ passier ist eine andere (vielleicht die nächste) frage.

Gruß
Willi
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#8

Re: Pointer ???

  Alt 4. Aug 2004, 09:57
Moin,

records haben immer eine feste grösse, das liegt in ihrer natur, da sie zB. mit einer simplen multiplikation in einem array addressierbar sind etc. Also wie oben schon angemerkt ist ein dyn.Array bereits ein pointer und muss somit nicht doppelt gemoppelt werden.
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#9

Re: Pointer ???

  Alt 4. Aug 2004, 10:07
Tue mir mal noch einen Gefallen und erweitere bitte Deine Überschrift. Pointer ??? ist etwas zu allgemein.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
paelesoft

Registriert seit: 3. Jul 2004
37 Beiträge
 
Delphi 7 Professional
 
#10

Re: Pointer verstehen

  Alt 5. Aug 2004, 21:32
Hallo wiwa,

TArray ist in Wirklichkeit schon eine Art Zeiger, da es ein dynamisches
Array ist, auf das mit einem Zeiger referenziert wird.

Überprüfen kannst du es zB wenn du SizeOf(TArray) aufrufst. Dann erhältst du das
Ergebnis "4" (Größe eines Pointers).
Noch ein "Beweis" dafür ist folgender Versuch:

Bitte ein Formular mit einem Button und einem Editierfeld (Edit1) erstellen.
In die OnClick-Behandlung des Buttons folgenden Code einfügen:

Delphi-Quellcode:
var S : array of Char;
    T : PChar;
begin
  Setlength(S,6);
  S[0]:='H';
  S[1]:='a';
  S[2]:='l';
  S[3]:='l';
  S[4]:='o';
  S[5]:=#0;
  GetMem(T,6);
  Move(Pointer(S)^ ,T^,6);
  Edit1.Text:=StrPas(T);
  FreeMem(T,6);
end;
Das Ergebnis ist "Hallo"
Gruß Erik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:21 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