Comment fournir un tableau directement à la fonction

Bonsoir, je me pose sûrement une question un peu débile, mais je me demande s'il est possible de fournir un tableau directement à la fonction, comme quelque chose qui ressemble à ça :

maFonction({2, 5, 67, 89});

Au lieu de devoir créer un tableau pour le passer comme paramètre :

byte monTableau [] = {2, 5, 67, 89};
maFonction(monTableau);

Est-ce possible ? :thinking:


EDIT : Les solutions sont multiples. Ce sont les messages #2 (solution originale), #6, #19 qui répondent à la question.

C’est impossible.
A la limite vous pouvez transmettre un élément d’un tableau mais c’est tout.
Ex: maFonction(monTableau[2]);

Bonne soirée

Merci beaucoup ! Sujet rapide, résolu et terminé ! :slightly_smiling_face:

Bonne soirée. :wave:

En fait lorsque vous transmettez un tableau à une fonction comme ci-dessus, c’est l’adresse de son premier élément que vous transmettez. Du coup le tableau doit être déclaré avant d’être transmis de sorte que tout le bloc mémoire qui le constitue soit connu.
Et tout ça est logiquement nécessaire.
Bonne soirée

Je le savais déjà, mais merci quand même !

tu peux faire ça:

maFonction(new byte[3]{2, 3, 4});

Merci, mais donc c'est possible, finalement ?

Le code que j'ai donné est fonctionnel en tout cas :slight_smile:

Et le new, je suppose que c'est le nom ?

Alors je ne suis pas sûre de comprendre la question.
new est un mot clé pour allouer dynamiquement de la mémoire, ce qui pose d'ailleurs des problèmes de fuite mémoire dans ton cas :slight_smile:, car je crois qu'il alloue dans le tas et pas dans la pile.
Il faudrait demander à @J-M-L la confirmation, peut être que @philippe86220 a aussi l'information?

personnellement je n'utilise pas ce genre de syntaxe et préfère déclarer des variables locales, même pour une utilisation unique.
peut être il y a une directive, pour spécifier de faire une allocation dans la pile ?

@terwal,
A ma connaissance ce n'est pas possible d'ailleurs ton code génère des erreurs. Mais encore une fois je suis débutant et donc je peux me tromper (je ne sais peut-être pas le mettre en œuvre). En tout cas on ne trouve pas ce genre de fonction dans mes livres.
Quant à @J-M-L, j'espère qu'il va bien car il est de moins en moins présent sur le forum à mon grand regret.

Quel est ton message d'erreur ?
Peut être que wokwi m'a menti :frowning:
Après ce n'est pas dans la fonction que cela réside, mais dans l'allocation mémoire.

Mais de toute façon je ne recommande pas du tout cette façon de faire, qui me parait amener plus de problème que cela en résous.

@terwal
Quel est ton code exactement ?
Merci

Je t'ai posé la question avant :slight_smile:

j'ai testé ça:

void maFonction(byte parm[]) {
  Serial.print("Ma fonction, lenght:");Serial.print(strlen(parm));Serial.print(", first: ");Serial.println(parm[0]);
}

void setup() {
  Serial.begin(115200);
  byte monTableau [] = {2, 5, 67, 89};
  maFonction(monTableau);
}

void loop() {
  maFonction(new byte[3]{5, 6, 7});
  delay(5000);
}
1 Like

@terwal, ça fonctionne. Je ne connaissais pas du tout ! Je dormirai moins bête ce soir !

Maintenant il est possible que ça pose des problèmes de mémoire effectivement (création dynamique ). oui new crée dans le tas et tu ne supprimes pas la mémoire allouée (en plus avec la loop() c'est peut-être suicidaire !)
Si @J-M-L passe par là ...

Oui, j'ai mis dans la loop, un peu au hasard, j'espère que @techvij ne compte pas l'utiliser dans ce contexte :exploding_head:

après je n'ai pas testé, mais cela doit être possible de désallouer dans la fonction, mais cela reste toujours suicidaire :slight_smile:

Du coup ouai, c'est possible, par contre de là à l'utiliser :melting_face:

Où as tu trouvé cette façon de faire ? Personnellement je n'avais jamais vu ça.

Nul pars, si c'est possible lors de l'affectation d'une variable, cela l'ai surement aussi en paramètre d'une fonction.

je suis pas mal occupé en ce moment et loin de mon ordinateur. pas simple de tout suivre sur un iPhone :slight_smile: mais je suis toujours parmi vous.

Pour la question : new effectivement alloue dans le tas et c'est votre responsabilité de libérer l'objet créé. Comme vous ne le faites pas, il y a fuite mémoire. De manière générale on déconseille l'usage de new en C++

les variables locales non statiques elles sont sur la pile et sont libérées automatiquement à la fin de la fonction.

si vous voulez voir la différence entre l'usage de new et la création d'une instance, essayez ce petit code:

class A {
  public:
    int val;
    A(int x) : val(x) {
      Serial.print("constructeur de A avec valeur ");
      Serial.println(val);
    }

    ~A() {
      Serial.print("destructeur de A avec valeur ");
      Serial.println(val);
    }
};

void testing(A* aPtr) {
  Serial.print("Testing d'un A avec valeur ");
  Serial.println(aPtr->val);
}


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

void loop() {
  Serial.println("------ début de loop ------");
  testing(new A(10));
  A a1(100);
  testing(&a1);
  delay(1000);
  Serial.println("------ fin de loop ------");
}

je crée une classe A avec un entier comme attribut (variable d'instance). Il y a le constructeur et le destructeur déclarés pour voir ce qu'il se passe.

quand vous faites tourner ce code, vous devriez voir se répéter

------ début de loop ------
constructeur de A avec valeur 10
Testing d'un A avec valeur 10
constructeur de A avec valeur 100
Testing d'un A avec valeur 100
------ fin de loop ------
destructeur de A avec valeur 100

➜ on verra bien que le destructeur pour la valeur 10 n'est jamais appelé alors que la variable a1, locale à la loop, est automatiquement libérée à la fin de l'exécution de la fonction comme toute variable locale non statique.

(dites moi si ça fonctionne car j'ai tapé cela ici)

1 Like

Bonjour @J-M-L

Cela fonctionne parfaitement Merci beaucoup.