Ошибка сегментации с использованием функции MEX- C в MATLAB - PullRequest
0 голосов
/ 20 января 2020

У меня проблема при создании функции MEX- C в MATLAB.

Здесь я хочу вернуть некоторые данные, сгенерированные моей вычислительной программой, и поместить их в plhs [0] .

Мне кажется, что я неправильно понял, используя C указатели и MEX-файлы, так как я на самом деле не C парень ...

Вот мой код:

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
    uint8_t *output_buffer;
    mwSize *size;
    size = (mwSize *) mxGetPr(prhs[0]);
    plhs[0] = mxCreateNumericMatrix(1, size[0], mxUINT8_CLASS, mxREAL);
    output_buffer = (uint8_t *) mxGetData(plhs[0]);
    output_buffer = genData();
}

В основном моя функция genData () генерирует некоторые данные и возвращает их.

Я хотел бы получить результат в виде вывода, такого, что при наборе:

a = genData() a будет содержать содержимое plhs [0], но это не работает.

Я пытался использовать mxSetData(plhs[0], output_buffer). Это работает, но вылетает тогда, когда вы делаете что-то еще ...

Я думаю, что ответ должен быть вполне очевидным, но я не очень разбираюсь в C.

Спасибо за вашу помощь .

1 Ответ

2 голосов
/ 21 января 2020

Вы не можете присоединить собственную память C / C ++ к mxArray через функции API mxSetData (и друзей). Это испортит MATLAB Memory Manager и в итоге приведет к взлому sh. Вы должны либо изменить функцию genData, чтобы использовать функции API MATLAB для выделения памяти (mxMallo c, mxCallo c, et c.), В этом случае вы можете затем использовать mxSetData, или вам нужно будет скопировать данные из genData возвращали указатель в mxArray. Кроме того, ваш метод получения переменной размера не является надежным. Если тип целого числа, хранящегося в prhs [0], не соответствует mwSize, то вы либо получите неправильный ответ, либо cra sh. Таким образом, вместо этого

mwSize *size;
size = (mwSize *) mxGetPr(prhs[0]);
plhs[0] = mxCreateNumericMatrix(1, size[0], mxUINT8_CLASS, mxREAL);

вы должны сделать что-то вроде этого

mwSize size;
size = mxGetScalar(prhs[0]);
plhs[0] = mxCreateNumericMatrix(1, size, mxUINT8_CLASS, mxREAL);

Наконец, вы должны поставить некоторые проверки заранее, чтобы убедиться, что передается prhs [0] в том, что это число c, и что оно не пустое и не сложное и т. д. c. Кроме того, следующая строка dos not присоединяет указатель к mxArray:

output_buffer = genData();

Он просто перезаписывает значение в переменной output_buffer ... ничего больше.

...