Hallo,
kann mir mal jemand erklären, wie Dateien in Standard Pascal funktionieren? Sowas wie Assign oder Bind gibt es da ja nicht. Wie orndet man einer Datei also einen Namen zu?
Bitte mal ein Beispiel.
Andreas K. Foerster schrieb:
kann mir mal jemand erklären, wie Dateien in Standard Pascal funktionieren? Sowas wie Assign oder Bind gibt es da ja nicht. Wie orndet man einer Datei also einen Namen zu?
Leider gibt "Classic Pascal" (also ISO 7185, im Gegensatz zu Extended Pascal) dazu keinen Mechanismus. Das Einzige, was man tun kann, ist die Datei im Programm-Header zu deklarieren und sie damit als extern zu kennzeichnen, z.B.:
program Foo (Bar);
var Bar: Text;
begin Rewrite (Bar); WriteLn (Bar, 'bar') end.
Wie der Dateiname zustandekommt, ist allerdings compilerahängig. GPC bietet dazu 3 Möglichkeiten:
- Per Default wird der Benutzer zur Laufzeit nach einem Dateinamen gefragt.
- Wenn man mit der Option `--transparent-file-names' compiliert, wird der Variablenname (hier also `Bar') als Dateiname verwendet. (Damit bekommt man natürlich keine Punkte usw. hin ...)
- Man kann den Dateinamen beim Start des Programms mit einer (etwas seltsam aussehenden Option) `--gpc-rts=-nBar:myfile.dat' festlegen.
Frank
On Wed, Jan 22, 2003 at 04:14:41PM +0100, Frank Heckenbach wrote:
kann mir mal jemand erklären, wie Dateien in Standard Pascal funktionieren? Sowas wie Assign oder Bind gibt es da ja nicht. Wie orndet man einer Datei also einen Namen zu?
Leider gibt "Classic Pascal" (also ISO 7185, im Gegensatz zu Extended Pascal) dazu keinen Mechanismus. Das Einzige, was man tun kann, ist die Datei im Programm-Header zu deklarieren und sie damit als extern zu kennzeichnen, z.B.:
program Foo (Bar);
var Bar: Text;
begin Rewrite (Bar); WriteLn (Bar, 'bar') end.
Wie der Dateiname zustandekommt, ist allerdings compilerahängig.
Ach deshalb fehlt die Angabe überall.
GPC bietet dazu 3 Möglichkeiten:
- Per Default wird der Benutzer zur Laufzeit nach einem Dateinamen gefragt.
Sehr gut! ...und wenn man nur Enter drückt, nimmt er die Standard-Eingabe - auch sehr gut!
Wie wäre es, zusätzlich mit einer Compiler-Option die Möglichkeit zu schaffen, dass die Programm-Optionen als Dateinamen interpretiert und der Reihe nach zugeordnet werden. Das würde ich als optimal empfinden. ...nur ein Vorschlag, nichts, was mir wirklich wichtig wäre.
Ich habe ein wenig damit rumexperimentiert. Also FPC macht bei dem Programm nur einen Laufzeitfehler. :-(
Bei Standard Pascal Programmen habe ich öfter gesehen, dass "input, output" angegeben waren. Wird das in dem Standard vorausgesetzt, oder welchen Zweck hat das?
Besonders Interessant fand ich bei GPC folgendes Verhalten:
| program Foo (output, input, stderr, bar); | | var | Bar: Text; | | begin | Rewrite (Bar); | WriteLn (Bar, 'bar'); | Rewrite (output); | WriteLn (output, 'output'); | Rewrite (stderr); | WriteLn (stderr, 'stderr'); | end.
Dabei fragte er wirklich nur nach einer Datei. :-) Das "stderr" ist aber bestimmt kein Standard, oder?
Nicht, dass ich mich jetzt nur noch auf Standards beschränken will. Aber ich möchte das verstehen, um halt möglichst portabel programmieren zu können; da, wo es möglich ist.
Andreas K. Foerster schrieb:
GPC bietet dazu 3 Möglichkeiten:
- Per Default wird der Benutzer zur Laufzeit nach einem Dateinamen gefragt.
Sehr gut! ...und wenn man nur Enter drückt, nimmt er die Standard-Eingabe - auch sehr gut!
Ja, insofern BP-kompatibel. ;-)
Wie wäre es, zusätzlich mit einer Compiler-Option die Möglichkeit zu schaffen, dass die Programm-Optionen als Dateinamen interpretiert und der Reihe nach zugeordnet werden. Das würde ich als optimal empfinden. ...nur ein Vorschlag, nichts, was mir wirklich wichtig wäre.
Wäre prinzipiell möglich. Es wäre ein bisschen Aufwand, weil die Reihenfolge der Programm-Parameter dann zur Laufzeit verfügbar gemacht werden muss, sollte sich aber in Grenzen halten. Also, wenn Interesse daran besteht ...
Ich habe ein wenig damit rumexperimentiert. Also FPC macht bei dem Programm nur einen Laufzeitfehler. :-(
Ja, BP (an dem sich FPC ja orientiert) verlangt `Assign', und kennt auch keine internen Dateien (für die man gar keinen Namen angibt, und die nur während einer Laufzeit des Programms benutzt werden).
Bei Standard Pascal Programmen habe ich öfter gesehen, dass "input, output" angegeben waren. Wird das in dem Standard vorausgesetzt, oder welchen Zweck hat das?
Ja, wenn man z.B. `ReadLn' und `WriteLn' verwendet, müssen die angegeben werden. GPC verlangt das nur in den Standard-Modi.
Besonders Interessant fand ich bei GPC folgendes Verhalten:
| program Foo (output, input, stderr, bar); | | var | Bar: Text; | | begin | Rewrite (Bar); | WriteLn (Bar, 'bar'); | Rewrite (output); | WriteLn (output, 'output'); | Rewrite (stderr); | WriteLn (stderr, 'stderr'); | end.
Dabei fragte er wirklich nur nach einer Datei. :-) Das "stderr" ist aber bestimmt kein Standard, oder?
Nein, eine GPC-Erweiterung, und wie bei so vielen Erweiterung, ist offenbar auch hier das größte Problem, sie nur in den geeigneten Standards/Dialekten zu aktivieren ...
Ist in der nächsten Version behoben (fjf755.pas).
Frank