Einzelnen Beitrag anzeigen

OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: ScanLine anwenden, bzw die Hilfe verstehen

  Alt 19. Jul 2007, 12:54
Erklärt nur alles dem TE nicht, was es mit dem Pointer auf sich hat und warum das alles Zuweisungskompatibel ist...

Im Endeffekt wird die Frage "ist mein P ein Pointer oder ein ^PixArray" erst zu Laufzeit interessant. Pointer unter sich sind allesamt Zuweisungskompatibel, denn eigentlich speichern sie alle NUR ADRESSEN. Daraus folgt: Pointer sind nur "indirekte" Variablen - ich hoffe, du verstehst, was ich meine...

Führst du also ein
P:=Img.Scanline[h]; aus, dann wird in P nur eine Adresse gespeichert. Mehr nicht. Aber: Dein P "zeigt" jetzt auf ein Stück Speicher.

Erst, wenn du mit dem P anfängst "zu arbeiten", wird es interessant, das das kein normaler Pointer ist, sondern ein typisierter Pointer.

Mit der Zeile
i:=P^[1]; muß Delphi anfangen, dein P wie ein Array zu behandeln. Das Stück Speicher, auf das dein P nun zeigt, wird erst jetzt als ein PixArray interpretiert

Ich bin sicher, irgendwo findet sich hier ein Tutorial zum Thema Zeiger/Pointer. Hat man das mit den Pointern begriffen, erkennt man die ungeheuer Mächtigkeit von Zeigern - aber auch die ziemlich gräßlichen Nebenwirkungen, die Zeiger haben können. Ein Beispiel (P sei wieder ein ^PixArray):

Delphi-Quellcode:
P:=Pointer(2);
P^[1]:=37;
Das ist absolut gültiger Code. Den wird Delphi auch klaglos übersetzen. Schließlich weist du einem Pointer einen anderen Pointer zu (das P bekommt also die Adresse 2 als Inhalt). Und dann greift du auf das erste Byte zu, auf das P zeigt. Nichts schlimmes also.

Läßt man das laufen, bekommt man was an die Ohren (Schutzverletzung an Adresse [bla], Schreiben von Adresse $00000002)

Pointer gehören nicht umsonst zum am meisten gefürchteten Konstrukt in Coderkreisen, denn zahllose Einsteiger verstehen das Konzept erst nach einer Weile - und etliche raffen es nie.

Noch ein Tip: Wenn du im Code mit Zeigern arbeitest, dann benutze das Dach zum dereferenzieren. Ich weiß, das Delphi das nicht benötigt (war mal anders). Aber es hilft ungemein bei der Fehlersuche, wenn man sieht, das man nicht den Zeiger beschreibt, sondern das, auf das er zeigt Spätestens, wenn man sich irgendwann mal mit C beschäftigt und dort praktisch sekündlich über Zeiger stolpert und sie dereferenzieren muß, freut man sich über diese Angewohnheit

[Edit]Hab ein Tutorial gefunden:
Zeiger-Tutorial
  Mit Zitat antworten Zitat