|
|
|
|
|
|
|
|
| .. Dumm gelaufen | ||
|
|
||
|
|
|
|
|
|
|
|
|
|
Ersatzzeichen \xhh bei Compilern Es gibt Compiler, die mit der Auswertung des Ersatzzeichens \xhh für zweistellige hexadezimale Zahlen in der Weise Probleme haben, als sie nachfolgende Zeichen, die als Ziffern (dezimal od. hexadezimal) gewertet werden können, mit zu der auszuwertenden zweistelligen Ziffernfolge hinzuschlagen. z.B.: \x1BAffe gemeint als ESC Affe und nicht als 1Bh, AFh, Feh. Tritt diese Fehlinterpretation bei einem Compiler auf, sollte man den String wie folgt unterteilen \x1B Affe. Compiler fügen derart unterteilte Strings zusammen und es entsteht tatsächlich die gewünschte Abfolge 1Bh 41h 66h 66h 65h -> ESC Affe. |
|
|
|
|
|
|
|
Oktale Zahlen sind keine dezimalen Zahlen Dieses Problem trifft in der Regel Systematiker, die es sich wünschen immer gleich lange Zahlen in Listen ihres Quelltextes zu benutzen. Sie füllen dann bei z.B. bei Listen die auch zweistellige Zahlen besitzen, die vorderste Stelle von einstelligen Zahlen mit einer 0 auf. Aus 5 wird dann 05 usw. Nun ist die führende 0 bei C, die Kennzeichnung von oktalen Zahlen, und bei 08 mault der Compiler, denn eine solche Zahl kann es im Oktalsystem nicht geben. Glück gehabt. Die davor liegenden einstelligen Zahlen sind richtig, denn hier entsprechen die oktalen noch den dezimalen Zahlen. Schlecht wird es bei dreistelligen Zahlen. Hier entspricht beispielsweise 046 nicht mehr der dezimalen Zahl 46, denn oktal 046 = dezimal 38. Der Compiler 'mault' in diesem Fall nicht, denn eine oktale Ziffernfolge 046 gibt es ja. Wer nun als Programmierer glaubt, glaubt mit 046 eine Dezimalzahl benannt zu haben, der hat ein schwer auffindbares Problem zur Laufzeit seines Programms. |
|
|
|
|
|
|
|
#define ESC 0x1B; Die im Beispiel genannte Präprozessordirektive #define weist dem Ausdruck ESC den Ausdruck 0x1B; zu. Man kann also im Programm ESC schreiben und der Compiler ersetzt das ESC vor der Wandlung des Programms in Maschinensprache in 0x1B; Wer nun vor hatte, den Ausdruck ESC als merkbaren Ersatz für den ASCIIcode 0x1B der Taste Escape zu benutzen, hat sich ein Problem geschaffen. #define -Direktiven werden nicht mit einem Semikolon abgeschlossen. Dieses ist im obigen Ausdruck Teil es Ersatzliterals. So entwickelt der Compiler die Befehlszeile ... char x = ESC; .. zu .. char x = 0x1B;;
Das ist nicht weiter schlimm, denn das Semikolon ist das Trennzeichen zweier C-Befehle und zwischen zwei unmittelbar folgenden Semikola (;;) steht ein 'leerer' Befehl, was den Compiler nicht behindert. Der Funktionsaufruf .. chrout(ESC); .. wird zu .. chrout(0x1B;);
.. und diesen Ausdruck mag der Compiler nicht. Er wird 'maulen' dass hinter dem 0x1B eine Klammer fehlt, womit er ja recht hat, denn bei der Übergabe von Parametern an eine Funktion haben Semikola nichts zu suchen. Da der Programmierer aber nur die Zeile chrout(ESC) sieht, wird er wahrscheinlich eine ganze Zeit nach der Quelle des Fehlers zu suchen haben. |
|
|
|
|
|
|
|
printf()-Funktionen und ihr Formatierungsstring Der Funktion printf() muss ein Formatierungsstring mitgegeben werden, dem dann beliebig viele Parameter folgen können. Solche Funktionen mit einer Ellipse kann der Compiler nicht auf die Richtigkeit ihres Aufrufs überprüfen. So lautet die zwingend einzuhaltende Anweisung, dass in dem Formatierungsstring immer genau so viele Einfügungsstellen (%u, %d ..) genannt werden müssen, wie in der Folge an Parametern genannt werden. Geschieht dies nicht, ist also die Anzahl der Einfügestellen ungleich der Anzahl der genannten Parameter, so wird der Stack des Programms gestört, was zu einem Absturz des Programms zur Laufzeit führen kann / wird.
Schlecht ist es für den Programmierer, wenn er die Zeichen für die Einfügestellen nicht mehr genau erinnert und beispielsweise %h verwendet, weil er eine Hexadezimalzahl ausgeben will. In diesem Fall ist die Gleichheit zwischen Einfügestellen und folgenden Parametern mit Sicherheit nicht gegeben, denn %h gibt es nicht als Bezeichnung einer Einfügestelle. Mit %% kann man übrigens das Prozentzeichen auf dem Bildschirm ausgeben. |
|
|
|
|
|
|
|
|
|
|
|
char x =5; (Was wollte ich hiermit sagen?) |
|
|
|
Strings von Browsern können nur ein weiches Freizeichen enthalten. |
|
|
|
|
|
.de