Les pointeurs : je deviens chèvre !! - C - Programmation
Marsh Posté le 10-01-2013 à 19:07:23
Edit : fausse manipulation qui fait que j'ai validé 2 fois
Marsh Posté le 10-01-2013 à 19:09:55
Bonsoir !
Je ne comprends pas bien votre code ...
A quoi sert le paramètre cBuffer dans la fonction MesurerRotation, puisqu'il n'est jamais utilisé ?
Dans ma compréhension, la fonction MesurerRotation remplit le tableau UART5_Buffer_Rx à partir de la chaîne "je suis labas" et modifie la structure Polarimetre.
Si les lignes ci-dessous, auxquelles vous faites référence ...
cBuffer = Polarimetre.Rx_buffer;
cBuffer = &UART5_Buffer_Rx[0];
cBuffer = jj;
sont placées dans la fonction "MesurerRotation", le comportement que vous évoquez est normal : dans la fonction, la variable "cBuffer" est modifiée par ces lignes, mais la variable qui a été passée à la fonction, elle, n'est pas modifiée (un paramètre toujours passé par valeur en C).
Si vous voulez modifier cette valeur, vous devez passer un "char **", un peu comme-ci :
Code :
|
et modifier le main
Code :
|
Marsh Posté le 10-01-2013 à 20:15:39
Merci Farian pour cette réponse !
Je vais tester cela est chercher de la documentation et essayer de comprendre ce mécanisme.
cBuffer n'est pas utilisé dans la fonction, mais me permet de récuperer la valeur lue par cette fonction. La valeur renvoyé par la fonction me sert qu'en à elle de savoir si j'ai une valeur enregistrée par cBuffer.
Jean-Marie
Marsh Posté le 10-01-2013 à 20:57:53
(Vous avez modifié le code, car je ne comprenais plus rien )
L'idée est simple, le paramètre que vous passez peut être modifié dans la fonction mais les modifications seront perdues au retour de la fonction.
En revanche, si vous passez un pointeur (ou un tableau, ou l'adresse d'une structure), vous pouvez modifier la valeur sur laquelle pointe le paramètre (ou modifier une (ou plusieurs) valeur(s) du tableau ou un (ou plusieurs) champ(s) de la structure ).
C'est ce mécanisme que j'exploite dans mon exemple en passant un pointeur sur une valeur à modifier (qui est elle-même un pointeur sur un char, d'où le double pointeur).
Marsh Posté le 14-01-2013 à 18:47:57
schneiderj a écrit :
|
Bonsoir
C'est exactement le même problème qu'avec le code simplifié suivant
Code :
|
La variable i de fct n'est qu'une copie de la variable i du main. Et donc la modif dans la fonction est perdue. Dans votre code, le cBuffer de la fonction ne reçoit qu'une copie de l'adresse envoyée par le main. Cette copie est bien modifiée mais perdue en fin de fonction.
Si vous voulez modifier le buffer d'origine, il faut utiliser l'adresse (copiée certes mais c'est la copie de l'adresse d'une vraie variable) et aller donc taper dans la zone pointée par cette adresse...
Code :
|
Marsh Posté le 10-01-2013 à 18:47:03
Bonsoir,
je patauge depuis hier avec ce code qui est destinné à tourner sur un microcontrolleur. Et je ne suis pas sûr si cela est une erreur de codification (fortement probable compte tenu des difficultés que j'ai avec les pointeurs et les tableaux ) ou un problème d'environnement de développement (MPLAB IDE de microchip). Voici le code en question :
Exécuté avec code blocks, je n'ai pas de problème jusqu'à la fin de la fonction MesurerRotation(&Reponse[0]); où la variable cBuffer pointe bien vers UART5_Buffer_Rx[0].
Mais lors du retour dans le main(), la valeur du pointeur est perdue. Et ceci de la même façon pour le deuxième appelle (ce qui est assez logique).
mais je ne comprends pas ce qui cloche... c'est probablement ce qui explique le comportement de la fonction MesurerRotation lorsque je l’exécute avec MPLAB : cBuffer ne change pas de valeur lors de l’exécution des lignes
Bref, je deviens vert, rouge....
Toute aide sera plus que la bien venue !
Jean-Marie
Message édité par schneiderj le 10-01-2013 à 20:19:28