Bonjour,
J'ai plusieurs capteurs branchés sur un esp32, les données recueillies sont des floats qui nécessitent des traitements statistiques similaires (moyenne, ...). J'aimerais utiliser la POO pour standardiser l'approche. Pour chaque capteur, je crée un tableau de float (une variable globale) avec par exemple
float tabTemperature[10];
float tabHygro[5];
L'objet capteur Temperature doit recevoir l'adresse du tableau tabTemperature ainsi que sa taille au moment de la création. Je ne compte pas modifier la taille des tableaux dans les objets, seulement le contenu des tableaux. J'ai donc défini une classe Capteur ainsi :
class Capteur
{
public:
Capteur::Capteur(int precision, int tailleTableau, float &tableau); //???
float mesure();
float ajouteMesure();
float publie();
float lemin();
float moyenne();
private:
int nbDecimales; //nb de décimales des mesures
int indDernValeur; //indice de la dernièrre valeur lue
int tailleFile; //prendra la valeur de tailleTableau
float tab[]; //??? = adresse du tableau de données donnée en paramètre
};
puis dans l'extrait du fichier cpp, pour l'instant j'ai
#include "capteur.hpp"
//tableau existe déjà (var globale) contenant (tailleTableau) float
Capteur::Capteur(int precision, int tailleTableau, float &tableau)
{
nbDecimales = precision; //nb de décimale de chaque valeur
tailleFile = tailleTableau;
float tab[tailleTableau]= &tableau; //???
//initialisaiton du tableau, je remplace tous les 0 par la valeur d'une première mesure
tab[0]=mesure();
for (int i=1;i<tailleFile;i++) {
tab[i]=tab[0];
}
indDernValeur = 0;
}
float Capteur::mesure()
{
// effectue une mesure directement sur le capteur
}
float Capteur::ajouteMesure()
{
// ajoute le résultat d'une mesure dans la file
indDernValeur = (indDernValeur + 1) % tailleFile;
tab[indDernValeur] = mesure();
}
Il est clair qu'il y a un problème là où j'ai indiqué ??? en commentaire mais qui provient sûrement des définitions.
J'espère avoir été clair sur l'objectif.
Quelqu'un peut-il m'expliquer ce qui cloche ?
Merci d'avance.
Si tu veux déclarer un type d'argument de type adresse mémoire, il faut écrire float *tableau
Après je n'ai pas regardé en détaille ton code, mais si tu utilise des objets, normalement c'est surtout pour ne pas avoir un collection de variable global.
Ton tableau ne devrait pas être remplis par une fonction d'acquisition de ton objet ?
Bonjour
Si dans les déclarations (la 1ère ligne ci-dessous) je mets l'étoile
Capteur::Capteur(int precision, int tailleTableau, float * tableau)
{
nbDecimales = precision; //nb de décimale de chaque valeur
tailleFile = tailleTableau;
float tab[tailleTableau]= tableau; //???
il y a encore quelque chose qui cloche dans la dernière ligne ci-dessus. Je veux initialiser la variable tab de telle sorte qu'elle pointe sur le tableau fourni en paramètre.
Pour ta seconde remarque
Ton tableau ne devrait pas être remplis par une fonction d'acquisition de ton objet ?
Oui, dans l'idéal, je souhaiterais aussi passer en paramètre de la classe Capteur un pointeur vers la fonction qui interroge le capteur physique. Si c'est un capteur de température type DS18B20, Capteur::mesure() renverra la valeur du capteur de température avec le code usuel par exemple :
float mesureTemp() {
sensors.requestTemperatures();
// Fetch the temperature in degrees Celsius for device index:
float tempC = sensors.getTempCByIndex(0);
return tempC;
}
Mon but est bien de standardiser tous les capteurs et de leur passer uniquement l'adresse d'un tableau de valeurs (historique de valeurs) + une fonction de mesure, les deux sous la forme de pointeurs. Je ne sais pas si c'est possible de le faire comme en Python.
Oui, tu définis et initialise un tableau et tu veux lui affecter une adresse mémoire.
Si tu veux affecter une adresse mémoire à une variable, cette variable doit être de type adresse mémoire.
donc si tu déclare ta variable tab en float *, tu pourra faire l'affectation.
Je ne veux pas jouer les rabats joie, mais il faudrait que tu suive quelque tutorial sur la programmation C++, parce que tu risque de faire ce genre d'erreur à chaque ligne de ton objet
La POO et les variable globales, ça ne va pas très bien ensemble !
Chaque tableau devrait être un membre d'un classe Capteur, alloué dans le ctor et libéré dans le dtor.
De plus, dans ton ctor, pourquoi t'embrouilles-tu à créer une nouvelle variable tab, au lieu de travailler directement avec le paramètre tableau ?
il faudrait que tu suives quelques tutoriaux sur la programmation C++
J'y travaille ... j'ai corrigé ma définition de tab. Merci
@biggil
Je ne veux pas allouer de la mêmoire au tableau dans le constructeur carle tableau existe (est une variable globale, un tableau par capteur), et je ne veux pas en faire une copie, je souhaite fournir son adresse à mes objets Capteur.
Quand vous dites
pourquoi t'embrouilles-tu à créer une nouvelle variable tab , au lieu de travailler directement avec le paramètre tableau ?
tableau est un paramètre du constructeur, et dans toutes les méthodes de l'objet j'ai besoin de travailler sur ce tableau donc tab est un des attributs égal à tableau (égalité d'adresses si je ne me gourre pas dans mes étoiles). Le tableau de données n'a pas à être supprimé dans le destructeur, sa taille est fixée dès le départ, le tableau existe tant que l'ESP32 est en fonction, tout comme mes objets Capteur.
Je n'ai pas précisé dès le départ mais le programme complet fonctionne déjà sans POO, mais je ne le trouve pas satisfaisant car il y a beaucoup de répétitions.
Etape suivante : Comment fournir aux objets un paramètre qui soit une fonction, celle qui permet d'interroger un capteur physique ? je cherche si c'est possible en C++ ... que je ne maîtrise pas encore suffisamment.
Je suis d'accord avec @biggil, le tableau devrait être dans la class, surtout si comme tu le dit il y a un tableau par capteur.
Je ne comprend pas quand tu dis que le tableau existe. Il est bien défini quelque part, il suffit de le définir dans la class.
Bonjour Kamill
Ce qui m'avait poussé à faire ainsi est qu'il ne m'avait pas paru possible de définir un tableau de taille paramétrable dans le constructeur.
En effet dans le constructeur, si je fournis la taille du tableau en paramètre
Capteur::Capteur(int precision, int tailleTableau)
{
nbDecimales = precision; //nb de décimale de chaque valeur
tailleFile = tailleTableau;
float tab[tailleTableau];
// initialisaiton du tableau
tab[0]=mesure();
for (int i=1;i<tailleFile;i++) {
tab[i]=tab[0];
}
indDernValeur = 0;
}
Mais dans ce cas tab devient une variable locale au constructeur, mais pas un attribut de l'objet. Je ne peux donc pas l'utiliser ailleurs ?