C Ошибка сегментации в структуре. Код переведен с Matlab-> C с помощью Matlab Coder

0

Я перевод некоторых функций 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 без возвращаемого значения.

  • 0
    Это похоже на то, что retArray не инициализирован должным образом, так как его size указывает на 0 вместо выделенного int32_T . Это помогло бы, если бы вы могли предоставить нам весь ваш код. - Редактировать: не ваш собственный код, а сгенерированный: p
  • 0
    Это может быть сложно, потому что в этой функции более 100000 строк. Но вы предполагаете, что может быть проблема в коде, переведенном с Matlab Coder?
Показать ещё 6 комментариев
Теги:
struct

1 ответ

1
Лучший ответ

Вы называете это из основного:

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));
  • 1
    не бросайте результат malloc . Это скроет ошибки компилятора.
  • 0
    Вы правы, забыли об этом. Благодарю.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню