Приложения
Приложение А. Функции, константы и структуры RDS
А.5. Сервисные функции и макросы RDS
А.5.13. Вызов функций блоков
Описываются функции и макросы, предназначенные для вызова моделей блоков из моделей других блоков (см. §2.13 руководства программиста).
А.5.13.1. Макрос RDS_FUNCPARAMCAST – приведение параметра функции к нужному типу
Макрос RDS_FUNCPARAMCAST предназначен для приведения поля Data структуры параметров функции RDS_FUNCTIONCALLDATA, которое является указателем общего вида, к указанному в параметре типу.
RDS_FUNCPARAMCAST(
pFuncData, // Указатель на RDS_FUNCTIONCALLDATA
Type // Тип, к указателю на который приводится поле Data
)
Определение
#define RDS_FUNCPARAMCAST(pFuncData,Type) \ ((Type*)(((RDS_PFUNCTIONCALLDATA)(pFuncData))->Data))
Параметры
- pFuncData (указатель на RDS_FUNCTIONCALLDATA)
- Указатель на структуру данных вызываемой функции RDS_FUNCTIONCALLDATA. Этот параметр не обязательно должен иметь тип «RDS_FUNCTIONCALLDATA*», он может быть и указателем произвольного типа (void*), поскольку внутри макроса он явно приводится к нужному типу. В нем, например, можно передать значение третьего параметра (ExtParam) функции модели блока при реакции на событие RDS_BFM_FUNCTIONCALL – несмотря на то, что он имеет тип void*, в нем всегда передается указатель на структуру данных функции.
- Type (имя типа)
- Имя типа, к указателю на который будет приведено поле Data указанной в первом параметре структуры.
Возвращаемое значение
Значение поля Data структуры данных функции, приведенное к указанному типу.
Примечания
В структуре данных функции RDS_FUNCTIONCALLDATA поле Data, являющееся указателем на параметры функции, для универсальности имеет тип «указатель общего вида», то есть LPVOID. Макрос RDS_FUNCPARAMCAST позволяет в некоторых случаях упростить приведение этого указателя к нужному типу. На практике, в большинстве случаев, в его применении нет острой необходимости – все приведения типов всегда можно записать вручную.
Пример
Допустим, в глобальной переменной FuncId находится идентификатор какой-либо функции (см. rdsRegisterFunction), параметром которой является указатель на некую структуру TMyStruct:
typedef struct { DWORD servSize; // Размер структуры для проверки int IntField; double DoubleField; } TMyStruct;
Вызов этой функции может выглядеть, например, так:
TMyStruct str; str.servSize=sizeof(str); str.IntField=1; RDS_BHANDLE Block=... // Идентификатор вызываемого блока rdsCallBlockFunction(Block,FuncId,&str);
Реакция на вызов этой функции в модели блока может выглядеть так:
// Модель блока extern "C" __declspec(dllexport) int RDSCALL Model( int CallMode, // Событие RDS_PBLOCKDATA BlockData, // Данные блока LPVOID ExtParam) // Дополнительные параметры { switch(CallMode) { ... case RDS_BFM_FUNCTIONCALL: // Вызов функции if(((RDS_PFUNCTIONCALLDATA)ExtParam)->Function==FuncId) { if(RDS_FUNCPARAMCAST(ExtParam,TMyStruct)->servSize==sizeof(TMyStruct)) { // Выполнение функции RDS_FUNCPARAMCAST(ExtParam,TMyStruct)->DoubleField= RDS_FUNCPARAMCAST(ExtParam,TMyStruct)->IntField*2; } } break; ... } }
См. также