Seite 1 von 1

Gehversuche in Forth

Verfasst: Di 12. Jun 2012, 21:06
von U-Held
Hallo, ich weiß nicht mehr weiter:

: hello_file
mount? parsenw dup if
dup adm:newfile .err
c" Hello file!" 09 adm:fkt!s!
adm:close
else drop 23 .err then ;

...erzeugt mit einem Aufruf wie "hello_file hf.txt" nur eine leere Datei. :-(

Was habe ich falsch gemacht?

Verzweifelte Grüße vom U-Held.

Re: Gehversuche in Forth

Verfasst: Di 12. Jun 2012, 21:44
von drohne235
Hatte ich in schon irgendwo adm:newfile definiert, oder ist die Definition von dir?

Aber egal wie: die Administra-Funktion sd_newfile erzeugt nur eine neue Datei ohne implizites öffnen! Wenn ich richtig sehe, muss dem adm:newfile also noch ein adm:open (schreibend) folgen, um die erzeugte Datei erst zu öffnen. Versuch mal.

Edit: Sorry, die adm.lib ist noch ziemlich unvollständig. Vielleicht können wir sie aber zusammen ein wenig erweitern?

Re: Gehversuche in Forth

Verfasst: Mi 13. Jun 2012, 06:34
von U-Held
drohne235 hat geschrieben:Hatte ich in schon irgendwo adm:newfile definiert, oder ist die Definition von dir?
Nein, adm:newfile habe ich in der sd0.lib gefunden. Hätte ich auch dazuschreiben können. So wie das "ifnot" für einzelne Wörter müsste es noch ein "require" für ganze Libs und Mods geben, das im aktuellen und im Forth-Verzeichnis nach der Datei sucht und sie bedingt einliest. Das wäre Build-Hilfe und Doku in einem. Die Gefahr besteht darin, dass der Speicher voll ist mit unbenutzten Wörtern und das eigene Programm keinen Platz mehr hat. Das ist mit einem Ein-Pass-Compiler aber nicht zu schaffen.
drohne235 hat geschrieben:Wenn ich richtig sehe, muss dem adm:newfile also noch ein adm:open (schreibend) folgen, um die erzeugte Datei erst zu öffnen. Versuch mal.
Hatte ich schon versucht. Aber ich versuche es noch einmal und melde mich.

Wie überrede ich eigentlich .err resp. ERR dazu, den Fehlercode vor dem Reset auch auszugeben?
drohne235 hat geschrieben:Sorry, die adm.lib ist noch ziemlich unvollständig. Vielleicht können wir sie aber zusammen ein wenig erweitern?
Danke für das Angebot, ich nehme es gern an!

Grüße, U-Held

Re: Gehversuche in Forth

Verfasst: Mi 13. Jun 2012, 18:16
von drohne235
Habe gerade noch ein Problem gefunden. Die Funktion adm:putblk kann nicht mit "09 adm:fkt!s!" definiert werden! Bei der Übertragung eines Strings (s!) wird als erstes die Stringlänge als Byte übertragen. Ein String kann also eine maximale Länge von 256 Byte haben. Die Funktion adm:putblk/getblk erwarten aber als Länge ein Long, damit größere Datenblöcke im Stück übertragen werden können. Korrekt müsste man also ein "adm:fkt!blk!" definieren und für diese Funktion verwenden.

Wo die Fehlerausgabe von .err verschwunden ist, sehe ich grad nicht. Kann sein, dass ich sie versehentlich wegrationalisiert habe, um Speicher zu sparen... :(

Re: Gehversuche in Forth

Verfasst: Mi 13. Jun 2012, 21:53
von U-Held
OK, habs. Danke für die Tips.

Code: Alles auswählen

\ require sd0.lib
\ adm:puts  ( str -- )
: adm:puts
  dup C@ dup
  b[
    09 [a!] [a.l!]      \ adm:putblk
    0 do
      1+ dup C@ [a!]
    loop
  ]b
  drop ;

: hello_file
  mount? parsenw dup if 
    dup adm:newfile .err
    57 adm:open .err
    c" Hello file!" adm:puts
    adm:close
  else drop 23 .err then ;  
Man könnte noch ein "open" schreiben, das die Datei ggf. neu anlegt.

Gruß, U-Held

Re: Gehversuche in Forth

Verfasst: Do 14. Jun 2012, 07:16
von drohne235
Man könnte noch ein "open" schreiben, das die Datei ggf. neu anlegt.
Meine Wortnamen sind da noch nicht so ausgegoren. Vielleicht wäre "newopen" ein guter Name. Ansonsten habe ich gerade in meinem basics.mod gesehen, dass "open" nur lesend öffnet - sollte vielleicht auch parametrisierbar sein.