problème avec les pointeurs

Bonjour à toutes et à tous,

J’ai une fonction qui me retourne vrai lorsque une entrée passe de l’état bas à l’état haut. Elle modifie une valeur globale “etatPrec”. Cela fonctionne très bien, la voici :

byte etatPrec = LOW;

boolean agir(byte noEnt) {
  boolean result = false;
  if (digitalRead(noEnt) ==  HIGH && etatPrec == LOW) {
    etatPrec = HIGH;
    result = true;
  }
  if (digitalRead(noEnt) ==  LOW && etatPrec == HIGH) {
    etatPrec = LOW;
    result = false;
  }
  return result;
}


if (agir(10)) { // un appel de la fonction
// Faire ce qu'il faut
}

Maintenant, je souhaite passer la variable “etatPrec” en paramètre afin d’utiliser cette fonction pour plusieurs entrées. J’écris alors :

byte etatPrec_1 = LOW;
byte etatPrec_2 = LOW;

boolean agir(byte noEnt, byte *etatP) {
  boolean result = false;
  if (digitalRead(noEnt) ==  HIGH && etatP == LOW) {
    etatP = HIGH;
    result = true;
  }
  if (digitalRead(noEnt) ==  LOW && etatP == HIGH) {
    etatP = LOW;
    result = false;
  }
  return result;
}


if (agir(10), &etatPrec_1) { // un appel de la fonction
// Faire ce qu'il faut
}
error: invalid conversion from 'int' to 'byte* {aka unsigned char*}' [-fpermissive]

     etatP = HIGH;

           ^

Je ne vois pas trop comment écrire cette fonction pour ne pas avoir d’erreur de compilation et qu’elle fonctionne, c’est-à-dire qu’au retour de la fonction, le paramètre “etatPrec_1” soit modifié comme il faut.

Merci de votre aide.

Pierre

Pour accéder au pointeur c'est

*etatP = HIGH;

Bonjour,

Tu peux aussi passer ta valeur par référence

byte etatPrec_1 = LOW;
byte etatPrec_2 = LOW;

boolean agir(byte noEnt, byte &etatP) {
 boolean result = false;
 if (digitalRead(noEnt) ==  HIGH && etatP == LOW) {
   etatP = HIGH;
   result = true;
 }
 if (digitalRead(noEnt) ==  LOW && etatP == HIGH) {
   etatP = LOW;
   result = false;
 }
 return result;
}


if (agir(10), etatPrec_1) { // un appel de la fonction
// Faire ce qu'il faut
}

fdufnews:
Pour accéder au pointeur c’est

*etatP = HIGH;

J’avais essayé cette solution, mais cela provoquait un autre type d’erreur :

C:\Documents and Settings\Pierre\Mes documents\Arduino\Projets_ChP\GPS_Display\GPS_Display.ino: In function 'boolean agir(byte, byte*)':

C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:40:14: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

 #define HIGH 0x1

              ^

C:\Documents and Settings\Pierre\Mes documents\Arduino\Projets_ChP\GPS_Display\GPS_Display.ino:21:46: note: in expansion of macro 'HIGH'

   if (digitalRead(noEnt) ==  LOW && etatP == HIGH) {

                                              ^

Cordialement.

Par contre, la solution que me propose kamill fonctionne.

Pierre

kamill: Bonjour,

Tu peux aussi passer ta valeur par référence

Merci kamill, cette solution fonctionne bien.

Cordialement.

Pierre

ChPr: J'avais essayé cette solution, mais cela provoquait un autre type d'erreur :

Ben oui mais il faut remplacer partout dans la fonction etatP par *etatP