2

我正在尝试在 MATLAB 中读取以下函数的 int 和字符串数组:

int DLLEXPORT getdata(int *index, char *id[])

在 CI 中,只需执行以下代码即可:

int count;       
int *index = calloc(MAXLINE, sizeof(int));
char **id = calloc(MAXLINE, sizeof(char*));

for (for i = 0; i < MAXLINE; ++i)                      
       id[i] = malloc(MAXID);

errcode = getdata(index, id);

在 MATLAB 中,我正在尝试以下代码,但没有成功:

errorcode = libpointer('int32');
index = libpointer('int32Ptr');
id = libpointer('stringPtrPtr');

[errorcode, index, id] = calllib('mylib','getdata', index, id);

我已经尝试初始化 libpointers 并且收到相同的消息“检测到分段违规”。有人可以帮助我吗?

4

1 回答 1

0

您肯定需要初始化您的指针 - 现在它们指向无处,它们被初始化为 0。这很可能导致段错误。如果您尝试初始化它们,那么您一定做错了。试试看。像这样

index = libpointer('int32Ptr', [1 2 3 4]);
id = libpointer('stringPtrPtr', {'asdfasdf', 'asdfasdf'});

您还可以传递普通的 matlab 数组,而不是制作 libpointer:

[errorcode, index, id] = calllib('mylib','getdata', [1 2 3 4], {'asdfasdf', 'asdfasdf'});

您可以在此处找到有关 matlab 类型和相应本机类型的信息。

编辑这是一个简单的共享库函数,它接受您的输入(您在下面的评论)并使用 mexPrintf 在屏幕上打印一个字符串

#include <string.h>
#include <mex.h>
void testfun(int *index, char* id[]){
  int idx0  = index[0];
  mexPrintf("printing string %d: id[0] %s\n", idx0, id[idx0]);
}

该函数使用整数数组中的第一个值(在您的情况下为 index[0])来打印字符串数组(id[index[0]])中的指定字符串。输出是

printing string 0: id[0] 01234567890123456789012345678901

所以它有效,试试吧。请记住,您还必须向 loadlibrary 提供相应的头文件!

如果您可以正确执行上述操作,那么您提供给 getdata 的数据很可能是错误的,并且您一定在某处遇到了段错误。也许您以某种方式修改了输入参数?例如创建非NULL 终止的字符串?

于 2012-09-19T18:41:26.810 回答