Quelle est la difference entre ces struct

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

J'ai été aidé pour réalisé ceci (en gros)

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

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:

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

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

#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!!!

ces deux déclarations :

typedef struct {
  int moisture; 
  long resistance; 
} values;

et

struct values {
  int moisture;
  long resistance;
};

sont pratiquement équivalentes.

biggil:
ces deux déclarations :

typedef struct {

int moisture;
  long resistance;
} values;



et


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é)

Lorsqu'on donne un nom à un type structure par typedef, l'utilisation est beaucoup plus aisée. En effet, si on déclare :

struct personne

{
  ...
  }



les déclarations de variables se feront par :


struct personne p1,p2;



alors que si on déclare :


typedef struct
  {
  ...
  } PERSONNE;



les déclarations de variables se feront par :


PERSONNE p1,p2;



on voit que la seconde méthode permet d'éviter d'avoir à répéter `struct`.

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)

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

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

J-M-L:
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:
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++