2

関数の戻り値を格納するための char 配列を作成しようとしています。次の関数では、データは *****valv** に保存されます。データにアクセスするために extern 変数を作成する方法は?

int credis_lrange(REDIS rhnd, const char *key, 
                   int start, int end, char ***valv) 
{
  int rc;

  if ((rc = cr_sendfandreceive(rhnd, CR_MULTIBULK, "LRANGE %s %d %d\r\n", 
                                key, start, end)) == 0) 
  {
    *valv = rhnd->reply.multibulk.bulks;
    rc = rhnd->reply.multibulk.len;
  }

  return rc;
}

解決:

char **elements;

int size = credis_lrange(this->redis,"object_2",600,603,&elements);

for (int i=0; i<size;i++) {
    cout << "element: " << elements[i] << endl; 
}

みんなありがとう!

4

2 に答える 2

5
char ***element[size];

正確には 3D 配列ではありませんが、sizeポインターからポインターへ、ポインターからポインターへの要素の配列ですchar

次のいずれかを使用します。

char e[ D1 ][ D2 ][ D3 ]; /* D1, D2, D3 are integral constants */
char *e[ D2 ][ D3 ];
char e[][ D2 ][ D3 ];

eまた、関数の引数として指定するだけで渡すことができます。

さらに読むと、パラメーターは実際には 3D 配列ではなく、C スタイルの文字列の配列へのポインターであることがわかります。構文は同じかもしれませんが、意図は異なることに注意してください。

その場合、次の 2 つのことを行う必要があります。

  • 配列に格納する文字列の数を指定します
  • 弦ごとに
    • メモリを割り当てる
    • char文字列データを配列にコピーする

最後に、この文字列配列のアドレスをcredis_lrange関数に渡します。

于 2010-02-02T23:29:52.953 に答える
0

これについてGoogleでヒットしたのは1つだけですが、cr_sendfandreceive関数がrhnd->reply.multibulk.bulksメンバーを割り当てるように見えるので、実際に戻す必要はありません(そもそもrhndが渡されたため) )。

それをコピーしたい場合は、要素を char** として宣言し、そのアドレスを渡し (または参照を使用)、メソッド内でバルクメンバーと配列内の各文字列を (ループで) 複製します。 .

于 2010-02-02T23:54:16.570 に答える