fonction avec return de 2 variables possible ou pas ?

bonjour j 'avance dans mon projet.
j'ai beau retourner et lire moult posts, je bloque.
voilà je voudrai faire une fonction:
aucune variable en entré donc mafonction();
après calcul retourne deux variables qui sont en fait deux entre d'un tableaux.
voir le post :tableau avec fichier image.h - Français - Arduino Forum
C'est mon tableau qui affiche les icônes suivant deux variables.

display.drawXbm(25, 0, lesIcones[var1][var2].icone_width, lesIcones[var1][var2].icone_height, lesIcones[var1][var2].icone);

merci de votre aide.

après calcul retourne deux variables qui sont en fait deux entre d'un tableaux.

une fonction en C ne peut retourner qu'un seul "truc" (mais ce truc peut être une structure qui contient plusieurs machins).

pourquoi pas de param?

ha ça m'arrange pas :confused:
faut que je trouve autre chose alors. merci.

Bonjour,

Tu peux passer tes arguments par référence et tu récupère les valeurs dans les variables que tu as passées

maFonction(int &var1, int &var2)
{
 // traitement
 // ...
 var1=
 var2=
}

lcd1602:
faut que je trouve autre chose alors. merci.

pourquoi pas de paramètres ? c'est OK d'avoir des paramètres à une fonction qui doit retourner quelque chose...

et pourquoi ne pas utiliser des variable globale static... ca evite d'utiliser des parametres et d'utiliser des renvois...

static (dans le cas de la classe) signifie que la variable n'existe qu'en un seul exemplaire, elle est globale à la classe en quelque sorte. Autrement, chaque objet du type de la classe dispose de sa propre copie.

Une telle syntaxe (déclaration et définition en un seul coup) est possible en C++, mais seulement parce qu'elle vérifie certaines conditions : il s'agit d'une variable constante, statique, et de type entier.

static int mavar1 =0;

maFonction
{
mavar1 = ...,
}

...
...
...

mavar2 = mavar1;

hazerty565:
static (dans le cas de la classe) signifie que la variable n'existe qu'en un seul exemplaire, elle est globale à la classe en quelque sorte. Autrement, chaque objet du type de la classe dispose de sa propre copie.

Une telle syntaxe (déclaration et définition en un seul coup) est possible en C++, mais seulement parce qu'elle vérifie certaines conditions : il s'agit d'une variable constante, statique, et de type entier.

Hum... tel quel ce n’est pas une variable de classe mais juste une variable globale et donc pas besoin de static...

non la variable n’a pas besoin d’etre « constante », on donne juste la valeur initiale, elle peut évoluer (c’est une variable) plus tard. (à moins que vous ne vouliez dire la valeur d’initialisation)

bonjour merci pour vos réponses.
je vais faire comme le propose kamill
merci.

C'est la méthode la plus utilisée.
Ta fonction peut aussi retourner un indicateur pour dire OK ou KO.

merci pour votre aide à tous.
une petite question quelle différence entre &var1 et var1?

car je suis perdu entre les bytes , les chars....avec ma formule:
display.drawXbm(25, 0, lesIcones[var1][var2].icone_width, lesIcones[var1][var2].icone_height, lesIcones[var1][var2].icone);
quel type de var je dois prendre, j'opterai pour des bytes en rapport avezc le tableau:
enum : byte {Soleil=0,Orages,Vents,Pluies,Froid};
enum : byte {niveau0= 0,niveau1,niveau2,niveau3};
mais cela ne marche pas ?
merci de votre soutien.
excusez pour les quotes ça à merdé :frowning:

var1 c'est un passage par valeur. Ça crée une variable temporaire dans la pile, si tu modifies var1 dans la fonction, la modif est perdue à la sortie de la fonction.
&var1 c'est un passage par référence (adresse de la variable) et donc si tu modifies var1 dans ta fonction, la variable que tu as passé en paramètre sera modifiée.

Le type de var que tu dois prendre est le type que tu veux retourner.
Je ne comprends pas bien ce que tu veux retourner. Ce sont des bytes?

ben a vrai dire je ne sais plus trop.
j'ai enum byte {soleil=0, orage.......} c'est la variable1
j'ai enum byte {niveau0= 0,niveau1........... c'est la variable 2
c'est ces deux variable qui me donne "l'adresse" dans mon tableau d'icone.
je pensai formater var1 et var2 en byte, mais cela ne marche pas.
voilà ou j'en suis.
merci

Est ce que c'est quelque chose comme ça que tu veux faire?

enum ETemps : byte {Soleil = 0, Orages, Vents, Pluies, Froid};
enum ENiveau : byte {niveau0 = 0, niveau1, niveau2, niveau3};

void setup() {
  Serial.begin(115200);
}

void loop() {
  ETemps tempsCourant;
  ENiveau niveauCourant;

  GetTempsNiveau(tempsCourant, niveauCourant);
  Serial.print("Temps: "); Serial.println(tempsCourant);
  Serial.print("Niveau: "); Serial.println(niveauCourant);

  delay(10000);
}

// détermine le temps et le niveau
void GetTempsNiveau(ETemps &temps, ENiveau &niveau)
{
  temps = Orages;
  niveau = niveau2;
}

essayez cela (tapé ici donc je ne sais pas si ça marche mais vous comprendrez sans doute l'idée)

enum meteo_t : byte {Soleil = 0, Orages, Vents, Pluies, Froid};
enum niveau_t : byte {niveau0 = 0, niveau1, niveau2, niveau3};

void affecterVariablesType(meteo_t& m, niveau_t& n)
{
  m = Pluies; // compatibilité directe des types
  n = niveau2;
}

void affecterVariablesByte(uint8_t& m, uint8_t& n)
{
  m = Vents; // les enum étant déclarés en byte, l'affectation est possible sans soucis
  n = niveau1;
}


void setup() {
  Serial.begin(115200);

  // EN UTILISANT LE TYPAGE DES ENUM
  meteo_t m1 = Orages;
  niveau_t n1 = niveau3;
  Serial.print("METEO = "); Serial.println(m1);
  Serial.print("NIVEAU = "); Serial.println(n1);

  affecterVariablesType(m1, n1);
  Serial.print("METEO = "); Serial.println(m1);
  Serial.print("NIVEAU = "); Serial.println(n1);

  // OU AVEC DES BYTE
  uint8_t m2 = Orages;
  uint8_t n2 = niveau3;

  affecterVariablesByte(m2, n2);
  Serial.print("METEO = "); Serial.println(m2);
  Serial.print("NIVEAU = "); Serial.println(n2);
}

void loop() {}

bonjour merci à tous ça fonctionne :smiley: .
j'ai encore à progresser avec les tableaux :wink:
je vais maintenant m'attaquer à stocker les données pour en faire une moyenne.

bonne journée