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 :

Problème de définition de fonction dans Arduino


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2022
    Messages : 7
    Par défaut Problème de définition de fonction dans Arduino
    Mon code affiche une erreur a la ligne 20 voici l'erreur afficher par la console:

    error: 'lireDistance' was not declared in this scope
    et bien que je crois comprendre le problème du moins une partie je ne trouve pas de solution à vue de nez pouvez vous m'aidez?
    mon code si dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include<Servo.h>                           
    Servo servoAvant, servoArriere;
    #define trigger 2
    #define echo 4
    int avant[]={60,120,120,60};
    int arriere[]={120,120,60,60};
    int distance=0;
    int distMin=20;
     
    void setup(){
      servoAvant.attach(5);
      servoArriere.attach(6);
      pinMode(trigger, OUTPUT);
      digitalWrite(trigger, LOW);
      pinMode(echo, INPUT);
    }
     
    void loop(){
     
      distance = lireDistance();
      if (distance > distMin){
        avance();
      }
      int lireDistance() {
        long lecture_echo;
        long cm;
        digitalWrite(trigger, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigger, LOW);
        lecture_echo = pulseIn(echo, HIGH);
        cm = lecture_echo*0.017;
        return cm;
       }
    }
    void avance(){
      for (int n=0;n<4;n++) {
        servoAvant.write(avant[n]);
        servoArriere.write(arriere[n]);
        delay(250);
      }
    }

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Enlève le code de la fonction lireDistance de la fonction loop (ligne 24 à 33) et place le avant la fonction setup.

  3. #3
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 624
    Par défaut Imbrication
    Bonjour,

    En complément, le C (et C++) n'accepte pas les fonctions imbriquées comme d'autres langages (le Pascal par exemple).

    Salutations

  4. #4
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2022
    Messages : 7
    Par défaut
    Citation Envoyé par Jerome Briot Voir le message
    Enlève le code de la fonction lireDistance de la fonction loop (ligne 24 à 33) et place le avant la fonction setup.
    j'ai besoin que le code reste dans la fonction loop parsque cette opération dois se répéter du moin cest ce que me dis le manuel de programation que je suis pour ce code et en le retirant du loop et en le mettant dans setup ça ne marche pas

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par Sodabob_78 Voir le message
    cest ce que me dis le manuel de programation
    Quel manuel ?

    Tu n'utilises pas l'IDE Arduino ?

  6. #6
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2022
    Messages : 7
    Par défaut
    Citation Envoyé par Jerome Briot Voir le message
    Quel manuel ?

    Tu n'utilises pas l'IDE Arduino ?
    j'utilise un manuel pour construire et programmer un robot

  7. #7
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    IDE : environnement de développement, ici le logiciel Arduino.
    Jérôme te demandais si tu utilisais le logiciel Arduino pour programmer ta carte.

  8. #8
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir Sodabob_78
    Citation Envoyé par Sodabob_78 Voir le message
    j'ai besoin que le code reste dans la fonction loop parsque cette opération dois se répéter du moin cest ce que me dis le manuel de programation que je suis pour ce code et en le retirant du loop et en le mettant dans setup ça ne marche pas
    Ce n'est pas le code (de la fonction) qui doit être dans loop() mais l'appel de la fonction en l'occurrence, dans loop(), distance = lireDistance();
    Ta ou tes fonctions (le code), comme lireDistance(), peuvent se trouver avant ou après void setup() et void loop();, ça n'a pas d'importance.

    En général on met:
    Les déclarations
    setup()
    loop()
    et le reste du programme, dont tes fonctions comme lireDistance().

    PS: Le code du post #7 se compile très bien, tu as du avoir un problème de copier/coller.

    Cordialement
    jpbbricole

  9. #9
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    En général on met:
    Les déclarations
    setup()
    loop()
    et le reste du programme, dont tes fonctions comme lireDistance().
    Oui, tant qu'on reste dans l'IDE arduino c'est effectivement une possibilité car l'IDE va s'arranger pour générer ce qu'il faut pour que les fonctions soient connues du compilateur.

    En règle générale cependant, et en C ou C++ "propre", il faut déclarer les éléments qu'on utilise avant de les utiliser. ça semble logique.

    Donc si on veut prendre de bonnes habitudes (surtout que l'IDE se trompe parfois quand on a plusieurs onglets dans un projet avec des .cpp et des .h) on mettra plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Les include
    Les déclarations globales de variables
    Les déclarations de fonctions
    setup()
    loop()
    (ou alors on met soit même les déclaration des en tête de fonction au début mais c'est du boulot)

    Pour trouver le setup() et la loop(), il suffit de scroller tout en bas du fichier, donc pas difficile à repérer et comme cela on respecte la norme et on n'a pas de mauvaises surprises plus tard quand on attaque des projets plus importants.

  10. #10
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Jay M

    Citation Envoyé par Jay M Voir le message
    Oui, tant qu'on reste dans l'IDE arduino c'est effectivement une possibilité car l'IDE...
    Il ne faut pas perdre de vue que l'on est dans un forum Arduino donc environnement de développement Arduino.
    Citation Envoyé par Jay M Voir le message
    En règle générale cependant, et en C ou C++ "propre", il faut déclarer les éléments qu'on utilise avant de les utiliser. ça semble logique.
    "Technique" que l'on trouve très rarement dans les exemples ou programmes qui "tournent" autour de l'Arduino.
    Pour moi, ce n'est pas logique et surtout pas nécessaire.
    Citation Envoyé par Jay M Voir le message
    Pour trouver le setup() et la loop(), il suffit de scroller tout en bas du fichier, donc pas difficile à repérer et comme cela on respecte la norme et on n'a pas de mauvaises surprises plus tard quand on attaque des projets plus importants.
    setup() et loop() étant les pivots essentiel à tout programme Arduino, il est illogique de les trouver "au fond" du programme, les concepteurs du "système Arduino" ne se sont pas trompés.

    Cordialement
    jpbbricole

  11. #11
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2022
    Messages : 7
    Par défaut
    Citation Envoyé par Jerome Briot Voir le message
    Enlève le code de la fonction lireDistance de la fonction loop (ligne 24 à 33) et place le avant la fonction setup.
    ça me donne l'erreur:a function-definition is not allowed here before '{' token

  12. #12
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    déclare tes fonctions avant setup() et loop() ou prédéfinis tes fonctions :
    https://www.developpez.net/forums/d2...in-this-scope/

    Aère aussi un peu ton code, ça n'a aucune influence sur la compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include<Servo.h>                           
    Servo servoAvant, servoArriere;
    #define trigger 2
    #define echo 4
    int avant[]={60,120,120,60};
    int arriere[]={120,120,60,60};
    int distance=0;
    int distMin=20;
     
    int lireDistance() 
    {
        long lecture_echo;
        long cm;
        digitalWrite(trigger, HIGH);
        delayMicroseconds(10);
        digitalWrite(trigger, LOW);
        lecture_echo = pulseIn(echo, HIGH);
        cm = lecture_echo*0.017;
        return cm;
    }
     
    void avance()
    {
      for (int n=0;n<4;n++) 
      {
        servoAvant.write(avant[n]);
        servoArriere.write(arriere[n]);
        delay(250);
      }
    }
     
    void setup()
    {
      servoAvant.attach(5);
      servoArriere.attach(6);
      pinMode(trigger, OUTPUT);
      digitalWrite(trigger, LOW);
      pinMode(echo, INPUT);
    }
     
    void loop()
    {
     
      distance = lireDistance();
      if (distance > distMin)
      {
        avance();
      }
     
    }

  13. #13
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2022
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2022
    Messages : 7
    Par défaut
    erreur:a function-definition is not allowed here before '{' token ligne 44

  14. #14
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    pour moi le code compile sans souci dans l'IDE arduino

  15. #15
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Oui l’équipe arduino a essayé de fournir des aides pour le programmeur debutant

    Comme je le disais Pour la plupart des sketchs ça fonctionne dans l’IDE mais ce n’est pas la norme. C’est important de la connaître et de comprendre que l’IDE fait du boulot pour vous et comme parfois se trompe… le savoir vous permettra de debugger ce genre d’erreur. C’était l’objet de mon post.

    Pour ce qui est de la logique, quand vous faites une explication, Ça semble normal de définir les termes employés avant des les utiliser ou de fournir un glossaire, non? C’est un peu pareil pour le compilateur.

  16. #16
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Jay M
    Citation Envoyé par Jay M Voir le message
    ...et comme parfois se trompe… le savoir vous permettra de debugger ce genre d’erreur. C’était l’objet de mon post.
    Ce serait intéressant d'avoir un exemple, un cas de figure.

    Cordialement
    jpbbricole

  17. #17
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    Ce serait intéressant d'avoir un exemple, un cas de figure.

    Un exemple, essayez de compiler cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void setup() {
      uneFonction();
    }
     
    void loop() {}
     
    auto uneFonction() -> void{}
    ==> le compilateur va se plaindre qu'il ne connait pas uneFonction()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    In function 'void setup()':
    sketch_mar06a:3:3: error: 'uneFonction' was not declared in this scope
       uneFonction();
       ^~~~~~~~~~~
    exit status 1
    'uneFonction' was not declared in this scope
    maintenant mettez la définition de uneFonction au début:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    auto uneFonction() -> void{}
     
    void setup() {
      uneFonction();
    }
     
    void loop() {}
    et ça compile tout seul. C'est bien sûr un exemple un peu tiré par les cheveux (et avancé dans la définition de la fonction) mais ça montre les limites du générateur de prototypes. Il est parfois trop simpliste quand on commence à faire de projets "matures".

    Les limites du générateur sont discutées à plusieurs endroit.

    La patronne d'Adafruit ("Lady Ada") a posté ce bug par exemple: https://github.com/arduino/arduino-builder/issues/68 qui a été classé en "imperfection"...

    Voici un bug ouvert par exemple (imaginez que les 2 enum + fonctions proviennent d'un include par exemple qui peut injecter des déclarations et du code)

    C'était l'objet de mon post, il est bon de savoir que l'IDE n'est pas infaillible et que parfois on peut avoir des messages d'erreurs un peu incompréhensibles surtout quand on commence à avoir plusieurs onglets, des includes etc. (le plus souvent c'est dû à un type déclaré après que du code ait été injecté et le prototype ne connaît pas le type).

  18. #18
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Jay M

    Citation Envoyé par Jay M Voir le message
    C'est bien sûr un exemple un peu tiré par les cheveux
    J'allais le dire!

    J'ai recherché auto dans Arduino reference, je n'ai pas trouvé, en C++ oui.
    Je m'attendais a un exemple plausible que tout amateur d'Arduino serait susceptible de croiser dans les moultes exemples ou tuto trouvés sur le net voire dans des bouquins.

    Cordialement
    jpbbricole

  19. #19
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    Je m'attendais a un exemple plausible que tout amateur d'Arduino serait susceptible de croiser dans les moultes exemples ou tuto trouvés sur le net
    Vous vouliez des exemples, je vous en ai donné.

    Comme je l’ai dit c’est quand le code devient un peu compliqué que ça se manifeste. Donc il n’y a pas d’exemple en 3 lignes "de programmeur de base".

    Et (pour la troisième fois), mon post était pour alerter sur la possibilité d’erreur générée par l’IDE Arduino Si on ne respectait pas la norme C++, ce qui reste le compilateur utilisé au final après l’injection de code faite par l’IDE.

    Donc soit vous respectez la norme C++ et prenez l’habitude d’écrire du code correct et c’est applicable partout et vous n’aurez pas de problème, soit vous dépendez de l’IDE et dans ce cas là il vaut mieux être informé que dans des cas rares Vous pourrez avoir un souci de compilation et maintenant vous saurez où creuser…

    Un programmeur informé en vaut deux

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

Discussions similaires

  1. Problème pour lancer une fonction dans une classe
    Par Jiyuu dans le forum Général Python
    Réponses: 13
    Dernier message: 24/08/2010, 09h05
  2. Réponses: 2
    Dernier message: 19/04/2010, 17h04
  3. Réponses: 7
    Dernier message: 10/09/2005, 16h49
  4. Problème d'utilisation de fonction dans une popup
    Par Pymm dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 06/09/2005, 15h00
  5. Réponses: 2
    Dernier message: 17/08/2005, 11h20

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