Je ne voudrais pas quelque chose comme:
et ensuite lorsque vous utilisez: p> le est une chose tellement possible? P> Voici le programme complet non fonctionnel :
La sortie doit être éditer. P > J'ai essayé d'isoler l'exemple à un minimum nu, mais je tire moi-même au pied maintenant. Dans la chose réelle, je n'ai pas de Alors j'essaye quelque chose comme ça maintenant: p> mais celui-ci échoue lorsqu'il est utilisé avec:
Cause La macro ne donne pas de valeur de retour, donc aucune mission ne peut se produire. P> J'ai donc besoin quelque chose comme:
où Pour que cela puisse empoisonner encore plus pour la rendre possible? Voici le code complet: p> #define quelque_func (a) quelque_func (a, create_foo ()) code> FOO < / Code> L'instance ne doit être créée qu'une seule fois pour chaque ligne.
Donc, dans le cas ci-dessus, 2 fois. Et quand la boucle fonctionne à nouveau, il ne faut pas créer à nouveau aux instances foo code>. P> 3, 40, 6, 80, 9, 120, 12, 160, ... code> p> void code> comme type de retour mais un booléen code>. p> #define DEBONCE (VAL) pour (Static Auto D = Create_Debounce (); Déboquez (D, VAL), FAUX; )
code> p> int état = DEBONCE (digitalRead (Button_fire)); CODE> P> #define DEBONCE (VAL) true; pour (statique auto d = create_debounce (); débond (d, val), false;) code> p> true code> est le résultat du create_debounce < / Code> Fonction. P>
4 Réponses :
Lorsque la boucle est à nouveau exécutée, les instances Je soupçonne ce que vous voulez faire consiste à utiliser un ensemble de variables statiques. Ou refacteur votre code pour plus de clarté. P>
Cette macro ne vous aide pas dans cette affaire, ne l'utilisez pas, utilisez des variables explicites, puis vous verrez la durée de vie des objets. Une macro ne fait pas partie du compilateur, mais du préprocesseur. P> FOO CODE> sont à nouveau créées, elles ne sont pas restaurées à partir de l'exécution précédente. P>
En plus d'être mal formé, votre macro n'est pas utile pour ce que vous voulez car vous appelez Vous pouvez utiliser des variables statiques: P> < Pré> xxx pré> p> create_foo code> sur chaque invocation.
Si vous êtes prêt à obtenir vraiment em> moche, vous pouvez accomplir pratiquement n'importe quoi. Je ne réponds que parce que ceci est un teaser cérébral. Vous pouvez définir la macro comme ceci: p> Oui, cela fonctionnera. Dans Standard C ++, la clause d'AI de A pour boucle peut contenir une déclaration de variable statique. La variable sera donc initialisée qu'une seule fois. Ensuite, la "condition" est l'appel actuel à adapter votre code d'Arduino à Standard C ++ et simulant les quatre cycles, généré la même sortie que vous vouliez. Voir Live . P> Alternativement, si vous Voulez-vous apparaître légèrement moins cryptique (mais pourquoi voulez-vous?), vous pouvez opter pour cela: p> même chose vraiment. p> D'accord , en l'appliquant à vos appels de problèmes réels em> pour quelque chose de différent: p> Ceci définit et invoque immédiatement une Lambda. Étant donné qu'un lambda crée un type de fermeture unique partout où il apparaît dans un programme, cela créera un objet statique unique pour chaque expression que vous écrivez one_func code> suivi de l'opérateur de la virgule avec false code>, la fonction est donc uniquement exécutée une fois que la bouclette est entrée à chaque fois que la bouclette est entrée. p>
de débattre (...) code> in. Une alternative est l'expression de relevé spécifique de la GCC . Mais contrairement à une Lambda, c'est une extension. Que vous pouvez ou non vouloir utiliser, ymmv. P> p>
Aïe qui fait mal: p
Je comprends bien. Je suis triste cependant, j'ai vraiment cru un instant que pour (auto-auto statique ...); pour (statique auto n = ...); code> créerait un seul n code>.
La première chose à noter, c'est que votre état est un booléen. Cela vous sauvera quelques octets de RAM.
La prochaine chose à souligner est que vous souhaitez ignorer les modifications apportées à l'entrée pendant une période de temps; Cela signifie que vous n'avez pas besoin de stocker l'état "actuel"; Juste le dernier état ... qui finira par être la même chose. Cela pourrait ne rien vous sauver quoi que ce soit, car les 2 booléens et 1 booléen vont probablement juste prendre un octet; Mais cela donne au compilateur une chance, et surtout, rend les choses plus simples. P>
avec ces 2 améliorations assez mineures faites, nous arrivons aux plus grands. N'utilisez pas de macros à moins que vous sachiez vraiment ce que vous faites; Et même ensuite reconsidérer. p>
L'exemple de code Arduino a tendance à leur offrir parce que quelqu'un a pensé que cela faciliterait l'apprentissage; Mais honnêtement, ils ne le font pas. Ils ne sont pas une fonction et votre utilisation ne fait pas vraiment ce que vous pensez que cela fait. Arduino offre des moyens limités de le déboguer. Vous ne pouvez donc pas dire que votre état sera toujours élevé, car la macro expansion est la suivante: p> déplacez-le à une fonction ; Laissez le compilateur optimiser le code car il sera toujours em> faire un meilleur travail que vous aussi longtemps que vous écrivez le code d'une manière qui le laisse. P> P>
Pourquoi utiliseriez-vous une macro pour cela? Pourquoi ne pas simplement déclarer et définir un autre
certains_func (int a) code> fonction pour appeler plus spécifiqueone_func (int, foo &) code>?@uv_ Parce que OP pense que le
Createefoo code> est ensuite appelé une seule fois."Mais je tire moi-même au pied maintenant" correct. Enlevez les macros, ils ne font pas ce que vous pensez qu'ils font.
@Storyteller au moins il n'y a pas une paillette les tenant ... ou une suppression ^ _ ^
@Storyteller Désolé, ce n'était pas exprès, je pensais abstraiter le problème aidé. Votre réponse était toujours très utile.
@Storyteller Je l'ai maintenant et je n'aurais jamais pu le faire sans toi. Si vous fournissez
#define DEBONCE (VAL) ({INT R; POUR (STATIQUE AUTO D = CREATE_DEBONCE (); R = DEBONCE (D, VAL), FAUX;); R;}) CODE> Réponse Je vais vous donner la marque.@ Clankill3R - D'accord. J'ai l'autre approche éditée. C'est standard C ++, bien que je mentionne des expressions de déclaration.