Gebruik van #define.

© Harry Broeders.

Deze pagina is bestemd voor studenten van de THRijswijk groepen EPm en EPv die de module SOPX1 volgen.

In het boek "De taal C - van PSD tot C-programma" van Daryl McAllister wordt het juiste gebruik van #define behandeld.

#include <stdio.h>
#define AANTAL 3

int main() {
   int a[AANTAL];
   int index;
   printf("Geef %d getallen:\n", AANTAL);
   for (index=0; index<AANTAL; index=index+1)
      scanf("%d", &a[index]);
   printf("In omgekeerde volgorde is dit:\n");
   for (index=AANTAL-1; index>=0; index=index-1)
      printf("%d ", a[index]);
   printf("\nDruk op de enter toets om dit programma te verlaten.");
   getchar();
   getchar();
   return 0;
}

Met #define kun je programma's ook compleet onleesbaar maken. Dit moet je natuurlijk nooit doen maar is, net zoals sommige andere dingen die je eigenlijk niet moet doen, wel leuk. Er is zelfs een internationale wedstrijd om C programma's zo onleesbaar mogelijk te maken. Deze wedstrijd heet "The International Obfuscated C Code Contest" en werd dit jaar (2005) voor de 18de keer georganiseerd. Zie http://ioccc.org/main.html. Je kunt verschillende winnende inzendingen bewonderen op: http://ioccc.org/years.html. De meeste inzendingen maken gebruik van allerlei donkere hoekjes van de C taal die wij nog niet hebben behandeld (en die we niet gaan behandelen ook).

Michael H. Pawka was in 1986 een van de winnaars met de volgende inzending:

#include <stdio.h>
#define xyxx char
#define xyyxx putchar
#define xyyyxx while
#define xxyyyx int
#define xxxyyx main
#define xyxyxy if
#define xyyxyy '\n'
#define bd getchar();
xyxx *xyx [] = {
"]I^x[I]k\\I^o[IZ~\\IZ~[I^|[I^l[I^j[I^}[I^n[I]m\\I]h",
"]IZx\\IZx[IZk\\IZk[IZo_IZ~\\IZ~[IZ|_IZl_IZj\\IZj]IZ}]IZn_IZm\\IZm_IZh",
"]IZx\\IZx[I^k[I\\o]IZ~\\IZ~\\I]|[IZl_I^j]IZ}]I^n[IZm\\IZm_IZh",
"]IZx\\IZx[IZk\\IZk[IZo_IZ~\\IZ~_IZ|[IZl_IZj\\IZj]IZ}]IZn_IZm\\IZm]IZh",
"]I^x[I]k\\IZo_I^~[I^|[I^l[IZj\\IZj]IZ}]I^n[I]m^IZh",'\0'};/*xyyxyxyxxxyxxxyy*/
xyxx *xyyx; xxyyyx xyyyx,xyyyyx,xyyyyyx=0x59,xyyyyyyx=0x29,/*yxxyxyyyxxyyyxyy*/
xxyx=0x68;xxxyyx(){xyyyyx=0;xyyyxx(xyx[xyyyyx]){xyyx=xyx[xyyyyx++];/*xyyyxxyx*/
xyyyxx(*xyyx){xyyyx= *xyyx++-xyyyyyx;xyyyxx(xyyyx--)xyyxx(*xyyx-xyyyyyyx);/*x*/
xyxyxy(*xyyx==xxyx)xyyxx(xyyxyy);*xyyx++;}}bd}/*xyxyxyyyyxxyxxxyyyxyyyxyxxyyy*/

Copyright (c) 1986, Landon Curt Noll & Larry Bassel. All Rights Reserved. Permission for personal, educational or non-profit use is granted provided this this copyright and notice are included in its entirety and remains unaltered. All other uses must receive prior permission in writing from both Landon Curt Noll and Larry Bassel.

De #define bd heb ik toegevoegd om ervoor te zorgen dat de uitvoer van het programma op het scherm blijft staan als je dit programma met Borland 5.02 vertaald en uitvoert. Knippen en plakken en proberen maar!

Voor de duidelijkheid: Inzendingen voor de volgende IOCCC kunnen niet bij het practicum SOPX1 worden ingeleverd!