Текущий раздел:

Описания RDS

Приложения

Приложение А. Функции, константы и структуры RDS

А.5. Сервисные функции и макросы RDS

А.5.13. Вызов функций блоков

А.5.13.1. Макрос RDS_FUNCPARAMCAST – приведение параметра функции к нужному типу

# Приложения

## Приложение А. Функции, константы и структуры 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;
            ...
          }
      }

См. также

RDS_BFM_FUNCTIONCALL, RDS_FUNCTIONCALLDATA.