| Zeile 69: | Zeile 69: | ||
Es kann auch durchaus vorkommen das ein Sektor der Diskette, die zu zum Testen verwendest, defekt ist. Dieser Fehler ist besonders dann schwer zu finden, wenn man sein System primär auf realer Hardware testet. | Es kann auch durchaus vorkommen das ein Sektor der Diskette, die zu zum Testen verwendest, defekt ist. Dieser Fehler ist besonders dann schwer zu finden, wenn man sein System primär auf realer Hardware testet. | ||
| − | == C- | + | == C-bezogene Fehler == |
=== volatile === | === volatile === | ||
Der Compiler hat die angenehme Eigenschaft den Code um sinnlose Passagen zu erleichtern. Aber manchmal ist das eben nicht hilfreich, vor allem wenn man inline-Assembler verwendet, wird dieser oft wegoptimiert. Dagegen hilft das ''volatile'' Schlüsselwort. Es fordert den Compiler dazu auf, den entsprechenden Code nicht zu optimieren: | Der Compiler hat die angenehme Eigenschaft den Code um sinnlose Passagen zu erleichtern. Aber manchmal ist das eben nicht hilfreich, vor allem wenn man inline-Assembler verwendet, wird dieser oft wegoptimiert. Dagegen hilft das ''volatile'' Schlüsselwort. Es fordert den Compiler dazu auf, den entsprechenden Code nicht zu optimieren: | ||
| Zeile 129: | Zeile 129: | ||
=== Nur ein kleines Zeichen… === | === Nur ein kleines Zeichen… === | ||
| − | |||
| − | |||
Die folgenden Fehler sind eigentlich zu banal für diesen Artikel. Leider passieren sie aber doch zu häufig. Außerdem überliest man sie bei längeren Codepassagen schneller, als einem lieb ist: | Die folgenden Fehler sind eigentlich zu banal für diesen Artikel. Leider passieren sie aber doch zu häufig. Außerdem überliest man sie bei längeren Codepassagen schneller, als einem lieb ist: | ||
| Zeile 162: | Zeile 160: | ||
Diese Operation liefert das gewünschte 0x05. | Diese Operation liefert das gewünschte 0x05. | ||
| − | == C++- | + | == C++-bezogene Fehler == |
=== Designated initializers === | === Designated initializers === | ||
Das Problem hier ist, dass C++ im Gegensatz zu C keine ''designated initializers'' (siehe [http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html GCC Manual] für eine Erklärung) unterstützt, beispielsweise wird der Code | Das Problem hier ist, dass C++ im Gegensatz zu C keine ''designated initializers'' (siehe [http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html GCC Manual] für eine Erklärung) unterstützt, beispielsweise wird der Code | ||
| Zeile 205: | Zeile 203: | ||
</cpp> | </cpp> | ||
| − | == | + | == Linker-bezogene Fehler == |
=== Undefined reference to `funktionsname' === | === Undefined reference to `funktionsname' === | ||
Diese Fehlermeldung wird vom Linker ausgegeben, wenn er kein Symbol mit dem Namen ''funktionsname'' findet. Dies kann vorkommen, wenn | Diese Fehlermeldung wird vom Linker ausgegeben, wenn er kein Symbol mit dem Namen ''funktionsname'' findet. Dies kann vorkommen, wenn | ||
| Zeile 320: | Zeile 318: | ||
} | } | ||
</pre> | </pre> | ||
| + | |||
| + | == Emulator-bezogene Fehler == | ||
| + | === Bochs verabschiedet sich mit einer Endlosschleife der Meldung: "math_abort: MSDOS compatibility FPU exception" === | ||
| + | Dieser Fehler tritt auf, wenn dein Code zur Berechnung von Fleißkommazahlen auf die [[FPU]] zugreift, z.B. bei der Verwendung des Daentyps "float". Wenn du vorher die FPU nicht initialisiert hast, dann tritt in Bochs der obige Fehler auf. Die Behebung des Problems lässt sich mit folgendem einfachen Assembler-Befehl beheben, den du nur vor der Verwwendung der FPU aufrufen musst: | ||
| + | <asm>finit</asm> | ||
| + | Achtung: Falls mehrere Prozesse die FPU verwenden, musst du die Inhalte der FPU-Register vor dem Task-Switch sichern! | ||