MATLAB/Simulink - C MEX S-функция: преобразование между сигналом шины и устаревшей структурой C с использованием указателей
В настоящее время я внедряю устаревший код C в S-функции C MEX в MATLAB/Simulink (R2017b). Я уже разместил двойную запись в Entry на MathWorks-MATLAB. Унаследованные функции принимают в качестве указателя общего правила структуры, включающие указатель на дополнительные структуры, например, унаследованный код:
func.h:
typedef struct {
double* param;
}T_DATA_1;
typedef struct {
double in;
double out;
T_DATA_1* pParam;
}T_DATA_2;
func.c:
void func(T_DATA_2 *pData){
pData->out = pData->in + *(pData->pParam->param);
}
Я уже знаю, что могу обернуть вручную, например, сигнал входной шины в унаследованную структуру в функции C S, как в следующем фрагменте кода:
void wrap_BussignalToLegacy(T_DATA_2 *pLegacy, T_DATA_2__BUSOBJ *pInput){
pLegacy->in = pInput->in;
pLegacy->out = pInput->out;
*(pLegacy->pParam->param) = pInput->pParam.param;
}
с соответствующей структурой для сигнала шины, удаляющей все объявления указателя.
typedef struct {
double param;
}T_DATA_1__BUSOBJ;
typedef struct {
double in;
double out;
T_DATA_1 pParam;
}T_DATA_2__BUSOBJ;
Конечно, я должен написать аналогичную функцию, чтобы обернуть унаследованную структуру обратно в сигнал выходной шины.
Использование этого метода вручную просто отлично работает, но для случая, когда структуры становятся больше с увеличением количества указателей на дальнейшие структуры, потребуется огромное время для написания соответствующих оболочек сигналов.
Одна идея заключается в написании синтаксического анализатора MATLAB, который анализирует устаревшие структуры и генерирует C-код, который вызывается в C S-функциях. Кто-нибудь уже знает, что такой парсер и генератор кода существует?
Обходной путь для обхода всех структурных полей с помощью арифметики с указателями завершится неудачей, поскольку объем памяти заранее неизвестен. В качестве альтернативы итерациям можно использовать X-макросы, но они все равно будут зависеть от парсера и генератора кода.
Запись в стеке потока Обмен данными между несколькими s-функциями c mex дает хороший обзор двух подходов, но в нем отсутствует генерация кода, которая потребуется в будущем. Кто-нибудь знает дальнейшие обходные пути для обработки устаревших структур указателей, включая указатель на дальнейшие структуры?
Спасибо за любой ответ и помощь!