Funzione STRTOI funziona bene sono in locale

Ho scritto un codice come quello che segue…

for (byte x = 0; x < 10; x+=2) {
        char hextoi[2];
        long received_data;
        hextoi[0] = buf[x];
        hextoi[1] = buf[x + 1];
        received_data = strtol(hextoi, NULL, 16);
        Serial.println(received_data);
      }

In sostanza ho un array di tot valori esadecimali espressi in forma di due caratteri ascii ciascuno, di fila.
Ad esempio: AF3C5B8F32 giusto per dirne alcuni.

Perchè il codice mi funziona soltante se gli passo delle variabili locali in ingresso uscita ?
Mi riferisco a “hextoi” e “received_data”.

Se le lascio come variabili globali mi segna in uscita tutti valori al massimo, cioè se metto in uscita un byte 255, se metto int 65536, se metto un long… non ricordo 2 miliardi e spicci.

Mentre se uso le variabili locali, dichiarate dentro al loop funziona correttamente, ad esempio AF restituisce 175.

Stesso errore che ho appena segnalato in un altro post: strtol() si aspetta in ingresso una stringa stile C, quindi con il terminatore. Il tuo buffer deve dunque essere un carattere più lungo e contenere un '\0' in fondo.

Quindi mi confermi che è un problema di libreria ? O meglio di non buona conoscenza della libreria ?
E poi... si capisco il problema del terminatore ma... perchè se la uso in locale funziona ? Viene aggiunto un terminatore in automatico li ?

No, è un problema della tua conoscenza del C e delle sue stringhe...

Ma perché pensate sempre che ci siano dei problemi nelle librerie o nel compilatore e mai nel vostro codice? Sono cose che utilizzano (decine/centinaia di) migliaia di persone, pensate davvero che 3 righe banali possano incappare in bug seri? Mettete SEMPRE prima in questione il vostro codice, guardatelo e riguardatelo mille volte prima di pensare che i problemi siano altrove, il 99.999999% delle volte sono lì.

No ma infatti io pensavo di aver cappellato qualcosa, come ho scritto nella seconda parte della prima riga, cit. m. stss. O meglio di non buona conoscenza della libreria ? intesa come mia scarsa conoscenza della libreria.

Mica penso che una roba fatta da molti anni e usata da molta gente abbia chissa quali problemi, il problema semmai è che io non sapevo come usarla hi hi

Però mi puoi spiegare perchè in locale funziona ?
In ogni caso grazie per l'aiuto.

ma le variabili globali le hai inizializzate?

Si e no...

Ho dichiarato le variabili fuori dallo scope, poi le inizializzo nel ciclo for con i valori prelevati dal buffer "buf".

Ho sbagliato ?

L'unica cosa che ho fatto di diverso è stato di spostare la dichiarazione all'interno dello scope. fine.

Mi intrometto, non continuate a cercare cose fantasiose per capire dove potrebbe essere il problema. Non è lo scope e non sono le librerie ne altro, il problema e la relativa soluzione la fornita @SukkoPera al post #2 manca il terminatore punto, nientaltro che quello

Ma scuserai eh... ok il problema è risolto e per carità. Funziona e tutto. Però il tuo discorso non lo condivido, cioè è l'antiscienza...

Io non programmo per lavoro, cioè anche ma è una minima parte del mio lavoro, piu che altro lo faccio per impararr e quindi mi posso permettere di farmi dei dubbi ogni tanto.

Poi non è che questo obbliga gli altri a rispondermi, però se leggi bene vedi che il mio dubbio non è sul terminatore, sacrosanto che serva se la funzione vuole una stringa in formato C, ma sul fatto che su all'interno di uno scope funziona anche senza... quello mi lascia perplesso.

A te non incuriosisce ? A me si e se non mi incuriosisse... che diavolo ci faccio qui ?

Cosa non ti è chiaro che una variabile locale non è globale?
Non userà la 'stessa' memoria, dopo di lei non ci sarà la stessa 'roba'
Non credi che magari dopo la 'locale' si trova 'per caso' area vuota? Cioè il terminatore....

Ho capito... quindi non posso fare conto che funzioni sempre in locale così come lho messa... va a mulo diciamo se non ci aggiungo il terminatore?

Tutto li volevo sapere... scusate siate pazienti non sono esperto però sono curioso come una scimmia. Perdonate se sono diventato polemico a un certo punto. Grazie a tutti.

Quel che vuole dire fabpolli è che quel che devi imparare da questa esperienza è che il terminatore in una stringa va sempre messo, altrimenti può succedere di tutto (leggere oltre i limiti di un array è undefined behaviour, il compilatore è libero di ucciderti il gatto). Il resto ha una spiegazione ma temo sia un po' avanzato per il tuo attuale livello di conoscenze, quindi non preoccupartene, ci sono altre cose più importanti da imparare prima.

Ok, grazie raga.