una variable temporal la cual es la que se imprime y cuando termine de llenarla entonces la paso al arreglo para almacenar
Correcto, Y si es un poco engorroso.
Gracias por la info pero estaba viendo lo siguiente, el usar arreglos de cadenas significa que lo que debo hacer primero es asignarle una cadena por defecto para que lo dimensione o me va a dar problemas luego, no recordaba que de esa manera había definido los textos de los menú proncipal o secundario lo cual es lo primero que se imprime al encender el sistema.
Si quisieras no tocar demasiado tu programa, solo deberias modificar una sola cosa, hacerlo asi:
typedef struct /* Estructura para almacenar la fecha */
{ /* y hora del dispositivo. La */
uint8_t ano[5]; /* estructura está pensada para */
uint8_t mes[3];
uint8_t dia[3];
uint8_t hora[3];
uint8_t minuto[3];
uint8_t segundo[3];
} tiempo;
Y asegurarte que ano[4], y todos los demas [2] sean si o si cero, Asi termina el string.
Esto es el minimo cambio que deberias realizar.
Es cierto que es mas comodo usar una estructura para lo que planteas. Pero implica tener un puntero a lo que estas modificando para mostrar eso unico. Suponete que lo hacemos con "indices" entonces no tiene sentido hacer una estructura, lo podemos plantear como arrays, te doy un ejemplo sin probar y sin reventarme demasiado la cabeza..
Declaracion de las variables...
uint8_t tiempo[6], auxiliar;
uint8_t *temp;
enum tiempo_e {ANO,MES,DIA,HORA,MINUTO,SEGUNDO};
char salida[10];
tiempo mantiene todos los valores del RTC, como imagino que queres manejarte con nombres entonces cree un enum para que pueda usarlo, auxiliar es tu array donde vas a cargar los datos en formato de entero, *temp es solo un puntero para asegurarme de saber cual se esta modificando. Finalmente salida es tu string donde tendrias el mensaje a enviar con tu funcion.
tiempo[tiempo_e.ANO] = 20;
tiempo[tiempo_e.MES] = 3;
tiempo[tiempo_e.DIA] = 17;
tiempo[tiempo_e.HORA] = 19;
tiempo[tiempo_e.MINUTO] = 31;
tiempo[tiempo_e.SEGUNDO] = 00;
Para cargar valores, asi tambien podes usar el enum para pasarlo como indice..
Para actualizar el string de "salida"
void actualizarString(uint8_t indice){
if (&tiempo[indice] == temp)
{
} else {
sprintf(salida
, "%u",tiempo
[indice
]); }
}
Como ves si estoy modificando algun valor, entonces precargo temp con su direccion, de esa forma puedo saber cual se esta modificando, y en caso de que se este modificando, mostraria el valor temporal ( auxiliar ) y no el del array.
Y finalmente si tenes ese valor "auxiliar" como un string y no como un entero, la carga al array se podria complicar un poco. Entonces pense en una funcion que te permita realizarlo, Ojo que espera un 0 al final de lo cargado:
void Cargar_stoi(uint8_t indice, uint8_t *text){
// Paso de texto a numero, hasta que llegue un 0
uint8_t i;
for(i=0; *text != 0; text++) {
tiempo[indice] *= 10;
tiempo[indice] = *text-'0';
}
}
Finalmente usarias:
Para imprimirlo... Es decir actualizas el string salida y lo imprimis. Lo que va a determinar si es mas pesado el programa, va a ser cuantas veces lo imprimis, deberias ser consciente que si no cambia no deberias imprimirlo.