vendredi 12 avril 2013

Pointer le bug

J'ai passé 2 jours à tenter de résoudre un bug (CCS C sur PIC 16F ) : je voulais qu'une valeur transmise en paramètre d'une fonction (par défaut transmission par valeur) est sa valeur modifiée par cette fonction.Une solution facile et éprouvée était de créer une variable globale, visible de la fonction appelante et appelée. Mais j'ai voulu faire autrement en utilisant un pointeur de façon à transmettre le paramètre non pas par valeur mais par référence (adresse).

j'ai donc déclaré :
int8 *PtrVal;

Par la suite je découvrais que ça ne fonctionnait pas: la fonction appelée qui essayait simplement de resetter la variable :
*PtrVal = 0;

A la fin j'ai posé le problème sur le forum de CCS et obtenu la réponse de PCM Programmer  :
The key thing you need to remember is that just simply creating a pointer doesn't create or allocate any RAM storage locations for data. You have a pointer, but you don't have anything for it to point to.
So to make the pointer be useful, you need to declare a variable, or an array, and load the pointer with the address of that variable or array. 



Il n'y a donc pas d'allocation mémoire lors de la déclaration du pointeur; il faut déclarer la variable :
int8 x;         //Déclaration de la variable et allocation de mémoire
int8 *Ptr;    //Déclaration du pointeur vers un byte


Ptr = &x;     // affectation de l'adresse de x au pointeur

il est alors possible d'accéder/modifier x via le pointeur :
*Ptr = 12;

Certainement très basique mais complétement oublié voire jamais connu!

Aucun commentaire: