Conversioni

Alla ricerca di come convertire una stringa in un numero sono approdato qui
Syntax & Programs › convertire una Stringa in Int - #4 by lestofante - Generale - Arduino Forum da leggere fino in fondo
A parte la totale assenza dell'argomento nei reference dove comunque c'e' un capitolo " Conversion" viene da dire " Viva il Basic" che con uno striminzito val ed str di porta da uno all'altro senza una pagina di codice

Finche' si lavora su un PC , hai voglia di esaurire le risorse
Ma su Arduino ci fai un po' de sta roba e ci rimani a piedi

Nessuna speranza per metodi alternativi ??

ciao

forse interpreto male la tua necessità... ma non ti basta atoi()?

lucadentella:
forse interpreto male la tua necessità... ma non ti basta atoi()?

String A = "22" ;
Poi fai atoi di A e il compilatore da errore
Come sintassi avevo preso da esempi trovati con il search

brunol949:
String A = "22" ;
Poi fai atoi di A e il compilatore da errore

Ovvio che ti da un errore, String non lo puoi convertire in intero con la atoi(), devi usare un normale array di tipo char.

char A[] = "22" ;
int variabile;

variabile = atoi(A);

brunol949:
String A = "22" ;

atoi accetta un char[]... non un oggetto String

Questo perché String è un oggetto introdotto dall'Arduino, quindi una classe, non è perciò un tipo di dato per cui per poterlo convertire va prima riportato in un tipo di dato standard del C.

leo72:
Questo perché String è un oggetto introdotto dall'Arduino, quindi una classe, non è perciò un tipo di dato per cui per poterlo convertire va prima riportato in un tipo di dato standard del C.

per cui non c'e soluzione se non con quanto indicato da lesto nel TRD indicato all'inizio

String D3 = "46";
 
char thisChar[D3.length()+1];
D3.toCharArray(thisChar, D3.length()+1) ;
int a = atoi(thisChar);

Grazie delle precisazioni

mi sembra l'approccio giusto:

  • crea un array delle dimensioni corrette
  • usa il metodo dell'oggetto String per ottenere un char array
  • usa atoi per convertirlo in numero

cosa non ti piace di questo approccio?

lucadentella:
cosa non ti piace di questo approccio?

Guardo sempre con trepidazione la memoria disponibile :smiley:

brunol949:

lucadentella:
cosa non ti piace di questo approccio?

Guardo sempre con trepidazione la memoria disponibile :smiley:

Allora non usare String ma direttamente char[]. Non è difficile da gestire, devi solo capire certi meccanismi, ma è molto più semplice e parco di risorse, alla fine.

Esempio. Questo:

String mario[]="Beppe";
void setup(){}
void loop(){}

A me dà, compilato, ben 1.296 byte!

Quest'altro, invece:

char* mario[]={"Beppe"};
void setup(){}
void loop(){}

solo 450 byte!! :wink:

leo72:
A me dà, compilato, ben 1.296 byte!

E qui ci riallacciamo al discorso librerie in fase di compilazione, questo è il classico esempio di inclusione in automatico di molto codice, serve per gestire l'oggetto String, solo per aver definito una variabile :slight_smile:

Difatti l'esempio è per far capire che String è una classe ingombrante che, solo per "esistere", si porta dietro una marea di robaccia.
E' come mettersi in casa un Sanbernardo oppure un Terrier: cani sono entrambi, ma il primo mangia e sporca molto di più :stuck_out_tongue_closed_eyes:

leo72:
Difatti l'esempio è per far capire che String è una classe ingombrante che, solo per "esistere", si porta dietro una marea di robaccia.

Allora String e' da evitare in assoluto se si ha un codice un po' corposo
ma poi il char* Riga[] andra sempre usato con la sintassi riga[] = { "testo" }

Tutta 'sta storia nasce dal fatto che x = (dataFile.read()); ti fa' trovare su x il valore ascii letto dalla SD
Quindi 198 per farlo diventare un numero faccio Riga.concat(char(x)) ;
La mia Riga che attualmente e' una String deve tornare un numero perche' e' di un numero che ho bisogno
Poi per capirsi tutta la storia e' la configurazione della Ethernet che vorrei fosse modificabile dalla SD anziche' dover inserire il tutto nel codice e doverlo compilare per ogni scheda

Mettiamo di proseguire con le String ( vedo di cambiare comunque )
Per comprimere e semplificare faccio questo

void Conv_atoi(String aa ){
    char thisChar[aa.length()+1];
    aa.toCharArray(thisChar, aa.length()+1) ;
    int xx = atoi(thisChar); 
    byte bb(xx);
    } // FINE void Conv_atob()

come faccio ha "portarmi fuori" quel bb ??
Ho riesumato i testi C e C++ di un corso fatto 20 anni fa' :drooling_face: ma e' un po' una impresa

Grasssie del suggerimento

ciao

molto facile passare dal metodo Concat dell'oggetto riga ad un più leggero:

char parametro[30];
int parametro_position = 0;

nel ciclo while quando leggi un carattere alla volta fai semplicemente:

parametro[parametro_position++] = leggiDaSD();

ti basta definire la funzione con un valore di ritorno e non "void"

byte Conv_atoi(String aa ){
    char thisChar[aa.length()+1];
    aa.toCharArray(thisChar, aa.length()+1) ;
    int xx = atoi(thisChar); 
    byte bb(xx);
    return bb;
    } // FINE void Conv_atob()

quando la vai a richiamare fai

.
.
.
String pluto="Ciao";
byte pippo=Conv_atoi(pluto);
.
.
.

lucadentella:
ti basta definire la funzione con un valore di ritorno e non "void"

Praticamente cosi' ??

    byte b ;
    Riga = "222" ;
    b = Conv_atob(Riga) ;
    Serial.println(b);

 // =================
byte Conv_atob(String aa ){
    char thisChar[aa.length()+1];
    aa.toCharArray(thisChar, aa.length()+1) ;
    int xx = atoi(thisChar); 
    Serial.println(xx);
    byte bb(xx) ;
    return bb;
    } // FINE void Conv_atob()

Ho provato a risfogliare i libri ma dopo tutti 'sti anni oltretutto passati a programmare logiche molto piu' simili al basic , non e' mica semplice
Funzionare .... funziona
Ma forse e' meglio abbandonare le String
Giusto per leggere un file dalla SD e convertire una stringa si sono bruciati 14 k

o volendo potresti dichiarare bb una variabile globale e la utilizzi ogni volta che ti serve e ovunque

plrmntonio:
quando la vai a richiamare fai

String pluto="Ciao";

byte pippo=Conv_atoi(pluto);

Ho postato finche postavi Tu :slight_smile:
Ma per curiosita ... cosa vale pippo ??
Chiaro che se metto su pluto 222 avro' 222 anche su pippo , ma cosi' ?