PB pour créer une fonction avec un return tableau[]

Bonjour

Création d une fonction cree_tab() retournant un tableau t[]

void loop() {
            delay(500);
            int tab[3];// =  cree_tab();
            tab[0,2] =  cree_tab();//ramène les 3 valeurs du return pour les mettre ds les cases 0 à 2 de tab[]
            for(int i = 0; i<3; i++){
                      Serial.print("tab: ");Serial.println(tab[i]);
            }
}

int cree_tab(){
            int t[3] = {1,2,3};
            for(int i = 0; i<3; i++){
                    Serial.print("t: ");Serial.println(t[i]);
            }  
            return t[0,2];//retourne les valeurs des cases 0 à 2 de t[]
}

Est ce que mon code parait cohérent pour créer la fonction cree_tab();
La console me renvoie:
t: 1
t: 2
t: 3
tab: 1
tab: 2
tab: 3

Ca me parait juste Par contre si je supprime Serial.print("t: ");Serial.println(t*);*
La console renvoie :
tab: 1536
tab: -2855
tab: 3
Pourquoi qu en supprimant un Serial.print le résultat change et donne n importe quoi sauf le 3 qui est juste
Merci pour votre aide

La fonction cree_tab est définie comme:

int cree_tab()

Elle est censé retourner un entier, on ne peut pas lui faire retourner un tableau! C'est drôle que le compilateur le laisse passer.

A priori elle a le droit de retourner n'importe quoi. Sur les 6 octets passés, il y en a 2 qui doivent passer, pas les autres.

Maintenant il est possible que le compilateur pousse les trois bonnes valeurs dans la pile pour le println et que de l'autre côté tu dépiles 4 octets en plus. Et que par hasard ce soit les bonnes

salut , je pense que tu peux renvoyer un tableau de int avec cette fonction , un tableau n ' est pas un type de variable , donc tu peux renvoyer un tableau de n ' importe quoi ( ici : int ).

en faisant :

bool ma fonction () {
 bool tableau_bool [3] = {true,true,true};

return tableau_bool ;
}

ca devrait le faire ou je confonds avec le PHP .

sinon il faut passer par les pointeurs .

Pour oliver pecheux

Merci pour votre réponse

Ce n'est pas un hasard car j ai changé les valeurs et la logique reste la même
Vous dites que la fonction est censée retourner un entier oui mais alors comment on fait pour retourner un tableau d'entiers?

Merci

nono401:
Est ce que mon code parait cohérent pour créer la fonction cree_tab();

Bonjour,

Non ce n'est pas correct.
tab[0,2] ne représente pas tout le tableau, mais est équivalent à tab[2]. Donc seul le troisième élément du tableau est affecté.

Quand on veut utiliser un tableau ou retourner un tableau il faut passer son adresse en paramètre, ce qui en C est le nom du tableau.

donc utiliser les pointeurs :wink:

Pour iznobe

Merci pour votre réponse mais dans l exemple que vous donnez vous retournez qu un booleen et pas un tableau meme s'il porte le nom tableau

iznobe:
donc utiliser les pointeurs :wink:

Pas forcément

void loop() {
  delay(500);
  int tab[3];// =  cree_tab();
  cree_tab(tab); //ramène les 3 valeurs du return pour les mettre ds les cases 0 à 2 de tab[]
  for (int i = 0; i < 3; i++) {
    Serial.print("tab: "); Serial.println(tab[i]);
  }
}

void cree_tab(int tableau[]) {
  int t[3] = {1, 2, 3};
  for (int i = 0; i < 3; i++) {
    Serial.print("t: "); Serial.println(t[i]);
    tableau[i]=t[i];
  }
}

Dans ce code, il n'y a pas de pointeur (du moins pas de pointeur explicite).

pour kamil

Merci pour votre réponse mais j ai fait des essais avec return t[0,1] et la fonction retourne que 2 valeurs
Mais ma grosse question est pourquoi la presence ou pas d'un print console change les valeurs ds le tableau tab

kamill:
Pas forcément

void loop() {

delay(500);
 int tab[3];// =  cree_tab();
 cree_tab(tab); //ramène les 3 valeurs du return pour les mettre ds les cases 0 à 2 de tab[]
 for (int i = 0; i < 3; i++) {
   Serial.print("tab: "); Serial.println(tab[i]);
 }
}

void cree_tab(int tableau[]) {
 int t[3] = {1, 2, 3};
 for (int i = 0; i < 3; i++) {
   Serial.print("t: "); Serial.println(t[i]);
   tableau[i]=t[i];
 }
}



Dans ce code, il n'y a pas de pointeur (du moins pas de pointeur explicite).

oui , mais il n ' y a pas de return dans la fonction :open_mouth: , je ne connais pas cette façon de faire .

nono401:
pour kamil

Merci pour votre réponse mais j ai fait des essais avec return t[0,1] et la fonction retourne que 2 valeurs
Mais ma grosse question est pourquoi la presence ou pas d'un print console change les valeurs ds le tableau tab

ca c ' est la portée des variables , les noms sont similaires , mais pas le contenu des variables .

Pour kamill

Merci pour le code mais c est pas ce que je recherche Vous envoyez un tableau a la fonction alors que moi je veux créer un tableau dans la fonction et le retourner dans loop.
Avec votre fonction vous ne retournez plus rien. Il n y a pas de return
Peut etre que je n ai pas tout compris......

la solution est de passer par l' adresse du tableau dans le return , grace au pointeur .

ok pour faire avec un pointeur mais je ne sais pas faire
Merci de me dire à quoi ressemblera le code

exemple et explications ici : https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=2ahUKEwiGs43c6sLoAhUHJhoKHZoeCOEQFjACegQIDBAG&url=https%3A%2F%2Fwaytolearnx.com%2F2017%2F02%2Fprogrammation-en-c-fonction-qui-retourne-un-tableau.html&usg=AOvVaw242PgXBWtK3dMIY2B74K6J

nono401:
Merci pour le code mais c est pas ce que je recherche Vous envoyez un tableau a la fonction alors que moi je veux créer un tableau dans la fonction et le retourner dans loop.

C'est exactement ce que fais le code. Le fonction retourne les valeurs directement dans le tableau passé en paramètre.
Testes le code que je t'ai proposé.

Merci mais c 'est du C++ et si je ne me trompe pas arduino est un peu different

Si tu te trompes!

tu peux aussi faire une declaration de tableau en global , le transmettre a une fonction , lui faire modifier les valeurs du tableau , et c ' est tout

ensuite une lecture des elements est suffisante a partir de n ' importe ou , car ton tableau est global , hors de loop ou de setup , si je ne dis pas de betise , habituellement je fais comme ca , je poste le code des que je l ' ai retrouvé .

il me semble que c ' est ce que kamill a deja proposé d' ailleurs .

et il n ' y a que ces 2 solutions a ma connaissance .

Merci à tous
Je vais donc tester avec les pointeurs demain
Bonne soirée