AGB  ·  Datenschutz  ·  Impressum  







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

Einführung in Pointer

Ein Thema von El Cattivo · begonnen am 7. Apr 2005 · letzter Beitrag vom 18. Jan 2007
Antwort Antwort
Seite 4 von 4   « Erste     234   
El Cattivo

Registriert seit: 17. Apr 2004
Ort: Nieste bei Kassel
19 Beiträge
 
Delphi 5 Standard
 
#31

Re: Einführung in Pointer

  Alt 9. Apr 2005, 13:12
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...
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.
  Mit Zitat antworten Zitat
El Cattivo

Registriert seit: 17. Apr 2004
Ort: Nieste bei Kassel
19 Beiträge
 
Delphi 5 Standard
 
#32

Re: Einführung in Pointer

  Alt 10. Apr 2005, 15:25
...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..?
  Mit Zitat antworten Zitat
El Cattivo

Registriert seit: 17. Apr 2004
Ort: Nieste bei Kassel
19 Beiträge
 
Delphi 5 Standard
 
#33

Re: Einführung in Pointer

  Alt 24. Apr 2005, 14:24
...Oder vielleicht kann mir wenigstens jemand sagen wie man ein Glied einer Pointerkette löscht...
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;
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#34

Re: Einführung in Pointer

  Alt 24. Apr 2005, 14:31
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..!
Manuel Pöter
  Mit Zitat antworten Zitat
El Cattivo

Registriert seit: 17. Apr 2004
Ort: Nieste bei Kassel
19 Beiträge
 
Delphi 5 Standard
 
#35

Re: Einführung in Pointer

  Alt 24. Apr 2005, 19:28
Vielen Dank! Das Tutorial ist mir wirklich eine große Hilfe! Super!
  Mit Zitat antworten Zitat
Benutzerbild von Boombuler
Boombuler

Registriert seit: 14. Mär 2003
Ort: Osnabrück
244 Beiträge
 
Delphi 2009 Professional
 
#36

Re: Einführung in Pointer

  Alt 25. Apr 2005, 08:36
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
"Look at you, Hacker. A pathetic creature of meat and bone, panting and sweating as you run through my corridors. How can you challenge a perfect, immortal machine?"
SwapIt Highscore:
  Mit Zitat antworten Zitat
Benutzerbild von Tormentor32
Tormentor32

Registriert seit: 27. Okt 2005
Ort: Düsseldorf
369 Beiträge
 
Delphi XE5 Professional
 
#37

Re: Einführung in Pointer

  Alt 18. Jan 2007, 08:03
Muss das Thema nochmal aufkochen

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
Richard Mahr
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#38

Re: Einführung in Pointer

  Alt 18. Jan 2007, 08:56
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: 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
  Mit Zitat antworten Zitat
Benutzerbild von Tormentor32
Tormentor32

Registriert seit: 27. Okt 2005
Ort: Düsseldorf
369 Beiträge
 
Delphi XE5 Professional
 
#39

Re: Einführung in Pointer

  Alt 18. Jan 2007, 09:15
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 TMyArray = Array[0..19,0..19] of TMyRecord habe, dann kann ich mit meinem Zeiger auf ein Record den Aufruf MyZeiger := @MyArray[x,y] machen und dann über MyZeiger^.ValueX darauf zugreifen und die entsprechenden Werte modifizieren oder?

Edit: Juhu 100 Beiträge
Richard Mahr
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#40

Re: Einführung in Pointer

  Alt 18. Jan 2007, 09:29
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


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 09:59 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