PDA

Visualizza la versione completa : atoi


settembre97
07-04-2010, 13:55
Ciao a tutti, devo leggere da USB un file alfanumerico formato da righe di tipo ">LABEL=VALORE<\n"

Per estrarre il valore uso la "atoi" ma mi restituisce sempre 0!!!
Ho provato a testare la funzione isolandola dal progetto, e funziona...sapete dirmi dove sbaglio?



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
.
.
.

int UsbLoadParameters (...) {

char s2[11];
int iParValue;

memset(s2,0,sizeof(s2));
estraiStr(s1, s2, "=", "<"); //questa funzione estrae dalla stringa s1 tutto ciò che è compreso tra "=" e "<" e lo mette in s2
iParValue=atoi(s2); //anche se s2 punta ad una locazione "corretta" la atoi ritorna sempre 0
.
.
.
}

oregon
07-04-2010, 14:07
Sei sicuro che s2 punti alla stringa?

settembre97
07-04-2010, 16:05
sì!
supponiamo che il valore numerico sia 1, e che la memoria sia:

0x20003000 001
0x20003001 000
0x20003002 000
0x20003003 000
0x20003004 000
0x20003005 000
0x20003006 000
0x20003007 000
0x20003008 000
0x20003009 000
0x2000300a 000

s2 punta a 0x20003000, e la atoi anzichè restituirmi "1" mi restituisce "0"

LeleFT
07-04-2010, 16:37
Prova ad aggiungere queste due printf() prima della atoi:



printf("Stringa: %s\n", s2);
printf("Lunghezza: %d\n", strlen(s2));


E vediamo che succede...


Ciao. :ciauz:

oregon
07-04-2010, 18:22
Devi controllare esattamente (intendo il valore ASCII di ogni carattere ...) il contenuto della memoria puntato da s2. Soprattutto il valore ASCII del primo carattere puntato da s2 (lo vedi facendo un po' di debugging).

settembre97
08-04-2010, 12:37
I valori assunti dai puntatori sono corretti...ho notato però delle stranezze (supponiamo che la stringa in questione fosse "123"):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
.
.
.
ucDebugLen = strlen(pucOutStr); // ucDebugLen assume correttamente il valore 3
sprintf(sDebug,"stringa %s lunga %d", pucOutStr, ucDebugLen); // in memoria viene visualizzato, dalla locazione puntata da sDebug in poi "stringa 123 lunga 3"
iParValue=atoi((char *)pucOutStr); // iParValue assume il valore 23!!!!!!!!!!!!!
iDebug=atoi("0123"); // iDebug assume il valore 23!!!!!!!!!!!!!!
iDebug1=atoi("123"); // iDebug1 assume il valore 23!!!!!!!!!!!!!!!
iDebug2=atoi("234"); // iDebug2 assume il valore 234


vi viene in mente qualcosa? L'ambiente di sviluppo è il Keil uVision; non viene effettuata alcuna ottimizzazione in fase di compilazione; il micro su cui gira questo fw è un ARM7 Luminary (LM3S3739)

shodan
08-04-2010, 12:49
Originariamente inviato da settembre97
iDebug=atoi("0123"); // iDebug assume il valore 23!!!!!!!!!!!!!!
iDebug1=atoi("123"); // iDebug1 assume il valore 23!!!!!!!!!!!!!!!


Per quel che vedo scritto qui, c'è poco da dire: se i due valori non sono 123, la atoi del tuo compilatore ha un bug.

settembre97
08-04-2010, 12:56
...eppure isolando la atoi dal resto del progetto mi funziona:


main(){
int i,j,k;

i=atoi("1234");
j=atoi("2345");
k=atoi("0123");
}



in questo esempio i,j e k assumono il valore corretto (1234, 2345, e 123 rispettivamente)

shodan
08-04-2010, 13:04
Il fatto è che si può tirare solo a indovinare, visto che lavori su un micro particolare.
Posso solo consigliarti di controllare per bene che i puntatori non usati siano inizializzati a 0, che le stringhe siano lunghe a sufficienza, etc.
Il tuo problema può dipendere da un puntatore che interferisce con la atoi.
Dal poco che hai postato non si può capire molto di più.

oregon
08-04-2010, 14:12
Probabilmente è la funzione atoi buggata ...

Ma puoi eseguire il programma con il debug, istruzione per istruzione all'interno della atoi?

Loading