2017-05-17 5 views
4

シンプルなCプログラムを書いて時間と分を読み込んで一緒に追加しました。しかし、それは追加されず、currentHrMinは分の値だけを出力しています。ただし、currentHrMinの印刷後にgetCurrentDate(&dateParams)が呼び出された場合は問題ありません。私は自分のコードに何が間違っているかを知ることができません。愚かな問題かもしれません。私はMinGW Cコンパイラを使用しています。 #include <inttypes.h>含めた後scanfを使用してuint8_tデータを読み取る

#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'は' int'の書式指定子です。これは32ビット長である可能性があります。しかし、それを8ビット値の 'scanf'に使用しています。したがって、隣接するバイトも破損しています。 –

+0

'scanf()'では、 ''%d "'には、対応する引数があり、 'int *'のような符号付き整数 へのポインタです。 '&(time-> hours)'は 'uint8_t *'型です。 – chux

答えて

8

、変更:これに

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

:すべてのあなたのscanfの中

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

、あなたはintの代わりに、uint8_tために読み込まれるように。あなたが行わ


観察そのに関し、あなたは通常32ビットであるタイプintに対して指定%d指定子、と読んでいました。したがって、読み取った値をtime->hoursに代入すると、隣接する構造体のフィールドに「オーバーフロー」することになります。


次回は、あなたのコンパイラの警告を有効にしてください、あなたはこのような何かを取得する必要があります:私はこのanswerで議論するよう

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. 

私は、 ウォールコンパイラフラグを使用していました。

関連する問題