Я перевод некоторых функций Matlab на C с Matlab Coder. Все работает до такой степени, что я хочу вернуть массив (транспонированный вектор) из моей функции.
В Matlab у меня есть функция:
function returnedArray = myFun(input arguments)
<function code>
Этот вызов функции в C получает translateet для:
void myFun(input arguments, emxArray_realT *returnedArray)
<function code>
emxArray_real_T - это структура, которая была создана Matlab Coder:
struct emxArray_real_T
{
real_T *data;
int32_T *size;
int32_T allocatedSize;
int32_T numDimensions;
boolean_T canFreeData;
};
И real_T, int32_T... создаются общие определения типов:
typedef double real_T;
Я называю это myFun из основного:
struct emxArray_real_T *result = malloc(sizeof(struct emxArray_real_T));
myFun(input arguments, result);
Когда я запускаю это, я получаю сообщение об ошибке: Ошибка сегментации. gdb дал мне это:
Program received signal SIGSEGV, Segmentation fault at:
99643: i0=retArray->size[0];
p retArray
$1 = (emxArray_real_T *) 0xc1d010
p retArray.size
$2 = (int32_T *) 0x0
p retArray.size[0]
Cannot access memora ar adress 0x0
Я делаю что-то неправильно в своей основной функции? Надеюсь, это так, потому что переведенный код из Matlab в C - это беспорядок или, может быть, только для меня, как для новичков. Код работает нормально, если я перевежу и скомпилирую его на C без возвращаемого значения.
Вы называете это из основного:
struct emxArray_real_T *result = malloc(sizeof(struct emxArray_real_T));
// result->size == 0;
// You would need to initialize this too.
// Somewhere in myFun it is accessed like this:
// *retArray->size = x;
// or
// x = *retArray->size;
// which causes the fault.
myFun(input arguments, result);
Поскольку я ничего не знаю о Matlab, я не могу сказать вам, если это то, что вам нужно сделать, или если это должно быть сделано сгенерированным кодом где-нибудь.
Вы можете исправить это следующим образом:
result->size = malloc(sizeof(int32_T));
malloc
. Это скроет ошибки компилятора.
retArray
не инициализирован должным образом, так как егоsize
указывает на 0 вместо выделенногоint32_T
. Это помогло бы, если бы вы могли предоставить нам весь ваш код. - Редактировать: не ваш собственный код, а сгенерированный: p