配列、文字列、およびポインターの使用

Doctor プログラム (プラットフォーム ソフトウェア開発キット (SDK) の \samples\rpc\doctor を参照) は、配列属性と文字列属性に関連する設計のトレードオフを示すアプリケーションの良い例です。 博士プログラムは、1960年代にMITで人工知能研究者ジョセフ・ワイゼンバウムによって開発された、よく知られたプログラムの小さなサンプルバージョンであるエリザです。 プログラムは、自然言語入力に応答する単純なパターンマッチングを使用してセラピストを模倣します。

エライザプログラムは、次のセッションを記録しました.

User イライザ
男性はみんな同じだ。 どのような方法で?
彼らは常に何かや他のことについて私たちを盗聴しています。 具体的な例を考えることができますか?
さて、私のボーイフレンドは私をここに来させました。 あなたのボーイフレンドはあなたがここに来させました。
彼は私が多くの時間を落ち込んでいると言います。 あなたが落ち込んでいると聞いて申し訳ありません。
それは本当です、私は不満です。 ここに来て、あなたが不満にならないのに役立つと思いますか?
私はいくつかの助けが必要です。それは確かなようです。 あなたはいくつかの助けを得た場合、それはあなたに何を意味しますか?
おそらく、私は母と一緒にやることを学ぶことができました。 あなたの家族について詳しく教えてください。
私の母は私の世話をします。 あなたの家族の他の誰があなたに面倒を見るのですか?
私の父。 あなたのお父さん。
あなたはある点で私の父に似ています。 どのような類似点が表示されますか?

 

Doctor プログラムは、クライアント側とサーバー側のアプリケーションに分割できます。 クライアント側は患者に入力を求め、医師の応答を表示します。 サーバー側で患者の入力を処理し、医師の応答を生成します。 これは、クライアント/サーバー アプリケーションの従来の例です。サーバーが広範な計算負荷を処理している間、クライアントはユーザー操作を担当します。 関数に渡されて返されるデータはあまりありませんが、データに大量の処理が必要になる可能性があるため、サーバーはそれを処理します。

Doctor プログラムは、入力に文字配列を使用し、別の文字配列を出力として返します。 次の表は、クライアントとサーバーの間で文字配列を渡す 4 つの方法と、各アプローチを実装するために必要な属性と関数を示しています。

アプローチ 属性または関数
カウントされた文字配列 [ size_is], [ length_is], [ ref]
スタブ管理文字列 [ string], [ ref], サーバー上のmidl_user_allocate
スタブ管理文字列 [ string], [ unique], midl_user_allocate on client and server
文字列を返す関数 [ unique]

 

これらの属性の組み合わせに関連付けられている制約内では、1 つの文字配列をクライアントからサーバーに送信し、サーバーからクライアントに別の文字配列を返す別の方法があります。

次のトピックでは、これらのパラメーターを管理できるさまざまなインターフェイス間の設計上のトレードオフについて説明します。