Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

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 9. Apr 2005 13:12

Re: Einführung in Pointer
 
Zitat:

Zitat von bttb930
Mal eine Frage:

Seid ihr Geschichtsforscher?

Oder programmiert ihr mit Turbo Pascal 5.0?

Zeiger braucht man heutzutage in Delphi so gut wie gar nicht mehr. Records auch nicht. Das wurde alles extrem vereinfacht und hier scheint es niemand mitbekommen zu haben.

Benutzt einfach Klassen und macht euch über Pointer keine Gedanken.

[...]

Erzähl das meinem Info-Lehrer... :roll:
Aber wenn ich nochmal auf das Beispiel von atreju2oo0 zurückkommen darf... wäre das dann "fifo" (first in first out)? Ist der Quelltext mit "lifo" (last in first out) nicht kürzer? Das Problem ist, ich weiß selbst nicht genau wie man fifo und lifo unterscheidet. Ich weiß nur, beim auslesen ließt man bei lifo rückwärts aus und bei fifo vorwärts, weil man beim einlesen bei fifo hinten dran hängt und bei lifo eben vorne.

El Cattivo 10. Apr 2005 15:25

Re: Einführung in Pointer
 
...ok
Ich hab noch eine letzte Frage. Ich habe eine Kette von Zahlen erstellt. Die sieht so aus:
das sind globale deklarationen:
Delphi-Quellcode:
type
  Zeiger=^Element;
     Element= record
               rechts: Zeiger;
               inhalt: integer;
               end;
var
  Form1: TForm1;
  a: integer;
  wurzel,lauf,help: zeiger;
Nun kommt das Program an sich:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
a:=1;
wurzel:=NIL;
end;

procedure TForm1.Button1Click(Sender: TObject);
var b: integer;
begin
b:=strtoint(edit1.text);
if a=1
   then
     begin
       new(lauf);
       lauf^.rechts:=NIL;
       lauf^.inhalt:=b;
       wurzel:=lauf;
       a:=2;
     end
   else
     begin
       while lauf^.rechts<>NIL do
         lauf:=lauf^.rechts;
       new(lauf^.rechts);
       lauf:=lauf^.rechts;
       lauf^.inhalt:=b;
       lauf^.rechts:=NIL;
     end;
edit1.text:='';

end;
Und die Ausgabe in ein label:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
lauf:=wurzel;
label1.Caption:=inttostr(lauf^.inhalt) + ',';
while lauf^.rechts<>NIL do
  begin
    lauf:=lauf^.rechts;
    label1.Caption:=label1.caption + inttostr(lauf^.inhalt) + ',';
  end;
end;
Für das sortieren habe ich folgenden Ansatz:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
lauf:=wurzel;
help:=lauf^.rechts;
while lauf.rechts.rechts<>NIL do
  if lauf^.rechts^.inhalt<help^.rechts^.inhalt
    then
      begin
        lauf^.rechts:=help^.rechts;
        lauf^.rechts^.rechts^.rechts:=help;
        lauf^.rechts^.rechts:=lauf^.rechts^.rechts^.rechts;
        lauf^.rechts^.rechts^.rechts:=help^.rechts^.rechts;
      end
    else
      begin
        lauf:=help;
        help:=lauf^.rechts;
      end;
label2.Caption:=label1.caption + inttostr(lauf^.inhalt) + ',';
end;
Achso ja. Und meine Frage ist, wie ich diese Pointerkette sortiert bekomme. Wohlgemerkt ohne die gespeicherten Elemente zu ändern sondern nur durch "Verbiegen" der Pointer..?

El Cattivo 24. Apr 2005 14:24

Re: Einführung in Pointer
 
...Oder vielleicht kann mir wenigstens jemand sagen wie man ein Glied einer Pointerkette löscht... :duck:
Ich kann Pointer ja auch nicht mehr sehen. Ich habe auch nen Ansatz, der funktioniert aber nicht.
Delphi-Quellcode:
r:=strtoint(edit5.text);
lauf:=wurzel;
for n:=1 to r-1 do
  lauf:=lauf.rechts;
help:=lauf.rechts;
dispose(lauf);
lauf:=help;

Motzi 24. Apr 2005 14:31

Re: Einführung in Pointer
 
Wenn ich den Thread schon früher gesehen hätte, hätte ich schon früher auf mein Tutorial verweisen - naja, dann hol ich das halt mal nach.. ;)
Auf www.manuel-poeter.de findest du ein sehr umfangreiches Pointer-Tutorial von mir. Für diejenigen die schon glauben es zu kennen - die alte Version wurde komplett überarbeitet und das alte (schlechte) Beispiel-Projket wurde durch ein neues ersetzt! :)
Ich denke da findest du auch fast alle Fragen eine Antwort..! :)

El Cattivo 24. Apr 2005 19:28

Re: Einführung in Pointer
 
Vielen Dank! Das Tutorial ist mir wirklich eine große Hilfe! :thumb: Super!

Boombuler 25. Apr 2005 08:36

Re: Einführung in Pointer
 
Ich sag nur

Pointerfun with BINKY

http://www.cs.stanford.edu/cslibrary...nPascalBig.avi <-- Large Version (34 MB)
http://www.cs.stanford.edu/cslibrary...rFunPascal.avi <-- Small Version (14 MB)

Viel Spass damit
Greetz
Boombuler

Tormentor32 18. Jan 2007 08:03

Re: Einführung in Pointer
 
Muss das Thema nochmal aufkochen :wink:

warum gibt folgendes eine AV?
Delphi-Quellcode:
type
  PBitmap = ^TBitmap;
var
  Bitmap: PBitmap;
{...}
  new(PBitmap);
  Bitmap := @image1.picture.bitmap;
  Bitmap^.Canvas.Brush.Color := clred;
  Bitmap^.Canvas.Rectangle(0,0,10,10); // Hier krachts!
Gruß Richard

Muetze1 18. Jan 2007 08:56

Re: Einführung in Pointer
 
TBitmap ist intern ein Zeiger auf das Objekt. Durch deinen PBitmap Typ hast du dann einen Zeiger auf den Zeiger auf das Objekt.

Aber wie gesagt (wenn du den Thread gelesen hättest), wird auf Seite 2 schon erklärt, dass Instanzen intern Zeiger sind und du somit keinen solchen Zeigertyp brauchst. Eine Variable vom Typ TBitmap ist ein Zeiger.

Beispiel:
Delphi-Quellcode:
ShowMessage(IntToStr(SizeOf(TBitmap)) + ' bytes gross');
Schmeiss alles mit deinem PBitmap raus und nutze statt dessen einfach nur TBitmap.

Dein Code wie es reichen würde:
Delphi-Quellcode:
var
  Bitmap: TBitmap;
{...}
  Bitmap := image1.picture.bitmap;
  Bitmap.Canvas.Brush.Color := clred;
  Bitmap.Canvas.Rectangle(0,0,10,10); // Hier krachts!
Dein Code korrigiert:
Delphi-Quellcode:
type
  PBitmap = ^TBitmap;
var
  Bitmap: PBitmap;
{...}
  new(PBitmap);
  Bitmap^ := image1.picture.bitmap;
  Bitmap^.Canvas.Brush.Color := clred;
  Bitmap^.Canvas.Rectangle(0,0,10,10); // Hier krachts!
Dein Problem im Code ist folgender: Du reservierst Speicher für den Typen PBitmap. Danach zeigt PBitmap auf den reservierten Speicherbereich. Danach setzt du den Zeiger aber um und lässt ihn auf die Property von TPicture zeigen. Somit nutzt den alloziierten Speicher nicht und zum anderen zeigst du auf eine Property und kein richtiges Objekt. Bei der Dereferenzierung versucht er dann die Property als TBitmap zu benutzen. Dadurch wird der Getter der Property nicht ausgelöst und es gibt an der Stelle kein TBitmap -> AV

Tormentor32 18. Jan 2007 09:15

Re: Einführung in Pointer
 
Okay danke! Ich hatte den obrigen Thread gelesen, hatte es aber nicht richtig verstanden... Jedenfalls funktioniert es jetzt!

Aber das ist nicht bei einem Record so oder?
Wenn ich ein
Delphi-Quellcode:
TMyArray = Array[0..19,0..19] of TMyRecord
habe, dann kann ich mit meinem Zeiger auf ein Record den Aufruf
Delphi-Quellcode:
MyZeiger := @MyArray[x,y]
machen und dann über
Delphi-Quellcode:
MyZeiger^.ValueX
darauf zugreifen und die entsprechenden Werte modifizieren oder?

Edit: Juhu 100 Beiträge

Muetze1 18. Jan 2007 09:29

Re: Einführung in Pointer
 
Ja, kannst du. In dem Falle erstellst du direkt einen Zeiger auf das Element x des Arrays - das funktioniert entsprechend.

Aber: Ein Hinweis gleich dazu: Ein dynamisches Arrays ist intern ein Zeiger auf die Elemente des Arrays. Also auch hier aufpassen - ABER: ein Zeiger auf ein Element (wie dein Beispiel eben mit einem statischen Array) des Arrays funktioniert entsprechend dem statischen Array.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 Uhr.
Seite 4 von 4   « Erste     234   

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