Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: liste in datei specihern

  Alt 25. Jan 2007, 10:49
Zitat von -most-:
Was genau muss hier bei den pünktchen noch hinzugefügt werden? und was ist dieses "tmp"
Delphi-Quellcode:
var Datei:file of TDatensatz;
    item,tmp:PItem;
    //...
Bei den Pünktchen...? Hmm, anscheinend nix mehr, ausser du brauchst zum Löschen noch ein paar Variablen.

Und wozu ich tmp brauche. Um mir mal kurz ne Addresse zu merken.
Ok, ein bischen ausführlicher zu Adressen/Zeigern/Pointern:
tmp hab ich angelegt, weil ich es nachher brauche. item und tmp sind ja "nur" Zeiger. Belegen jeweils 4 Bytes auf dem Stack und zeigen irgendwohin in den Hauptspeicher. Und wenn wir alles richtig gemacht haben (mit der Zuweisung etc.) zeigen sie auf unseren Record. Was macht der Compiler da nun genau? (Wir vernachlässigen mal das es virtuelle und reale Adressräume gibt, das ist jetzt nicht so wichtig und würde nur verwirren)
Nehmen wir an item zeigt auf eine Speicheradresse mit der Nummer 10. Dann steht genau die 10 in item drin (item = 10). Wenn ich aber den Inhalt von item haben will, dann ist mir die 10 relativ wurscht/schnuppe/egal. Deswegen mach ich da so ein Zeichen (^) drann. Das sagt dem Compiler ich will den Inhalt an Stelle 10 im Hauptspeicher haben (item^ = unser TItem). Das ist allerdings ein record und da gehts noch ein bisschen weiter. Ich möchte nämliche item^.next; Für Delphi heisst es ich will die Zahl (die ist auch wieder ein Zeiger immer 4 Bytes groß) an Stelle 10+0 im Hauptspeicher. Das "+0" Kommt daher, da "next" das erste Element ist. ein Zweites element im Record würde an Stelle 10+4 liegen (4 Bytes wegen dem next) usw...
Wenn ich jetzt tmp:=item mache. Dann schreibt er die Adresse 10 in die Variable tmp rein. Jetzt zeigen also tmp und item auf die selbe Stelle im Speicher. tmp=item=10. Ich kann also jetzt mit tmp^.next genau dieselbe Zahl lesen wie mit item^.next. Und wenn ich in z.b. item^.next:=211 ändere (was mit pointer allerdings nicht so einfach geht), ist diese Zahl auch genauso in tmp^.art_nr=211. die beiden Zeiger (tmp und item) zeigen ja auf dieselbe Addresse.
So ist das mit Zeigern. Und mit new(item) bekomme ich vom Speichermanager so eine frei Addresse. Mit dispose sage ich, dass ich die Addresse 10 (und die nachfolgenden n Bytes) nicht mehr brauche.

Zitat von -most-:
und wasgenau ist hier zu beachten?
Delphi-Quellcode:
item:=start;
  while item<>nil do begin
    //start:=start^.next; rausnehmen
     write(Datei,item^.Artikel);
    item:=item^.next;
  end;
reicht das so? oder wie in etwa muss diese schleife aussehen?
Ich glaube ich hatte schon alles geschrieben, macnhmal bedeuten Kommentare bei mir auch, dass ich schon alles gemacht habe. Aber wenn du etwas an deinem Datensatz änderst, dann musst du auch da etwas ändern.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat