2013-07-08 12 views
7

私は壁に書かれた「グローバル回避」を読んでいます。それは明白な疑問につながり、どのようにするのが最善でしょうか?グローバル変数をcで使用しない方法

私は明らかに現在のプロジェクトでやりたいと思っています。目標は、離れたPCに、既に標準入力リーダーがあるアプリケーションに「キーストローク」を送信させることです。既存のコードでキーストロークが検出されない場合は、「udpキーストローク」があるかどうかを確認し、そうであれば入力してキーボード入力と見なされるようにします。最小限に侵襲的で、他の人々のコードにぴったりフィットするゴブを必要としません。

だから私は一度ノンブロッキングselect()を使用して、ループ内のservice()機能、その後、ポートを開き、バインドするsetup()関数を使用して、小さなUDPソケットリーダーを石畳のない、ないループ、読むために何があるかどうかだけをチェック今すぐ。その場合は、ソケットからデータを読み込み、それを何かを、それ以外は0

// pseudo c 
char c; 

setup(); 
while (1) 
{ 
    c = check_for_keyboard_entry(); 
    if (c == 0) 
     c = service(); 
    handle_keypress(c); 
    do_a_bunch_of_other_stuff(); 
} 

を返すこれを行うには明白な方法は、間などのポート、タイムアウト、のsockaddrのを転送するために、いくつかのグローバルであります2つの機能。しかし、あなたは熱心な世界を産みますよね?

したがって、機能間で6または8のヴァースを転送するにはどうすればよいですか?

setup()で静的バースを使用する場合は、service()ルーチンでアクセスできますか?

malloc-edを取得して渡された構造体がうまくいくと思います。ソケットを閉じてメモリを解放するにはcleanup()を持っていなければなりません。

これは思い出します。 NO C++!

+2

_'' malloc-edを取得し、渡された構造体が動作すると思われます。 '' - あなたはそれを持っています! –

+0

+1生のスピード!その他のアプローチは? –

+1

\ 0または '\ 0'を修正してください –

答えて

3

structにすべての情報をパックすることができます。構造体は、クライアントまたは不透明な型から見ることができます。複雑な型のデータ(カプセル化)を隠すことができるように、不透明な型がより良い選択肢になります。

typedef struct { 
port_t port; 
timeout_t timeout; 
sockaddr_t sockaddr; 
etc_t etc; 
} my_stuff; 

その後、参照することによってそれを周りに渡す:

void Foo(my_stuff*); 

私はmalloc関数-EDを取得し、周りに渡された構造体が働くだろうと仮定します。私はソケットを閉じてメモリを解放するためにクリーンアップ()をするべきです。

一般に、構造体は必ずしもmallocである必要はありません。しかし、はい、これが必要な場合があります。

+0

しかし、構造体をグローバルにしないでください?または、 'foo()'が 'my_stuff'へのポインタを返すことを意味しましたか?もしそうなら、 'my_stuff'は' foo() 'のスコープが閉じたときにどうしますか?あるいは 'foo()'に 'my_stuff'を静的にしますか? –

+2

@WesMiller:それを外側のスコープのスタックに置くことができます。だから 'int main(){my_stuff stuff; stuff.port = 80; ...; Foo(&stuff); ...; 0を返します。 } '。関数内の静的変数は事実上グローバルであり、同様の問題を共有します。 –

+0

@MaciejPiechotka +1。十分に価値のある、自己管理ドープスラップが適用された。あなたが一度それを見たら、その答えはとても明白です。 –

関連する問題