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 :

Modifier une partie d'une structure


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2020
    Messages : 6
    Par défaut Modifier une partie d'une structure
    Bonjour,
    J'ai une stucture de ce type :
    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
     
    struct temps //données de température pour un niveau d'un immeuble
    {
      float temp_confort=18.5;
      float temp_hysteris=0.1;
      uint8_t dh_enReduit[6]={5,18,0,7,20,0};
      ...
    };
     
    struct mesparametres //ensemble des données de deux niveaux
      {     
        temps rdc,etg;
        ...
      };
    mesparametres datanvs; //cette variable est globale et contient tous les paramètres à sauvegarder.
    Je souhaite pouvoir modifier au choix datanvs.rdc ou datanvs.etg dans une même fonction.
    J'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void interpreteData(AsyncWebServerRequest *request,uint8_t ou)
    { //ou=0 pour le rdc et 1 pour l'etg
      temps *adrtemp;
      if (ou==0) adrtemp=&datanvs.rdc; else adrtemp=&datanvs.etg;
      int i = request->getParam("JourSemaineDebutWE")->value().toInt();
      (*adrtemp).dh_enReduit[0]=i;
    Au départ je souhaitais donner directement datanvs.rdc ou datanvs.etg comme paramètre (par référence) mais sans succès, cette autre solution me paraissait être la plus sûre, il n'y a pas de problème de compilation mais plantage systématique à l'éxécution.
    Je patauge donc mais suis désireux de progresser ...
    Quelqu'un peut-il me venir en aide ?
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 576
    Par défaut
    Hello,

    Veuillez insérer Serial.println("Etape 1") avant la ligne getParam et Serial.println("Etape 2") avant la ligne (*adrtemp). Le dernier message affiché avant le redémarrage identifiera le coupable je pense...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2020
    Messages : 6
    Par défaut
    Merci Fred1599 de votre proposition qui m'a permis de trouver la cause du problème.
    La syntaxe du code visible dans mon message n'était pas en cause, le problème était dans les ... que je n'avais pas copiés ici pour simplifier.
    J'en ai profité pour modifier mon code afin de le rendre plus court et plus clair, si cela peut servir à quelqu'un :

    Les déclarations de structure :
    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
     
    struct temps  //données météo pour un étage
    {
      float temp_confort=18.5;
      ...
      uint8_t dh_enReduit[6]={5,18,0,7,20,0};
    };
     
    struct mesparametres //données méteo pour un immeuble
      { //attention tout le contenu de la variable datatnvs est écrasé au chargement des paramètres
        ...
        temps rdc,etg;
        ...
      };
    mesparametres datanvs; //le paramètre regroupant tout
    La fonction qui reçoit l'adresse d'une partie de la structure à modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void interpreteData(AsyncWebServerRequest *request, temps* ou)
    { 
      int i;
      float x;
      if (request->hasParam("JourSemaineDebutWE"))
      {
        i = request->getParam("JourSemaineDebutWE")->value().toInt();
        ou->dh_enReduit[0]=i;    
      } else Serial.println("la requete ne contient pas JourSemaineDebutWE");
      ...
    }
    et l'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    server.on("/setParamTempetg", HTTP_GET, [](AsyncWebServerRequest *request){
        interpreteData(request, &(datanvs.etg)); //je donne l'adresse de la partie à modifier
        request->send(200);
      });

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 576
    Par défaut
    De rien...

    Votre code actuel utilise un pointeur (temps* ou).
    Que se passerait-il si un autre développeur (ou vous-même dans 6 mois) appelait cette fonction par erreur avec un pointeur nul ?

    Refactoriser avec référence est une bonne idée...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

Discussions similaires

  1. JQuery - Modifier une structure HTML
    Par Rémy DEV dans le forum jQuery
    Réponses: 6
    Dernier message: 05/12/2017, 15h43
  2. modifier une structure
    Par boboss123 dans le forum C
    Réponses: 2
    Dernier message: 15/03/2010, 10h06
  3. Modifier une structure toutes les secondes
    Par jmathon dans le forum Débuter
    Réponses: 1
    Dernier message: 20/10/2008, 15h49
  4. Modifier une structure
    Par Hew dans le forum MATLAB
    Réponses: 14
    Dernier message: 22/02/2008, 17h57
  5. Modifier une partie de la source
    Par Sékiltoyai dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/10/2004, 22h52

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