2

次の関数のMATLABでintおよびstrings配列を読み取ろうとしています。

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に初期化されています。これにより、セグメンテーション違反が発生する可能性があります。それらを初期化しようとした場合は、間違って行ったに違いありません。sthを試してください。このような

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

libpointerを作成する代わりに、通常のmatlab配列を渡すこともできます。

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

matlabタイプと対応するネイティブタイプに関する情報は、ここにあります

編集これは、入力(以下のコメント)を受け取り、mexPrintfを使用して画面に1つの文字列を印刷する単純な共有ライブラリ関数です。

#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 に答える