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

Полный исходный текст на языке C++ для библиотеки (DLL) с моделями умножения матрицы на константу. Библиотека содержит три варианта модели:

Изменения от варианта к варианту выделены цветом.

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

  //========== Главная функция DLL ==========
  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  TestMatr(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))
  #define k (*((double *)(pStart+2*RDS_VSZ_S+RDS_VSZ_M)))
  #define pY ((void **)(pStart+2*RDS_VSZ_S+RDS_VSZ_M+RDS_VSZ_D))
    // Структуры с информацией о матрицах
     XD,YD;
    switch(CallMode)
      { // Проверка типа переменных
        case :
          if(strcmp((char*)ExtParam,"{SSMDDMD}")==0)
            return ;
          return ;

        // Выполнение такта моделирования
        case :
          // Считать информацию о матрице X в структуру XD
          (pX,&XD);
          if(XD.Exists) // Матрица X существует
            { // Задать размер Y и считать информацию о ней в YD
              (pY,XD.Rows,XD.Cols,FALSE,&YD);
              // Присвоить значения элементам Y
              for(int r=0;r<XD.Rows;r++)
                for(int c=0;c<XD.Cols;c++)
                  (double,&YD,r,c)=
                    k*(double,&XD,r,c);
            }
          else // Матрица X не существует
            // Очистить матрицу Y
            (pY,0,0,FALSE,NULL);
          break;
      }
    return ;
  // Отмена макроопределений
  #undef pY
  #undef k
  #undef pX
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================

  //===================================================
  // Второй вариант - доступ к матрицам через указатели
  //===================================================

  //============= Модель блока ==============
  extern "C" __declspec(dllexport)
    int  TestMatr1(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))
  #define k (*((double *)(pStart+2*RDS_VSZ_S+RDS_VSZ_M)))
  #define pY ((void **)(pStart+2*RDS_VSZ_S+RDS_VSZ_M+RDS_VSZ_D))
    // Структуры с информацией о матрицах
    switch(CallMode)
      { // Проверка типа переменных
        case :
          if(strcmp((char*)ExtParam,"{SSMDDMD}")==0)
            return ;
          return ;

        // Выполнение такта моделирования
        case :
          if((pX)) // Матрица X существует 
            { // Вспомогательные переменные 
              int xr,xc;
              double *ydata,*xdata;
              // Получить размеры матрицы X 
              xr=(pX);
              xc=(pX);
              // Задать размер Y равным размеру X 
              (pY,xr,xc,FALSE,NULL);
              // Получить указатель на первый элемент X 
              xdata=(double*)(pX);
              // Получить указатель на первый элемент Y 
              ydata=(double*)(pY);
              // Присвоить значения элементам Y 
              for(int r=0;r<xr;r++)
                for(int c=0;c<xc;c++)
                  ydata[r*xc+c]=k*xdata[r*xc+c];
            }
          else // Матрица X пуста
            (pY,0,0,FALSE,NULL);
          break;
      }
    return ;
  // Отмена макроопределений
  #undef pY
  #undef k
  #undef pX
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================

  //=======================================
  // Третий вариант - один цикл вместо двух
  //=======================================

  //============= Модель блока ==============
  extern "C" __declspec(dllexport)
    int  TestMatr2(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))
  #define k (*((double *)(pStart+2*RDS_VSZ_S+RDS_VSZ_M)))
  #define pY ((void **)(pStart+2*RDS_VSZ_S+RDS_VSZ_M+RDS_VSZ_D))
    // Структуры с информацией о матрицах
    switch(CallMode)
      { // Проверка типа переменных
        case :
          if(strcmp((char*)ExtParam,"{SSMDDMD}")==0)
            return ;
          return ;

        // Выполнение такта моделирования
        case :
          if((pX)) // Матрица X существует
            { // Вспомогательные переменные
              int xr,xc;
              double *ydata,*xdata;
              // Получить размеры матрицы X
              xr=(pX);
              xc=(pX);
              // Задать размер Y равным размеру X
              (pY,xr,xc,FALSE,NULL);
              // Получить указатель на первый элемент X
              xdata=(double*)(pX);
              // Получить указатель на первый элемент Y
              ydata=(double*)(pY);
              // Присвоить значения элементам Y
              for(int i=0;i<xr*xc;i++)
                ydata[i]=k*xdata[i];
            }
          else // Матрица X пуста
            (pY,0,0,FALSE,NULL);
          break;
      }
    return ;
  // Отмена макроопределений
  #undef pY
  #undef k
  #undef pX
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


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