如何通过指针访问全局定义的typedef结构?

时间:2012-07-05 12:53:48

标签: c pointers struct 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”的指针指向我的数组并使用“ - >”进行访问因为是指针。我错了吗?这是怎么回事?

有人能帮帮我吗?谢谢!

2 个答案:

答案 0 :(得分:3)

编译器不知道time_date_str的详细信息。你有两个选择:

  • struct time_date_str声明移至标题文件
  • rtc_i2c.c
  • 中创建一种“访问者”功能

这一切归结为一个问题:外部实体是否应该知道有关此结构的详细信息?

还有其他问题,包括您将未初始化的指针传递给RTCGetTime

答案 1 :(得分: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