L'uso di atoi()

Buon giorno.
Sto impazzendo con l'uso di atoi.
Devo convertire una stringa (array di char) in un numero byte; praticamente in payload [] c'è un char.
Ha sempre funzionato, ma poi ho aggiunto pezzi di programma (che apparentemente non vanno ad inficiare) ed ora non funziona più
per farlo funzionare ho dovuto "scomporre" la funaione atoi ed ho agito così
Prima

   for (byte i=0;i<2;i++){recive_lamp[i]=payload[i+25];Serial.println(recive_lamp[i]);} 
           lamp[11]=atoi(recive_lamp);

ora

   for (byte i=0;i<2;i++){recive_lamp[i]=payload[i+25];Serial.println(recive_lamp[i]);} 
           lamp[11]=(recive_lamp[0]-'0')*10+revice_lamp[1]-'0';

altrimenti mi scriveva dei numeri a caso...
Come è possibile?
Può essere che avendo aggiunto righe di programma ed utilizzato molte variabili, il compilatore per l'uso di atoi sbagli l'allocazione di memoria??
payload è una stringa di caratteri lunga da cui estraggo ciò che mi interessa in posizioni precise.
Grazie

Forse mi è venuto in mente una cosa...
lamp[] è di tipo byte, mentre atoi converte char in int....può essere questo il motivo??

Mi sembra importante...

se ciò che vai a convertire è una stringa, terminata correttamente con 0x00, che rappresenta un numero che va da 0 a 255 NON c'è alcun problema.

Ovvero, la sequenza di caratteri 0x32 0x35 0x35 0x00 passata a atoi() ti ritornerà il numero 255 che puoi tranquillamnete mettere in un byte, mentre la sequenza di caratteri 0x31 0x32 0x35 0x35 0x00 passata ad atoi() ti ritornerà 1255 che, ovviamente, NON puoi mettere in un byte.

Guglielmo

Già, grazie ragazzie dell'aiuto.
Guglielmo, non mettevo il terminatore e il sistema faceva un po' quello che voleva, giustamente....
Vi chiedo un'altra cosa, se possibile.
Vorrei convertire un array di tipo byte in un array char...nell'array byte c'è un codice alfanumerico di 8 byte.
grazie

Il tipo char, di default, NON è definito né signed né unsigned (va specificato come lo si vuole) ed occupa esattamente UN BYTE ... quindi ? ? ? Che vuoi convertire a fare una cosa che già occupa un byte in una che occupa un byte ?

Guglielmo

Solo un dubbio, la "recive" in fondo al secondo esempio e' scritta "revice", e' un'errore di trascrizione o e' cosi nel programma ?

E' solo un errore di trascrizione...
Si Guglielmo, hai ragione....
Ad ogni modo l'errore grande che facevo era quello di non mettere il terminatore'\0', si vede che all'inizio andava bene, poi aggiungendo programma atoi non sapeva più dove finire....
Faccio un'ultima domanda, anche se non c'entra con atoi:
Devo convertire un char ricevuto in una stringa da mandare a Nextion, ed ho soluzionato così:

String stringa;
     for (byte i=0;i<16;i++){
       stringa+=(char)payload[i+1];
                       }                   
   myNex.writeStr("info.t0.txt",stringa);

Così funziona ma non volevo usare la String ma la string del C.
Qualche suggerimento??

... e quindi ti devi studiare BENE tutte le funzioni che trovi in <string.h> che fa parte di AVR libc, libreria automaticamente sempre inclusa dall'IDE di Arduino.

Ti do un'indicazione ... per quello che devi fare ... guarda strcat() :wink:

Guglielmo

Guglielmo ho provato ad usarlo, ma forse non nel modo corretto..
Ho scritto

char stringa[17];
char dep_string[17];
     for (byte i=0;i<16;i++){
       strcat(stringa,(char)payload[i+1]);
                       }                   
   myNex.writeStr("info.t0.txt",stringa);

Ma non ottengo lo stesso risultato...

Mi sembra normale, hai letto bene cosa fa?

The strcat() function appends the src string to the dest string overwriting the '\0' character at the end of dest, and then adds a terminating '\0' character.

... ovvero si aspetta due stringhe classiche del 'C' e NON una stringa classica (stringa[]) ed un char (payload[i+1]); ti serve un passaggio in più per trasformare payload[i+1] da seplice char a stringa (ovvero metterlo in un array di due caratteri il cui secondo carattere è sempre 0x00).

Guglielmo

Grazie Guglielmo, il solito terminatore che non mi entra in testa :upside_down_face:
Grazie.
Ho riscritto tutto il programma con il terminatore ed ora finalmente funziona....
Errore banale davvero :face_with_hand_over_mouth:

... e che è fondamentale! Tutte quelle funzioni che operano sulle stringhe classiche del 'C' lavorano partendo dall'inizio dell'array di char (quindi un puntatore) e vanno avanti, byte dopo byte, fino a quando non incontrano 0x00. Capisci bene che, se non lo metti, vanno avanti finché, in memoria, da qualche parte lo incontrano ... con le ovvie conseguenze ... :crazy_face:

Guglielmo

Già, e perdita di tempo e scervellamenti per capire dove sbagli :crazy_face:

Metto il codice che ho scritto per risolvere

 char stringa[18];
 stringa[0]='\0';
 char dep_str[3];
    for (byte i=0;i<16;i++){
      dep_str[0]=(char)payload[i+1];
      dep_str[1]='\0';
       strcat(stringa,dep_str);
                       }

Per chi vuole usufruirne .... :slightly_smiling_face:
Magari si migliora....Ma funziona

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.