Hi nochmal,
Zu Michael:
ich fühle mich mal angesprochen, auch wenn ich Martin heiße
Ich habe wie von Dir empfohlen „File of PVliste“ zu „File of
Vliste“ geändert. Ich bekomme danach eine Fehlermeldung „Type
mismatch“ nach READ (f,l). Liegt wohl daran, dass f nun Vliste
ist und l PVliste. Das passt wohl nicht zusammen.
Ja, das hast Du richtig erkannt. Du brauchst noch eine Variable vom Typ „VListe“, die dann u. a. als Argument für die READ-Routine dient.
Wie sollte ich das ändern.
Allgemeiner Tip: In Pascal (und allen anderen gebräuchlichen Programmiersprachen) muß man ja allem Namen geben. Das allem ist dabei wörtlich gemeint, denn nicht nur Variablen wollen Namen haben, sondern auch Typen, Prozeduren, Funktionen, das Programm selbst, Units, kurz: wirklich alles. Bei so vielen Namen ist nun die Gefahr groß, daß früher oder später Wirrwarr entsteht (und das ist die Pest des Programmierens). Bei Prozedur- und Funktionnamen ist diesbezüglich zwar wenig zu befürchten, aber bei Variablen und Typen kann man verflucht schnell den Überblick verlieren – vielleicht hast Du das selbst schon gespürt. Weil das allen Programmierern so geht, hat sich unter Pascal eine einfache, aber wirkungsvolle Konvention eingebürgert:
Alle T ypbezeichner (mit Ausnahme der „elementaren“ Typen wie INTEGER, BOOLEAN, POINTER, STRING) beginnen stets mit einem „T“.
Hält man sich daran, kann man künftig alle Typbezeichner sofort daran erkennen, daß sie mit einem „T“ anfangen. Zusätzlich kann man sich auch noch angewöhnen, alle Zeigervariablen mit einem großen „P“ beginnen zu lassen. Das ist dann aber auch schon alles!
Deinen
record
menge:integer;
preis:Real;
next:stuck\_out\_tongue:Vliste;
end;
düftest Du dann nicht „VListe“ nennen, sondern z. B. „TListenElement“, denn es wird ja ein Typ vereinbart. Ein Zeiger auf eine Variable dieses Typs müßte vom Typ TPTListenElement sein:
TYPE
TPTListenElement = ^TListenElement;
TListenElement
= record
menge: integer;
preis: Real;
next : TPTListenElement;
end;
~
VAR
PListenElement: TPTListenElement;
ListenElement : TListenElement
Guck Dir jetzt mal die beiden Variablendeklarationen an: Daß die erste Variable ein Zeiger ist, springt Dir sofort ins Auge (P…), und ebenso verhält es sich mit den Typen (T… / TPT…).
Vielleicht konnte ich Dich vom Sinn dieser Konvention überzeugen, und vielleicht magst Du sie übernehmen. Ich kann Dir versichern, daß sie einem das (ohnehin hart genug seiende) Programmiererleben wirklich ungemein erleichtert:
VAR
Button1 : TButton;
Button2 : TButton;
ButtonSpezial: TButton;
Ernie, Bert : TSesamstrassenFigur;
Sesamstrasse : TSesamstrasse;
Du schreibst, dass l noch kein Wert zugewiesen wurde. Ich
kenne mich mit dynamischen Datenstrukturen noch nicht so ganz
gut aus. Was für einen Wert soll ich denn zuweisen.
Das hat mit dynamischen Datenstrukturen nichts zu tun. Du kannst l einfach nicht abfragen, ohne daß es einen definierten Wert hat. Später bekommt l ja Werte beim Aufruf von „READ“.
Du schreibst, dass „next : PVliste“ nicht in der Datei
gespeichert ist. Ich habe das nur gemacht, weil es in
Programmen, wo man die dynamischen Datenstrukturen nicht
einlesen musste gut geklappt hat. Das hier ein Unterschied
besteht, wusste ich nicht. Ich hab auch keine Idee, wie ich
das jetzt hinkriegen könnte. Ich nehme an, dass das „next“ in
jedem Fall drinbleiben muss, aber wie soll ich es dann
bezeichnen.
TYPE
TDateiElement
= record
menge: integer;
preis: Real;
end;
TPTListenElement = ^TListenElement;
TListenElement
= record
DateiElement: TDateiElement;
PNextLE : TPTListenElement;
end;
Um den Rest mußt Du Dich jetzt aber selber kümmern.
Mit freundlichem Gruß
Martin