software:diy:basic:tbc
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
software:diy:basic:tbc [13/03/2013 21:03] – Bibliothek dirs ebert | software:diy:basic:tbc [Unbekanntes Datum] (aktuell) – Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
---|---|---|---|
Zeile 12: | Zeile 12: | ||
Inzwischen existiert auch eine deutschsprachige Version des Handbuchs, die eine Übersetzung der englischen Version | Inzwischen existiert auch eine deutschsprachige Version des Handbuchs, die eine Übersetzung der englischen Version | ||
mit einer Reihe von Ergänzungen und erklärenden Anmerkungen darstellt. Sie ist [[http:// | mit einer Reihe von Ergänzungen und erklärenden Anmerkungen darstellt. Sie ist [[http:// | ||
+ | |||
===== Besonderheiten von Tokiwa-Basic ===== | ===== Besonderheiten von Tokiwa-Basic ===== | ||
Zeile 18: | Zeile 19: | ||
Tokiwa-Basic nimmt sich (so der Autor) Standard-Basic als Ausgangspunkt und erweitert es um nützliche Eigenschaften: | Tokiwa-Basic nimmt sich (so der Autor) Standard-Basic als Ausgangspunkt und erweitert es um nützliche Eigenschaften: | ||
* keine Angabe von Zeilennummern notwendig | * keine Angabe von Zeilennummern notwendig | ||
- | * explizit | + | * explizit |
- | * erweiterte Arrays (mir DIMX definierbar) | + | * erweiterte Arrays (mit DIMX definierbar) |
* benutzerdefinierte benannte Unterprogramme und Funktionen mit formalen Parameterlisten | * benutzerdefinierte benannte Unterprogramme und Funktionen mit formalen Parameterlisten | ||
* lokale Variablen in Unterprogrammen und Funktionen | * lokale Variablen in Unterprogrammen und Funktionen | ||
Zeile 152: | Zeile 153: | ||
| | ||
Ein Beispiel für die Verwendung findet sich im schon erwähnten Testprogramm test31.bas. | Ein Beispiel für die Verwendung findet sich im schon erwähnten Testprogramm test31.bas. | ||
+ | |||
Zeile 161: | Zeile 163: | ||
Eine wesentliche Einschränkung ergibt sich allerdings daraus, dass die MERGE-Anweisung keine verschachtelten Bibliotheken zulässt (MERGE darf nicht in einer Bibliothek verwendet werden), was es z.B. unmöglich macht, an zentraler Stelle Konstantendefinitionen zusammenzufassen. Wenn Bibliotheken voneinander abhängen, lässt sich dies nicht im Quellcode ausdrücken - vielmehr muss man es wissen bzw. entsprechend dokumentieren. | Eine wesentliche Einschränkung ergibt sich allerdings daraus, dass die MERGE-Anweisung keine verschachtelten Bibliotheken zulässt (MERGE darf nicht in einer Bibliothek verwendet werden), was es z.B. unmöglich macht, an zentraler Stelle Konstantendefinitionen zusammenzufassen. Wenn Bibliotheken voneinander abhängen, lässt sich dies nicht im Quellcode ausdrücken - vielmehr muss man es wissen bzw. entsprechend dokumentieren. | ||
- | Wenn - wie bei unserem Pofo - der Platz recht knapp ist, kann es außerdem ein Problem darstellen, dass mit dem Einbinden einer Bibliothek deren gesamter Inhalt mit ins Programm aufgenommen wird - auch wen man womöglich nur eine einzige Funktion aufruft. Deshalb kann es in manchen Fällen von Vorteil sein, nur einzelne Abschnitte aus einer Bibliothek direkt | + | Wenn - wie bei unserem Pofo - der Platz recht knapp ist, kann es außerdem ein Problem darstellen, dass mit dem Einbinden einer Bibliothek deren gesamter Inhalt mit ins Programm aufgenommen wird - auch wenn man womöglich nur eine einzige Funktion aufruft. Deshalb kann es in manchen Fällen von Vorteil sein, nur einzelne Abschnitte aus einer Bibliothek direkt |
Nachfolgend wird - ohne Anspruch auf Vollständigkeit - der Inhalt der einzelnen Bibliotheken als Kurzreferenz dargestellt. Diese Referenz soll bei der Verwendung helfen, ist aber keine umfassende Dokumentation. Es empfiehlt sich also in jedem Fall, auch die Kommentare in den Bibliotheken selbst und ggf. deren Quellen zu lesen. | Nachfolgend wird - ohne Anspruch auf Vollständigkeit - der Inhalt der einzelnen Bibliotheken als Kurzreferenz dargestellt. Diese Referenz soll bei der Verwendung helfen, ist aber keine umfassende Dokumentation. Es empfiehlt sich also in jedem Fall, auch die Kommentare in den Bibliotheken selbst und ggf. deren Quellen zu lesen. | ||
- | Weil bei Tokiwa-Basic benutzerdefinierte Funktionen, die einen Integer-Wert zurückliefern | + | Weil bei Tokiwa-Basic benutzerdefinierte Funktionen, die einen Integer-Wert zurückliefern, über das Schlüsselwort SUBROUTINE beschrieben werden, ist die Unterscheidung zwischen Unterprogrammen und Funktionen etwas verwirrend. Nachfolgend wird die Unterscheidung so vorgenommen, |
==== Bibliothek CONTIME.LIB ==== | ==== Bibliothek CONTIME.LIB ==== | ||
Zeile 202: | Zeile 204: | ||
Nach dem Aufruf steht die Uhrzeit in der Variablen time$.\\ | Nach dem Aufruf steht die Uhrzeit in der Variablen time$.\\ | ||
- | **Achtung: | + | **Achtung: |
=== date === | === date === | ||
Zeile 212: | Zeile 214: | ||
Nach dem Aufruf steht das Datum in der Variablen date$.\\ | Nach dem Aufruf steht das Datum in der Variablen date$.\\ | ||
- | **Achtung: | + | **Achtung: |
Zeile 219: | Zeile 221: | ||
Diese Bibliothek stellt keine Funktionen im eigentlichen Sinne bereit. Ihre Aufgabe besteht darin, den vom aktuellen Programm belegten Speicher auf die tatsächlich benötigte Größe zu beschränken, | Diese Bibliothek stellt keine Funktionen im eigentlichen Sinne bereit. Ihre Aufgabe besteht darin, den vom aktuellen Programm belegten Speicher auf die tatsächlich benötigte Größe zu beschränken, | ||
- | Dazu muss MSHRINK.LTB hinter dem letzten mit '' | + | Dazu muss MSHRINK.LTB hinter dem letzten mit '' |
Mit dem Einbinden von MSHRINK.LTB sind außerdem folgende globale Variablen definiert: | Mit dem Einbinden von MSHRINK.LTB sind außerdem folgende globale Variablen definiert: | ||
Zeile 323: | Zeile 325: | ||
* Der Ergebnispuffer (adressiert durch resloc) muss eine String-Variable im Datensegment sein, deren Adresse sich mit Hilfe der LOC-Funktion bestimmen lässt. | * Der Ergebnispuffer (adressiert durch resloc) muss eine String-Variable im Datensegment sein, deren Adresse sich mit Hilfe der LOC-Funktion bestimmen lässt. | ||
* Der Rückgabewert kann direkt an die '' | * Der Rückgabewert kann direkt an die '' | ||
+ | |||
Zeile 339: | Zeile 342: | ||
Hinweise: | Hinweise: | ||
* Sowohl der Zielpuffer als auch die Datenquelle müssen vollständig im Datensegment liegen. | * Sowohl der Zielpuffer als auch die Datenquelle müssen vollständig im Datensegment liegen. | ||
- | * Der Zielpuffer | + | * Der Zielpuffer |
* Ein Überlappen der Bereiche von Quelle und Zielpuffer ist zulässig, wenn die Zieladresse unterhalb der Quelladresse liegt - nicht umgekehrt! | * Ein Überlappen der Bereiche von Quelle und Zielpuffer ist zulässig, wenn die Zieladresse unterhalb der Quelladresse liegt - nicht umgekehrt! | ||
* Das '' | * Das '' | ||
* Achtung: Es wird keine Überprüfung auf Offset-Überlauf durchgeführt! | * Achtung: Es wird keine Überprüfung auf Offset-Überlauf durchgeführt! | ||
| | ||
+ | |||
+ | |||
=== memCpyFar(odest, | === memCpyFar(odest, | ||
Zeile 358: | Zeile 363: | ||
Hinweise: | Hinweise: | ||
- | * Der Zielpuffer | + | * Der Zielpuffer |
* Ein Überlappen der Bereiche von Quelle und Zielpuffer ist zulässig, wenn die Zieladresse unterhalb der Quelladresse liegt - nicht umgekehrt! | * Ein Überlappen der Bereiche von Quelle und Zielpuffer ist zulässig, wenn die Zieladresse unterhalb der Quelladresse liegt - nicht umgekehrt! | ||
* Das '' | * Das '' | ||
Zeile 398: | Zeile 403: | ||
* Bei einem negativen Wert von '' | * Bei einem negativen Wert von '' | ||
* Das Löschen erfolgt "in place", | * Das Löschen erfolgt "in place", | ||
+ | |||
=== strDeleteChr(str, | === strDeleteChr(str, | ||
Zeile 407: | Zeile 413: | ||
* chr: Zeichencode (integer) des Zeichens, das gelöscht werden soll | * chr: Zeichencode (integer) des Zeichens, das gelöscht werden soll | ||
* pos: Start-Indexposition des Bereichs, in dem das Zeichen gelöscht werden soll | * pos: Start-Indexposition des Bereichs, in dem das Zeichen gelöscht werden soll | ||
- | * length: Maximallänge des Bereichs, in dem das zeichen | + | * length: Maximallänge des Bereichs, in dem das Zeichen |
Rückgabewert: | Rückgabewert: | ||
Hinweise: | Hinweise: | ||
- | * Bei einem negativen Wert von '' | + | * Bei einem negativen Wert von '' |
* Das Löschen erfolgt "in place", | * Das Löschen erfolgt "in place", | ||
Zeile 429: | Zeile 435: | ||
* Die Adresse der Ziel-Zeichenkette (Argument '' | * Die Adresse der Ziel-Zeichenkette (Argument '' | ||
* Wenn der Wert von '' | * Wenn der Wert von '' | ||
+ | |||
=== strLen(str) === | === strLen(str) === | ||
Zeile 438: | Zeile 445: | ||
Rückgabewert: | Rückgabewert: | ||
- | Hinweis: Die Funktion verhält sich wie die Standardfunktion LEN, akzeptiert jedoch als Argument | + | Hinweis: Die Funktion verhält sich wie die Standardfunktion LEN, akzeptiert jedoch als Argument statt einer Stringvariablen oder -konstanten auch einen Integer-Wert, |
=== strLower(str) === | === strLower(str) === | ||
Zeile 488: | Zeile 495: | ||
Rückgabewert: | Rückgabewert: | ||
+ | |||
=== strTok(str, | === strTok(str, | ||
Die Funktion erlaubt das schrittweise Zerlegen einer Zeichenkette in Token. | Die Funktion erlaubt das schrittweise Zerlegen einer Zeichenkette in Token. | ||
- | Dazu wird die Zeichenkette nach dem ersten Vorkommen eines Trennzeichens durchsucht. Enthält sie ein Trennzeichen, | + | Dazu wird die Zeichenkette nach dem ersten Vorkommen eines Trennzeichens durchsucht. Enthält sie ein Trennzeichen, |
die ganze Zeichenkette (als einzelnes Token gespeichert. | die ganze Zeichenkette (als einzelnes Token gespeichert. | ||
Argumente: | Argumente: | ||
Zeile 505: | Zeile 513: | ||
Hinweise: | Hinweise: | ||
* Der Ergebnispuffer (adressiert durch resloc) muss eine String-Variable im Datensegment sein. | * Der Ergebnispuffer (adressiert durch resloc) muss eine String-Variable im Datensegment sein. | ||
- | * Wenn der Rückgabewert der Funktion nicht 0 ist, so kann dieser Wert als Argument str für einen nachfolgenden Aufruf der Funktion verwendet werden um ein weiters Token abzuspalten. | + | * Wenn der Rückgabewert der Funktion nicht 0 ist, so kann dieser Wert als Argument str für einen nachfolgenden Aufruf der Funktion verwendet werden, um ein weiters Token abzuspalten. |
Beispiel: | Beispiel: | ||
Zeile 644: | Zeile 652: | ||
* Das aufrufende Programm ist dafür verantwortlich, | * Das aufrufende Programm ist dafür verantwortlich, | ||
* Die Funktion schließt die Datei nach Ausführung nicht, sondern verschiebt lediglich deren internen Datenzeiger um die Anzahl der gelesenen Bytes. Sie kann also mehrfach hintereinander aufgerufen werden, um den Inhalt einer Datei stückweise zu lesen. Das Dateiende ist erreicht (die Datei vollständig gelesen), wenn der Rückgabewert kleiner als '' | * Die Funktion schließt die Datei nach Ausführung nicht, sondern verschiebt lediglich deren internen Datenzeiger um die Anzahl der gelesenen Bytes. Sie kann also mehrfach hintereinander aufgerufen werden, um den Inhalt einer Datei stückweise zu lesen. Das Dateiende ist erreicht (die Datei vollständig gelesen), wenn der Rückgabewert kleiner als '' | ||
+ | |||
=== fwrite_f(fhandle, | === fwrite_f(fhandle, | ||
Zeile 658: | Zeile 667: | ||
Hinweise: | Hinweise: | ||
- | * '' | + | * '' |
* Auch der Rückgabewert ist streng genommen vorzeichenlos. Bei Blockgrößen über 32 KBytes sollte er deshalb nicht als negativer Wert fehlinterpretiert werden. | * Auch der Rückgabewert ist streng genommen vorzeichenlos. Bei Blockgrößen über 32 KBytes sollte er deshalb nicht als negativer Wert fehlinterpretiert werden. | ||
* Die Funktion schließt die Datei nach Ausführung nicht, sondern verschiebt lediglich deren internen Datenzeiger um die Anzahl der geschriebenen Bytes. Sie kann also mehrfach hintereinander aufgerufen werden, um den Inhalt einer Datei stückweise zu schreiben. | * Die Funktion schließt die Datei nach Ausführung nicht, sondern verschiebt lediglich deren internen Datenzeiger um die Anzahl der geschriebenen Bytes. Sie kann also mehrfach hintereinander aufgerufen werden, um den Inhalt einer Datei stückweise zu schreiben. | ||
+ | |||
=== fwrite(fhandle, | === fwrite(fhandle, | ||
Zeile 674: | Zeile 684: | ||
Hinweise: | Hinweise: | ||
- | * '' | + | * '' |
* Auch der Rückgabewert ist streng genommen vorzeichenlos. Bei Blockgrößen über 32 KBytes sollte er deshalb nicht als negativer Wert fehlinterpretiert werden. | * Auch der Rückgabewert ist streng genommen vorzeichenlos. Bei Blockgrößen über 32 KBytes sollte er deshalb nicht als negativer Wert fehlinterpretiert werden. | ||
* Die Funktion schließt die Datei nach Ausführung nicht, sondern verschiebt lediglich deren internen Datenzeiger um die Anzahl der geschriebenen Bytes. Sie kann also mehrfach hintereinander aufgerufen werden, um den Inhalt einer Datei stückweise zu schreiben. | * Die Funktion schließt die Datei nach Ausführung nicht, sondern verschiebt lediglich deren internen Datenzeiger um die Anzahl der geschriebenen Bytes. Sie kann also mehrfach hintereinander aufgerufen werden, um den Inhalt einer Datei stückweise zu schreiben. | ||
+ | |||
=== fseek(fhandle, | === fseek(fhandle, | ||
Zeile 696: | Zeile 707: | ||
* Im Modus '' | * Im Modus '' | ||
* Es erfolgt keine Prüfung, ob die Position über die Dateigrenze hinaus verschoben wird. Bei einer Verschiebung vor den Dateianfang können bei nachfolgenden Schreibzugriffen Fehler in der Dateistruktur entstehen. Bei einer Verschiebung hinter das Dateiende wird die Datei vergrößert und es entsteht ein Bereich, der mit zufälligem Inhalt gefüllt ist. | * Es erfolgt keine Prüfung, ob die Position über die Dateigrenze hinaus verschoben wird. Bei einer Verschiebung vor den Dateianfang können bei nachfolgenden Schreibzugriffen Fehler in der Dateistruktur entstehen. Bei einer Verschiebung hinter das Dateiende wird die Datei vergrößert und es entsteht ein Bereich, der mit zufälligem Inhalt gefüllt ist. | ||
- | * Wird für '' | + | * Wird '' |
* '' | * '' | ||
* '' | * '' | ||
- | * '' | + | * '' |
* Bei erfolgreicher Ausführung wird die aktuelle Dateiposition in der globalen Variablen '' | * Bei erfolgreicher Ausführung wird die aktuelle Dateiposition in der globalen Variablen '' | ||
Zeile 721: | Zeile 732: | ||
* Die Offset-Wert ist ein vorzeichenbehafteter 32-Bit-Integer. Somit kann man die Positionsverschiebunf theoretisch maximal +/-2^31 betragen. Weil Tokiwa-Basic keinen integralen 32-Bit-Integer kennt, ist eine Aufteilung auf zwei Argumente nötig. | * Die Offset-Wert ist ein vorzeichenbehafteter 32-Bit-Integer. Somit kann man die Positionsverschiebunf theoretisch maximal +/-2^31 betragen. Weil Tokiwa-Basic keinen integralen 32-Bit-Integer kennt, ist eine Aufteilung auf zwei Argumente nötig. | ||
* Bis auf den größeren möglichen Offset entspricht das Verhalten der Funktion dem für '' | * Bis auf den größeren möglichen Offset entspricht das Verhalten der Funktion dem für '' | ||
+ | |||
Zeile 729: | Zeile 741: | ||
Für die Datei-Suchfunktionen wird eine globale Puffervariable '' | Für die Datei-Suchfunktionen wird eine globale Puffervariable '' | ||
- | Außerdem definiert die Bibliothel | + | Außerdem definiert die Bibliothek |
* DOS-Funktionsnummern | * DOS-Funktionsnummern | ||
Zeile 778: | Zeile 790: | ||
**Unterprogramme und Funktionen** | **Unterprogramme und Funktionen** | ||
+ | |||
=== setCurrentDrive(drv) === | === setCurrentDrive(drv) === | ||
Zeile 783: | Zeile 796: | ||
Die Funktion legt das aktive Laufwerk fest. | Die Funktion legt das aktive Laufwerk fest. | ||
- | Argument: Laufwerk, das aktiv gesetzt werden soll (angegeben als Index oder laufwerksbuchstabe) | + | Argument: Laufwerk, das aktiv gesetzt werden soll (angegeben als Index oder Laufwerksbuchstabe) |
Rückgabewert: | Rückgabewert: | ||
Zeile 789: | Zeile 802: | ||
Hinweise: | Hinweise: | ||
* Der Argumenrwert ist eine Zahl (Laufwerksindex, | * Der Argumenrwert ist eine Zahl (Laufwerksindex, | ||
- | * Der Rückgabewert ist eine Zahl, wenn als Argument ein Index (also ein Wert zwischen 0 und 25) angegeben wurde,oder ein Groß- bzw. Kleinbuchstabe, | + | * Der Rückgabewert ist eine Zahl, wenn als Argument ein Index (also ein Wert zwischen 0 und 25) angegeben wurde, oder ein Groß- bzw. Kleinbuchstabe, |
* Der Aufrufer kann den Erfolg der Operation prüfen, indem er den Rückgabewert mit dem übergebenen Argumentwert vergleicht. | * Der Aufrufer kann den Erfolg der Operation prüfen, indem er den Rückgabewert mit dem übergebenen Argumentwert vergleicht. | ||
Zeile 826: | Zeile 839: | ||
* Die Funktion kann (wie der rmdir-Befehl von DOS) nur einzelne Verzeichnisse, | * Die Funktion kann (wie der rmdir-Befehl von DOS) nur einzelne Verzeichnisse, | ||
* Das zu löschende Verzeichnis muss leer sein und darf nicht schreibgeschützt sein. | * Das zu löschende Verzeichnis muss leer sein und darf nicht schreibgeschützt sein. | ||
+ | |||
=== delFile(fpath) === | === delFile(fpath) === | ||
Zeile 831: | Zeile 845: | ||
Die Funktion löscht die angegebene Datei. | Die Funktion löscht die angegebene Datei. | ||
- | Argument: Name der zu löschenden Datei(relativer oder absoluter Pfad) | + | Argument: Name der zu löschenden Datei (relativer oder absoluter Pfad) |
Rückgabewert: | Rückgabewert: | ||
Zeile 838: | Zeile 852: | ||
* Der als Argument übergebene Pfad kann absolut oder relativ zum aktuellen Verzeichnis angegeben werden. | * Der als Argument übergebene Pfad kann absolut oder relativ zum aktuellen Verzeichnis angegeben werden. | ||
* Eine absolute Pfadangebe kann eine Laufwerksangabe enthalten, die nicht mit dem aktuellen (aktiven) Laufwerk übereinstimmen muss. | * Eine absolute Pfadangebe kann eine Laufwerksangabe enthalten, die nicht mit dem aktuellen (aktiven) Laufwerk übereinstimmen muss. | ||
- | * Im Unterschied zum DOS-Befehl del kann nur eine einzelne | + | * Im Unterschied zum DOS-Befehl del kann nur eine einzelne |
* Die zu löschende Datei darf nicht schreibgeschützt und nicht geöffnet sein. | * Die zu löschende Datei darf nicht schreibgeschützt und nicht geöffnet sein. | ||
Zeile 864: | Zeile 878: | ||
* Bei erfolgreicher Ausführung wird der vollständige Pfad des aktuellen Arbeitsverzeichnisses in der Puffervariablen abgelegt. | * Bei erfolgreicher Ausführung wird der vollständige Pfad des aktuellen Arbeitsverzeichnisses in der Puffervariablen abgelegt. | ||
* Als Parameter muss die Adresse (bestimmbar mit der LOC-Funktion) des Puffers angegeben werden. | * Als Parameter muss die Adresse (bestimmbar mit der LOC-Funktion) des Puffers angegeben werden. | ||
+ | |||
=== setDTA(offs, | === setDTA(offs, | ||
Zeile 876: | Zeile 891: | ||
Hinweis:\\ | Hinweis:\\ | ||
Das DTA (Disk Transfer Area) ist ein Pufferbereich, | Das DTA (Disk Transfer Area) ist ein Pufferbereich, | ||
- | von den Suchfunktionen (find first / find next) verwendete | + | von den Suchfunktionen (find first / find next) verwendet |
80H im PSP und teilt sich damit den Speicherbereich mit den auf der Kommandozeile übergebenen Parametern. Das temporäre Verlegen | 80H im PSP und teilt sich damit den Speicherbereich mit den auf der Kommandozeile übergebenen Parametern. Das temporäre Verlegen | ||
dieses Bereichs kann sinnvoll sein, um beim Verwenden der genannten Funktionen die Parameter nicht zu überschreiben.\\ | dieses Bereichs kann sinnvoll sein, um beim Verwenden der genannten Funktionen die Parameter nicht zu überschreiben.\\ | ||
Zeile 949: | Zeile 964: | ||
Im Falle eines Fehlers (z.B. wenn die Datei nicht existiert) ist der Rückgabewert | Im Falle eines Fehlers (z.B. wenn die Datei nicht existiert) ist der Rückgabewert | ||
größer als 255. Der um 256 verminderte Rückgabewert entspricht dann dem Fehlercode. | größer als 255. Der um 256 verminderte Rückgabewert entspricht dann dem Fehlercode. | ||
+ | |||
=== setFileAttr(fname, | === setFileAttr(fname, | ||
Zeile 962: | Zeile 978: | ||
Hinweise: | Hinweise: | ||
* Das Setzen von Attributen ist nicht beliebig möglich. Welche Attribute gesetzt werden können, ist vom Typ des Verzeichniseintrags abhängig. | * Das Setzen von Attributen ist nicht beliebig möglich. Welche Attribute gesetzt werden können, ist vom Typ des Verzeichniseintrags abhängig. | ||
- | * Vorsicht: Es ist mit dieser Funktion grundsätzlich möglich Dateieinträge in Vezeichniseinträge umzuwandeln (und umgekehrt). Ein Anwendungsprogramm sollte dies abfangen um Fehler im Dateisystem zu verhindern. | + | * Vorsicht: Es ist mit dieser Funktion grundsätzlich möglich, Dateieinträge in Vezeichniseinträge umzuwandeln (und umgekehrt). Ein Anwendungsprogramm sollte dies abfangen, um Fehler im Dateisystem zu verhindern. |
software/diy/basic/tbc.1363207258.txt.gz · Zuletzt geändert: 16/02/2024 17:02 (Externe Bearbeitung)