Qui a dit : "Un problème bien ennuyeux" ? 




Le chapitre est sur le point de s'achever, il est temps de retrouver notre fil rouge. Si vous avez compris ce chapitre, vous devriez être capables de résoudre le problème, maintenant. Qu'est-ce que vous en dites ? Essayez !

Voici la solution pour comparer :

void decoupeMinutes(int* pointeurHeures, int* pointeurMinutes);


int main(int argc, char *argv[])

{

    int heures = 0, minutes = 90;


    // On envoie l'adresse de heures et minutes

    decoupeMinutes(&heures, &minutes);


    // Cette fois, les valeurs ont été modifiées !

    printf("%d heures et %d minutes", heures, minutes);


    return 0;

}


void decoupeMinutes(int* pointeurHeures, int* pointeurMinutes)

{

    /* Attention à ne pas oublier de mettre une étoile devant le nom

    des pointeurs ! Comme ça, vous pouvez modifier la valeur des variables,

 et non leur adresse ! Vous ne voudriez pas diviser des adresses,

    n'est-ce pas ? ;o) */

    *pointeurHeures = *pointeurMinutes / 60;

    *pointeurMinutes = *pointeurMinutes % 60; 

}



Résultat :


1 heures et 30 minutes




Rien ne devrait vous surprendre dans ce code source. Toutefois, comme on n'est jamais trop prudent, je vais rabâcher une fois de plus ce qui se passe dans ce code afin d'être certain que tout le monde me suit bien. C'est un chapitre important, vous devez faire beaucoup d'efforts pour comprendre : je peux donc bien en faire moi aussi pour vous !

  1. Les variables heures et minutes sont créées dans le main.
  2. On envoie à la fonction decoupeMinutes l'adresse de heures et minutes.
  3. La fonction decoupeMinutes récupère ces adresses dans des pointeurs appelés pointeurHeures et pointeurMinutes. Notez que là encore, le nom importe peu. J'aurais pu les appeler h et m, ou même encore heures et minutes. Je ne l'ai pas fait car je ne veux pas que vous risquiez de confondre avec les variables heures et minutes du main, qui ne sont pas les mêmes.
  4. La fonction decoupeMinutes modifie directement les valeurs des variables heures et minutes en mémoire car elle possède leurs adresses dans des pointeurs. La seule contrainte, un peu gênante je dois le reconnaître, c'est qu'il faut impérativement mettre une étoile devant le nom des pointeurs si on veut modifier la valeur de heures et de minutes. Si on n'avait pas fait ça, on aurait modifié l'adresse contenue dans les pointeurs, ce qui n'aurait servi… à rien.

Il était possible de résoudre le « problème » sans utiliser de pointeurs. Oui, bien sûr c'est possible, mais il faut contourner certaines règles que nous nous sommes fixées : on peut utiliser des variables globales (mais on l'a dit, c'est mal), ou encore faire un printf dans la fonction decoupeMinutes (alors que c'est dans le main qu'on veut faire le printf !). L'exercice est un peu scolaire et peut donc être contourné si vous êtes malins, ce qui vous fait peut-être douter de l'intérêt des pointeurs. Soyez assurés que cet intérêt vous paraîtra de plus en plus évident au cours des chapitres suivants

Créé avec HelpNDoc Personal Edition: Générateur complet de livres électroniques Kindle