Macros TP C4

Vérifier que l'éditeur de texte n'a pas ajouté de lignes vides lors du copier/coller d'une macro.

[I.3. Il faut toujours rendre ce que l’on a emprunté]

Il est donc conseillé de définir une macro :
#define FREE( _p_ ) do { \
  if ( (_p_) == NULL ) { \
     fprintf( stderr, "Desallocation impossible dans le fichier :%s ligne : %d", \
       __FILE__, __LINE__ ); \
     exit( EXIT_FAILURE ); \
  } \
  free(_p_); \
  (_p_) = NULL; \
} while (0)
et de tout simplement remplacer free(ptr); par FREE(ptr);

On doit aussi prendre la bonne habitude de sortir du programme avec un message d’erreur quand une allocation a échoué, par exemple :

int* ptrEntier = (int*)malloc( sizeof(int) );
if ( ptrEntier == NULL) {
  printf( "L’allocation a échoué !\n" );
  return 1;
}
Ou encore plus « pro » (merci au site developpez.com) :
#define MALLOC( _t_, _p_ ) do { \
  (_p_) = (_t_ *)malloc( sizeof(_t_) ); \
  if ( (_p_) == NULL ) { \
    fprintf( stderr, "Allocation impossible dans le fichier %s, ligne %d", \
      __FILE__, __LINE__ ); \
    exit( EXIT_FAILURE ); \
  } \
} while (0)
Il suffira alors de remplacer (avantageusement) :
int* ptrEntier = (int*)malloc( sizeof(int) );
par :
int* ptrEntier;
MALLOC( int, ptrEntier );

[III.1. Il est encore plus intéressant d’allouer dynamiquement des tableaux (qui prennent bcp de place).

Comme ci-dessus, on peut aussi définir une macro :
#define NMALLOC( _n_, _t_, _p_ ) do { \
  (_p_) = (_t_ *)malloc( (_n_) * sizeof(_t_) ); \
  if ( (_p_) == NULL ) { \
    fprintf( stderr, "Allocation impossible dans le fichier %s, ligne %d", \
      __FILE__, __LINE__ ); \
    exit( EXIT_FAILURE ); \
  } \
} while (0)
Il suffira alors de remplacer (avantageusement) :
TabDyn vTab = (TabDyn)malloc( 100 * sizeof(int) );
par :
TabDyn vTab;
NMALLOC( 100, int, vTab );

Dans ce cas, on pourait définir plus simplement la macro MALLOC :
#define MALLOC( _t_, _p_ ) NMALLOC( 1, _t_, _p_ )