Go Down

Topic: Conversioni (Read 2084 times) previous topic - next topic

lucadentella

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

lucadentella.it

plrmntonio

Code: [Select]
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
Code: [Select]

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

brunol949


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


Praticamente cosi' ??
Code: [Select]

    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
Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

plrmntonio

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

brunol949


quando la vai a richiamare fai
Code: [Select]

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


Ho postato finche postavi Tu  :)
Ma per curiosita ... cosa vale pippo ??
Chiaro che se metto su pluto 222 avro' 222 anche su pippo , ma cosi' ?
Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

plrmntonio

eh già ho perso tempo mentre scrivevi comunque pippo varrà sempre il risultato della conversione fatta con la funzione Conv_atoi della variabile di tipo String che viene passata alla stessa, in questo caso pluto.

PS: pippo e pluto erano le classiche variabili di esempio che ci facevano a scuola :P

lucadentella

di default se atoi() fallisce perché il char array non è un numero valido, restituisce 0:

If no valid conversion could be performed, a zero value is returned.
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
lucadentella.it

brunol949

Vedo di rompere per l'ultima volta
Code: [Select]
  if (dataFile) {
    while (dataFile.available()) {
      x = (dataFile.read());
      Serial.print(char(x)); // Stampa il carattere e non il codice ASCII
    } // End while
    dataFile.close();   
   } // End if (dataFile)

Visto che il read restituisce byte, come dovrei fare per avere una stringa da cui estrarre i vari gruppi caratteri da convertire con atoi senza ricorrere all'uso di String ??

Mi rendo conto che per fare una qualsiasi cosa che vada oltre la lettura o il set di un pin ci vuole una buona conoscenza del C/C++
Tutt'altro che non serve niente come si scriveva in qualche messaggio :smiley-fat:
Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

lucadentella

ciao

esattamente come ti ho indicato sopra... un char è sempre un byte (http://arduino.cc/it/Reference/Char) che "identifica" un carattere secondo la tabella ASCII... puoi quindi fare un array di char e memorizzare quanto leggi dalla SD e quindi applicare direttamente a tale array la funzione atoi()
lucadentella.it

brunol949


puoi quindi fare un array di char

Questo e' il punto  ; non capisco e non trovo come fare un array di char

Siccome i miei parametri sono tutti concatenati divisi da una , ( virgola ) facevo conto di leggere il byte che sarebbe l'x che viene fuori dal read del file
Verificare cosa ci sia dentro per trovare la virgola
Se c'e' la virgola non "accodo" il byte all'array e converto l'array in intero
Per semplicita' sara un array di interi per cui dopo avro' a[0] a[1] etc per fare quello che mi serve
Cancello l'array e vado avanti fino alla seconda virgola , poi la terza .
Il discorso di trovare la virgola salta fuori perche' puo' esserci 168 ma anche 1 ; 1 potrebbe essere 001 per avere elementi tutti da 3 caratteri ma se poi c'e' 086 si arrabbia tirando fuori storie di numeri in fomato ottale
Quindi solo 86 e niente 086
Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

lucadentella

Ciao

(ti rispondo "in teoria" perché non ho sottomano un arduino+sd con cui provare)...

fai così:

- definisci un array di char della dimensione massima che ti aspetti (es. se sono 3 cifre, char buffer[3])
- inizi a leggere un carattere per volta dalla sd e accodi al buffer se il carattere non è ','
- quando trovi la virgola, non la accodi al buffer e converti quanto hai memorizzato fin qui con atoi(), quindi resetti l'indice del buffer (ovvero torni a scrivere dalla posizione 0), e leggi il nuovo byte (che sarà dopo la virgola)
lucadentella.it

brunol949


- definisci un array di char della dimensione massima che ti aspetti (es. se sono 3 cifre, char buffer[3])

E' quello che ho fatto

char Riga[4] ;

poi

  if (dataFile) {
    while (dataFile.available()) {
      x = (dataFile.read());

x ha il codice asci del carattere

Come lo metto ( accodo ) sull'array Riga ?? perche poi Riga sia valida per atoi
E' questo che non so fare
Immagino che per cancellarlo basta far Riga[] = { } 

Poi per il resto della struttura di controllo non avro' sicuramente problemi
If switch case  for non mi fanno paura ; col linguaggio strutturato lavoro sui PLC in IEC 61131-3

Grazie per la pazienza






Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

lucadentella

tieni in una variabile (tipo int posizione_riga) il punto in cui sei arrivato a scrivere nel vettore...

quindi

char carattere = leggiCarattere()
if(carattere != ',')
riga[posizione_riga++] = carattere;
else {
atoi(riga);
posizione_riga = 0;
}
lucadentella.it

leo72



puoi quindi fare un array di char

Questo e' il punto  ; non capisco e non trovo come fare un array di char


Prima di continuare col povero Luca Dentella che ti sta facendo il programma lui  ;), ti consiglierei di studiarti un po' di basi di C.
Ad esempio qui spiegano gli array:
http://programmazione.html.it/guide/lezione/1099/cosa-sono-gli-array/
e qui gli array di char:
http://arduino.cc/en/Reference/String

brunol949


quindi

char carattere = leggiCarattere()
if(carattere != ',')
riga[posizione_riga++] = carattere;
else {
atoi(riga);
posizione_riga = 0;
}

Quindi un brutale array
Quello che dovro' capire e' la questione degli *
char  e  char*

Stasera riprendo in mano la cosa ; oggi e' una giornata di collaudi
Ho una torcia al plasma che mi fa' inpazzire un bus di campo sebbene sia fatto con tutti i crismi
Le mie opere : Flusso correnti nell'impianto fotovoltaico http://arduino.webveneto.net/energy_control/     PING ed E.Mail http://arduino.web

Go Up