Basic-Programm mit Diskettenzugriff - Denkhilfe benötigt

Es gibt 5 Antworten in diesem Thema, welches 1.478 mal aufgerufen wurde. Der letzte Beitrag (1. Januar 2016 um 11:22) ist von Lichtwicht.

  • Moin :)

    Helft mir mal bitte mit denken, irgendwie verstehe ich nicht, weshalb dieser Programmcode nicht funktioniert :gruebel

    Code
    500 dim w$(250):i=1
    510 open 2,lw,2,"wfile,s,r"
    520 if st=64 then 540
    521 input#2,w$(i)
    530 i=i+1:goto 520
    540 ?:?"Vorhandene Daten geladen!":close2

    lw ist entweder 8 oder 9, je nachdem, wo die Diskette eingelegt ist. Dieser Code soll den Inhalt einer sequentiellen Datei namens "wfile" in das Array w$(x) einlesen. Sobald die Statusvariable ST den Wert 64 enthält, ist das Ende der Datei erreicht und es wird ab Zeile 540 weiter im Programm verfahren. Soviel zur Theorie. Allerdings bleibt die Floppy einfach stehen und der C64 läuft eben nicht weiter im Programm. Ich kann teilweise nur mit Run/Stop-Restore den Rechner wiederholen. Rufe ich im Direktmodus das Array w$(x) auf, so hat das Programm scheinbar alle Daten eingelesen, fährt aber trotzdem nicht im Programm fort. Merkwürdigerweise hat sogar die Statusvariable ST den Wert 64. Aber das Programm will partout nicht weiterlaufen. Die rote LED der Floppy bleibt auch an. Der Fehler tritt auf beiden Floppys gleichermaßen auf, es ist also kein Fehler der Floppy.

    Was mache ich falsch? Ich dreh hier noch durch :D:gahh::juhu:

    Nachdem er in Zeile 521 die letzte Information gelesen hat, geht die Statusvariable auf 64. somit sollte er nach dem Abarbeiten der Zeile 530 mit anschließendem Sprung zurück in Zeile 520 und der auf 64 stehenden Statusvariablen mit Zeile 540 weitermachen. Wie gesagt, die Statusvariable ist ja 64 aber dennoch gehts nicht in 540 weiter. :gahh:


    Danke im Voraus fürs Mitdenken! :)

    Viele Grüße!
    Ingo :)

  • Wie wurde die Datei wfile.seq denn erstellt? Sowas kann vorkommen, wenn input# auf ein chr$(0) im Datensatz stösst.

  • Ist es nicht so, dass INPUT# genauso wie INPUT ein CHR$(13) also Return erwartet, um die Eingabe abzuschließen?

    wenn die Anzahl der Datensätze (/Strings)
    N
    sei,
    und die Anzahl der CHR$(13) nur:
    N-1
    ist,
    dann würde das INPUT# im letzten Durchlauf hängenbleiben.

    Das ist zumindest mein theoretisches Verständnis der Angelegenheit, ich hoffe damit eine Lösung befördert zu haben, selbst wenn meine Theorie falsch gewesen sein sollte.

  • HA! Ja genau das war es, ihr habt beide recht.

    Die Datei wird mit einem eigenen, separaten Editorprogramm erstellt. Bei der Eingabe der entsprechenden Datensätze im Editor habe ich einen kleinen Fauxpas mit einprogrammiert. Nach jeder erfolgten Eingabe wird der Zähler mit i=i+1 weitergestellt. Wenn ich die Eingabeprozedur mit einer Leereingabe beende, steht der Zähler ja schon einen Schritt weiter und dieser letzte Schritt wird eben jener Leereingabe zugeordnet. Bzw umgekehrt, die Leereingabe erhält somit im Array auch noch einen Platz und wird mit einer entsprechenden Routine mit allen anderen Eingaben in das genannte sequentielle File geschrieben. Beim Auslesen wartet INPUTBitte melde dich an, um diesen Link zu sehen. natürlich auf einen Datensatz, der aber nicht kommt, da er ja leer ist und damit wartet sich der C64 natürlich bei INPUTBitte melde dich an, um diesen Link zu sehen. einen Wolf, für die Floppy ist der Job allerdings erledigt, setzt die Statusvariable auf 64 und bleibt stehen, die LED bleibt natürlich rot, da ja noch kein CLOSE2 gesendet werden konnte, da der C64 noch bei INPUTBitte melde dich an, um diesen Link zu sehen. klebt. Und somit natürlich auch nicht mit IF ST=64 THEN 540 die bereits auf 64 stehende Statusvariable entdecken konnte.

    Ich habe jetzt im Editor die IF/THEN-Abfrage des Strings w$(x) dahingehend modifiziert, daß nach Detektion der Leereingabe zur Beendigung der Eingabeprozedur der Zähler wieder um einen Schritt verringert wird. In diesem Fall:

    IF w$(i)="" THEN i=i-1:GOTO 260

    Somit wird der leere Datensatz auch nicht mehr in das File geschrieben und INPUTBitte melde dich an, um diesen Link zu sehen. bleibt beim Auslesen auch nicht mehr kleben.

    In meinem Code im Initialbeitrag habe ich übrigens die IF/THEN-Abfrage auch noch mit einem i=i-1nach Detektion des Wertes 64 der Statusvariablen erweitert, da sonst ja auch ein leerer Datensatz im definierten Array stehen würde. Das ist zwar für die weitere Verarbeitung nicht sooo tragisch, aber wir wollen ja nicht unnötig Speicherplatz verbraten :D Der Code sieht also jetzt so aus:

    Code
    500 dim w$(250):i=1
    510 open 2,lw,2,"wfile,s,r"
    520 if st=64 then i=i-1: goto 540
    521 input#2,w$(i)
    530 i=i+1:goto 520
    540 ?:?"Vorhandene Daten eingelesen!":close2

    Ursächlich für das Problem war allerdings nicht dieser Code, der jetzt auch ohne die Änderung in Zeile 520 funktioniert, sondern eben der o.g. kleine Programmierfehler im Editor.

    Edit: natürlich wird im Editor beim Schreiben in das SEQ-File nach jedem Datensatz ein CHR$(13) mitgesendet bzw mit in die Datei geschrieben, auch nach dem hier genannten leeren Datensatz. Allerdings scheint die Ausleseroutine INPUTBitte melde dich an, um diesen Link zu sehen. im Gegensatz zum "normalen" INPUT keine leeren Datensätze zu mögen und ignoriert den von der Floppy gesendeten CHR$(13) nach dem leeren Datensatz. Eben kleine aber feine Details, die es zu beachten gilt :D


    So einfach kann es sein. Manchmal hat man eben das sprichwörtliche Brett vorm Kopf und sucht sich an der komplett falschen Stelle dumm und dusselig :D:wand:platsch::juhu:

    Danke an alle fürs Mitdenken und die Hilfe! :):thnks::thnks:

    Viele Grüße und guten Rutsch! :)
    Ingo

    2 Mal editiert, zuletzt von Lichtwicht (31. Dezember 2015 um 08:51)

  • Hi, Ingo!

    Schön, daß es jetzt läuft. Allerdings setzt deine Problemlösung, wie ich meine, an der falschen Stelle an.

    An dem ursprünglichen Code ist ja grundsätzlich nichts verkehrt: er liest ein Datum ein, erhöht den Zähler um 1 und wenn er feststellt, daß die Datei zu Ende ist, geht er aus der Schleife raus und schließt die Datei.

    Erschwerend zum Ausarbeiten einer sauberen Programmlogik kommt dann natürlich noch das Problem zum Tragen, daß INPUT# keine "leeren" Eingaben mag (wie bereits festgestellt), das ist aber nicht das einzige Problem: Leerzeichen in der Eingabe vorne und hinten werden einfach weggelassen, Kommata und Doppelpunkte wirken als Trenner, Anführungszeichen ändern die Semantik (stehen sie vorne und hinten als Begrenzer, dann "gehen" Kommata und Doppelpunkte zwar wieder, aber wehe innendrin tauchen noch mal Anführungszeichen auf)... deshalb ist INPUT# eigentlich nur brauchbar, wenn man vorher sicherstellt, daß die .SEQ Datei solche "Fallen" nicht enthält. Und dann gibt es noch die Beschränkung auf maximal 80 Zeichen pro Eingabe ...

    Ich hab' vor einiger Zeit mal eine kleine Supportroutine in Maschinencode geschrieben, die an Stelle von INPUT# eine Zeichenkette aus einer Datei einfach bis zum nächsten CR oder EOF liest, ohne daß irgendwelche Sonderzeichen diese Routine aus dem Tritt bringen. Leere Eingabezeilen ergeben sauber einen Leerstring "". Und Eingaben dürfen bis zu 255 Zeichen lang sein. Muß die Routine nur mal herauskramen...

  • Moin Mike, danke für Deine Antwort. :)

    In meinem Programm werden nur einzelne Wörter eingegeben und gespeichert und die Wortlänge ist auf max 50 Zeichen begrenzt. Satz-, Leer- und Sonderzeichen werde ich nun nach deinen Angaben auch noch ausschließen, machen sie für meine Zwecke im Hauptprogramm eh keinen Sinn. :)


    Vielen Dank nochmals für eure Antworten! :thnks::thnks: