Classe -> Passer d'une variable uint8_t à un tableau de char

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:

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

Le Cpp:

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.

Petit oubli...
Lorsque je fais appel dans mon sketch à la fonction :

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.

Bonjour,

Pour connaitre la longueur d’une chaine il faut utiliser strlen.

int lengthText = strlen(TEXT);

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:

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

#include "LcdMidasI2C.h"

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

LcdMidasI2c::LcdMidasI2c()
{
}

Et mon programme principal:

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

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 ?

Éventuellement Lire mon tuto sur les pointeurs pour comprendre ce que & et * veulent dire

void LcdMidasI2c::printLCD(uint8_t *TEXT) {
	int lengthText = sizeof(&TEXT);

vous verrez que votre & n’est pas pertinent

J-M-L:
vous verrez que votre & n’est pas pertinent

Le sizeof non plus car il donne la taille du pointeur et non de la chaine.

Geeks:
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().

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 :

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

Mais là, j'obtiens:

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 :grin:

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

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

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

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

En utilisation:

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

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 ?