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 :
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
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 , 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.
@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à ...
je suis pas mal occupé en ce moment et loin de mon ordinateur. pas simple de tout suivre sur un iPhone 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)