Go Down

Topic: Classe -> Passer d'une variable uint8_t à un tableau de char (Read 113 times) previous topic - next topic

Geeks

Bonjour,

Je cherche à passer d'un uint_8 * TEXT à un char en vue d'en retirer sa longueur et à le parser dans un char pour être envoyé dans une commande I2C.

Le Header:
Code: [Select]

class LcdMidasI2c
{
public:
void printLCD(uint8_t *TEXT);
};


Le Cpp:
Code: [Select]

void LcdMidasI2c::printLCD(uint8_t *TEXT)
{

int lengthText = sizeof(&TEXT);

for(uint8_t i = 0; i<lengthText; i++)
{
writedata(TEXT[i]);
}
}


writedata(); pour le moment le me pose pas de problème !

J'ai une belle erreur de conversion de type au niveau du int length... Logique puisque je dois passer d'un type à un autre (ou alors redéfinir la façon dont ça se fait).

Merci pour votre aide.

Geeks

Petit oubli...
Lorsque je fais appel dans mon sketch à la fonction :
Code: [Select]

lcd.printLCD("TEST1234");


Si je vide la fonction, ça plante de la même façon. J'en déduit que c'est ma déclaration et le passage de variable qui ne convient pas.

kamill

Bonjour,

Pour connaitre la longueur d'une chaine il faut utiliser strlen.
Code: [Select]
int lengthText = strlen(TEXT);

Geeks

Ok. J'avais essayé, mais j'ai découvert une autre piste ! Je garde quand même sous le coude...

J'ai remarqué que les autres librairies s'appuient sur la librairie Print.h et Print.cpp.

J'ai donc fais comme eux avec mon .h:
Code: [Select]

#ifndef LcdMidasI2C_h
#define LcdMidasI2C_h

#include "Arduino.h"

#include <inttypes.h>
#include "Print.h"

class LcdMidasI2c : public Print
{
 public:
 LcdMidasI2c();
 using Print::write;
 private:
};

#endif


Et mon .cpp:
Code: [Select]

#include "LcdMidasI2C.h"

#include <Wire.h>
#include <stdio.h>
#include <string.h>
#include <inttypes.h>

LcdMidasI2c::LcdMidasI2c()
{
}


Et mon programme principal:
Code: [Select]

#include <Wire.h>
#include <LcdMidasI2C.h>

LcdMidasI2c lcd;

void setup () {

  Serial.begin(9600);
  //lcd.begin(0x3C, 16, 2); //Adresse I2C, Colonnes, Lignes
  //lcd.setCursor(0,0); //Colonne, Ligne
  lcd.print("TEST1234");
}


L'erreur n'est pas la même :
Quote
error: cannot declare variable 'lcd' to be of abstract type 'LcdMidasI2c'

 LcdMidasI2c lcd;
J'en déduit donc que la déclaration ne convient pas. Mais pourquoi ?

J-M-L

Éventuellement Lire mon tuto sur les pointeurs pour comprendre ce que & et * veulent dire
Code: [Select]
void LcdMidasI2c::printLCD(uint8_t *TEXT) {
int lengthText = sizeof(&TEXT);
vous verrez que votre & n'est pas pertinent
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

kamill

vous verrez que votre & n'est pas pertinent
Le sizeof non plus car il donne la taille du pointeur et non de la chaine.

kamill

J'en déduit donc que la déclaration ne convient pas. Mais pourquoi ?
Parce que tu n'as pas défini la fonction write().

Geeks

Oui, pour le pointeur, c'était mon code de départ, je pense qu'il y a mieux à faire.
Ok pour la longueur du pointeur, c'était pas une bonne idée aussi.
Y a presque du mieux si je rajoute :
Code: [Select]

public:
LcdMidasI2c();

virtual size_t write(uint8_t);
using Print::write;


Mais là, j'obtiens:
Quote
C:\Users\ALEXAN~1\AppData\Local\Temp\ccPGzSHd.ltrans0.ltrans.o: In function `__base_ctor ':

C:\Users\Alexandre\Documents\Arduino\libraries\ExaNumeric-Midas-I2C-LCD/ExaNumericLcdMidasI2C.cpp:9: undefined reference to `vtable for LcdMidasI2c'

C:\Users\Alexandre\Documents\Arduino\libraries\ExaNumeric-Midas-I2C-LCD/ExaNumericLcdMidasI2C.cpp:9: undefined reference to `vtable for LcdMidasI2c'
J'avais jamais vue cette erreur. Je découvre  :smiley-mr-green:

kamill

Ou est ce que la fonction write est définie?
C'est supposé faire quoi ça: 'using Print::write;'?

Geeks

Ca y est je l'ai défini, ça compile.

Code: [Select]

class LcdMidasI2c : public Print
{
public:
LcdMidasI2c();
void begin(uint8_t i2cAddr, uint8_t col, uint8_t row);
void setCursor(uint8_t col, uint8_t row);

virtual size_t write(uint8_t);
using Print::write;
private:


Et
Code: [Select]

size_t LcdMidasI2c::write(uint8_t value)
{
writeData(value);
return 1; // assume sucess
}


En utilisation:
Code: [Select]

#include <ExaNumericLcdMidasI2C.h>

LcdMidasI2c lcd;


//#include "RTClib.h"
//RTC_PCF8523 rtc;
//char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {

  Serial.begin(9600);
  lcd.begin(0x3C, 16, 2); //Adresse I2C, Colonnes, Lignes
  lcd.setCursor(0,0); //Colonne, Ligne
  lcd.print("TEST1234");
}


Bon, même si ça compile, l'écran reste vierge. Je cherche, j'investigue...

J-M-L

tant qu'on n'aura pas votre code en entier, on ne pourra pas vous aider... A quoi ça sert de faire la classe LcdMidasI2c ? vous n'avez pas une librairie toute faite déjà pour votre LCD ?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up