p. 1 Vakgroep Informatietechnologie Scanf voorbeeld #include int main(void) { int i=-1,j=-1,k=-1,l=-1; int b; b=scanf("%d %d %d %d",&i,&j,&k,&l); printf("res=%d ",b); printf("i=%d j=%d k=%d l=%d\n", i,j,k,l); return 0; } > res=4 i=5 j=6 k=7 l=8 5 6 * 9 -> res=2 i=5 j=6 k=-1 l= > res=4 i=5 j=6 k=7 l=8 (zie verder blz )
p. 2 Vakgroep Informatietechnologie Variabele argumenten / Macro Cfr boek blz 435 Macro voorbeeld: /* stringization.c */ #include #define PRINTVAR(t,x)printf(" "#x " = %" #t" ",x) int main(void) { double d=1.0; char c='a'; d+=c; PRINTVAR(f,d); PRINTVAR(c,c); return 0; } Output: d = c = a Boek blz. 64: string-constanten die door wit ruimte van elkaar gescheiden zijn, worden door de compiler tot een enkele string aaneengeregen.
p. 3 Vakgroep Informatietechnologie Prefix / Postfix operator n = ++a + a++; (gcc: a=10 -> n=22, a=12) n = a++ + a++; (gcc: a=10 -> n=20, a=12) Machine afhankelijk (mogelijks compiler warning) (cfr boek blz 79, oef 15) Sterk afgeraden om tweemaal prefix/ postfix operator op dezelfde variable te gebruiken!
p. 4 Deel I: Programmeertaal C 5. Programma Modulariteit en Preprocessor Prof.Dr.Ir. Filip De Turck
p. 5 Vakgroep Informatietechnologie Typisch C-bestand #include #definePI void einde(void); int main(void) { double pi_2; pi_2=PI*PI; printf("Het kwadraat van pi is %lf\n",pi_2); einde(); return 0; } void einde(void) { printf("Einde programma...\n"); } Preprocessor instructies Globale declaraties Module “main” Module “einde”
p. 6 Vakgroep Informatietechnologie Typisch C-bestand Preprocessor instructies Globale declaraties Module “main” Module A Module B Module... opdrachten Declaratie Assignatie Functie-oproep Controle Lege opdracht
p. 7 Vakgroep Informatietechnologie C-programma C-bestand module 1 module 2 module 3... C-bestand module 1 module 2 module 3... C-bestand module 1 module 2 module 3... linker modules kunnen naar elkaar verwijzen module-namen uniek ! slechts 1 module main() per executable !
p. 8 Vakgroep Informatietechnologie Header files bestand1.c module 1 module 2 module 3 ... bestand2.c module 1 module 2 module 3 ... Probleem: Bij compilatie bestand1.c moet nagekeken worden of oproep geldig is! correct aantal argumenten correct type argumenten correct return type oproep Slechte oplossing : globale declaratie letterlijk in bestand1.c opnemen (waarom slecht?)
p. 9 Vakgroep Informatietechnologie C oplossing: header files bestand1.c module 1 module 2 module 3 ... bestand2.c module 1 module 2 module 3 ... oproep bestand2.h “black box” beschrijving extern toegankelijke modules #include “bestand2.h”
p. 10 Vakgroep Informatietechnologie Header file & library i2c.h... /* i2ctimer.c */ int time_cmd(COMMAND_PARAMS *cmdbuff); void rst_timer_isr(void); void timer_init (void); void prnt_time(void); void asctime(void); i2c.o _time_cmd _rst_timer_isr _timer_init _prnt_time _asctime main.c... #include int main(void) {… rst_timer_isr(); …} Compile Link i2c executable !
p. 11 Vakgroep Informatietechnologie C-taal systeem Standaard C-header bestanden Gecompileerde C-bibliotheken Eigen C-bestanden Eigen header-bestanden # include # include “eigen.h”... C-systeem Beschikbaar op het systeem
p. 12 Vakgroep Informatietechnologie Modules in C C-bestand module 1 module 2 module 3 ... C-bestand module 1 module 2 module 3 ... C-bestand module 1 module 2 module 3 ... gestructureerd paradigma basisbouwsteen = functie modulariteit op hoger niveau (niet opgelegd in C) basisbouwsteen = compilatie-eenheid C++, Java: basisbouwsteen = klasse Compilatie-eenheid
p. 13 Vakgroep Informatietechnologie Naamgeving bestanden Windows-familieUNIX-familie Bronbestand*.c*.c Objectbestand*.obj*.o Bibliotheekbestand*.lib*.a Uitvoerbaar bestand*.exea.out
p. 14 Vakgroep Informatietechnologie De C preprocessor Conditionele compiliatie Voorgedefinieerde macro’s Assert macro Implementatie van modulariteit: include files TEST.h TEST.c PreprocessorCompiler TEST.o
p. 15 Vakgroep Informatietechnologie De C preprocessor: conditionele compilatie Doel : portabiliteit faciliteit tijdens ontwikkeling #if #ifdef #ifndef … #endif gecompileerd indien !=0 gedefinieerd niet gedefinieerd verwante directieven: #else en #elif
p. 16 Vakgroep Informatietechnologie Conditionele compilatie: sleutelwoorden #ifdef logische operatoren &&,|| en ! toegelaten #if defined(HP)&&(defined(DEBUG)||defined(TEST)) printf(“Voorlopige versie voor HP”); #endif #if defined #if defined( ) #undef
p. 17 Vakgroep Informatietechnologie Conditionele compilatie: portabiliteit Portabiliteit #define MAC #include … #ifdef MAC #include #elif defined SUN #include #else #include #endif header1.h
p. 18 Vakgroep Informatietechnologie Conditionele compilatie Ontwikkeling #define DEBUG … #ifdef DEBUG printf(“a= %d”,a); #endif …
p. 19 Vakgroep Informatietechnologie C preprocessor: voorgedefinieerde macro’s __DATE__ string met de datum __FILE__ string met de filename __LINE__ integer huidige lijnnummer __STDC__ ANSI C (1) of niet (!=1) __TIME__ string met de tijd #line wijzigt de waarde van __LINE__ en __FILE__ Blz
p. 20 Vakgroep Informatietechnologie Voorgedefinieerde macro’s: voorbeeld #include #define VERSION "Release 3.0" #define DEBUG void main() { short volatile timer; printf(" Release information: %s \n %s \n", VERSION, __FILE__ ); printf(" Modification on %s at %s \n", __DATE__, __TIME__); #ifdef DEBUG printf("DEBUG> at line %d: value of local timer : %d \n\n", __LINE__, timer); #endif }
p. 21 Vakgroep Informatietechnologie Uitvoering voorgedefinieerde macro’s Release information: Release 3.0 C:\Courses\Examples\Predefined_macros.c Modification on Oktober at 15:37:03 DEBUG> at line 15: value of local timer : Press any key to continue
p. 22 Vakgroep Informatietechnologie De C preprocessor: Assert macro Assert Biedt de mogelijkheid om een runtime check op een expressie uit te voeren. Als de assert() faalt: abort() wordt opgeroepen. printf(”Integer input range in [0;10]: \n"); scanf("%d", &input); assert(input > 0 && input <10); Blz
p. 23 Vakgroep Informatietechnologie Uitvoering assert() Integer input range in [0,10]: 88 Assertion failed: input > 0 && input <10, file C:\Courses\Predefined_macros.c, line 19 Press any key to continue
p. 24 Vakgroep Informatietechnologie Compile time checks: #error #ifdef MOTOROLA #error ERROR: Only Mac or Win32 targets supported! #endif Compiling... Predefined_macros.cpp C:\Courses\Examples\Predefined_macros.c (10) : fatal error C1189: #error : ERROR: Only Mac or Win32 targets supported! Error executing cl.exe.