Matlab C++ - получает тип вывода динамического размера (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 ответ

Вы можете проверить /questions/37318571/kak-ispolzovat-biblioteku-c-sozdannuyu-matlab-coder-codegen-v-programme-c-s-argumentami-emxarray/37318590#37318590 который, кажется, охватывает аналогичную проблему.

В этом конкретном случае проблема, вероятно, заключается в том, что память, на которую указывает 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, Даже если используются функции-обертки, может быть выделено хранилище для векторов размера.

Другие вопросы по тегам