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

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

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

§2.8. Сохранение и загрузка параметров блока

§2.8.2. Сохранение параметров в двоичном формате

Рассматривается сохранение и загрузка личных данных блока в двоичном формате, описываются соответствующие реакции модели (RDS_BFM_SAVEBIN и RDS_BFM_LOADBIN соответственно). В один из ранее описанных примеров добавляется сохранение и загрузка параметров в двоичном формате.

В качестве самого простого примера рассмотрим сохранение и загрузку параметров блока в двоичном формате для модели Test1. Ранее мы уже добавили в эту модель функцию настройки параметров, теперь сделаем так, чтобы значения этих параметров сохранялись вместе с блоком. Теперь функция модели будет выглядеть следующим образом (изменения выделены цветом):

  //============= Модель блока ==============
  extern "C" __declspec(dllexport)
    int  Test1(int CallMode,
                       BlockData,
                       ExtParam)
  { TTest1Data *data;
    switch(CallMode)
      { case : // Инициализация
          BlockData->BlockData=new TTest1Data();
          break;
        case :// Очистка
          data=(TTest1Data*)(BlockData->BlockData);
          delete data;
          break;
        case : // Функция настройки
          data=(TTest1Data*)(BlockData->BlockData);
          return data->Setup();
        case :
          // Сохранение параметров в двоичном формате 
          data=(TTest1Data*)(BlockData->BlockData);
          (&(data->IParam),sizeof(data->IParam));
          (&(data->DParam),sizeof(data->DParam));
          break;
        case :
          // Загрузка параметров в двоичном формате 
          data=(TTest1Data*)(BlockData->BlockData);
          (&(data->IParam),sizeof(data->IParam));
          (&(data->DParam),sizeof(data->DParam));
          break;
      }
    return ;
  }
  //=========================================

Как уже отмечалось, основное достоинство двоичного формата – простота реализации. Для каждого из параметров потребовалось всего два вызова функций: один – для сохранения, другой – для загрузки.

При сохранении схемы, записи блока в библиотеку или копировании его в буфер обмена модель будет вызвана с параметром RDS_BFM_SAVEBIN для сохранения данных в двоичном формате. Точнее, при сохранении схемы или записи блока в библиотеку модель сначала будет вызвана для сохранения данных в текстовом формате с параметром RDS_BFM_SAVETXT, но, поскольку реакция на это событие отсутствует, ничего не будет сохранено, и RDS вызовет модель еще раз с параметром . Как и в реакциях на другие события в этой модели, указатель на личную область данных блока, хранящийся в BlockData->BlockData, будет приведен к типу «указатель на TTest1Data» и присвоен вспомогательной переменной data. В личной области данных блока хранятся два параметра: целый IParam и вещественный DParam. Каждый из них сохраняется при помощи сервисной функции rdsWriteBlockData. Эта функция принимает два параметра: указатель на начало области памяти, которую нужно сохранить, и размер этой области в байтах. Для каждого из двух параметров передается указатель на него и размер этого параметра, полученный при помощи оператора sizeof. В результате двух последовательных вызовов этой функции в RDS будет передано 12 байтов: 4 байта займет целое число IParam, и 8 байтов займет вещественное число с двойной точностью (double) DParam. Если блок копировался в буфер обмена, эти 12 байтов попадут туда вместе с остальными данными этого блока. Если же запись производилась в текстовом формате, они будут преобразованы в 24 шестнадцатеричных символа и добавлены к тексту параметров блока отдельной строкой, начинающейся с «dlldata data 12».

При загрузке схемы или добавлении в нее блока из библиотеки или буфера обмена модель будет вызвана с параметром RDS_BFM_LOADBIN, поскольку данные блока были сохранены в двоичном формате. Параметры IParam и DParam загружаются двумя последовательными вызовами функции rdsReadBlockData, в том же порядке, в котором они сохранялись. Как и парная ей функция , принимает два параметра – указатель на начало загружаемой области и размер этой области.

Теперь измененные параметры блока не будут теряться при сохранении и последующей загрузке схемы. Для этого потребовалось всего четыре вызова – по два на каждый параметр. Следует, однако, помнить, что любое изменение типа или последовательности сохраняемых параметров приведет к тому, что старые схемы с этим блоком будут загружаться с ошибками.


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