2009-11-24 13 views
7

Ich mache eine Arduino-powered Uhr, und dabei versuche ich, Integer in zweistellige formatierte Strings für die Zeit Auslesen (z. B. 1 in "01") zu formatieren.Arduino String Formatierung Problem

Im Folgenden gibt mir "Fehler: erwartete Primärausdruck vor '{' token":

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

Ich versuche, es wie folgt zu verwenden:

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 
} 

Irgendwelche Ideen, Was fehlt mir hier?

Antwort

8

Die geschweifte Klammer Syntax ist gültig für die erste Deklaration einer Variablen, aber nicht für die Zuordnung nach der Tatsache.

Außerdem geben Sie einen Zeiger auf eine automatische Variable zurück, die nach der Rückgabe nicht mehr gültig zugewiesen wird (und beim nächsten Aufruf wie print zerstört wird). Sie brauchen so etwas wie dies zu tun:

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 danke! Da ich an C# gewöhnt bin, vermute ich, dass es einen Verweis auf die Funktion (eek) geben würde. – amb9800

+0

Es (Ihr orignal Beispiel) * gibt * eine Referenz zurück, aber zu einem Objekt, das nicht mehr existiert, nachdem die Funktion beendet wurde (so dass es zu einer freien Referenz wird). C hat keine eingebaute Referenzzählung/Müllsammlung. – caf

1

In C, können Sie nicht direkt ein Arrays Inhalt mit dem = Zuweisungsoperator eingestellt (können Sie initialisieren ein Array, aber das ist eine andere Sache, auch wenn es sieht ähnlich aus).

Zusätzlich:

  • Es klingt nicht wie die Verdrahtung char(value) Funktion/Operator tut, was Sie wollen; und
  • Wenn Sie einen Zeiger auf dieses Array strOut zurückgeben möchten, müssen Sie statische Speicherdauer haben.

Die einfache Art und Weise zu tun, was Sie wollen, ist 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

Ich glaube nicht, 'Sprintf' ist Teil der Arduino-Bibliothek - die Bibliotheken sind brutal subsettiert, um in eine maximale Textsegmentgröße von 14kb zu passen. –

+1

Jeffrey Hantin: Ich habe einige Beispiele gesehen, die andeuten, dass dies der Fall ist, aber die Gleitkommaunterstützung standardmäßig nicht verknüpft ist. – caf

0

Ein paar Dinge:

  • Sie können nicht auf ein Array zuweisen: strOut = {'0', (char)num};
  • Sie kehren die Adresse ein Objekt, das gleich nach der Rückkehrerklärung nicht mehr existiert.

Für das erste Problem, weisen Elemente-Array:

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

Für das 2. Problem ist die Lösung ein wenig komplizierter. Das Beste wäre, eine Zielzeichenfolge an die FormatTimeDigits()-Funktion zu übergeben und den Anrufer sich darum kümmern zu lassen.

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

Noch ein weiterer Punkt auf dem ersten Punkt: Sie etwas haben Similiar in einer Initialisierung gesehen. Das ist anders als die Zuweisung, und es ermöglicht ein ähnlich aussehendes Konstrukt als Zuweisung.

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

Ja, ich hatte die Bracketsyntax aus einer Initialisierung, die ich in einem Beispiel sah, angepasst. Gibt es eine Möglichkeit, mehrere Werte in einem Array in einer Anweisung zuzuordnen? – amb9800

+0

Es gibt keine Möglichkeit, mehrere Array-Elemente in einer "einfachen" Anweisung zuzuordnen. Aber wenn Sie mit Strings arbeiten, können Sie String-Funktionen verwenden, wie in 'strcpy (strOut," 00 "); oder" strcat (strOut, "00"); 'oder' sprintf' ... – pmg