2009-11-24 19 views
7

Realizzo un orologio con processore Arduino e, nel processo, sto cercando di formattare gli interi in stringhe formattate a due cifre per la lettura del tempo (ad esempio 1 in "01").Arduino String Formatting Edizione

Di seguito mi dà "Errore: atteso primaria espressione prima di '{' token":

char * formatTimeDigits (int num) { 
    char strOut[3] = "00"; 
    if (num < 10) { 
    strOut = {'0', char(num)}; 
    } 
    else { 
    strOut = char(num); 
    } 
    return strOut; 
} 

Sto cercando di usarlo come segue:

void serialOutput12() { 
    printWeekday(weekday); // picks the right word to print for the weekday 
    Serial.print(", "); // a comma after the weekday 
    Serial.print(hour12, DEC); // the hour, sent to the screen in decimal format 
    Serial.print(":"); // a colon between the hour and the minute 
    Serial.print(formatTimeDigits(minute)); // the minute 
    Serial.print(":"); // a colon between the minute and the second 
    Serial.print(formatTimeDigits(second)); // the second 
} 

Tutte le idee su cosa mi manca qui?

risposta

8

La sintassi di parentesi graffa è valida per la dichiarazione iniziale di una variabile, ma non per l'assegnazione dopo il fatto.

Inoltre, si restituisce un puntatore a una variabile automatica, che non viene più allocata correttamente una volta restituita (e sarà distrutta dalla chiamata successiva, ad esempio print). Hai bisogno di fare qualcosa di simile:

void formatTimeDigits(char strOut[3], int num) 
{ 
    strOut[0] = '0' + (num/10); 
    strOut[1] = '0' + (num % 10); 
    strOut[2] = '\0'; 
} 

void serialOutput12() 
{ 
    char strOut[3]; // the allocation is in this stack frame, not formatTimeDigits 

    printWeekday(weekday); // picks the right word to print for the weekday 

    Serial.print(", "); // a comma after the weekday 

    Serial.print(hour12, DEC); // the hour, sent to the screen in decimal format 

    Serial.print(":"); // a colon between the hour and the minute 

    formatTimeDigits(strOut, minute); 
    Serial.print(strOut); // the minute 

    Serial.print(":"); // a colon between the minute and the second 

    formatTimeDigits(strOut, second); 
    Serial.print(strOut); // the second 
} 
+0

Ok grazie! Essendo abituato a C#, immagino di aver pensato che avrebbe passato un riferimento alla funzione (eek). – amb9800

+0

It (il vostro esempio originale) * fa * restituisce un riferimento, ma ad un oggetto che cessa di esistere dopo che la funzione è stata chiusa (quindi diventa un riferimento ciondolante). C non ha un conteggio di riferimento incorporato/garbage-collection. – caf

1

In C, non è possibile impostare direttamente il contenuto di un array con l'operatore di = assegnazione (si può inizializzare un array, ma questa è una cosa diversa, anche se sembra simile).

Inoltre:

  • Non suona come il cablaggio char(value) funzione/operatore fa ciò che si vuole; e
  • Se si desidera restituire un puntatore a quell'array strOut, sarà necessario impostare la durata di archiviazione statica.

Il modo più semplice per fare quello che vuoi è sprintf:

char * formatTimeDigits (int num) 
{ 
    static char strOut[3]; 

    if (num >= 0 && num < 100) { 
    sprintf(strOut, "%02d", num); 
    } else { 
    strcpy(strOut, "XX"); 
    } 

    return strOut; 
} 
+0

Non penso che 'sprintf' sia parte della libreria di Arduino - le librerie sono brutalmente settate per adattarsi a una dimensione massima del segmento di testo di 14 kb. –

+1

Jeffrey Hantin: Ho visto alcuni esempi che implicano che lo è, ma non ha il supporto in virgola mobile collegato per impostazione predefinita. – caf

0

Un paio di cose:

  • Non è possibile assegnare ad un array: strOut = {'0', (char)num};
  • ritorni l'indirizzo della un oggetto che cesserà di esistere subito dopo la dichiarazione di ritorno.

Per il primo problema, assegnare agli elementi dell'array:

strOut[0] = '0'; 
strOut[1] = num; 
strOut[2] = '\0'; 

Per la 2a problema, la soluzione è un po 'più complicato. La cosa migliore sarebbe passare una stringa di destinazione alla funzione FormatTimeDigits() e lasciare che il chiamante si preoccupi di ciò.

FormatTimeDigits(char *destination, int num); /* prototype */ 
FormatTimeDigits(char *destination, size_t size, int num); /* or another prototype */ 

Ancora un altro punto del 1 ° punto: si può avere visto qualcosa di simile in un di inizializzazione. È diverso dall'assegnazione e consente un costrutto simile all'aspetto come assegnazione.

char strOut[] = {'a', 'b', 'c', '\0'}; /* ok, initialization */ 
strOut = {'a', 'b', 'c', '\0'}; /* wrong, cannot assign to array */ 
+0

Sì, ho adattato la sintassi della parentesi da un'inizializzazione che ho visto in un campione. C'è un modo per assegnare più valori in un array in una dichiarazione? – amb9800

+0

Non c'è modo di assegnare più elementi di array in una semplice istruzione "semplice". Ma, dato che hai a che fare con le stringhe, puoi usare le funzioni di stringa, come in 'strcpy (strOut," 00 ");' o 'strcat (strOut," 00 ");' or 'sprintf' ... – pmg