2

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」として宣言されたポインターは私の配列を指しており、ポインターであるため「-->」でアクセスされます。私が間違っている?これはどのように作動しますか?

誰でも私を助けてもらえますか?ありがとう!!

4

2 に答える 2

3

コンパイラは、 の詳細を知りませんtime_date_str。次の 2 つの選択肢があります。

  • struct time_date_str宣言をヘッダー ファイルに移動する
  • 一種の「アクセサ」関数を作成しますrtc_i2c.c

それはすべて、外部エンティティがこの構造の詳細を知っているべきかという問題に要約されます。

初期化されていないポインタを に渡しているという事実など、他にも問題がありますRTCGetTime

于 2012-07-05T12:56:25.567 に答える
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
于 2012-07-05T13:08:50.740 に答える