Навигация:
<< >> Оглавление Указатель

Приложения

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

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

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

Описываются функции и макросы, предназначенные для вызова моделей блоков из моделей других блоков (см. §2.13 руководства программиста).

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

Макрос RDS_FUNCPARAMCAST предназначен для приведения поля Data структуры параметров функции RDS_FUNCTIONCALLDATA, которое является указателем общего вида, к указанному в параметре типу.

  RDS_FUNCPARAMCAST(
    pFuncData,    // Указатель на 
    Type          // Тип, к указателю на который приводится поле Data
  )

Определение

  #define RDS_FUNCPARAMCAST(pFuncData,Type) \
    ((Type*)((()(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
  {  servSize;    // Размер структуры для проверки
    int IntField;
    double DoubleField;
  } TMyStruct;

Вызов этой функции может выглядеть, например, так:

  TMyStruct str;
  str.servSize=sizeof(str);
  str.IntField=1;
   Block=...    // Идентификатор вызываемого блока
  (Block,FuncId,&str);

Реакция на вызов этой функции в модели блока может выглядеть так:

  // Модель блока
  extern "C" __declspec(dllexport) int  Model(
      int CallMode,              // Событие
       BlockData,  // Данные блока
       ExtParam)           // Дополнительные параметры
  { switch(CallMode)
      {
        ...
        case : // Вызов функции
         if((()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.


<< >> Оглавление Указатель