从C-DLL函数中读取MATLAB中的int和字符串数组

时间:2012-09-19 16:51:54

标签: c matlab pointers dll shared-libraries

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

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

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

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,我收到了同样的消息“检测到Segmentation violation”。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分: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类型和相应原生类型here的信息。

编辑这是一个简单的共享库函数,它接受您的输入(您的评论如下)并使用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终止字符串?