3

次のようなヘッダーを持つ関数があります。

BPS_API int dialog_event_get_filebrowse_filepaths(bps_event_t* event,
                                            char** file_paths[], int* num_paths);

これは、疑問に思っている人のためのBlackBerry 10のネイティブSDKからのものです(ここにあります)。

問題は、2番目の議論として何を提供することになっているのかということです。この関数は、選択したファイルパスを返すために、charポインタの配列を設定する必要があります。

私はそれをこのように呼ぼうとしました:

char* ar[2];
dialog_event_get_filebrowse_filepaths(event, &ar, &number_paths);

また、QNXMomenticsから次のようなエラーが発生します。

cannot convert 'char * (*)[2]' to char * * * for argument 2 to int
dialog_event_get_filebrowse_filepaths(bps_event_t *, char * * *, int *)

これはそれを呼び出すための最も論理的な方法のようです。私が理解している限り、それらを設定するには、ポインタの配列のメモリアドレスが必要です。しかし、私が宣言した場合:

char** ar[2];
dialog_event_get_filebrowse_filepaths(event, ar, &number_paths);

それは機能しますが、この方法で、charポインターへのポインターの配列(char *の配列の配列)を作成しました。これは私が本当に関数に提供すべきものですか?

4

4 に答える 4

3

ドキュメントは実際にはもっと明確にすべきでしたが、これが関数が期待するものであると確信しています。

まず、関数のデコードに役立ついくつかの目安を示します。

  • タイプは実際には。と同等char***です。これは、3つのポインターの意味を見つける必要があることを意味します。
  • Cの文字列はchar*const簡潔にするために省略)です。関数が文字列の配列を設定することを期待しているので、それ*が説明されています。
  • Cの配列は、通常、ポインターで表されます。これが2番目*です。
  • 「出力パラメータ」は、2つの方法のいずれかで処理できます。呼び出し元がメモリを割り当ててポインタを渡し、呼び出し先にデータの書き込み先を指示するか、呼び出し元がメモリを割り当てにポインタをポインタに渡すだけです。 。次に、呼び出し先は、呼び出し先自体によって割り当てられたメモリのチャンクを指すように「最も内側の」ポインタを変更します。2番目のアプローチは最後のを説明します*。これは、ドキュメントノートの説明でもありますThe memory holding these values must be freed using bps_free() when no longer needed。メモリはユーザーではなくライブラリ関数によって割り当てられたため、正しいfree関数を使用することが重要です。

したがって、関数は次のように呼び出す必要があります。

char** strs;
dialog_event_get_filebrowse_filepaths(foo, &strs, bar);

関数が戻ると、strsはによって割り当てられた文字列の配列の最初のエントリを指しますdialog_event_get_filebrowse_filepaths

于 2012-05-27T22:13:56.803 に答える
2

推測ですが、次のように呼び出す必要があると思います。

char** ar = 0;
dialog_event_get_filebrowse_filepaths(event, &ar, &number_paths);

配列構文で宣言されているという事実は紛らわしいですが、これは、Cスタイルの関数が割り当てられた文字列の配列を返すための一般的な方法です。

于 2012-05-27T20:28:36.340 に答える
2

この関数は、引数を介して文字列配列と長さを返します。次のように使用できます。

char **ar=0;
int i,number_paths = 0;
dialog_event_get_filebrowse_filepaths(event, &ar, &number_paths);
for( i=0; i<number_paths; i++ )
  puts( ar[i] );

そして、次のようにメモリを解放することができます(lib-docuを参照)。

for( i=0; i<number_paths; i++ )
  free( ar[i] );
free( ar );
于 2012-05-27T21:56:18.810 に答える
1

コンパイラを満足させる必要のある(Blackberry以外の)コードを次に示します。

char *file_paths[];
iret = dialog_event_get_filebrowse_filepaths (event, &ar, &number_paths);

ポイントは

1)宣言に固定長を割り当てないでください。

2)addressof(&)配列ポインタを関数に渡します

3)誰か(API関数またはあなた)が配列と配列内のすべての文字列を割り当てていることを確認します

于 2012-05-27T20:28:31.830 に答える