Probleme type de données  [RESOLU]

Le langage C permet de créer des programmes rapides et proches de la machine

Modérateur : Francois

Répondre
Avatar du membre
EVOTk
Modérateur
Messages : 807
Enregistré le : sam. 20 sept. 2014 02:36

Probleme type de données  [RESOLU]

Message par EVOTk » ven. 17 juin 2016 20:47

Bonjour,

Débutant en C++, je ne sait pas comment manipuler les types de données et se que je trouve sur internet n'est pas tres clair a se sujet ?!

Code : Tout sélectionner

      unsigned long fin_tps_test = millis();
      unsigned long tps_test = fin_tps_test - debut_tps_test;
      double tps_h_test = tps_test / 3600000;
      double tension_moy = tension_total / nb_test;
      double mamp_moy = ( tension_moy / resistance ) / 1000;
      double capacite = mamp_moy * tps_h_test;
      
      
      lcd.clear();
      lcd.home();
      lcd.print("TEST FINI");
      lcd.setCursor(0, 1);
      lcd.print(tps_h_test);
      lcd.setCursor(0, 2);
      lcd.print(tension_moy);
      lcd.setCursor(0, 3);
      lcd.print(capacite);
      lcd.print(" mAh");
Dans se test, tps_h_test m'affiche 0.00, normal car la valeur est 0.0041666 mais dans se cas, comment lui faire afficher le nombre jusqu’à 6 après la virgule par exemple ?
Edit:
En faite, le soucis est peut etre pluot que je divise dans un "double" un "unsigned" avec "3600000"
NAS : DS3615xs Xpenology - 2x 8To + 2x 3To + 2x 4To WD Red - APC Back-UPS Pro 900
SeedBox / VPN : 1To / 20Gbps / Trafic illimité chez FeralHosting
Surveillance Réseau : Smokeping sur Rasp. B / Raspbian
Imprimante 3D : Dagoma DiscoEasy 200

destroyedlolo
Raspinaute
Messages : 1234
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: Probleme type de données

Message par destroyedlolo » ven. 17 juin 2016 22:45

Salut,

Je ne sais pas comment fonctionne ton compilo, mais il y a des chances que :

Code : Tout sélectionner

tps_test / 3600000;
reste un entier et comme le résultat est <1, arrondit à un entier ca donne 0.

J'essaierai de faire un cast histoire que tous les calculs se fassent en flottant.

Code : Tout sélectionner

double tps_h_test = (double)tps_test / 3600000.0;
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Probleme type de données

Message par guillaume9344 » sam. 18 juin 2016 08:25

Bonjour,
il y a aussi la fonction lcd.print() qui peut couper le résultat 2 chiffre aprés la virgule.
pour en étre sur , faire :

Code : Tout sélectionner

lcd.print("0.123456");
Vous étes toujours sur arduino IDE? voir peut etre la doc de la fonction lcd.
Je crois aussi me souvenir que l'IDE posséde une interface série , peut etre est il possible d'envoyer des infos de débugage avec la fonction cout du c++ (équivalent à un printf mais qui accepte tous les type de variable en entrée et les convertis pour l'affichage.

@+
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Avatar du membre
EVOTk
Modérateur
Messages : 807
Enregistré le : sam. 20 sept. 2014 02:36

Re: Probleme type de données

Message par EVOTk » sam. 18 juin 2016 09:20

Effectivement,
Si je fait un test :

Code : Tout sélectionner

#include <Wire.h>  // This library is already built in to the Arduino IDE
#include <LiquidCrystal_I2C.h> //This library you can add via Include Library > Manage Library > 
LiquidCrystal_I2C lcd(0x3F, 20, 4);

double test = 0.123456789;
uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
  
void setup()  {
  lcd.init();                     
  lcd.backlight();
  lcd.createChar(1, heart);
}
  
void loop()  {
  lcd.home();
  lcd.print("   Hello World !!");
  lcd.setCursor(1, 1);
  lcd.write(byte(1));
  lcd.print(" Test LCD 4x20 ");
  lcd.write(byte(1));
  lcd.setCursor(0, 2);
  lcd.print("0.123456789");
  lcd.setCursor(0, 3);
  lcd.print(test); 
}
L'ecran m'affiche sur la 3eme ligne : 0.123456789 et sur le 4eme : 0.12

@destroyedlolo :

Merci pour l'histoire du cast. Je les mis en place, maintenant le calcul se fait meme il est arrondi a .00 a cause de lcdprint.
NAS : DS3615xs Xpenology - 2x 8To + 2x 3To + 2x 4To WD Red - APC Back-UPS Pro 900
SeedBox / VPN : 1To / 20Gbps / Trafic illimité chez FeralHosting
Surveillance Réseau : Smokeping sur Rasp. B / Raspbian
Imprimante 3D : Dagoma DiscoEasy 200

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Probleme type de données

Message par guillaume9344 » sam. 18 juin 2016 13:20

EVOTk a écrit :Effectivement,
Si je fait un test :

L'ecran m'affiche sur la 3eme ligne : 0.123456789 et sur le 4eme : 0.12
il semble que la fonction lcd.print coupe les variables 2 chiffres aprés la virgule , mais affiche correctement les chaines de carractéres (lcd.print("0.123456879")
donc une solution est de convertir le double en chaine de caractéres :

Code : Tout sélectionner

#include <iostream>   
#include <string>
using namespace std;

double test = 0.123456789;
lcd.print(to_string(test));

@+
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Avatar du membre
EVOTk
Modérateur
Messages : 807
Enregistré le : sam. 20 sept. 2014 02:36

Re: Probleme type de données

Message par EVOTk » sam. 18 juin 2016 13:30

@ guillaume9344

merci pour cette précision !
NAS : DS3615xs Xpenology - 2x 8To + 2x 3To + 2x 4To WD Red - APC Back-UPS Pro 900
SeedBox / VPN : 1To / 20Gbps / Trafic illimité chez FeralHosting
Surveillance Réseau : Smokeping sur Rasp. B / Raspbian
Imprimante 3D : Dagoma DiscoEasy 200

Répondre

Retourner vers « C / C++ »