2016-12-07 2 views
0

В настоящее время я пытаюсь использовать библиотеку на основе кода на C/C++ в Matlab/Simulink с помощью инструмента Matalab legacy_code. Я очень новичок в этом, пожалуйста, принесите мне немного терпения.Matlab legacy_code Tool - Написание функции обертки для захвата массива

Я наткнулся на проблему, что у меня есть члены класса, которые возвращают массив.

То, что я сделал на сейчас, чтобы следовать примерам наследия-код Matlab, особенно это одна:

Integrate External C++ Object Methods

Насколько я могу видеть, инструмент legacy_code требует функции обертки, чтобы быть обернут вокруг вызов метода, так что, в основном, я мог бы, в рамках этой функции-обертки обрабатывать возвращаемое значение вызванного метада любым способом. Это не проблема.

Но я не уверен, как получить массив информации от вызываемого метода, а затем передать этот массив в Matlab/Simulink.

например. Возвращаемое значение метода - это указатель, указывающий на массив информации, из которого, допустим, мы знаем длину достоверной информации, которую он имеет.

/* Simple example */ 

uint8_t* BUS::answerRcvd() 
{ 
    static int r[10]; 
    int i; 


    srand((unsigned)time(NULL)); 

    for (i = 0; i < 10; ++i) 
    { 
     r[i] = rand(); 
    } 

    return r; 
} 

Есть ли способ, чтобы создать функцию-оболочку для такого метода, который будет получать массив информации и передать его вместе с MatLab?

Возможно, имеется возможность обрабатывать этот массив, например. одиночные значения uint8_t (если путь остается с данным примером) и передать их как в обычной функции matlab?

[a,b,c] = function() 

Я открыт для любых предложений, спасибо вам большое заблаговременно.

ответ

1

Хорошо, похоже, я нашел решение своей проблемы.

В качестве функции обертки ее можно использовать следующий шаблон

void myfunc(double u1, double u2, double u3, double *y1, double *y2) 
{ 
    *y1=u1; 
    *y2=(u2+u3)/2; 
} 

Эта обертка функция затем сопрягаемую с помощью унаследованного кода Tool (LCT), а затем:

def = legacy_code('initialize') 
def.OutputFcnSpec = 'void myfunc(double u1, double u2, double u3, double y1[1], double y2[1])' 

Простой, как , В коде C/C++ используйте номенклатуру/синтаксис указателя, в Matlab используйте номенклатуру/синтаксис массива.

Надеюсь, это поможет некоторым людям, таким как я, которым нужно решение для взаимодействия с устаревшим кодом, который должен принимать не только несколько входов, но и несколько выходов.

Оглядываясь назад, указатели tuuse опций довольно очевиден, но если вы не знаете, как научить ваш LCT взаимодействовать с ним, он легко становится утомительной задачей.

+0

Ссылка на соответствующую документацию Matlab: http://de.mathworks.com/help/simulink/sfg/integrating-existing-c-functions-into-simulink-models-with-the-legacy-code-tool .html – RaEyE

Смежные вопросы