[Résolu] Problème d'affectation des champs d'une variable structurée

Bonjour à tous,

Je découvre la pratique des variables structurées après avoir lu quelques pages (d’un livre et d’internet) là-dessus et je n’arrive pas à faire ce que je souhaite.

Voilà le code que j’utilise :

//**************************************************************
//Chargement des librairies
//**************************************************************

//pour déboguage
#include <MemoryFree.h>


//**************************************************************



//taille des tableaux de mesure
const byte tailletableau=8;

 
//**************************************************************
//Définition de la structure MesurePulse
//**************************************************************
//représente un pin sur lequel une détection d'impulsion est faite
struct MesurePulse{
  int Pin;//pin de mesure (ex : A0)
  int NbPulse;//nombre d'impulsion comptées
  float ValPulse;//valeur d'une impulsion
  unsigned long msLastPulse;//valeur de millis() à la dernière impulsion
  int ValMesures[tailletableau];//tableau des valeurs des dernières mesures
  unsigned long MsMesures[tailletableau];//tableau des moments des dernière mesures (obtenus avec millis())
  char Filename[12+1];//nom du fichier (longueur maximale au format 8.3 : 12)
};


//**************************************************************



//nombre de pin sur lequel les mesures d'impulsion se feront
const int NbMesureP = 3;
//tableau de type structuré MesurePulse contenant l'ensemble des mesures
MesurePulse MesuresP[NbMesureP];



void setup()
{
  

  // configuration de la liaison série
  Serial.begin(9600);
  
  Serial.println(sizeof(MesuresP));
  
  
  //**************************************************************
  //Définition des instances de type structuré MesurePulse
  //**************************************************************
  //liste des pins utilisés
  int ListPin[NbMesureP] = {5, 6, 7};
  //affectation d'une partie des champs
  for (int i=0; i < NbMesureP;i++) {
    //affichage pour débogue
    Serial.println(ListPin[i]);//fonctionne
    
    //création d'une variable temporaire
    MesurePulse MesureP;
    
    //afectation d'un nom de fichier
    char tmp[10];
    itoa(i,tmp,10);
    strcat(tmp,".txt");
    //affichage pour débogue
    Serial.println(tmp);//fonctionne
    strcpy(MesuresP[i].Filename,tmp);//ne fonctionne pas
    
    //affectation d'un numéro de pin
    MesureP.Pin=ListPin[i];//fonctionne
    
    //affectation d'un nombre d'impulsion
    MesureP.NbPulse=i*2;//fonctionne
    
    //enregistrement de la variable temporaire dans la variable globale
    MesuresP[i] = MesureP;
  }
  
  
  Serial.print("mémoire libre : ");
  Serial.println(freeMemory());
  Serial.println();

}

void loop ()
{
  for (int i=0; i < NbMesureP;i++) {
    MesuresP[i].NbPulse++;
    Serial.print("Filename : ");
    Serial.println(MesuresP[i].Filename);
    Serial.print("Pin : ");
    Serial.println(MesuresP[i].Pin);
    Serial.print("NbPulse : ");
    Serial.println(MesuresP[i].NbPulse);
    Serial.println();
  }
  
  
  Serial.println(MesuresP [1].Filename);
  strcpy(MesuresP [1].Filename,"poireau");
  Serial.println(MesuresP [1].Filename);
  
  delay(2000);
}

Voilà ce que j’observe dans le moniteur série :

219
5
0.txt
6
1.txt
7
2.txt
mémoire libre : 1445

Filename : 
Pin : 5
NbPulse : 1

Filename : 
Pin : 6
NbPulse : 3

Filename : 
Pin : 7
NbPulse : 5


poireau
Filename : 
Pin : 5
NbPulse : 2

Filename : poireau
Pin : 6
NbPulse : 4

Filename : 
Pin : 7
NbPulse : 6

Mon problème est donc que je n’arrive pas affecter la valeur d’un champ en utilisant une formule du type MesuresP[j].NomDuChamp (cf setup), alors qu’avec la même formule j’arrive à lire la valeur du champ en question (cf loop).

Quelqu’un peut-il m’aider ?

Je pense que le problème ce trouve là:

         strcpy(MesuresP[i].Filename,tmp);//ne fonctionne pas


    //enregistrement de la variable temporaire dans la variable globale
    MesuresP[i] = MesureP;

Tu fais une opération sur MesureP et plus loin tu fais MesuresP = MesureP; ce qui n’est pas très logique d’autant que je ne suis pas certain que l’opérateur d’affectation soit défini pour les structures.
Entre nous je ne vois pas l’intérêt de passer par une variable temporaire pour initialiser ton tableau de structure.
Je verrais plutôt quelque chose comme ça:
*_ <em>*    for (int i=0; i < NbMesureP;i++) {    //affichage pour débogue    Serial.println(ListPin[i]);//fonctionne        //affectation d'un nom de fichier    char tmp[10];    itoa(i,tmp,10);    strcat(tmp,".txt");    //affichage pour débogue    Serial.println(tmp);//fonctionne    strcpy(MesuresP[i].Filename,tmp);//ne fonctionne pas        //affectation d'un numéro de pin    MesuresP[i].Pin=ListPin[i];//fonctionne        //affectation d'un nombre d'impulsion    MesuresP[i].NbPulse=i*2;//fonctionne      }*</em> _*

Bonjour, Il me semble que l'utilisation des "structur" dans l'IDE Arduino peut poser des problèmes. Il faut mettre la "struct" dans un fichier .h qui se trouve dans le même répertoire que le fichier .ino. Ne pas oublier de mettre #include "???.h" dans le programme xxx.ino. Je crois avoir lu cela sur le site de Skywodd @+

icare:
Bonjour,
Il me semble que l’utilisation des “structur” dans l’IDE Arduino peut poser des problèmes. Il faut mettre la “struct” dans un fichier .h qui se trouve dans le même répertoire que le fichier .ino.
Ne pas oublier de mettre #include “???.h” dans le programme xxx.ino.
Je crois avoir lu cela sur le site de Skywodd
@+

+1
exemple dans un .h :

#ifndef TERRACPP_H_INCLUDED
#define TERRACPP_H_INCLUDED
//typedef struct Saison Saison;
struct  Saison
{
    Date date;// Structure contenant la date j/m/a
    int nbS;//nombre de semaine de la gradation
    float tempMax ;// temperature coupure alarme
    float tempMin ;// temperature  chauffage jour
    float tempMoy;// temperature max lampe chauffante
    float tempMinNuit;// temperature nuit chauffage

};
#endif // TERRACPP_H_INCLUDED

apres dans ton code c’est bien :

Structure variableStructure;
variableStructure.variableInterne;

attention cas d’un tableau de structure :

Structure  variableStructure[i];
variableStructure[i].variableInterne;

est dans le cas de pointeur le plus simple c’est le “->”

Structure *variableStructure;
variableStructure->variableInterne;
Structure *variableStructure[i];
variableStructure[i]->variableInterne;

on hesite pas a me reprendre si je me suis planté :wink:

icare: Bonjour, Il me semble que l'utilisation des "structur" dans l'IDE Arduino peut poser des problèmes. Il faut mettre la "struct" dans un fichier .h qui se trouve dans le même répertoire que le fichier .ino. Ne pas oublier de mettre #include "???.h" dans le programme xxx.ino.

Je n'ai jamais eu de problème en déclarant des structures directement dans le sketch

Je plussoie fdunews sur toutes ses remarques :

  • L'utilisation de fichier H permet de structurer son code mais ne résoud pas le problème
  • Pour moi l'analyse initiale de fdunews est la bonne. Il n'y a aucune raison que l'appel à strcpy() ne fonctionne pas. Si tu mets un Serial.print juste après tu devrais le constater. Par contre l'affectation 2 lignes dessous écrase ce que tu vients de faire car en C++ l'opérateur = fonctionne pour les structures (qui sont assimilés à des classes). J'ai un doute en C pur mais 100% sur en C++. Or le fichier INO est compilé comme du C++.

/mode coup de vent

fdufnews:
Je n’ai jamais eu de problème en déclarant des structures directement dans le sketch

Passe ta structure par pointeur ou par référence en argument d’une fonction et admire le résultat :wink:
L’ide arduino ne prend pas en compte les dépendances quand il génère les prototypes de fonction.
Il fout tout en début de fichier après les includes, donc si tu as un typedef c’est cuit.

barbudor: Par contre l'affectation 2 lignes dessous écrase ce que tu vients de faire car en C++ l'opérateur = fonctionne pour les structures (qui sont assimilés à des classes). J'ai un doute en C pur mais 100% sur en C++. Or le fichier INO est compilé comme du C++.

Effectivement, c'est sans doute ça le problème. Je n'avais pas compris avec le message de fdunews, mais là c'est plus clair. Je vais tâcher de faire un test ce soir, et je vous tiens au courant.

C'était bien ça le problème. Merci pour vos réponses.