Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19

Discussione: atoi

  1. #1

    atoi

    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
    .
    .
    .
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sei sicuro che s2 punti alla stringa?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    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"

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Prova ad aggiungere queste due printf() prima della atoi:

    codice:
    printf("Stringa: %s\n", s2);
    printf("Lunghezza: %d\n", strlen(s2));
    E vediamo che succede...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    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)

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    ...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)

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    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ù.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Probabilmente è la funzione atoi buggata ...

    Ma puoi eseguire il programma con il debug, istruzione per istruzione all'interno della atoi?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.