3

有一个带有如下标题的函数:

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

这来自 BlackBerry 10 的 Native SDK,供任何想知道的人使用(可以在此处找到)。

问题是:我应该提供什么作为第二个论点。此函数应填充 char 指针数组以返回选定的文件路径。

我试着这样称呼它:

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

我从 QNX Momentics 收到一个错误,如下所示:

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

文档确实应该更明确,但我很确定这是函数所期望的:

首先,一些有助于解码函数的经验法则:

  • 该类型实际上等同于 a char***。这意味着我们必须找到三个指针的含义。
  • C 中的字符串是 a char*const为简洁起见,省略了)。正如我们期望该函数填充一个字符串数组一样,这是一个原因*
  • C中的数组通常由指针表示。所以这是第二个*
  • “输出参数”可以通过以下两种方式之一处理:调用者分配内存,并传递一个指针,告诉被调用者在哪里写入数据,或者调用者分配任何内存,只是传递一个指向指针的指针. 然后被调用者将修改“最内层”指针以指向被调用者本身分配的一块内存。第二种方法将占最后*. 这也解释了文档说明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;
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 回答
2

只是一个猜测,但我怀疑它应该这样称呼:

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

使用数组语法声明它的事实令人困惑,但这将是 C 风格函数返回分配的字符串数组的常用方法。

于 2012-05-27T20:28:36.340 回答
1

这是一些应该满足编译器的(非黑莓)代码:

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

重点是

1) 不要声明中指定固定长度。

2) 将 addressof (&) 数组指针传递给您的函数

3) 确保有人(API 函数或您)分配数组,以及数组中的所有字符串

于 2012-05-27T20:28:31.830 回答