Matlab получает тип вывода динамического размера (emxArray_real_T)

Я преобразовал код Matlab в C ++, используя кодер.

void myfunction(const emxArray_real_T *input, emxArray_real_T *output){ ... }

У меня есть настройки для отправки emxArray_real_T введите вводы без каких-либо проблем. Как настроить получение динамического размера вывода в C ++, который вызывает myfunction?

Код обновлен:

main(){
.
.
.
double *inputVec;
inputVec=(double*)malloc(1000 * sizeof(double));
emxArray_real_T *input;
emxArray_real_T *output;

input=emxCreateWrapper_real_T(&inputVec[0],1,1000);
output = emxCreateWrapper_real_T(NULL,0,0);

myfunction(input,output);

emxDestroyArray_real_T(input);
emxDestroyArray_real_T(output);
.
.
}

Это компилируется просто отлично, но ошибки, говоря
*** glibc detected *** /data/myscript : double free or corruption (!prev): 0x000000000de54920 ***

1

Решение

Вы можете проверить https://stackoverflow.com/a/24271438/3297440 который, кажется, покрывает подобную проблему.

В этом конкретном случае проблема, вероятно, заключается в том, что память, на которую указывает output никогда не был инициализирован. Вы можете использовать один из emxCreate* функции в myfunction_emxAPI.h инициализировать пустой emxArray и передать это. Выбор между emxCreateWrapper_real_T а также emxCreate_real_T зависит от того, хотите ли вы владеть памятью, выделенной для данных. Первый дает право собственности в ваших руках, а второй используется, когда emxArray владеет памятью.

Что-то вроде:

output = emxCreateWrapper_real_T(NULL,0,0);

до звонка myfunction должен сделать свое дело.

Кстати, не забудьте позвонить:

emxDestroyArray_real_T(input);
emxDestroyArray_real_T(output);

в конце, чтобы очистить любую память, выделенную внутри emxArrays, Даже если используются функции-обертки, может быть выделено хранилище для векторов размера.

1

Другие решения


По вопросам рекламы [email protected]