2016-06-12 5 views
-2

私は2つのファイルを持っている:ポインタを介してファイルの静的変数に別のファイルからアクセスできますか?

static FIFO inputBuffer; 
static FIFO outputBuffer; 

そしてbuffer.c、同様に、FIFO構造体を管理するためにsevenalの機能があります:

void FIFOGet(FIFO* buffer, uint8_t* data, uint8_t length) 

これらの機能uart.c、それは4-5thラインにおける牽引変数を持っています一般的な使用のため、をbuffer.cに直接決してポインタで処理することはありません。 ablove関数は次のようにuart.cから呼び出されます。

FIFOGet(&inputBuffer, someArray, n) 

しかし、この関数の中で私がbufferの値(私は関数を呼び出すときinputBufferは0x04f0に位置していることを知っているが、bufferの値が0x04eaで失われた - これをoutputBufferを指している、私は140%の関数呼び出しがうまくいると確信している、私はoutputBufferを渡すことはありません)。これは、inputBufferstaticと宣言したために発生しますか?その場合は削除しますが、にextern FIFO inputBufferを入力する必要がありますか?誰かが正確にどのように動作するかを説明できるかどうかが欲しいです。

+0

「静的な」変数を読んで... –

答えて

0

Cでは、ファイルスコープにあるシンボル(「グローバル」変数と関数)は、デフォルトでオブジェクトファイルに「公開」されています。これはしばしば便利ですが、正確なシンボルが他のモジュールによって公開されないようにします。

いいえ、ファイルスコープのシンボルがファイルの外部にアクセスされない場合は、staticと宣言する必要があります。つまり、シンボルはオブジェクトファイルに公開されません。つまり、すべてです。あなたはそのシンボルへのポインタを他のモジュールに引き渡すことができます。名前でアクセスすることはできません。

extern FIFO inputBuffer;buffer.cに入力した場合は、リンカーエラーが発生します。それは公開されたシンボルinputBufferのすべてのモジュールを調べ、見つからないでしょう。

+0

extern-thingについては、 'static'''uart.c'を削除した後、' extern'を 'buffer.c'に入れて、変数は「真のグローバル」になりますが、それは私の問題ではありません。しかし、私はポインタを介してのみ有望なものにアクセスします、そして、私はこのケースでは 'extern'が何らかの影響を及ぼしているとは確信していません。 – klenium

+0

'static'を削除しても、' buffer.c'に 'extern'を入れないと、' Unknown symbol inputBuffer'というコンパイラエラーが発生します。しかし、私は理解していません:あなたは 'FIFOGet()'が最初に 'buffer'に正しい値を持っていますが、_lost_を取得していますか?確かにそれはここの問題ですか? 'inputBuffer'を' buffer'に再割り当てしようとするべきではありません。あなたは 'buffer'が最初に値を失った方法を見つけ出すべきです! –

関連する問題