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

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

  // Передача матрицы через динамическую переменную
  #include <windows.h>
  #include <math.h>
  #include <RdsDef.h>
  // Подготовка описаний сервисных функций
  
  #include <RdsFunc.h>

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

  //=========== Блок-передатчик =============
  extern "C" __declspec(dllexport)
    int  TestDynMatrCreate(int CallMode,
                                   BlockData,
                                   ExtParam)
  {
  // 
  #define pStart  ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define pX ((void **)(pStart+2*RDS_VSZ_S))
    // Вспомогательная переменная – указатель на структуру подписки
     Link;

    switch(CallMode)
      { // Инициализация блока
        case :
          // Создание динамической переменной
          Link=(, // В корневой
                                       "DynMatr",  // Имя переменной
                                       "MD",       // Тип
                                       TRUE,       // Запрет удаления
                                       NULL);      // Без нач.знач.
          // Запомнить указатель на структуру подписки
          BlockData->BlockData=Link;
          break;

        // Очистка
        case :
          // Запомненный указатель на структуру подписки
          Link=()BlockData->BlockData;
          // Удалить переменную
          (Link);
          break;

        // Проверка типа статических переменных
        case :
          if(strcmp((char*)ExtParam,"{SSMD}")==0)
            return ;
          return ;

        // Такт расчета
        case :
          // Запомненный указатель на структуру подписки
          Link=()BlockData->BlockData;
          // Если переменная существует, копировать входную матрицу
          // в матрицу динамической переменной
          if(Link!=NULL && Link->Data!=NULL)
            { // Копирование X в динамическую переменную
              (Link->Data,pX);
              // Уведомление подписчиков
              (Link);
            }
          break;
      }

    return ;
  // Отмена макроопределений
  #undef pX
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================

  //============ Блок-приемник ==============
  extern "C" __declspec(dllexport)
    int  TestDynMatrGet(int CallMode,
                                BlockData,
                                ExtParam)
  {
  // 
  #define pStart  ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define pY ((void **)(pStart+2*RDS_VSZ_S))
  #define s (*((double *)(pStart+2*RDS_VSZ_S+RDS_VSZ_M)))
    // Вспомогательная переменная – указатель на структуру подписки
     Link;

    switch(CallMode)
      { // Инициализация блока
        case :
          // Подписка на динамическую переменную
          Link=(, // В корневой
                                       "DynMatr",   // Имя
                                       "MD",        // Тип
                                       FALSE);      // Без поиска
          // Запомнить указатель на структуру подписки
          BlockData->BlockData=Link;
          break;

        // Очистка
        case :
          // Запомненный указатель на структуру подписки
          Link=()BlockData->BlockData;
          // Прекратить подписку
          (Link);
          break;

       // Проверка типа статических переменных
       case :
          if(strcmp((char*)ExtParam,"{SSMDD}")==0)
            return ;
          return ;

        // Изменение динамической переменой или такт расчета
        case :
        case :
          // Запомненный указатель на структуру подписки
          Link=()BlockData->BlockData;
          // В s будут суммироваться элементы матрицы
          s=0;
          // Проверка существования динамической переменной
          if(Link!=NULL && Link->Data!=NULL)
            { // Копировать динамическую матрицу в Y
              (pY,Link->Data);
              // Если матрица не нулевого размера – суммировать
              if((Link->Data))
                { // Число элементов в матрице
                  int count=(Link->Data)*
                            (Link->Data);
                  // Указатель на начало данных матрицы
                  double *data=(double*)(Link->Data);
                  // Суммирование элементов в цикле
                  for(int i=0;i<count;i++)
                    s+=data[i];
                }
              // Взвести Ready для передачи выходов по связям
              Ready=1;
            }
          break;
      }

    return ;
  // Отмена макроопределений
  #undef s
  #undef pY
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


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