Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einführung in Pointer (https://www.delphipraxis.net/43704-einfuehrung-pointer.html)

El Cattivo 7. Apr 2005 13:49


Einführung in Pointer
 
Hallo,
ich habe zu meiner Frage schon das Forum durchsucht aber wie auch bei google ohne nennenswerten Erfolg. Deswegen hoffe ich, dass ihr mir helfen könnt. Es geht um Pointer und zwar ganz allgemein. Ich kann mit dem Begriff schon etwas anfangen und ich hab auch ne ungefähre Ahnung wozu Pointer nützlich sind. Aber ich bräuchte eine kleine Anleitung wie ich Pointer benutze. Einige Befehle kenne ich schon, ich weiß nur nicht wie ich die anwenden soll und ich bin mir auch nicht sicher ob die so richtig sind.
Wenn "wurzel" ein Zeiger ist dann gilt:
Delphi-Quellcode:
wurzel:=NIL;
Zeiger "erden" oder "ins Nichts Zeigen lassen"
Delphi-Quellcode:
new(wurzel);
Speicherplatz für "wurzel" reservieren.
Delphi-Quellcode:
wurzel:=123;
dem Ziel der Addresse "wurzel" wird ein Wert zugeweisen.
Delphi-Quellcode:
dispose(wurzel);
gibt den Speicherplatz wieder frei.
Wenn "wurzel" ein typisierter Zeiger ist, dann wird er folgendermaßen deklariert:
Delphi-Quellcode:
type PInt=^integer;
var wurzel: PInt;
der Abgespeicherte Wert lässt sich auch so darstellen (?)
Delphi-Quellcode:
wurzel^
Stimmt das soweit? Ich kann damit nicht sehr viel anfangen. Wie setze ich diese Befehle ein? Ich habe leider auch kaum Quelltexte gefunden und erst recht keine erläuterten. Ich wäre also sehr dankbar wenn mir jemand eine kleine Einführung in Sachen Pointer geben könnten. Vielleicht auch nen Link wo das anschaulich beschrieben wird.

ste_ett 7. Apr 2005 14:00

Re: Einführung in Pointer
 
Wenn der Zeiger "wurzel" auf etwas zeigt...
if (wurzel <> nil) then

Zeiger "ins Nichts Zeigen lassen"
wurzel := nil;

Speicherplatz für "wurzel" reservieren.
GetMem(wurzel);

dem Ziel der Addresse "wurzel" wird ein Wert zugeweisen.
wurzel := ^MeinObjekt;

gibt den Speicherplatz wieder frei.
FreeMem(wurzel);

Wenn "wurzel" ein typisierter Zeiger ist, dann wird er folgendermaßen deklariert:
type PInt = ^Integer;
var wurzel: PInt;

der Abgespeicherte Wert lässt sich auch so darstellen
wurzel^

himitsu 7. Apr 2005 14:06

Re: Einführung in Pointer
 
Schau mal beim Luckie nach.


www.Luckie-Online.de


dort gibt es viele Programme (natürlich mit Quellcode)

Und viele Tuturials mit und sogar einige speziel über Pointer.

SirThornberry 7. Apr 2005 14:26

Re: Einführung in Pointer
 
@ste_ett: Anstelle von GetMem und FreeMem ist New und Dispose zu bevorzugen (steht auch in der Delphihilfe wenn du diese mal zu GetMem aufrufst)

himitsu 7. Apr 2005 14:33

Re: Einführung in Pointer
 
hmmm?

"GetMem und FreeMem"

Ja, da steht was in der OH, aber ich verwende auch noch diese ... hab irgendwie nicht rausbekommen, wie man bei New die Speichergröße angibt, welche man haben möchte.
Außerdem arbeitet Delphi selber auch damit und nicht mit new/dispose ... jedenfalls kommt getmem/freemem ziehmlich oft iim Source der Delphi-Komponenten vor :shock:

ste_ett 7. Apr 2005 14:38

Re: Einführung in Pointer
 
Zitat:

Zitat von himitsu
hmmm?

"GetMem und FreeMem"

Ja, da steht was in der OH, aber ich verwende auch noch diese ... hab irgendwie nicht rausbekommen, wie man bei New die Speichergröße angibt, welche man haben möchte.
Außerdem arbeitet Delphi selber auch damit und nicht mit new/dispose ... jedenfalls kommt getmem/freemem ziehmlich oft iim Source der Delphi-Komponenten vor :shock:

Die Größe für den Speicherbereich richtet sich automatisch nach der benötigten Größe des Objektes, das du bei "New(Objekt);" angibst.

El Cattivo 7. Apr 2005 14:45

Re: Einführung in Pointer
 
Ok, die Befehle sind mir dann also klar. Aber wenn ich damit etwas sinnvolles machen will, zum Beispiel eine Kette, dann hab ich schon wieder Schwierigkeiten. Dann sieht das zum Beispiel so aus:
Delphi-Quellcode:
type Zeiger=^Element
Element:record
rechst:zeiger;
inhalt:integer;
end;
var wurzel, lauf: zeiger;
begin
wurzel:=NIL;
new(lauf);
lauf^.rechts:=NIL;
//"lauf^.rechts" ist also ein Zeiger, der vom Ziel von Zeiger "lauf" ausgeht und erstmal ins Leere zeigt?//
lauf^.inhalt:=1;
//ist "lauf^.inhalt" das selbe wie "lauf^"?//
Bis hierhin hätte man also einen Zeiger "lauf" mit "lauf^"=1, einen Zeiger "wurzel", der ins Leere zeigt und einen Zeiger "lauf^.rechts", der von "lauf^" aus ins Leere zeigt.
Nun gehts weiter:
Delphi-Quellcode:
wurzel:=lauf^;
new(lauf);
lauf^.rechts:=wurzel;
lauf^.inhalt:=2;
wurzel:=lauf;
der Zeiger "wurzel" zeigt jetzt auf einen Speicherplatz in dem der selbe Wert wie "lauf^" (1) gespeichert ist. der Zeiger "lauf" bekommt einen neuen Speicherplatz reserviert. der Zeiger "lauf^.rechts", der vom Ziel von "lauf" ausgeht zeigt jetzt auf den selben Speicherplatz wie "wurzel". "lauf^.inhalt" wird überschrieben. Der Inhalt ist nun ein anderer, "lauf" stellt aber immer noch die selbe Addresse dar.
Wenn das so alles richtig war, dann hätte ich noch ne Frage. Wollte man die Kette um eine 3 erweitern, müsste man dann mit einem "lauf^.rechts^.rechts"-Zeiger arbeiten? gibt es so einen Zeiger überhaupt?

Danke für den link, ich denke der hilft mir auch weiter.

Ich denke für mich ist das noch nicht so relevant ob ich new und dispose oder Getmem und freemem benutze. So komplex sind meine Programme nicht gerade *g*...

himitsu 7. Apr 2005 14:52

Re: Einführung in Pointer
 
@El Cattivo

OK, das mag ja nicht schlecht sein, aber was macht dann New bei dem Typen Pointer und PChar, die haben ja keine feste Größe und für sowas brauchte ich diese Funktionen ja :gruebel:

SirThornberry 7. Apr 2005 14:56

Re: Einführung in Pointer
 
für PChars gibt es "StrAlloc"

El Cattivo 7. Apr 2005 15:41

Re: Einführung in Pointer
 
Also das mit dem new hab ich so verstanden.
Wenn p nen Pointer ist und n ne gespeicherte variable, dann weist man mit p:=@n p die Addresse von n zu. Wenn p noch auf keinen Wert zeigt, man aber bereits auf den Raum zugreifen will, auf den der Pointer zeigt, dann schreibt man new(p). Ich schätze mal, wenn p:=NIL wäre, dann könnte man nicht p^.rechts schreiben.
Aber eigentlich wollte ich hier die Fragen stellen :lol:, ich weiß ja nichtmal was ein PChar ist und mit " für PChars gibt es "StrAlloc"" kann ich erst recht nichts anfangen... :shock:
Ich wollte eigentlich nur wissen wie man Pointer anwendet, dass man ne Kette erstellt, in die man Elemente einfügen und auslesen kann und die man sortieren kann.
Die Kette unten hat aber erst zwei Eltemente (1 und 2) und ich hab keine Ahnung wie man die erweitet und ich habe nur ne leichte Ahnung wie man die sortieren könnte...


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:36 Uhr.
Seite 1 von 4  1 23     Letzte »    

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