IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Pourquoi pas #define ?


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut Pourquoi pas #define ?
    Bonjour à tous,

    Nouveau en programmation sur arduino (mais programmeur en C), je croise régulièrement ce genre d'écriture dans des exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const byte TRIGGER_PIN = 2;
    const byte ECHO_PIN = 3;
    const unsigned long MEASURE_TIMEOUT = 25000UL;
    const float SOUND_SPEED = 340.0 / 1000;
    (extrait de cette page)

    Mais y-a-t-il une raison pour définir / déclarer des variables (qui sont const) plutôt que d'utiliser #define:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define TRIGGER_PIN 2
    #define ECHO_PIN 3
    #define MEASURE_TIMEOUT 25000UL
    #define SOUND_SPEED (340.0 / 1000)     // la division peut rester, le précompilateur fera le calcul
    J'ai bien lu quelque part qu'il valait mieux des variables que des #define, car les #define pouvaient déjà se trouver dans une librairie . Mais on s'en moque, le précompilateur nous avertira de toute façon (à moins que je me plante complètement) puisque les libs (si j'ai bien compris) sont compilées en même temps que le code utilisateur. Et si les libs sont précompilées, les #define qui pouvaient s'y trouver n'existent plus.

    De même, y-a-t-il une raison pour ne pas employer des variables locales (lorsque c'est possible) plutôt que des globales ?

    Et aussi, est-ce une erreur d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i=0; ....; ....)
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i;
    ....
    for(i=0; i....; ....)
    D'avance merci pour vos réponses.

    Edgar;

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 901
    Par défaut
    C++ est plus fortement typé que le C

    Les const byte sont sont un meilleur choix car le compilateur peut faire des optimisations potentiellement plus importantes qu’avec un int (qui est le type par défaut du #define)

    Mettre la variable de boucle dans le for est aussi mieux car vous réduisez sa portée à la boucle et donc pas de risque qu’elle traine après la boucle (ou prenne inutilement de la mémoire sur la pile )

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Déclarer l'indice d'une boucle à l'extérieur de celle-ci n'a d'intérêt que lorsque la valeur de cet indice doit être consulté après la sortie de la boucle.
    Dans le cas d'une boucle Pour i entre a et b, lorsqu'une instruction a forcé la sortie de la boucle avant que l'indice de fin ait été atteint.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Merci à vous deux pour vos réponses, et désolé du délai pour ma réponse.

    Déclarer l'indice dans la boucle for() est une habitude chez moi, mais je vois souvent des exemples avec l'indice déclaré en-dehors alors qu'il n'est plus nécessaire lorsque le for() se termine, et je me posais la question (pour la prog. arduino).

    Pour le typage des variables, je prends bonne note.

    Encore merci,

    Edgar;

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Bonjour,
    Juste pour ajouter un élément de réponse à la toute première question. De mémoire il me semble que déclarer un const byte va forcer le compilateur à utiliser le tas de la mémoire.

    Si on imagine que TRIGGER_PIN est utilisé dans une fonction, si on laisse le préprocesseur faire les substitues du #define alors cette même constante TRIGGER_PIN va se retrouver dans la pile au moment où la fonction sera appelée. Avec une déclaration de type const byte la variable TRIGGER_PIN sera dans le tas.

    Sur les microcontrôleurs la taille de la pile peut rapidement montrer ses limites surtout si on code comme sur PC avec de l'encapsulation ou si on a une forte utilisation de fonctions imbriquées, parfois dans un soucis de clarté du code. Sur un PC il y a le garde fou qu'est l'OS qui peut générer dans le pire des cas un stackoverflow mais sur un microcontroleur il n'y a rien de tout ça. Si ça se produit, le soft plante et on constate juste que ça ne fonctionne pas.

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 901
    Par défaut
    bonjour Vincent

    Si on imagine que TRIGGER_PIN est utilisé dans une fonction, si on laisse le préprocesseur faire les substitues du #define alors cette même constante TRIGGER_PIN va se retrouver dans la pile au moment où la fonction sera appelée. Avec une déclaration de type const byte la variable TRIGGER_PIN sera dans le tas.
    Non... Dans tous les cas TRIGGER_PIN sera mis sur la pile lors de l'appel de la fonction, que ce soit par #define ou lecture de la valeur de la variable en mémoire pour la mettre sur la pile. (Le plus souvent l'optimiseur aura viré la constante et mis directement l'octet à la place de toutes façons donc on n'a pas de phase "lecture de la valeur de la variable en mémoire")

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. La binaire et pourquoi pas le ternaire
    Par Chromatic dans le forum Ordinateurs
    Réponses: 34
    Dernier message: 09/07/2012, 15h28
  2. Pourquoi pas WinDev 9 ?
    Par nyarla01 dans le forum WinDev
    Réponses: 35
    Dernier message: 25/07/2006, 19h41
  3. JTreeTable pourquoi pas en standard?
    Par Antoine_1977 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 03/01/2006, 22h33
  4. [Language][DAO]Pourquoi pas des Singletons ?
    Par le Daoud dans le forum Langage
    Réponses: 11
    Dernier message: 04/05/2005, 09h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo