funzione datalogger SD

Ragazzi, ho costruito una funzione in c++ con Xcode per sostituire un dato numero di una stringa con un'altro.
testando il codice con Xcode funziona perfettamente.

//  Funzione per modificare il valore(value) numero (number_value) di una data stringa(string[]).


void funzione(int number_value, float value, char string[]) {
    
    char prov_string [100];
    sprintf(prov_string, "%s",&string[(number_value*8)+7]);
    sprintf(&string[number_value*8], "%f", value);
    sprintf(&string[number_value*8+7], "%s", prov_string);
    
}

Ma quando provo ad usare la funzione con arduino non funziona..il monitor seriale mi restituisce dei punti interrogativi.
qualcuno mi può aiutare?
grazie

  1. meglio usare snprintf() a cui devi passare la dimensione del buffer.
  2. la sprintf o snprintf hanno disabilitato %f, devi usare per forza dtostrf
    http://dotnetside.org/blogs/pixel/archive/2013/03/12/arduino-utilizzo-di-dtostrf-e-sprintf.aspx
  3. un array è già implicitamente un puntatore, inutile usare & e poi le quadre, meglio non usare & e poi sommi al vettore l'indice (come fosse puntatore)
... &string[(number_value*8)+7]);
... string+(number_value*8)+7);

1.grazie nid69ita vado subito a informarmi sul snprintf e dopodiché lo sostituisco al sprintf.
3.grazie per avermelo fatto notare, mi era sfuggito. modifico subito lo sketch.

Ora però non ho ancora capito perché quella funzione che ho postato, con Xcode funziona e con arduino no. Il problema è la sprintf?
Grazie

  1. che cosa è xcode ?

  2. la snprintf per il %f è stata "castrata" per il compilatore gcc su atmel avr, perchè troppo pesante.

Non sono sicuro di aver capito..

Nell'ide di arduino hanno disabilitato la funzione sprintf quindi non si possono convertire direttamente delle variabili di tipo float in delle variabili di tipo string.

Quindi l'unico modo per fare ciò è moltiplicare il valore float per una costante facendolo diventare int e dopodiché usare la funzione dtostrf per farla diventare una variabile di tipo string.

Il ragionamento è giusto?
Ci sono altri modi per usare meno memoria?
grazie

No, l'IDE di basa sul compilatore gcc e sulla toolchain atmel per Avr.
Quindi vengono caricate le librerie per la mcu avr atmel. Non sei su un PC, l'ambiente è diverso, quello che funziona
compilando su Mac o Windows su Pc non è detto che funziona in un altro ambiente. Prova ad allocare un array da 1000 long su Arduino Uno che ha solo 2K di ram, vedi se funziona !! Su Mac lo fa.

Nelle librerie avr la parte %f è stata castrata. Come ti ho detto prima (mi sa che non hai letto) esiste la funzione dtostrf() per convertire da float a stringa

Poi, si se moltiplichi e fai calcoli potresti anche stampare un float usando due volte %d uno per la parte intera e uno per la parte decimale.

Qui le librerie avr linkate nella toolchain:
http://www.nongnu.org/avr-libc/user-manual/modules.html