Creare una Libreria

Ciao a tutti.
Come ho detto nella presentazione ho costruito e assemblato un circuito per display LCD Nokia 3330.
Nel creare sketch, ricorre spesso l'esigenza di dover visualizzare un numero di tipo int o float.
Per visualizzare qualcosa sul display è richiesto un puntatore di caratteri, quindi il numero, prima lo scompongo tra parte intera e parte decimale e poi trasformo il tutto in puntatore *char.
Nei miei sketch questo problema l'ho risolto inserendo un bel pò di codice per ogni volta che deve essere eseguita l'operazione di visualizzazione.
Ho cercato di creare una funzione, che non funziona, ma dato che devo imparare vorrei un aiuto a creare una libreria (che mi dia un pò di flessbilità) per questo problema.
Di seguito posto i file che ho creato che non funzionano di cui vorrei venirne a capo, e soprattutto a capire:

file .h

// -----
// NumberTopunt.h è una libreria che converte un numero int, float, double, ecc, in un puntatore di caratteri
// che può essere visualizzata direttamente su un LCD Nokia 3310 e simili.
// -----

#ifndef NumTopunt_h
#define NumTopunt_h

#include "Arduino.h"


class NumberTopunt{
	
public:
  char *Num2punt(float numero, int precisione);
  
private:
  float _numero;	// numero
  int _precisione;	// decimali dopo la virgola

};

#endif

File .cpp

#include "Arduino.h"

#include "NumberTopunt.h"

 char *NumberTopunt::Number2punt(float numero, int precisione){

     _numero = numero;
	 _precisione = precisione;
	 
	 int ndec = _precisione;  // numero (intero >0) di decimali da modificare per una maggior precisione
	 int decimali=1; // risultato dopo l'elevamento a potenza
	 int base=10;
	 int intPart = int(val);
	 
	 for(int i=0; i<ndec; i++)  // ciclo che esegue l'elevamento a potenza
		 decimali*=base;
	 
	 long decPart =decimali*(val-intPart); //I am multiplying by 1000 assuming that the foat values will have a maximum of 3 decimal places
									   //Change to match the number of decimal places you need
	 if(decPart>0)return(decPart);           //return the decimal part of float number if it is available 
	 else if(decPart<0)return((-1)*decPart); //if negative, multiply by -1
	 else if(decPart=0)return(00);           //return 0 if decimal part of float number is not available
	 
		String stringa="";
		int lung_numero=0;
		stringa+=String(int (_numero)+ "."+String(decPart);
		lung_numero=stringa.length();  //  Funzione che restituisce la lunghezza in intero di una stringa
		//if(lung_punt <= 0)
		  //lung_punt=12;
		char puntatorestringa[5]={' ', ' ', ' '};
		stringa.toCharArray(puntatorestringa, 5);
		for(int i=lung_numero; i<5; i++)
		  puntatorestringa[i]=' ';
		stringa="";
		return puntatorestringa;

}

Non ci piacciono i rebus del tipo qua un Sketch che non funziona indovinate cosa non funziona.

Ti prego di descrivere l' errore o il non o malfunzionamento.

Ciao Uwe

Ti rammento che sei su una piccola MCU che ha in tutto 2KB di SRAM, dove non c'è un sistema operativo e dove non esiste un "garbage collector".

La classe String usa l'allocazione dinamica e un continuo cambiare dimensioni alle stringhe, modificarle ecc. ... porta facilmente alla frammentazione della memoria e ... all' "impazzimento" del programma ... e del programmatore (... che non riesce a capire perché il programma non va).

Noi qui sconsigliamo sempre l'uso di detta classe a favore delle stringhe classiche del C (... array di char), facilmente manipolabili con le funzioni che trovi in <string.h> che fa parte di AVR libc (... sempre inclusa dal IDE).

Inoltre, nella <stdlib.h> trovi tutto quello che occorre per convertire in stringhe (... e viceversa) sia gli int che i float.

Guglielmo

Scusate se non mi sono spiegato bene, e vi ringrazio per le vostre risposte, ma i miei obiettivi principali sono risolvere il problema e imparare.
Detto questo se voglio che una libreria mi restituisca un puntatore di *char, è giusto mettere nel file .h

public:
char *Num2punt(float numero, int precisione);

Lo chiedo perchè dopo svariati tentativi, non so da dove partire, e vi ringrazio per la collaborazione.

Detto questo se voglio che una libreria mi restituisca un puntatore di *char, è giusto mettere nel file .h

public:
char *Num2punt(float numero, int precisione);

Si però attenzione a:

  1. Num2punt è una funzione membro pubblico del tipo NumberTopunt, e come tale dovrebbe per convenzione
    iniziare con il minuscolo. (questo membro non è il costruttore, vedi 3)

  2. Il puntatore restituito deve puntare ad un'area di memoria allocata o staticamente o dinamicamente.
    Se allocata staticamente, deve essere un membro di classe o di modulo, quindi non può essere una variabile
    locale interna ad una funzione membro. Se allocata dinamicamente ciò può anche avvenire dentro una
    funzione membro, tramite 'new' o malloc (o altra funzione che alloca memoria a runtime).
    Si sbaglia se si creare un array dentro la funzione Num2punt e si restituisce il puntatore, perché
    terminata la funzione Num2punt tutte le variabili locali incluso l'array non esiste più e quindi anche il
    puntatore restituito punta (nel nulla) ad una area di memori non allocata.

  3. Non ha specificato il costruttore, quindi C++ fornisce un costruttore standard.

Ciao.