2012-07-05 109 views
2

我想知道如何在它所在的文件之外使用typedef結構。我的意思是,我有這個:如何通過指針訪問全局定義的typedef結構體?

在一個名爲「rtc_i2c.c」的文件中,我有---------------------------- --------

#include "rtc_i2c.h" 

struct time_date_str 
{ 
    char year; 
    char month; 
    char date; 
    char day; 

    char hour; 
    char minute; 
    char second; 
}; 


int RTCGetTime(TimeDate *timdatstrptr) 
{ 
    timdatstrptr -> second = 0x12; 

    return 0; 
} 

然後在一個名爲「rtc_i2c.h」的文件中我有----------------------- --------

#ifndef RTC_I2C_H 
#define RTC_I2C_H 

typedef struct time_date_str TimeDate; 

#endif 

而在「main.c」中我有-------------------------- -----------------------

#include "rtc_i2c.h" 

TimeBase *TimeDateData; 

void main(void) 
{ 
    char DateTimeASCII[20]; 

    RTCGetTime(TimeDateData); 

    DateTimeASCII[0] = ???????? 
} 

然後,當我進入我的代碼時,輸​​入RTCGetTime並在監視窗口中可以看到正確執行的「timdatstrptr - > second = 12」賦值。但問題在外面。如果我把「TimeDateData - > second」放在????????的空間裏,編譯器會產生一個錯誤。所以我不知道我該如何通過指針訪問全局定義數組的內容。

如果我明白了,聲明爲「TimeBase * TimeDateData」的指針指向我的數組,並且使用「 - >」訪問,因爲它是一個指針。我錯了嗎?這個怎麼用?

任何人都可以幫助我嗎?謝謝!!

回答

3

編譯器不知道time_date_str的詳細信息。你有兩個選擇:

  • 移動struct time_date_str聲明到頭文件
  • 請在rtc_i2c.c

一種「訪問」功能,這一切都歸結爲一個問題:應該以外的實體知道有關這個結構的細節?

還有其他問題,包括您將未初始化的指針傳遞給RTCGetTime的事實。

+0

@cnincutalyes所有的外部實體應能獲得這種結構。我已經將結構移至.h文件,但仍然無法編譯。如果我把「DateTimeASCII [0] = TimeDateData - > second;」錯誤標記爲「未聲明的標識符」 – m4l490n 2012-07-05 13:24:01

+0

@ user1502121嘗試使用一個普通變量'TimeBase TimeDateData',您可以像這樣傳遞:'RTCGetTime(&TimeDateData)'。 – cnicutar 2012-07-05 13:26:19

+0

@cnincutalyes謝謝!那解決了它。我將「TimeBase * TimeDateData」更改爲「TimeBase TimeDateData」並且像「&TimeDateData」一樣傳遞並且它工作 – m4l490n 2012-07-05 13:37:03

0

你不應該在它所在的文件之外使用該結構,這就是它位於文件rtc_i2c.c而不是rtc_i2c.h中的原因。嘗試找到其他方法來完成你所需要的。

例如,我猜RTCGetTime的聲明也出現在rtc_i2c.h的某處,這就是爲什麼您可以在另一個文件(main.c)中使用它的原因。所以,在rtc_i2c.h尋找其他有用的功能,也許有什麼你可以使用?

如果你絕對不能採用這種方式,只需移動結構的定義頭文件:

#ifndef RTC_I2C_H 
#define RTC_I2C_H 

struct time_date_str 
{ 
    char year; 
    char month; 
    char date; 
    char day; 

    char hour; 
    char minute; 
    char second; 
}; 

typedef struct time_date_str TimeDate; 

#endif