7

壁に書かれている「Avoid Globals」を読みました。これは、どのように行うのが最善かという明白な質問につながります。

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

setup()そこで、関数を使用してポートを開いてバインドする小さな UDP ソケット リーダーを作成しました。次にservice()、ノンブロッキング 1 回を使用するループ内の関数、ループなし、今すぐselect()読み取るものがあるかどうかを確認するだけです。その場合、ソケットからデータを読み取って何かを行い、それ以外の場合は 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 されて渡される構造体が機能すると思います。cleanup()ソケットを閉じてメモリを解放する必要があります。

これは AC に関する質問です。いいえC ++!

4

1 に答える 1

4

そのすべての情報をstruct. 構造体は、クライアントまたは不透明な型に表示できます。複雑な型のデータ (カプセル化) を非表示にできるように、不透明な型を選択することをお勧めします。

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

次に、参照によって渡します。

void Foo(my_stuff*);

malloc されて渡される構造体が機能すると思います。ソケットを閉じてメモリを解放するには、 cleanup() が必要です。

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

于 2013-07-08T21:54:58.130 に答える