В настоящее время я внедряю устаревший код C в S-функции C MEX в MATLAB / Simulink (R2017b).Я уже поместил дубликат записи в Запись в 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-функции, как в следующем сегменте кода:
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 Code , который вызывается в C S-функциях.Кто-нибудь уже знает, что такой синтаксический анализатор и генератор кода существует?
Обходной путь для итерации по всем полям структуры с помощью арифметики с указателями завершится неудачей, поскольку объем памяти заранее не известен.В качестве альтернативы итерациям можно использовать X-макросы, но они все равно будут зависеть от синтаксического анализатора и генератора кода.
Запись в стеке потока Обмен данными между несколькими s-функциями c mex дает хороший результатобзор двух подходов, но не хватает генерации кода, которая понадобится в будущем.Кто-нибудь знает дальнейшие обходные пути для обработки устаревших структур указателей, включая указатель на дальнейшие структуры?
Спасибо за любой ответ и помощь!