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