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

Описания RDS

Руководство программиста

Глава 2. Создание моделей блоков

§2.5. Статические переменные блоков

§2.5.5. Работа со структурами

Полный исходный текст на языке C++ для библиотеки (DLL) с моделью сложения двух структур, хранящих комплексные числа.

      // Работа со структурами
      #include <windows.h>
      #include <RdsDef.h>
      // Подготовка описаний сервисных функций
      #define RDS_SERV_FUNC_BODY GetInterfaceFunctions
      #include <RdsFunc.h>

      //========== Главная функция DLL ==========
      int WINAPI DllMain(HINSTANCE /*hinst*/,
                               unsigned long reason,
                               void* /*lpReserved*/)
      { if(reason==DLL_PROCESS_ATTACH) // Загрузка DLL
          { // Получение доступа к функциям RDS
            if(!GetInterfaceFunctions())
              RDS_SERV_ERROR_MSGW // Сообщение: старая версия RDS
          }
        return 1;
      }
      //========= Конец главной функции =========

      extern "C" __declspec(dllexport)
        int RDSCALL TestStructSum(int CallMode,
                                  RDS_PBLOCKDATA BlockData,
                                  LPVOID ExtParam)
      {
      // Макроопределения для статических переменных
      #define pStart  ((char *)(BlockData->VarTreeData))
      #define Start (*((char *)(pStart)))
      #define Ready (*((char *)(pStart+RDS_VSZ_S)))
      #define x1 (*((void **)(pStart+2*RDS_VSZ_S)))
      #define x2 (*((void **)(pStart+2*RDS_VSZ_S+RDS_VSZ_STRUCT)))
      #define y (*((void **)(pStart+2*RDS_VSZ_S+2*RDS_VSZ_STRUCT)))
      // Макроопределения для полей структуры TestComplex
      #define Re(base) (*((double *)(base)))
      #define Im(base) (*((double *)(((char*)(base))+RDS_VSZ_D)))

        switch(CallMode)
          { // Проверка типа переменных
            case RDS_BFM_VARCHECK:
              if(strcmp((char*)ExtParam,"{SS{DD}{DD}{DD}}")==0)
                return RDS_BFR_DONE;
              return RDS_BFR_BADVARSMSG;

            // Выполнение такта моделирования
            case RDS_BFM_MODEL:
              Re(y)=Re(x1)+Re(x2);
              Im(y)=Im(x1)+Im(x2);
              break;
          }
        return RDS_BFR_DONE;
      // Отмена макроопределений
      #undef Im
      #undef Re
      #undef y
      #undef x2
      #undef x1
      #undef Ready
      #undef Start
      #undef pStart
      }
      //=========================================