![]() |
Re: Einführung in Pointer
Zitat:
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. |
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:
Nun kommt das Program an sich:
type
Zeiger=^Element; Element= record rechts: Zeiger; inhalt: integer; end; var Form1: TForm1; a: integer; wurzel,lauf,help: zeiger;
Delphi-Quellcode:
Und die Ausgabe in ein label:
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;
Delphi-Quellcode:
Für das sortieren habe ich folgenden Ansatz:
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;
Delphi-Quellcode:
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..?
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; |
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; |
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 ![]() Ich denke da findest du auch fast alle Fragen eine Antwort..! :) |
Re: Einführung in Pointer
Vielen Dank! Das Tutorial ist mir wirklich eine große Hilfe! :thumb: Super!
|
Re: Einführung in Pointer
Ich sag nur
Pointerfun with BINKY ![]() ![]() Viel Spass damit Greetz Boombuler |
Re: Einführung in Pointer
Muss das Thema nochmal aufkochen :wink:
warum gibt folgendes eine AV?
Delphi-Quellcode:
Gruß Richard
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! |
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:
Schmeiss alles mit deinem PBitmap raus und nutze statt dessen einfach nur TBitmap.
ShowMessage(IntToStr(SizeOf(TBitmap)) + ' bytes gross');
Dein Code wie es reichen würde:
Delphi-Quellcode:
Dein Code korrigiert:
var
Bitmap: TBitmap; {...} Bitmap := image1.picture.bitmap; Bitmap.Canvas.Brush.Color := clred; Bitmap.Canvas.Rectangle(0,0,10,10); // Hier krachts!
Delphi-Quellcode:
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
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! |
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:
habe, dann kann ich mit meinem Zeiger auf ein Record den Aufruf
TMyArray = Array[0..19,0..19] of TMyRecord
Delphi-Quellcode:
machen und dann über
MyZeiger := @MyArray[x,y]
Delphi-Quellcode:
darauf zugreifen und die entsprechenden Werte modifizieren oder?
MyZeiger^.ValueX
Edit: Juhu 100 Beiträge |
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 14:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz