2017-05-17 3 views
4

Ich habe ein einfaches C-Programm geschrieben, um Stunden und Minuten zu lesen und sie dann zusammenzufügen. Aber es wird nicht hinzugefügt und druckt nur den Wert von Minuten. Wenn jedoch getCurrentDate(&dateParams) nach dem Drucken currentHrMin aufgerufen wird, gibt es kein Problem. Ich kann nicht herausfinden, was mit meinem Code nicht stimmt. Könnte ein dummes Problem sein. Ich benutze MinGW C Compiler.Verwenden von scanf zum Lesen von uint8_t Daten

#include <stdio.h> 
#include <stdint.h> 

#define BCD_TO_DEC(num) ((((num)&0xF0)>>4)*10+((num)&0x0F)) 
#define DEC_TO_BCD(num) ((((num)/10) << 4) | ((num) % 10)) 


struct RTC_TIME 
{ 
    uint8_t hours; 
    uint8_t minutes; 
    uint8_t seconds; 
    uint8_t twelveHourFormat:1; //1 = 12 hour format, 0=24 hour format. 
    uint8_t AM_0_PM_1:1; 
    uint8_t hours24Format; 
    uint8_t alarm1State:1; 
    uint8_t alarm2State:1; 
}; 

struct RTC_DATE 
{ 
    uint8_t date; 
    uint8_t month; 
    uint8_t dayOfWeek; 
    uint8_t year; 
}; 


void getCurrentTime(struct RTC_TIME* time) 
{ 
    printf("Enter Hour: "); 
    scanf("%d",&(time->hours)); 
    printf("Enter Min: "); 
    scanf("%d",&(time->minutes)); 
} 

void getCurrentDate(struct RTC_DATE* date) 
{ 
    printf("Enter Month: "); 
    scanf("%d",&(date->month)); 
} 

int ar1[5]= {0x1253,0x1034,0x0804,0x1112,0x0409}; 

int main(void) 
{ 
    struct RTC_DATE dateParams; 
    struct RTC_TIME timeParams; 

    getCurrentTime(&timeParams); 
    getCurrentDate(&dateParams); 
    uint16_t currentHrMin = timeParams.hours*60 + timeParams.minutes; 
    printf("Current hour minute = %d\n",currentHrMin); 

    return(0); 

} 
+4

'% d' ist ein Formatbezeichner für' int', der wahrscheinlich 32 Bit lang ist. Aber Sie verwenden es, um einen 8-Bit-Wert zu scannen. Es korrumpiert also auch die benachbarten Bytes. –

+0

Mit 'scanf()' hat "% d" 'ein entsprechendes Argument eines Zeigers auf vorzeichenbehaftete ganze Zahl wie' int * '. '& (Uhrzeit-> Stunden)' ist der Typ 'uint8_t *'. – chux

Antwort

8

Nach einschließlich #include <inttypes.h> ändern:

scanf("%d",&(time->hours)); 

dazu:

scanf("%" SCNu8, &(time->hours)); 

in allen scanf sind, so dass Sie für uint8_t lesen, anstelle ein int.


Die Beobachtung, dass bezieht sich auf gemacht, Sie wurden mit %d Spezifizierer zu lesen, die für den Typ bezeichnet int, die 32 Bits in der Regel ist. Wenn Sie also den gelesenen Wert time->hours zuweisen, würde es auch zu den angrenzenden Strukturfeldern "überlaufen".


Das nächste Mal bitte Ihre Compiler Warnung aktivieren und Sie sollten etwas wie diese:

Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
main.c:32:16: warning: format specifies type 'int *' but the argument has type 
     'uint8_t *' (aka 'unsigned char *') [-Wformat] 
    scanf("%d",&(time->hours)); 
      ~~ ^~~~~~~~~~~~~~ 
      %s 
main.c:34:16: warning: format specifies type 'int *' but the argument has type 
     'uint8_t *' (aka 'unsigned char *') [-Wformat] 
    scanf("%d",&(time->minutes)); 
      ~~ ^~~~~~~~~~~~~~~~ 
      %s 
main.c:40:16: warning: format specifies type 'int *' but the argument has type 
     'uint8_t *' (aka 'unsigned char *') [-Wformat] 
    scanf("%d",&(date->month)); 
      ~~ ^~~~~~~~~~~~~~ 
      %s 
3 warnings generated. 

I verwendet Wand Compiler-Flag, wie ich in diesem answer diskutieren.

Verwandte Themen