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

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

  // Использование связанных сигналов
  #include <windows.h>
  #include <RdsDef.h>
  // Подготовка описаний сервисных функций
  
  #include <RdsFunc.h>

  // Глобальная переменная для значения ошибки
  double DoubleErrorValue;

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

  //===== Произведение максимального ========
  //====== и минимального элементов =========
  extern "C" __declspec(dllexport)
    int  TestMatMinMax(int CallMode,
                                BlockData,
                                ExtParam)
  {
  // 
  #define pStart  ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define s1 (*((char *)(pStart+2*RDS_VSZ_S)))
  #define s2 (*((char *)(pStart+3*RDS_VSZ_S)))
  #define pM1 ((void **)(pStart+4*RDS_VSZ_S))
  #define pM2 ((void **)(pStart+4*RDS_VSZ_S+RDS_VSZ_M))
  #define M1min (*((double *)(pStart+4*RDS_VSZ_S+2*RDS_VSZ_M)))
  #define M2max (*((double *)(pStart+4*RDS_VSZ_S+2*RDS_VSZ_M+ \ 
                RDS_VSZ_D)))
  #define y (*((double *)(pStart+4*RDS_VSZ_S+2*RDS_VSZ_M+ \
            2*RDS_VSZ_D)))

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

        // Выполнение такта моделирования
        case :
          if(s1) // Изменилось значение входа M1
            { // Необходимо найти новый минимальный элемент
              s1=0; // Сброс сигнала
              if((pM1)) // Матрица M1 не пуста
                { // Вспомогательные переменные
                  int m1count;
                  double *m1data;
                  // Число элементов в матрице
                  m1count=(pM1)*(pM1);
                  // Получить указатель на первый элемент
                  m1data=(double*)(pM1);
                  // Поиск минимального элемента
                  M1min=;
                  for(int i=0;i<m1count;i++)
                    if(m1data[i]!= &&
                       (M1min== || M1min>m1data[i]))
                      M1min=m1data[i];
                }
              else // Матрица M1 пуста
                M1min=;
            } // if(s1)
          if(s2) // Изменилось значение входа M2
            { // Необходимо найти новый максимальный элемент
              s2=0; // Сброс сигнала
              if((pM2)) // Матрица M2 не пуста
                { // Вспомогательные переменные
                  int m2count;
                  double *m2data;
                  // Число элементов в матрице
                  m2count=(pM2)*(pM2);
                  // Получить указатель на первый элемент
                  m2data=(double*)(pM2);
                  // Поиск максимального элемента
                  M2max=;
                  for(int i=0;i<m2count;i++)
                    if(m2data[i]!= &&
                       (M2max== || M2max<m2data[i]))
                      M2max=m2data[i];
                }
              else // Матрица M2 пуста
                M2max=;
            } // if(s2)
          // Значения M1min и M2max определены –
          // вычисление произведения
          if(M1min!= && M2max!=)
            y=M1min*M2max;
          else
            y=;
          break;
      }
    return ;
  // Отмена макроопределений
  #undef y
  #undef M2max
  #undef M1min
  #undef pM2
  #undef pM1
  #undef s2
  #undef s1
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


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