Część,
borykam się z problemem, którego do końca nie rozumiem, a mianowicie program mnie informuje o tym, że używam zmiennej, która nie jest zainicjalizowana, co nie jest prawdą z mojego punktu widzenia, zatem czegoś nie widzę. Błąd, który mi wyskakuje: 'time' may be used uninitialized in this function [-Wmaybe-uninitialized] .
Używam time, jako wskaźnika będącego tablicą char, zmieniam go w funkcji Clock i Clock_background, które działają poprawnie. Bardzo dziwne mi się wydaje to, że gdy wyświetlam dane przy pomocy funkcji Clock to wszystko dziala, problem zaczyna się, gdy zamierzam to zrobić na zewnątrz funkcji ( LCD_Text(time) w case ). Podejrzewałem początkowo, że zmienna jest zapisywana lokalnie, jednak funkcja Clock_background neguje moje podejrzenie, wyświetlacz pokazuje poprawnie wszystko, gdy przełączę na inny tryb mój komputer. Zmienna nie tylko jest zapisywana w pamięci, ale także zmieniana. Nie mam zatem pojęcia, dlaczego w funkcji Clock, gdy każę mojemu wyświetlaczowi wyświetlić stringa char'ów, to wszystko działa, a gdy poza nią, to nie działa. Obwiniałbym źle zainicjalizowany wskaźnik time.
Kod, który jest (moim zdaniem) istotny:
// Function prototypes
void LCD_Text(char*); // funkcja wyświetla cały tekst na wyświetlaczu LCD
void Show_Distance(float); //wyświetla dystans
void Show_Timer(char*); //wyświetla stoper
void Show_Clock(char*); //wyświetla zegar
void Show_Speed(float); //wyświetla predkosc
void Stoper();
void Clock(unsigned char*, unsigned char*, unsigned char*, char*);
void Clock2(unsigned char*, unsigned char*, unsigned char*);
void Clock_background(unsigned char*, unsigned char*, unsigned char*, char*);
// Defining parameters
unsigned char hour = 0, *p_hour;
unsigned char minute = 0, *p_minute;
unsigned char second = 0, *p_second;
p_hour = &hour;
p_minute = &minute;
p_second = &second;
char *time;
float distance = 0;
float speed = 0;
while (1)
{
LCD_Command(0x01); // czyszczenie ekranu
switch(function_number){
case 0:
Show_Distance(distance);
Clock_background(p_hour, p_minute, p_second, time);
break;
case 1:
//Show_Timer(time);
//Stoper();
Clock(p_hour, p_minute, p_second, time);
//Show_Clock(time);
//LCD_Text(time); // Dlaczego to generuje krzaki????
_delay_ms(500);
break;
case 2:
//Show_Timer(timer_value);
LCD_Text(time);
Clock_background(p_hour, p_minute, p_second, time);
break;
//case 3: // Settings?
}
void Clock(unsigned char *hour, unsigned char *minute, unsigned char *second, char *time) {
unsigned char size_of_char = sizeof(char);
char time_value[size_of_char*14];
//LCD_Command(0x01);
/*
//Kwestia estetyki, nie jest to konieczne
if (*hour < 10) {
if (*minute < 10) {
if (*second < 10) { sprintf(time_value, "Time: 0%d:0%d:0%d", *hour, *minute, *second); }
else { sprintf(time_value, "Time: 0%d:0%d:%d", *hour, *minute, *second); }
}
else {
if (*second < 10) { sprintf(time_value, "Time: 0%d:%d:0%d", *hour, *minute, *second); }
else { sprintf(time_value, "Time: 0%d:%d:%d", *hour, *minute, *second); }
}
}
else {
if (*minute < 10) {
if (*second < 10) { sprintf(time_value, "Time: %d:0%d:0%d", *hour, *minute, *second); }
else { sprintf(time_value, "Time: %d:0%d:%d", *hour, *minute, *second); }
}
else {
if (*second < 10) { sprintf(time_value, "Time: %d:%d:0%d", *hour, *minute, *second); }
else { sprintf(time_value, "Time: %d:%d:%d", *hour, *minute, *second); }
}
}*/
sprintf(time_value, "Time: %d:%d:%d", *hour, *minute, *second);
time = time_value;
LCD_Text(time);
_delay_ms(500);
//_delay_ms(1000);
(*second)++;
if ((*second % 60 == 0)&&(*second != 0)) {
*second = 0;
(*minute)++; // w nawiasach, żeby nie zdublowała się wartość zmiennej
}
else {}
if ((*minute % 60 == 0)&&(*minute != 0)) {
*minute = 0;
(*hour)++; // w nawiasach, żeby nie zdublowała się wartość zmiennej
}
else {}
if ((*hour % 24 == 0)&&(*hour != 0))
*hour = 0;
else {}
}
To co prawda nie jest jedyny problem tego programu, ale póki co najważniejszy. Byłbym wdzięczny za pomoc.