Arexx RP6 V2 Build your own robot kit RP6 V2 Manuale Utente

Codici prodotto
RP6 V2
Pagina di 141
RP6 ROBOT SYSTEM -  4. Programmierung des RP6
4.4.11. C-Präprozessor
Den C Präprozessor wollen wir auch noch kurz ansprechen. Wir haben diesen bereits 
oben verwendet – nämlich bei 
#include "RP6RobotBaseLib.h"
Dieser Befehl wird noch vor dem eigentlichen Übersetzen durch den GCC vom Präpro-
zessor ausgewertet. Mit 
#include "Datei" 
wird der Inhalt der angegebenen Datei an 
dieser Stelle eingefügt. Im Falle unseres Beispielprogramms ist das die Datei RP6Ba-
seLibrary.h. Diese enthält Definitionen der in der RP6Library enthaltenen Funktionen. 
Das muss so gemacht werden damit der Compiler diese Funktionen auch findet und 
richtig zuordnen kann.
Aber das ist natürlich noch nicht alles was man mit dem Präprozessor machen kann. 
Man kann auch Konstanten (also feste nicht veränderbare Werte) definieren: 
#define DAS_IST_EINE_KONSTANTE 123
Das würde die Konstante: 
„DAS_IST_EINE_KONSTANTE“
  mit dem Wert „123“ definieren. 
Der Präprozessor ersetzt einfach jedes Vorkommen dieser Konstanten durch den Wert 
(eigentlich ist es Textersatz).  Also würde z.B. hier:
writeInteger(DAS_IST_EINE_KONSTANTE,DEC);
das 
„DAS_IST_EINE_KONSTANTE“ 
durch „123“ ersetzt und wäre somit identisch zu:
writeInteger(123,DEC);
 
(übrigens ist auch das „DEC“ von writeInteger nur eine so definierte Konstante – hier 
mit dem Wert 10 – für das dezimale Zahlensystem.)
Auch einfache If-Bedingungen kennt der Präprozessor:
1  
2  
3  
4
5
6
7
8
9    
#define DEBUG
void
 someFunction(
void
)
{
      
// Mach irgendwas
      #ifdef DEBUG
         
writeString_P(
"someFunction wurde ausgeführt!"
);
#endif
}
Der Text würde hier nur ausgegeben wenn DEBUG definiert wurde (es muss kein Wert 
zugewiesen werden – einfach nur definieren). Nützlich um z.B. diverse Ausgaben die 
man nur für die Fehlersuche braucht nur bei Bedarf zu aktivieren. Wenn DEBUG im 
obigen Beispiel nicht definiert wäre, würde der Präprozessor den Inhalt von Zeile 7 gar 
nicht an den Compiler weiterleiten. 
In der RP6Library benötigen wir oft auch Makros – diese werden ebenfalls per #define 
definiert, man kann ihnen aber Parameter übergeben, ähnlich wie bei Funktionen. 
z.B. so:
#define setStopwatch1(VALUE) stopwatches.watch1 = (VALUE)
Das lässt sich dann wie eine normale Funktion aufrufen ( setStopwatch1(100); ).
Eine wichtige Sache ist noch, dass man normalerweise hinter Präprozessor Definitio-
nen kein Semikolon schreibt! 
- 78 -