zurück : weiter : inhalt

 

7 *** Bug Collection

Eine Zusammenstellung von Fehlern in den verschiedenen ROMs, soweit sie dem Autor bekantgeworden sind, und ohne Anspruch auf Vollständigkeit. Als Fehler wurde hier alles eingeordnet, was bei Benutzung des QL in dokumentierter Weise Daten, Programme oder Geräte stört und womöglich in Gefahr bringt, aber auch Fehlinformationen, die ein autoritätshöriger Teil der QL-"Szene" von allweisen Gurus blind übernommen hat und (nervtötend) nachplappert...

Auf die Hardware ist nur kurz Bezug genommen.
Referenz ist MGG sowie JS, beides mit TK2 und TrumpCard, Teils auch GoldCard.
"QDOS"-kompatibel heißt alles, was den Dokumenten {1, 2} genügt.
"QL SuperBASIC, The Definitive Handbook" von J.Jones ist die authentische Quelle zum "SBasic".

Aus (Zeit- und) Platzmangel sind die SQ-Varianten kaum berücksichtigt. Deren hier genannte Fehler können zumeist durch Compilieren z.B. mit dem QLiberator in einem SBasic-kompatiblen QL-System umgangen werden (alle Originale, MINERVA).

Irreguläre Anwendungsmöglichkeiten werden nicht als Fehler angesehen.
Ein paar dieser mitunter durchaus nützlichen Effekte sind hier auch verzeichnet.
Sie dürften im allgemeinen aber nur in den Original-QL-Systemen anwendbar sein. Da es mit TK2, Trump-/Gold-Card, QXL und SMSQ/E für alle diese Sonderfälle reguläre Aufrufe gibt, sollten sie nur als spezielle Nothelfer benutzt werden, und nicht in über das eigene Gerät hinaus zugänglichen Programmen.

Die meisten der hier genannten Fehlererscheinungen können mit den Aufrufen der IO2-Sammlung (nicht zuletzt zu welchem Zwecke sie entstanden ist) umgangen werden. Mehr dazu in den zugehörigen Texten.
 
 

* allgemein *

MINERVA 1.89
Durch einen Fehler in der Slaveblock-Initiierung ist nur 1MB RAM adressierbar.
Zur Adressierbarkeit von bis zu 16MB ändert man Adresse $04E6, Inhalt $D640 nach $D680
Ein weiterer Fehler, der auch in MINERVA 1.97 noch zu finden ist, führt zum Steckenbleiben durch "address error", wenn (versehentlich, der Opcode ist nicht gültig) die Operation D0=$44, Trap#3, für einen MDV-Kanal aufgerufen wird. Dies kann nur durch re-assemblieren des ROM-Code korrigiert werden - für UQLX geschehen, bei Interesse mail...
 

Viren
Computerviren, behaupten kluge (naive?!) Leute, gebe es im QL nicht. - Was nicht stimmt.
Sie sind jedoch weder sonderlich bekanntgeworden, noch gab es bis dato jemanden, der krank genug gewesen wä, solche Zeug zu kultivieren.
Möglich ist dergleichen aber durchaus auch in QL/QDOS/SMSQ-Rechnern - wobei einmal nicht das SMSQ selbst, obwohl darin wesentliche Kriterien erfüllt sind, als "Virus" gelten soll.
Im QDOS des QL läßt sich dergleichen jedoch weder fest verankern noch dauerhaft verbergen, da es dank umfassender Dokumentation und klarer Strukturen keine "geheimen", irgendwelchen bornierten "Systemprogrammierern" vorbehaltene Bereiche gibt - Gerade gegenteilige Privilegien wurden von "Entwicklern" bezüglich des SMSQ reklamiert, darum die o.g. Einschätzung.
Womit Computerviren in wirklichen QDOS-Rechnern kaum Erfolgsausaussichten haben.
Weiter ist öffentlich dazu nichts anzumerken. Wer aber in irgendeinem Programm solch einen Erguß mentaler Impotenz vermutet und Hilfe sucht, mag sich per e-mail an mich wenden, jedoch nur, wenn es sich nicht um besagte in sich selbst schon verseuchte Umgebung handelt (SQ).

* A *

ARC : MGG, MINERVA
Bei MGG um Null und Pi, bei Minerva 'nur' um Pi, wird in den Bereichen +/- 11° nichts gezeichnet, an einer Stelle eine unregelmäßige gekrümmte Linie außer Zusammenhang. Abhilfe nur durch richtige Code-Procedur. Eine Lösung ist hilfsweise mit der Turtle-Graphik bei sehr erhöhter Laufzeit möglich.

ATAN u.a. transzendente Funktionen : JS
Der Speicher kann durch einen Adressierungsfehler im ROM verdorben werden, Schäden aller Art sind möglich.
Der Fehler läßt sich sehr leicht korrigieren, wenn der Systemcode im RAM liegt (z.B GoldCard): Man ersetzt das Byte $90 auf Adresse $4356 durch $98.

Arrays : SQ
1. Die je nach ROM-Version meist schneller verarbeitete Notation der Art

style="text-align: center"
zahl = dimvariable(d1)(d2)(..)(dn)
anstelle der Form
zahl = dimvariable(d1,d2, ... ,dn)
fehlt, rsp. führt zu gänzlich abwegigen Ergebnisssen.
2. SQ :
Ermittlung der wirklichen Länge eines String in einem Array aus dem Wert auf Index Null scheitert.

Denn:
Im Gegensatz zu mitunter abgesondertem "Wissen" ist der letzte Index eines DIMensionierten String in der Tat dessen Länge, und dies keineswegs als "bug" oder "undocumented feature", da genau so im Handbuch - "User Guide" - beschrieben (Keywords, DIM).


 

* B *

Basic
Man kann die Priorität des Interpreters auf 0 setzen. Damit schaltet man dann aber die Tastatur mit aus.

Basic-Definitionen Minerva
Überdefinierte Basic-Befehle werden, wenn sie entfernt wurden, oder nach NEW rsp LOAD, weiter mit der ehemaligen Zeilennummer als Programm-Definitionen aufgerufen.

BEEP :
alle Sinclair ROMs, MINERVA anscheinend nicht mehr.
1. Wird während der Datenübergabe zum IPC ein Job eingerichtet oder entfernt, kann der QL steckenbleiben. Der Basicbereich wird dabei verschoben und die Parameter geraten durcheinander. Abhilfe mit Processor-Code im Supervisor-Mode oder durch Compilieren.
2. GoldCard:
BEEP 0,22 piept in anderer Tonlage, als BEEP 30000,22 was an daran liegen könnte, daß bei den 680xx-Processoren genaue Laufzeitberechnungen für Warteschleifen nahezu unmöglich sind.

BLOCK : bis MGG
Einen BLOCK von 512 Pixel Breite zu zeichnen ist nicht möglich. Zwei Blöcke ersatzweise oder CLS führen zum Ziel.

Break : bis MGG
1. In einer einzeiligen recursiven Procedur erfolgt keine Reaktion auf Unterbrechung aus der Tastatur (Break). Es hilft nur, sie auf mindestens 2 Zeilen zu verteilen.
2. Wenn man nach BREAK in einer Procedur EDIT Zeilennummer eingibt, dann gibt es meist die Meldung 'Not implemented' und eine falsche Zeile erscheint. Keinesfalls diese Zeile editieren, man kann damit das Programm zerstören. CLEAR oder erneut BREAK und EDIT Zeilennummer hilft.

BV.CHRIX :
MINERVA:
D0 mit -1 signalisiert keinen Fehler. Dieser Wert wird zurückgegeben, wenn keine Speicheraktion erforderlich war.
SQ:
keinerlei Fehlerhinweise, außer u.U. Systemzusammenbruch.
D0 nach BV.CHRIX ist zwar nicht spezifiziert, MGx gibt jedoch die übliche Codierung zurück., ebenso MINERVA - was bis zum Erscheinen der SQs ja durchaus vorteilhaft war: Man muß nicht abstürzen! Es sind nach Fehlermeldung auch alternative Aktionen denkbar!
 

* C *

CLEAR :
1. MGG, MINERVA
Erscheint nach CLEAR ein "Syntax Error", kann jede weitere Operation dazu führen, daß der QL nicht mehr arbeitet. Ein Basic-Job bei MINERVA ist dann oft nicht mehr zu retten. Ein sicheres Verfahren ist sonst, erneut CLEAR einzugeben. Damit sind auch Folgeerscheinungen, die womöglich irgendwo das System durcheinandergebracht haben können, beseitigt.
2. Minerva-Basic-Jobs :
CLEAR wirkt nicht, solange gerade ein anderer Basic-Job aktiv ist. Während das Programm sonst alle Befehle weiter abarbeitet, erfolgt die damit verbundene Speicherfreigabe erst, wenn der betreffende Basic-Job (mit CTR/C oder einer 'pick'-Funktion) freigegeben ist.

CLS : alle Sinclair ROMs
Es gibt abwegige Nutzungsmöglichkeiten, aber auch böse Fallen, mit einigen undokumentierten Parametern (s. auch PAN und SCROLL):

    8 STRIP 0
    9 INK 0
  10 FLASH 1
  11 UNDER 1
  12 OVER 0
  16 POINT 0,0
  20 SCALE PI * 10^-618 - Damit keinesfalls die Graphik benutzen.
  97 PAUSE
  98 INPUT ohne Parameter-RETurn
  99, 100 dto mit Müll im Bild
105  nicht vorhander SD.EXTOP-Aufruf ohne Wiederkehr.
108 3 Pixel gestreifte BORDER
114 Cursor auf nächste Zeile
115 Cursor ein Zeichen nach links
116 dto. rechts
120 SCROLL -10
121 dto., oberes Teilfenster
122 dto., unteres
123 PAN ziemlich weit nach rechts
CURSOR : JS
CURSOR a,b,c,d funktioniert nur im Kanal 1, in anderen Kanälen nur mit 2 Parametern.
Der Fehler kann leicht korrigiert werden, wenn der Systemcode im RAM liegt (z.B. GoldCard): Das Byte $67 auf Adresse $66CC ist durch $6A zu ersetzen.
MINERVA :
Gegenüber MGG, JS, MF ist bei Bezug auf das Graphiksystem der Cursor um 4 Pixel nach rechts verschoben. Dazu kommt ein weiterer Versatz unregelmäßig von bis zu zwei Pixeln schwer vorherbestimmbar abhängig von der Position im Bild.
 

* D *

DATA bis JS
Wenn in einer DATA-Zeile eine Angabe mit Klammer "(" beginnt, wird der Rest der Zeile ignoriert.

DEFine
1. allgemein
Sprünge an das Ende des Programms dauern länger als an den Anfang: Mit dem Aufruf beginnt die Suche nach niedrigen Zeilennummern hin. Es ist sinnvoll, wichtige oft benutzte Proceduren in die Nähe vor den Aufruf zu stellen.
2. Aufruf oder Editierversuch einer gelöschten Procedur oder Funktion am Ende eines Programms kann zum Steckenbleiben führen. An Schluß sollte stets eine Zeile stehenbleiben.
3. SQ :
Solange nicht alle DEFinitionen fehlerfrei abgeschlossen sind, ist kein auch schon fertiger und korrekter Teil des betr. Programms ausführbar. Es hilft beim Austesten z.B. nur der provisorische Abschluß aller DEFinitionen und(!) Strukturen.
4. SQ, seit 2.89
Zeilen wie
    DEFine PROCedure XX : END DEFine
oder
    DEFine PROCedure XX : LOCal e,f,g
    ...
stehen zwar am Rande des für das Basic zulässigen. Sie können keinesfalls irgendwelchen Schaden anrichten, und wurden von allen QL-Systemen, selbst vom SMSQ/E (wenigstens bis 2.85), fehlerfrei verarbeitet. Solche Zeilen lösen ab SMSQ/E 2.89 nun beim nächsten "END DEFine" die nicht eben geistreiche Meldung aus, daß dieses "END DEFine" dort nicht stehen dürfe, und kein Teil des betroffenen Programms kann ausgeführt werden.

DIV : bis JS
Integer-Zahlen des Basic können zu falschen Resultaten führen. 32768 ist im Zweierkomplement nicht darstellbar: Das nur gesetzte Vorzeichenbit einer binären Zahl wird vielfach (und dennoch ziemlich widersinnig) als "negative Null" interpretiert, oder auch als die imaginäre Einheit. Der QL nimmt sie als -32768 an.
 

* E *

ELSE IF alle QL-Roms, nicht Minerva
Ein gelegentlich eher nützlicher Fehler macht unerwartet und undokumentiert ELSE IF zum Strukturwort, das mit dem Ende der einleitenden IF-Abfrage aufgelöst wird:
IF bedingung "true"-Teil ausführen
ELSE IF alternative : zweiter "true"-Teil
ELSE nicht.erfüllt END IF
Womit zugleich klar wird, warum diese ansich richtige Struktur zu Fehlern führt:
IF bedingung true.teil
ELSE IF alternative : ausführung : END IF : END IF
Es ist dabei nur ein "END IF" anzugeben, oder man schreibt mit Doppelpunkt
ELSE : IF alternative : ausführung : END IF : END IF
Error :
1. alle ROMs
Eine Fehlermeldung geht verloren, wenn sie nach neu geöffnetem Basic-Kanal #1 bei beschäftigtem Kanal #0 auszugeben wäre. Das liegt an der Annahme in den Roms, daß Kanal #1 die Identifizierung $00010001 habe. Der Kanal darf beliebig oft geöffnet und geschlossen werden, wobei er nie wieder dieselbe Nummer erhält. So ist er dann für die Systemmeldungen nicht mehr auffindbar.
2. MINERVA:
Bei Basic Jobs gilt dasselbe. Natürlich kann auch ein Kanal #0, identifiziert mit 0, in einem neuen Job nicht mehr vorhanden sein. So gibt es bei den Meldungen Probleme, die mitunter zum Verlust des Jobs führen.
3. bis JS (MGG ?):
Jedesmal, wenn nach einer Fehlermeldung RUN eingegeben wird, verliert man 16 Bytes Speicherplatz. Selbst NEW gibt sie nicht zurück. Aufruf von EDIT oder Start mit GOTO 1 unmittelbar danach helfen.
4. MGG:
Kommen zwei Fehlermeldungen zurück, und lautet die letzte "Syntax Error", ist unbedingt erst CLEAR vor irgendeiner anderen Aktion einzugeben. Sonst bleibt der QL stecken oder baut Fehler auf, die sich erst später zeigen werden.
5. SQ:
Jede Aktion, selbst einfaches LIST ERNUM, kann zum Verlust der localen Daten und Zustandsinformationen führen. Fortsetzung mit CONTINUE oder RETRY ist dann nicht mehr möglich. Feststellen der Fehlerursche mit Hilfe der Basic-Systemvariablen scheitert daran, daß nur einige davon richtig besetzt werden.
6. SQ:
Fehler durch uninitiierte Variable sind kaum feststellbar, da sie im Gegensatz zu den wirklichen QDOS-Systemen bereits bei Namensnennung mit irgendwelchen Werten eingerichtet werden.

ERR_DF : alle ROMs außer MINERVA
Abfrage von ERR_DF (Drive Full) kann zum Zusammenbruch des Systems führen. TK2 u.a. berichtigt diesen Fehler.

WHEN ERRor
JS : Funktioniert nicht nicht immer.
MGG : Mit TK2 zuverlässig, die Fehlerabfrage muß immer ein END WHEN "sehen".
MINERVA : Heikel in Versionen vor 1.93! Editieren der definierenden Zeile kann die merkwürdigsten Ergebnisse liefern, bis hin zum vollständigen Zusammenbruch des Systems.
SQ : WHEN variable erzeugt Fehlermeldung, oder ist nicht vorhanden, auch Teile von Programmen, die solch eine Zeile enthalten, sind nicht aufrufbar.
 

* F *

FILL : bis MGG
Füllt dieselbe Linie zweimal, wenn man vorher OVER -1 eingegeben hat.

FOR/REPEAT : alle ROMs
Man kann einmal je Zeile die Kurzform von FOR/REPeat- Schleifen verwenden. Verschachtelte Schleifen sind mit END FOR/END REPeat abzuschließen.

FOR : SQ
Rücksprung mit programmiert verändertem Index-Wert scheitert.

FORMAT : alle Systeme mit GoldCard-ROM Version 2.49
Hier zuerst, aber beileibe nicht nur hierbei, können in dieser GC-ROM-Version die übelsten Fehler auftreten. Oft scheint es, als liege ein Defekt an den Floppies vor, oder in deren Verkabelung. Das muß nicht sein. Solche Hardwarefehler sind, auch, wenn Erklärungen von Meister-Weichmännern anders lauten mögen, außerordentlich selten.
Austausch ggf. gegen eine andere Version ist immer ratsam, denn das 2.49-er ROM ist schlichtweg unbrauchbar, eigene Korrekturversuche dürften aussichtslos sein.
 

* G *

GO SUB : QL
wird in einer einzeiligen FOR Schleife als END FOR bewertet.
 

* H *

Hardware : QL
1. Hängenbleiben bei allen Geräten
Bei längerem Betrieb kann es vorkommen, daß der QL den Dienst versagt. Aber nur dann, wenn die Ursache sicher nicht mit irgendwelchen Systemerweiterungen zusammenhängt, sollte man sich die Mühe machen, an die Hardware zu gehen. Oft ist mit solch einer Erweiterung, auch wenn sie sich sonst bewährt haben mag, das gesamte System weit weniger fehlertolerant.
Die Gründe in der Hardware sind nie so recht klar geworden. Es heißt, daß es Probleme mit der Refresh- Steuerung der dynamischen Ram gebe. Dergleichen ist schwer zu analysieren. In {14} wird geraten, die Anschlüsse aller gesockelten Bauteile zu reinigen.
Meist ist nur unzureichende Kühlung des Spannungsreglers die Ursache. Legt man ihn nach Außen, ist das Problem oft schon gelöst. Reinigen der Steckkontakte wird aber immerhin nicht schaden.
2. bis MGG :
Die Tastenkombination CTRL-ALT-7 lähmt den Rechner. Das ist sicher bekannt. Es gibt aber auch Geräte, wo dies mit der 5 oder der 2 geschehen kann. Aus Basic heraus ist keine Abhilfe möglich. Bei direkter Programmierung ist die Trap-Tabelle zu verändern. Dazu SV.TRAPV und MT.TRAPV im Textteil.
 

* I *

IPC : STAT_CMD : alle Sinclair ROMs {QLW 2/89 }
Der Aufruf liefert immer die Nachricht, daß kein MDV- Schreibschutz bestehe. In solchen Fall wird zwar nicht geschrieben, die Hardware sorgt für Sicherheit. Programme erfahren davon erst nach acht vergeblichen Versuchen mit Abbruch wegen "bad or changed medium".

Interrupt-Routinen : MGG (und andere?)
Das Register A5 muß konserviert werden.
 

* K *

KEYROW : s. 'Tastatur'
 

* L *

LBYTES/SBYTES : alle ROMs
Wird ein File mit LBYTES gleich nach dem Sichern geladen, sind womöglich Änderungen nicht aufgezeichnet. Der Geschwindigkeit wegen werden sie aus den Slave-Blocks heraus an ihre Position im File gesetzt. Die Operation wird durch LBYTES unterbrochen. Die Betriebssysteme nutzen nicht die zum sicheren Abschluß eines SAVE-Vorganges vorgesehene Qdos-Trap FS.FLUSH. Auch FS.CHECK könnte Aufschluß geben und entsprechende Schutzmaßnahmen erlauben. Notfalls gibt Warten bis zum Stillstand des Laufwerks Sicherheit, was aber nicht immer programmiert zu überwachen ist ist.

LRESPR/LBYTES+CALL : nur SQ
1. arbeiten innerhalb von Proceduren fehlerhaft, rsp. garnicht.
2. In SBASIC-Jobs geladene Erweiterungen gehen verloren, sobald ein (Basic-)Programm geladen wird, rsp nach jedem Aufruf von NEW.
 

 

* M *

MDV : bis JS
Nach Aufruf von MDV8 arbeitet MDV2 nicht mehr richtig.
alle ROMs :  Solange eines der Laufwerke in Betrieb ist, kann ein neuer FORMAT-Befehl zum Hängebleiben führen.
Gold-Card, LV2: Files werden oftmals nicht oder fehlerhaft gelesen.

MERGE : alle ROMs
Ein File aus direkten Kommandos, also ohne Zeilennummer, ist mit MERGE nur zu laden, wenn es nicht mehr als eine Zeile enthält. Sonst wird u.U. das File nicht mehr geschlossen. Hilfsweise ist das Schließen durch CLOSE_Q% aus IO1 {13} nachträglich möglich, nachdem zuvor mit CH_CHAN$ der richtige Kanal herausgesucht wurde.

MODE :
1. alle ROMs, nicht MINERVA
Durch einen Fehler im Befehl geht beim ersten Aufruf ein Teil von SV.TVMOD verloren. Danach ist nicht mehr feststellbar, in welchem Modus (MONITOR/FS) die Bildausgabe sich befindet. In einer neuen Definition zur Korrektur wäre lediglich noch D2 mit -1 an die Trap zu übergeben.
2. JS, SQ:
Die zugehörige QDOS-Trap verdirbt das Register A4.
 

* N *

NET
1. QL : Der QL soll steckenbleiben können, wenn beim Sender ein noch bestehender Netzwerkkanal auf einen nicht mehr existierenden Kanal des Empfängers geschlossen wird. Die Beschreibung {QLW, 1/90} deutet auf fehlerhafte Verwaltung der Kanaltabellen. Direktes Schließen des QDOS-Kanals hilft. Daß, wie dort vermutet, der Puffertransistor die Ursache birgt, ist darum unwahrscheinlich.
2. Alle Geräte : Es gibt offenbar sehr leicht Fehler durch Ausgleichsströme, wenn die beteiligten Rechner nicht hinreichend niederohmig miteinander verbunden sind, insbes. wenn ihre Stromversorgung an verschiedenen Phasen des Lichtnetzes liegt. Schon bei unterschiedlichen Steckdosen an derselben Phase einer Altbau-Wohnung mit Alu-Leitungen waren Fehler festzustellen. Durch die bei offener Verbindung noch unausgeglichenen Potentiale können dann beim Stecken der Netzwerk-Leitung außerdem auch Hardwareschäden eintreten (s.o., Sendetransistor).
Eine vorher verlegte, üppig bemessene Masse-Leitung zwischen den Geräten hilft.
3. SQ : Die automatische Taktermittlung bei SQ/QXL taugt nichts. Damit konnte (beim Autor) unter keinerlei Umständen je eine ordentliche Verbindung hergestellt werden. Dagegen stets einwandfreie und zuverlässige Funktion nach Konfiguration auf die wirkliche Processortaktung.
4. SQ : In der QXL offene Files können bei der Arbeit daran schwer beschädigt werden, wenn zugleich ein Netzwerktransport im gange ist.
Dieser Fehler wird durch verdorbene Slave-Blöcke verursacht, ein vielfach reproduziertes und belegtes Phänomen, welches von "zuständigen Stellen" jedoch unverdrossen als "nicht nachvollziehbar" abgestritten wurde - kein Wunder, da erklärtermaßen(!) die Prüfung an der QXL unterblieb...

NEW : SQ
Nachgeladene residente Teile gehen den SBASIC-Jobs der SMSQ-Varianten verloren, sowie ein neues Basic-Programm geladen wird, oder wenn NEW eingegeben wurde.
 

* O *

OPEN : MGG
Die zugehörige QDOS-Trap verdirbt das Register D2.
 

* P *

PAN : alle Sinclair ROMs
Wie bei SCROLL und CLS gibt es Abwegiges zu berichten. Hier nur ein paar womöglich braubare Beispiele:
PAN #kanal,anzahl.bytes%,40
    verstellt den Filepointer um "anzahl.bytes%" .
PAN #kanal,115 aktiviert den Cursor in #kanal,
PAN #kanal,116 schaltet ihn wieder ab.
POINT : MGG
Setzt Pixelmuster entsprechend der gerade gültigen INK aus drei Parametern. Abhilfe durch neue Codierung der Procedur (TK2).

Pointer Interface
1. Initialisierung der Primärfenster
Die Routinen des Pointer Interface übernehmen die Speicherverwaltung nach Öffnen eines Primärfensters mit der ersten I/O-Operation. Sollte vorher irgendeine Aktion mit den Fenstern abgelaufen sein, wird deren Speicher durcheinandergeraten. Gewöhnlich ist er danach verloren. Schon irgendein Aufruf, der die Fenstergestalt berührt, schafft aber Abhilfe (z. B. PAPER 0).
2. Speicherorganisation
Die PIF-Versionen vor (ca.) 1.66 weisen u.a. folgende konzeptionelle Fehler auf:
a) Bei dicht belegtem nahezu vollem Speicher führt schon das Wegnehmen eines Jobs zum Systemzusammenbruch, u.U. bei Totalverlust auch aller zu diesem Zeitpunkt offenen Dateien.
b) Gerade Wegnehmen eines Jobs, und damit Verlust wenigstens aller diesbezüglichen Daten, ist aber die einzige Möglichkeit, bei annähernd vollem Speicher andere Programme überhaupt wieder zu erreichen. Das PIF verweigert nämlich seinen Dienst, wenn es die (in solchen Fällen ja auch so überaus wichtigen) Bilddaten nicht mehr zwischenspeichern kann, und ersetzt die Job-Umschaltung durch sinniges Gebrumme.
c) Fehlschlag der erst nach erfolgter Speicherzuweisung durchgeführten Koordinatenprüfung beim Sichern eines Teilfensters wird durch Fehlercode quittiert, nicht aber Freigabe des unbrauchbaren Speicherbereichs, sodaß sich in solchen Fällen der Speicher füllt, ohne daß eine augenfällige Ursache erkennbar würde. Vom aufrufenden Programm aus sind Gegenmaßnahmen nicht möglich, da keine Freigabeadresse übermittelt wird, und selbst der Besitzer-Job des Bereichs ungewiss ist.

Erst nach bis zu mehr als achtjährigen K(r)ämpfen gegen Überheblichkeit und Ignoranz konnte schließlich durch Übermittlung detailierter Änderungsanweisungen eine Korrektur der Berechnungsprocedur für den Speicherbedarf erreicht werden (Details dazu in der PEX-Dokumentation), sowie ordentliche Speicherfreigabe bei Fehlschlag der Teilfenster-Speicherung, wodurch seit Version (ca.) 1.66 immerhin die schädlichsten Fehler allem Anschein nach behoben sind.

PROT_DATE : Gold-Card v2.15+
Nette Einrichtung zur Beruhigung des Anwenders. Schutzwirkung nur beim Aus- und Einschalten, versagt aber bei einem Systemzusammenbruch.
 

* R *

RENUMBER: bis JS, auch manche MINERVA
Kann mit DATA-Zeilen Fehler verursachen, die unmittelbar am Anfang des Programmes stehen. Z.B. erste Zeile REMark hilft.

RI.ATAN - s.o., ATAN
 

* S *

SAVE : SQ/TK
Wenn bei Vorhandensein einer Datei gleichen Namens die Überschreib-Abfrage mit "N" beantwortet wird, bricht die Procedur das betr. Programm gleich ganz ab, und meldet zur großen Überraschung des überforderten(?) Anwenders, daß eine Datei gleichen Namens schon vorhanden sei. Innerhalb Programmen ist SAVE damit im SMSQ nicht mehr zu gebrauchen, sofern nicht eine gesonderte Procedur zum Abfangen dieses Fehlers benutzt wird, wie etwa Q_ERR_ON, oder CATCH_P (in "fio" aus IO2) - die dann aber Erkennung wirklicher Fehler erschwert.
 

SCROLL : alle Sinclair ROMs
Ähnlich CLS kann auch SCROLL undokumentierte Parameter aufnehmen. In einem Falle ist dies ganz vorteilhaft:

SCROLL #kanal,file.position%,42
setzt einen Filepointer auf die 16-Bit-"file.position%", entsprechend FS.POSAB. Relativ setzen läßt er sich z.B. mit PAN, s. dort.

SER :
1. bis MGG
Nach OPEN oder COPY usw. kann ein SER2-Kanal nicht richtig geschlossen werden: CLOSE schließt den Eingang von SER1 und den Ausgang von SER2. Es bleibt nur, den Stecker herauszuziehen {14}.
2. alle ROMs:
Bei schnellem Datentransport auf mehreren Wegen des IPC zugleich können einzelne Zeichen verlorengehen oder durcheinandergeraten. Die Ursache liegt in den Grundstrukturen des IPC. Ohne entscheidende Neuerungen ist Abhilfe nicht möglich. Darum ist solch ein Ansturm zu vermeiden.
3. SQ:
Die Z-Option funktioniert nicht.
4. SQ:
Die Kanalparameter von SER-Kanälen entsprechen nicht der QDOS-Definition (s. Tabellen).
5. SQ (nur E-Versionen):
SER hat nichts mehr mit der RS232-Definition (u.ä.) gemein: Die betr. Kanäle werden eo ipso und unvermeidbar einzeln "dynamisch" gepuffert.
Was anderswo in Form von SER und PRT noch getrennt und vor allem steuerbar zur Verfügung steht, ist hier in weitgehender Unbrauchbarkeit vereint. Sinnfällige Verwendung der SER-Schnittstellen ist außer für Drucker und extrem anspruchslose Peripheriegeräte kaum mehr möglich. Der eigentliche Verwendungszweck programmgesteuerter Kommunikation zwischen beliebigen Stationen über diese per definitionem neutrale(!) Schnittstelle wird extrem behindert.

Vielfältige Versuche, grundlegende Korrekturen zu veranlassen, sind immer wieder am dummen Gewäsch über die Annehmlichkeit einer gepufferten Ausgabe an (antiquierte?) Drucker gescheitert - welche nicht Aufgabe der Schnittstelle ist! Im Gegenteil wurden als Reaktion auf solch ein Ansinnen dann von Sachkenntnis oder Einsicht völlig ungetrübte patzige Belehrungen über "timeout"-Berechnungen veröffentlicht (QL-Today). Weitere Bemühungen dürften also kaum einen Sinn haben, andere Abhilfe gibt es aber kaum, und so wird man sich beim SMSQ/E mit der Unbrauchbarkeit der SER-Schnittstellen für seriöse Anwendungen jenseits der Druckerpufferung abfinden müssen. - Einen Versuch, diesen Mißstand einzudämmen, stellt SIMSER in Gestalt einer für alle QDOS-Systeme tauglichen teilweisen Neuinstallation des SER-Device dar, mehr s. dort.
 

* T *

Tastatur-Eingabe : JS {QLW 6/88}
1. Die Taste CTRL/SHIFT/ESC wird als 160 gelesen, wenn der Feststeller aktiviert wurde, 128 ohne SHIFT. 160 sollte bei CTRL/SHIFT/"2" kommen.
2. alle Sinclair ROMs: Diagonale Cursorsteuerung zusammen mit ALT oder CTRL führt zu mehrdeutigen Ergebnissen bei Maus- oder Keyrow-Abfrage.
 

* V *

VARIABLE - Parameter
 JS :
1. Bei mehr als 9 lokalen Variablen in einer Procedur kann alles Mögliche passieren. Mitunter werden die Variablennamen durch PRINT ersetzt.
2. Man kann in einem Select-Statement nur den jeweils letzen Parameter der Übergabeliste einer Procedur/Funktion verwenden.
3. MINERVA:
Der Typ unbenutzter Übergabeparameter kann in der Parameterliste einer Funktion oder Procedur nicht festgelegt werden. Es wird stets Typ 2 (f.p. Zahl) angenommen.
4. SQ:
"Undefinierte" Variable (und ggf darauf zurückzuführende Programmfehler) sind wegen der nur diesen Systemvarianten eigenen und uneinheitlichen automatischen Initiierung dort kaum ermittelbar (s. auch "Error").

Fließkommadarstellung bei Werten um +/- 2^32 : JS, MGG
Kettenrechnungen der Art 2^32+2-2^32 führen zu falschen Ergebnissen, die nicht nur durch die definierte Rechengenauigkeit zu erklären sind. Das Resultat Null muß man hinnehmen, nicht aber 4 als Ergebnis obigen Beispiels.
-2^32 wird als -(2^32) ausgerechnet.
MINERVA:
-2^32 = (-2)^32 und 2^32-2^32+2 = 2. Aber 2^32+2-2^32 = 0.

String : bis JS
1. Das direkte String-Slicing gibt seinen Speicherplatz nicht frei. Umspeichern vermeidet das: b$=a$(3 to 6):print b$
2. MINERVA: Der erste Parameter ist nur dann entbehrlich, wenn der Teilstring, der ab dem Anfang geschnitten werden soll, nicht einem dimensionierten String entstammt. Dort ist in altbekannter Manier zu verfahren. Bei der Übergabe an eine Procedur haftet dem String der dimensionierte Typ auch dann an, wenn er solchem als Teilstring entnommen wurde.
3. alle ROMs: Stringvergleich arbeitet nur bei Zeichen unter Code 128 und über Code 231 eindwandfrei. Dazwischen nicht immer. Auch wenn Ziffern am Anfang stehen, gibt es Fehler. Es hilft nur geeigneter Code bei direkter Programmierung.
4. bis JS: READ oder INPUT eines String in den Teil eines undimensionierten String bleibt ohne Erfolg. Basic stoppt ohne Fehlermeldung. Abhilfe durch Umspeichern.
5. SQ : s.o., "Arrays"

VER$ : bis MGG
Ist erst in eine Arbeitsvariable zu laden, wenn daran eine Operation durchgeführt werden soll. Sonst kann der QL steckenbleiben (JS: gibt falsche Länge zurück).
 

* W *


WHEN variable : SQ (alle Varianten)
Die WHEN-Behandlung ist im SMSQ lücken- rsp fehlerhaft, im SMSQ/E 2.89 kommt gar die Meldung "In Zeile .. schwerwiegender Fehler im SBASIC-Interpreter", wenn ein Programm eine Zeile mit WHEN variable enthält!
Richtig wäre "...des SBASIC-Interpreters", denn im SQ gibt es die Behandlung von WHEN variable nicht. Diese Lücke kann mit Hilfe des QLiberator umgangen werden, sofern das betr. Programm in einem ordentlichen QDOS/Basic-System compiliert wird.

WINDOW : alle Sinclair ROMs
Der Befehl wertet die letzten vier Parameter aus, dazu ggf. den ersten, wenn das Hash-Zeichen davorsteht. Sind mehr Parameter angegeben worden, bleiben sie ohne Fehlermeldung unbeachtet.

WSTAT : SQ
Funktioniert nicht mit vollständigen Filenamen. Der Aufruf bricht dann mit err.iu (-9) ab.


 


oben : zurück : weiter : inhalt

(count)