2009-11-24 24 views
7

Estoy haciendo un reloj con Arduino, y en el proceso, estoy tratando de formatear enteros en cadenas de dos dígitos formateadas para la lectura del tiempo (por ejemplo, 1 en "01").Arduino Cadena de formato Problema

El siguiente me da "error: se esperaba primaria-expresión antes '{' token":

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

Estoy tratando de utilizar de la siguiente manera:

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 
} 

Alguna idea de ¿Qué me falta aquí?

Respuesta

8

La sintaxis de llavero es válida para la declaración inicial de una variable, pero no para la asignación después del hecho.

Además, devuelve un puntero a una variable automática, que ya no es válida asignada una vez vuelto (y será aplastado por la siguiente llamada, como a print). Que tiene que hacer algo como esto:

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 gracias! Siendo utilizado para C#, supongo que asumí que pasaría una referencia a la función (eek). – amb9800

+0

Es (su ejemplo original) * no * devuelve una referencia, sino a un objeto que deja de existir después de que la función sale (por lo que se convierte en una referencia colgante). C no tiene recuento de referencia integrado/recolección de basura. – caf

1

En C, no se puede establecer directamente los contenidos de una matriz con el operador = asignación (que puede inicializar una matriz, pero eso es una cosa diferente, a pesar de que Se ve similar).

Además:

  • No suena como el cableado char(value) función/operador hace lo que quiere; y
  • Si desea devolver un puntero a esa matriz strOut, deberá hacer que tenga una duración de almacenamiento estática.

La forma más simple de hacer lo que quiere es 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

No creo que 'sprintf' forme parte de la librería Arduino: las librerías se subdividen brutalmente para que quepan en un tamaño de segmento de texto máximo de 14kb. –

+1

Jeffrey Hantin: He visto algunos ejemplos que implican que lo es, pero que no tiene soporte de punto flotante vinculado por defecto. – caf

0

Un par de cosas:

  • No se puede asignar a una matriz: strOut = {'0', (char)num};
  • que regrese la dirección de un objeto que dejará de existir inmediatamente después de la declaración de devolución.

Para el primer problema, asignar a los elementos de la matriz:

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

Para el segundo problema, la solución es un poco más complicada. Lo mejor sería pasar una cadena de destino a la función FormatTimeDigits() y dejar que la persona que llama se preocupe por ello.

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

Aún otro punto de la primera máquina: Puede que haya visto algo similar en un inicialización. Eso es diferente de la asignación, y permite una construcción de aspecto similar como asignación.

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

Sí, había adaptado la sintaxis del paréntesis de una inicialización que vi en una muestra. ¿Hay alguna manera de asignar múltiples valores en una matriz en una declaración? – amb9800

+0

No hay forma de asignar múltiples elementos de matriz en una declaración "simple". Pero, como se trata de cadenas, puede usar funciones de cadena, como en 'strcpy (strOut," 00 ");' o 'strcat (strOut," 00 ");' o 'sprintf' ... – pmg