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

C++ Discussion :

Problème dans une fonction


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Curieux
    Inscrit en
    Novembre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Curieux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 17
    Points : 0
    Points
    0
    Par défaut Problème dans une fonction
    Le sketch que je vous donne est une mesure de température et d'humidité par un DHT22
    Mon problème est le suivant :
    lorsque ces lignes de code se trouvaient dans le Main, la compilation se faisait sans problèmes et tout fonctionnait normalement
    Mais lorsque j'ai voulu faire de cette mesure une fonction mesure_temperature séparée, le compilateur m'affiche l'erreur suivante : 'dht' was not declared in this scope

    Je n'arrive pas à savoir pourquoi cela fonctionne en tant que lignes de code dans le main mais pas lorsque j'en fait une fonction séparée


    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
    int mesure_temperature(float Temp, float Humidity) {
        int z = 0;
     
        for (z = 1; z < 50; z++) {
     
            digitalWrite(pine_provider, LOW); // LED ROUGE eteinte 
     
            float mesureH = dht.readHumidity(); // Lecture du taux d'humidité
            Serial.println(mesureH);
     
            float mesureT = dht.readTemperature(); // Lecture de la température en Celcius
            Serial.println(mesureT);
     
            if (isnan(mesureH) || isnan(mesureT)) // Stop le programme et renvoie un message d'erreur si le capteur ne renvoie aucune mesure
            {
                Serial.println("Echec de lecture !");
                return;
            }
            moyenneT = moyenneT + mesureT;
            moyenneH = moyenneH + mesureH;
     
        }
        digitalWrite(pine_provider, HIGH); // LED ROUGE allumée
     
        Temp = moyenneT / 49;
        Humidity = moyenneH / 49;
     
        return (Temp, Humidity);
    }
     
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    dht ne serait pas une variable globale dans le fichier main par hasard ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Curieux
    Inscrit en
    Novembre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Curieux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 17
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Bousk Voir le message
    dht ne serait pas une variable globale dans le fichier main par hasard ?
    Les instructions dht.readTemperature and dht.readHumidity font partie de la bibliothèque DHT.h que j'ai déclarée au début de mon code principal

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par Jo6466 Voir le message
    Les instructions dht.readTemperature and dht.readHumidity font partie de la bibliothèque DHT.h que j'ai déclarée au début de mon code principal
    Bonjour
    Oui ces fonctions sont dans DHT.h, mais il faut initialiser creer un dht, avant, est ce que cela est bien fait?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "DHT.h"
     
    #define DHTPIN 2
    #define DHTTYPE DHT22 
     
    DHT dht(DHTPIN, DHTTYPE);

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 416
    Points : 1 443
    Points
    1 443
    Par défaut
    Bonjour,

    kajtp répond bien à la question, mais j'ai vu quelques trucs étranges dans le code:

    Tu passes Temp et Humidity par valeur, donc ce n'est qu'une copie que tu modifies, donc la modification est perdue quand tu quittes la fonction.

    Il faut les passer par référence:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int mesure_temperature (float& Temp,float& Humidity)
    Et je ne pense pas que ceci compilera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (Temp,Humidity);

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Curieux
    Inscrit en
    Novembre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Curieux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 17
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par kajtp Voir le message
    Bonjour
    Oui ces fonctions sont dans DHT.h, mais il faut initialiser creer un dht, avant, est ce que cela est bien fait?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "DHT.h"
     
    #define DHTPIN 2
    #define DHTTYPE DHT22 
     
    DHT dht(DHTPIN, DHTTYPE);
    Oui cela existe dans mon programme principal et ces mêmes lignes dht.readTemperature and dht.readHumidity sont parfaitement compilées et donnent bien les résultats escomptés quand elles sont dans le programme MAIN
    C'est lorsqu'elles sont déménagées dans la fonction mesure_temp que j'ai créée que ces mêmes lignes refusent d'être compilées

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Curieux
    Inscrit en
    Novembre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Curieux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 17
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Guntha Voir le message
    Bonjour,

    kajtp répond bien à la question, mais j'ai vu quelques trucs étranges dans le code:

    Tu passes Temp et Humidity par valeur, donc ce n'est qu'une copie que tu modifies, donc la modification est perdue quand tu quittes la fonction.

    Il faut les passer par référence:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int mesure_temperature (float& Temp,float& Humidity)
    Et je ne pense pas que ceci compilera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (Temp,Humidity);
    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
    J'ai modifié le code en passant par 2 variables intermédiaires T et H mais le compilateur continue à stopper et me dire 'dht' was not declared in this scope
     
     
    int mesure_temperature (float& Temp,float& Humidity)
      {
        int z=0;
     
        for (z = 1; z < 50; z++)                                              
                                                        {
     
                                                          digitalWrite (pine_provider,LOW); // LED ROUGE eteinte 
     
                                                          float mesureH = dht.readHumidity(); // Lecture du taux d'humidité
                                                          Serial.println(mesureH);
     
                                                          float mesureT = dht.readTemperature(); // Lecture de la température en Celcius
                                                          Serial.println(mesureT);
     
                                                              if (isnan(mesureH) || isnan(mesureT)) // Stop le programme et renvoie un message d'erreur si le capteur ne renvoie aucune mesure
                                                                {
                                                                  Serial.println("Echec de lecture !");
                                                                  return;
                                                                }   
                                                          moyenneT = moyenneT + mesureT;
                                                          moyenneH = moyenneH + mesureH;
     
                                                        } 
                                                         digitalWrite (pine_provider, HIGH); // LED ROUGE allumée
     
                                          T = moyenneT/49;
                                          H = moyenneH/49;
     
                                          return (T,H);
      }

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 416
    Points : 1 443
    Points
    1 443
    Par défaut
    Je préférerais voir ton main() avant de me prononcer, mais j'imagine qu'il ressemble à ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
        DHT dht(DHTPIN, DHTTYPE);
        float Temp;
        float Humidity;
        mesure_temperature(Temp, Humidity);
        return 0;
    }
    Dans ce cas, 3 solutions:
    ->Soit, comme suggéré plus tôt, tu déclares dht à l'extérieur de main() pour le rendre global (donc visible de tout le monde, y compris de mesure_temperature)
    ->Soit (je doute que ce soit une bonne idée, enfin tout dépend de l'implémentation de DHT) tu le déclares au début de mesure_temperature
    ->Soit tu ajoutes dht en paramètre de mesure_temperature (ce que je conseillerais)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int mesure_temperature (float& Temp,float& Humidity, DHT& dht)

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Curieux
    Inscrit en
    Novembre 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Curieux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 17
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Jo6466 Voir le message
    [CODE]
    Dans ce cas, 3 solutions:
    ->Soit, comme suggéré plus tôt, tu déclares dht à l'extérieur de main() pour le rendre global (donc visible de tout le monde, y compris de mesure_temperature)
    ->Soit (je doute que ce soit une bonne idée, enfin tout dépend de l'implémentation de DHT) tu le déclares au début de mesure_temperature
    ->Soit tu ajoutes dht en paramètre de mesure_temperature (ce que je conseillerais)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int mesure_temperature (float& Temp,float& Humidity, DHT& dht)
    Problème résolu : la compilation se fait complètement maintenant

    j'ai ajouté cette ligne dans la fonction : DHT dht(DHTPIN, DHTTYPE);

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

Discussions similaires

  1. Petit problème dans une fonction
    Par Jiyuu dans le forum wxPython
    Réponses: 6
    Dernier message: 08/07/2008, 22h49
  2. probléme dans une fonction qui retourne un data reader
    Par saraenim dans le forum Windows Forms
    Réponses: 32
    Dernier message: 28/04/2008, 21h53
  3. Problème dans une fonction PL/SQL
    Par jnayna86 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/04/2008, 13h28
  4. Problème dans une fonction
    Par onefootstep dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 02/11/2006, 09h46
  5. [Debutant] Problème dans une fonction
    Par haludo dans le forum Langage
    Réponses: 4
    Dernier message: 19/10/2006, 09h25

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