2011-12-26 12 views
0

私はRPCベースのサーバークライアントアプリケーションを構築していました。関数から配列を返す方法

私は含まれていevent呼ばstructています

int type_id 
long int time 

は私が返すサーバー(event*)での機能を持っている:私が欲しいもの

event * 
log_1_svc(event *argp, struct svc_req *rqstp) 
{ 
    static event* result; 
result = (struct event*)malloc (3 * sizeof (struct event)); 
while (i <3) 
     { 
      result[i].type_id = i; 
      result[i].time = i; 
      i++; 
     } 
return &result 

} 

は、クライアント上の結果を受信しますこのポインタを使用します。

ここ

は、クライアントのサイト上のコードです:

log_prog_1(char *host,int client_type,int type_id,long int time) 
{ 

event *result_1; 

result_1 = log_1(&log_1_arg, clnt); // this calls the function in server and gurantee that the result is returned an address to pointer 

int i =0; 
     while (i<3) 
     { 
      printf ("Type: %d\n",result_1[i].type_id); 
      printf ("Time: %ld\n",result_1[i].time); 
      [CODE][/CODE] 
      i++; 
     } 

} 

このコードは動作しますが、それは(クライアント端末に示した数字は、サーバの端末でのものと異なっている)のアドレスではない値を返すようです。

私は、サーバーのリターンresultせてみました:それは働いていただけ最初の項目は、クライアントの端末で正しく印刷さ

return &result; 

:(以前に書かれたように)

return result; 

ない結果のアドレスを他の2つの項目は0です。

事前のソリューションと感謝を私に提供してください。)

+3

このコードはコンパイルされません: 'event **'型の '&result'を返しています。実際のコードを投稿してください。 –

+1

また、クライアントとサーバーが(おそらく)2つの別々のプロセスであるため、独立したアドレス空間を持つため、これを実行できない理由があります。他人の記憶を見ることはできません。生ポインタを転送する場合は、「共有メモリ」を調べる必要があります。 –

+0

@OliCharlesworth、共有メモリであっても、メモリブロックは同じアドレスにある可能性は低いです。生のポインタではなく、共有メモリブロックへのオフセットを使用したいと思うでしょう。 –

答えて

0

いくつかの発言:

  1. 露骨なメモリリークがあります(メモリはmalloc関数(ある)D「が、決して自由には()」 d)。
  2. iはlog_1_svc
  3. に初期化されることはありません構造体*イベントの結果ポインタが構造体を返しlog_1_svc
  4. 静的である必要はありません**上記で既に述べたように代わりに構造体*イベントのイベント、(; によって方法、これは暗黙のポインタのキャストがある警告してコンパイルします。あなたの警告を修正する!)

をあなたの問題を解決するには、私は最高のsoultionがにあることを考える2.

0

に私のベットを置きますメモリへのポインタを3つの関数に渡すstruct eventを入力してください。

すなわち

void log_1_svc(event *argp, struct svc_req *rqstp, struct event *result) 

これは、呼び出し側がちょうどスタックを使用して、任意のメモリリークを避けることができ付加的な利点が追加されます。

関連する問題