BASIC; STRING speichern


BASIC; STRING speichern

von dl7ukk » Mo 25. Nov 2019, 00:24
Hallo Basic-Programmierer,

mir ist beim Speichern von String's aufgefallen, dass beim Benutzen von

LIST #1,X$

der String auf der Disk/ ATR 10 Zeichen länger ist, als der String im Speicher vom Atari.
Die Ausgabe auf dem Bildschirm war ok. Es werden offenbar bei der Ausgabe mit LIST genau 10 Leerzeichen davor gesetzt.

Zur Veranschaulichung ein kleines Programm.
Code: Alles auswählen
5 TRAP 80                       Abfangen von EOF
10 DIM A$(20),B$(20)            Länge der Strings bestimmen
20 OPEN #1,4,0,"D:DATEN.LST"    Öffnen der Daten Eingabe
30 OPEN #2,8,0,"D:OUTPUT.LST"   Öffnen der Daten Ausgabe
40 INPUT #1,A$                  Einlesen einer Zeile in den A$
50 PRINT A$                     Print/ Ausgabe von A$ auf dem Bildschirm
60 PRINT #2,A$                  Print/ Ausgabe von A$ auf der Disk/ Atr
70 GOTO 40                      Wiederholung bis EOF
80 CLOSE #1                     Kanal schließen
90 CLOSE #2                     Kanal schließen
100 REM
105 TRAP 199                    Abfangen von EOF
110 OPEN #1,4,0,"D:DATEN.LST"   Öffnen Original-Daten
120 OPEN #2,4,0,"D:OUTPUT.LST"  Öffnen von OUTPUT zum Lesen
130 INPUT #1,A$                 Einlesen einer Zeile in den A$
140 PRINT A$;" ";LEN(A$)        Ausgabe auf dem Bildschirm von A$ und seiner Länge
150 INPUT #2,B$                 Einlesen einer Zeile in den B$
160 PRINT B$;" ";LEN(B$)        Ausgabe auf dem Bildschirm von B$ und seiner Länge
170 GOTO 130                    Wiederholung bis EOF
199 END                         Fertig



Man sieht beim Wiedereinlesen der gerade gespeicherten Strings deutlich, daß nunmehr die Zeilen/ Daten -> Strings jeweils 10 Zeichen länger sind. Aber warum und wofür?
Oder mein Fehler?? Falscher Befehl??

Ich habe Alles mehrfach geprüft. Atari-Basic, Turbo-Basic, Basic++, Atari-OS, SPOS, Atari800-Emu, Atari800XL

Workarounds zur Problemlösung habe ich.

* Mit Get & Put die Datei bearbeiten und überflüssige Zeichen rausnehmen
* Vor dem "Benutzen" der Zeilen/ Strings mit A$=A$(10-LEN(A$)) korrigieren
* Alles am PC erledigen.

Vielleicht hat Jemand Lust es auszuprobieren oder kennt eine Lösung.
Bin gespannt wo der Fehler liegt.

Ich habe ein STRING.ATR mit dem PROGRAMM.BAS und den DATEN.LST angehängt
STRING.ATR.zip
(10.85 KiB) 125-mal heruntergeladen

Hintergrund war/ ist die Konvertierung/ Korrektur von Listings.



Gruß

Re: BASIC; STRING speichern

von atarixle » Mo 25. Nov 2019, 08:27
LIST???

In Basic geht das einfach
Code: Alles auswählen
?#1;S$

oder
Code: Alles auswählen
?#1;S$;

wenn du keinen Zeilenumbruch am Ende willst.

Für "mehr Kontrolle" (bzw. um Daten von Strings der Länge 0 abzuspeichern) geht in Turbo-BASIC auch
Code: Alles auswählen
BPUT#1,ADR(S$),LEN(S$)

wenn die Länge größer 0 ist
oder
Code: Alles auswählen
BPUT#1,ADR(S$),LAENGE

wenn die Länge nicht bekannt ist, weil du den String mit POKE / BGET / DPOKE / MOVE etc beschrieben hast.

Kurz noch:
Code: Alles auswählen
?#1,S$

(mit Komma statt Semikolon) setzt ein paar Leerzeichen vor den String (soll ein Tab sein).

Re: BASIC; STRING speichern

von FlorianD » Di 26. Nov 2019, 01:02
Hallo,

Code: Alles auswählen
LIST #1,A$

geht das überhaupt?


Code: Alles auswählen
PRINT #1,A$

der Fehler liegt beim Komma ",", das beim PRINT-Befehl ein Tab einfügt.

Code: Alles auswählen
PRINT #1;A$

wäre richtig. Da kommt dann noch ein CHR$(155) ("RETURN") dran, wenn man die Zeile nicht mit ";" abschließt.
Sollte man aber, da man sonst nicht weiß, wo die Zeile endet.
Das RETURN wird bei INPUT #1;A$ ja nicht mitgelesen sondern dient als Markierung, wo der $ endet.

Mach mal Dein Listing mit ";" statt ",".
Das sollte da gehen.

Re: BASIC; STRING speichern

von dl7ukk » Di 26. Nov 2019, 07:59
Hi,

ich danke Euch für die Hilfe. Das Komma war's, wo ich ein Semikolon brauchte.

FlorianD hat geschrieben:
Code: Alles auswählen
LIST #1,A$

geht das überhaupt?


Ist natürlich völliger Quatsch und geht auch nicht. Zur Rettung meiner Ehre ... im Programm war es richtig! Mirko hatte es auch schon gesehen.


Es muss natürlich

PRINT #1,A$

heißen.


Gruß