Передача массива в структуру по ссылке на coder.ceval

У меня есть структура с очень большими массивами. Я использую кодировщик MATLAB для генерации кода C.
В моем сгенерированном коде я хочу вызвать некоторую функцию C и передать по ссылке один из массивов.

Например:

coder.ceval('Foo',coder.ref(MyStruct.VeryLargeArray));

Это не разрешено кодером MATLAB, и я получаю сообщение об ошибке:

coder.ref может применяться только к выражению типа V или V(E)...

Поскольку MyStruct.VeryLargeArray очень большой, как следует из названия, я хочу избежать очевидного решения копирования его во временную переменную:

UnnecessaryTempVar = MyStruct.VeryLargeArray;
coder.ceval('Foo',coder.ref(UnnecessaryTempVar));  

Любые идеи для обходного пути?


person ThP    schedule 18.12.2014    source источник


Ответы (2)


Вы можете написать C-оболочку для Foo, которая принимает указатель на структуру и перенаправляет базовый указатель данных MyStruct->VeryLargeArray в Foo.

Код MATLAB passStruct.m:

function y = passStruct(x)
%#codegen
coder.cinclude('Foo.h');
s.f = x;
coder.cstructname(s, 'wrapperStruct_T');
y = 10;
y = coder.ceval('WrapFoo', coder.ref(s));

Файл заголовка Foo.h:

/* Include generated header to get struct definition */
#include "passStruct.h"
double WrapFoo(wrapperStruct_T *s); 
double Foo(double *x);

Исходный файл Foo.c:

#include "Foo.h"
double WrapFoo(wrapperStruct_T *s)
{
    return Foo(s->f);
}

double Foo(double *x)
{
    return 2.0*x[0];
}

Команда Codegen:

codegen passStruct -args zeros(1000) Foo.c -report
person Ryan Livingston    schedule 18.12.2014

Хотя решение, предложенное lilbill39, будет работать, я столкнулся с другим подходом:

function y = passStruct(x)
%#codegen
s.f = x;
ps = coder.opaque('double *','&s.f[0]');
y = 0;
y = coder.ceval('Foo', ps);

Однако предполагается, что имя структуры не изменяется в процессе генерации кода.

person ThP    schedule 19.12.2014