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

Описания RDS

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

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

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

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

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

- с отведением памяти вручную функцией rdsAllocate;
- с автоматическим отведением памяти при сложении строк функцией rdsDynStrCat.

      // Преобразование числа в строку и сложение строк
      #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 TestIntStr(int CallMode,
                             RDS_PBLOCKDATA BlockData,
                             LPVOID ExtParam)
      {
      // Макроопределения для статических переменных
      #define pStart  ((char *)(BlockData->VarTreeData))
      #define Start (*((char *)(pStart)))
      #define Ready (*((char *)(pStart+RDS_VSZ_S)))
      #define prefix (*((char **)(pStart+2*RDS_VSZ_S)))
      #define val (*((RDSINT32 *)(pStart+2*RDS_VSZ_S+RDS_VSZ_A)))
      #define str (*((char **)(pStart+2*RDS_VSZ_S+RDS_VSZ_A+RDS_VSZ_I)))

        char buf[40];	// Буфер, в котором формируется строка
        int l1,l2;

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

            // Выполнение такта моделирования
            case RDS_BFM_MODEL:
              // Преобразование числа val в строку buf
              itoa(val,buf,10);
              // Определение длин строк prefix и buf
              l1=prefix==NULL?0:strlen(prefix);
              l2=strlen(buf);
              // Освобождение прежнего значения str
              rdsFree(str);
              // Отведение памяти под новую строку
              str=(char*)rdsAllocate(l1+l2+1);
              // Занесение строки в отведенную память
              if(prefix!=NULL) // Строка prefix не пуста
                { strcpy(str,prefix); // Копировать prefix
                  strcat(str,buf);    // Дописать buf
                }
              else // Строка prefix пуста
                strcpy(str,buf);      // Копировать buf
              break;
          }
        return RDS_BFR_DONE;
      // Отмена макроопределений
      #undef str
      #undef val
      #undef prefix
      #undef Ready
      #undef Start
      #undef pStart
      }
      //=========================================

      //==============================================================
      // Второй вариант - использование сервисной функции rdsDynStrCat
      //==============================================================

      //============= Модель блока ==============
      extern "C" __declspec(dllexport)
        int RDSCALL TestIntStr1(int CallMode,
                             RDS_PBLOCKDATA BlockData,
                             LPVOID ExtParam)
      {
      // Макроопределения для статических переменных
      #define pStart  ((char *)(BlockData->VarTreeData))
      #define Start (*((char *)(pStart)))
      #define Ready (*((char *)(pStart+RDS_VSZ_S)))
      #define prefix (*((char **)(pStart+2*RDS_VSZ_S)))
      #define val (*((RDSINT32 *)(pStart+2*RDS_VSZ_S+RDS_VSZ_A)))
      #define str (*((char **)(pStart+2*RDS_VSZ_S+RDS_VSZ_A+RDS_VSZ_I)))

        char buf[40];	// Буфер, в котором формируется строка

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

            // Выполнение такта моделирования
            case RDS_BFM_MODEL:
              // Преобразование числа в строку
              itoa(val,buf,10);
              // Освобождение прежнего значения str
              (str);
              // Формирование выходной строки
              str=rdsDynStrCat(prefix,buf,TRUE);
              break;
          }
        return RDS_BFR_DONE;
      // Отмена макроопределений
      #undef str
      #undef val
      #undef prefix
      #undef Ready
      #undef Start
      #undef pStart
      }
      //=========================================