PDA

View Full Version : [C++] Da stringa ad intero: perchè questa funzione non va?


Dani88
16-12-2010, 11:47
Sto lavorando su un microprocessore programmabile in C/C++. Ho necessità di convertire una stringa mandata dal pc in un numero, dato che atoi() gestisce solo caratteri singoli ho scritto una funzione per la conversione.

//Convert a string into a number
int stringToInt(String s){
byte sLen = s.length();
int retNum = 0;
lcd.setCursor(8,2);
//lcd.print (s); lcd.print ("-");

for(byte k=0; k < sLen; k++){
retNum += ((byte)s.charAt(k)-48) * pow(10, sLen-k-1);
lcd.print(((byte)s.charAt(k)-48) * pow(10, sLen-k-1),0); lcd.print("#");
}
return retNum;
}


Il tutto sembra funzionare fino a 99: passato 99 il numero è sbagliato di uno in negativo (101 -> 100 ecc...).
Ora stampando ogni singola conversione da carattere letto in numero e poi moltiplicandolo per 10 alla ... (per ottenere centinaia, decine, unità) i numeri sono giusti, lo vedo tramite la riga:

lcd.print(((byte)s.charAt(k)-48) * pow(10, sLen-k-1),0); lcd.print("#");

Se invio ad esempio 123 mi da:
100#20#3
dunque il problema sembra dovuto a quando incremento "retNum"...
A cosa può essere dovuto?? Non riesco a capire...pensavo a qualche casino che fa per le conversioni da un tipo all'altro...
:help: :help: :help:

NOTA: uso i tipi byte perchè su microprocessori non ho molta memoria, quindi meglio non usare int ove possibile.

Supdario
16-12-2010, 12:11
Non ho capito bene con che stringhe stai lavorando, se sono std::string ti basta fare così:

int num = atoi(str.c_str());

oppure:

istringstream stream(str);
int num;
stream >> num;

In ogni caso la tua funzione mi sembra abbastanza incasinata, stai facendo un vario miscuglio di tipi diversi (ad esempio trasformare il return della funzione pow (che restituisce un double) ad un char).

Dani88
16-12-2010, 12:21
Dunque, le stringhe non credo siano quelle classiche del C++.
Qui trovi maggiori info
http://arduino.cc/en/Reference/StringObject

Ho provato con atoi() ma vuole un carattere per volta.
Si pow mi da un double, però senza decimali, quindi posso troncarlo a intero per incrementare retNum senza perdite.
Non ho capito il char che dicevi tu :)

Supdario
16-12-2010, 12:32
Ho notato che retNum è di tipi int, invece il valore che incrementi è un byte, forse dovresti provare a fare un cast o a modificare il tipo.