Go Down

Topic: Quelle est la difference entre ces struct (Read 165 times) previous topic - next topic

pierrot10

Bonjour,
Je ne suis pas un expert dans le structure (struct)

J'ai été aidé pour réalisé ceci (en gros)
Code: [Select]

struct capteur
{
  uint8_t idDuCapteur;
  boolean actif;
  const char * nomDuCapteur;
};

capteur mesCapteur[] = {
  {capteur_battery_id, battery_active, "ba"},
  {capteur_temperature_id, temperature_active, "te"},
  {capteur_pression_id, pression_active, "pr"},
  {capteur_alt_id, alt_active, "al"},
  {capteur_humidity_id, humidity_active, "hu"},
  {capteur_moisture_id, moisture_active, "mo"},
  {capteur_luminosity_id, luminosity_active, "lu"},
  {capteur_wm1_id, wm1_active, "w1"},
  {capteur_wm2_id, wm2_active, "w2"},
  {capteur_wm3_id, wm3_active, "w3"},
  {capteur_datetime_id, datetime_active, "da"},
  {capteur_airquality_id, airquality_active, "aq"},
  {capteur_temperature_soil_id, temperature_soil_active, "ts"},
  {capteur_gauge_id, gauge_active, "ga"},
  {capteur_wind_id, wind_active, "wi"},
};

Maintenant, je travaille sur un code, et j'appercois ceci
Code: [Select]

typedef struct {
  int moisture; //!< Moisture
  long resistance; //!< Resistance
} values;
values valueOf[NUM_READS];


J'ai réalisé que cette patie de code n'est pas utilisé dans l'exemple de mon sketch, mais elle n'est pas anodine et j'aimerais l'exploiter.

Ce qui m'interpelle c'est ceci, dans la déclaration:
Code: [Select]
typedef struct {[/code
car si je supprime value, mon compilateur m'affiche une erreur
[code]typedef struct {
  int moisture; //!< Moisture en %
  long resistance; //!< Resistance
};


La différence entre mon code et l'exemple, c'est le
Code: [Select]
typedef

Comment dois-je interpreté ces deux cas?
Je pense que c'est deux manière de faire, mais je voulais avoir un peu de théorie.

Mon code me retourne la résistence d'un capteur d'humidité du sol et le teneur en eau en pourcentage.
Ca fonctionne comme le code est actuellement, mais je voulais mieux faire/perfectionner en exploitant donc ceci
Code: [Select]

#define NUM_READS (int)10    // Number of sensor reads for filtering
long buffer[NUM_READS];
typedef struct {
  int moisture; //!< Moisture
  long resistance; //!< Resistance
} values;
values valueOf[NUM_READS];


PS mon code va mesurer 10 fois la résistence/pourcentage et la valeur finale sera la moyenne

Que me diriez-vous?

Milles mercis!!!
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

biggil

ces deux déclarations :
Code: [Select]
typedef struct {
  int moisture;
  long resistance;
} values;

et
Code: [Select]
struct values {
  int moisture;
  long resistance;
};

sont pratiquement équivalentes.

J-M-L

#2
May 21, 2018, 08:44 am Last Edit: May 21, 2018, 08:46 am by J-M-L
ces deux déclarations :
Code: [Select]
typedef struct {
  int moisture;
  long resistance;
} values;

et
Code: [Select]
struct values {
  int moisture;
  long resistance;
};

sont pratiquement équivalentes.
Dans le passé ne pas mettre typedef obligeait de réutiliser le mot struct dans des déclarations ultérieures mais ce n'est plus le cas aujourd'hui, le typedef avec une struct n'est plus nécessaire

---- cf ce topic (par exemple, premier trouvé)
Quote
Lorsqu'on donne un nom à un type structure par typedef, l'utilisation est beaucoup plus aisée. En effet, si on déclare :
Code: [Select]
struct personne
   {
   ...
   }

les déclarations de variables se feront par :
Code: [Select]
struct personne p1,p2;
alors que si on déclare :
Code: [Select]
typedef struct
   {
   ...
   } PERSONNE;

les déclarations de variables se feront par :
Code: [Select]
PERSONNE p1,p2;
on voit que la seconde méthode permet d'éviter d'avoir à répéter struct.
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

pierrot10

Hello,
Merci pour vos précisions!

En fait, actuellement mon code utilise un buffer pour calculer la résistence. Le truc c'est que le buffer, ne mémorise que la résistence et rien n'est prévu pour le pourcentage (sauf ce truct)

Code: [Select]
addResistance(resistance);
// Averaging algorithm
void addResistance(long resistance)
{
  buffer[idx] = resistance;
  idx++;
  if (idx >= NUM_READS) {
    idx = 0;
  }
}
long averageResistance()
{
  long sum = 0;
  for (int i = 0; i < NUM_READS; i++) {
    sum += buffer[i];
  }
  return (long)(sum / NUM_READS);
}



Donc, là, je pose encore la question, quelle est la différence ou qu'est qui est le mieux de faire entre un buffer et un struct. Quel est l'aventage du struct?

Ceci étant dit, je dois aussi faire la même chose avec la résistence et le pourcentage et est prévu pour le pourcentage (sauf le struct)

Donc, ce que je pouvais faire, c'est dupliquer addResistance and averageResistence et les renommer en addPercent() et averagePercent() et utilisé un deuxième buffer (buffer_r et buffer_p, par exemple), mais là je ne suis pas convaincu que c'est la solution la plus optimal, surtout que j'ai trouvé ce struct qui était déjà déclarer
Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!
You can not know everything, perseverance, it is almost everything!

J-M-L

#4
May 21, 2018, 10:24 am Last Edit: May 21, 2018, 10:42 am by J-M-L
Une struct permet de regrouper au sein d'une unité (un type) plusieurs variables potentiellement de types différents mais conceptuellement liées. Par exemple une structure personne pourrait avoirdes champs nom, prénom, date de naissance, numéro de sécu. et Ensuite vous pouvez créer un tableau de personnes

Si vous n'avez qu'une seule variable alors pas besoin de grouper quoi que ce soit et la struct est inutile
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

biggil

#5
May 21, 2018, 06:51 pm Last Edit: May 21, 2018, 06:52 pm by biggil
Dans le passé ne pas mettre typedef obligeait de réutiliser le mot struct dans des déclarations ultérieures mais ce n'est plus le cas aujourd'hui, le typedef avec une struct n'est plus nécessaire
C'est sans doute l'influence du C++.
En C++, la seule différence entre struct et class est que dans une struct, par défaut les membres sont de type "public", alors que dans une class, ils sont de type "private".

_pepe_

Dans le passé ne pas mettre typedef obligeait de réutiliser le mot struct dans des déclarations ultérieures mais ce n'est plus le cas aujourd'hui, le typedef avec une struct n'est plus nécessaire
En dehors du cas où la structure définit explicitement un type (usage de typedef), l'obligation de réutiliser le mot struct dans les déclarations ultérieures est toujours d'actualité en langage C.

Si l'on peut s'en passer en "langage" Arduino, c'est parce qu'il s'agit de langage C++.

Mais si l'on rajoute un fichier C à son projet Arduino (i.e. avec une extension .c), on peut constater que le compilateur rapporte une erreur lorsqu'on omet le mot struct.

J-M-L

En dehors du cas où la structure définit explicitement un type (usage de typedef), l'obligation de réutiliser le mot struct dans les déclarations ultérieures est toujours d'actualité en langage C.

Si l'on peut s'en passer en "langage" Arduino, c'est parce qu'il s'agit de langage C++.

Mais si l'on rajoute un fichier C à son projet Arduino (i.e. avec une extension .c), on peut constater que le compilateur rapporte une erreur lorsqu'on omet le mot struct.
Effectivement c'est pour le C++
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Go Up