OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 04 Июль, 2020 09:31

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Использование Stores
СообщениеДобавлено: Пятница, 13 Декабрь, 2019 16:49 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 52
Как при помощи модуля Stores сохранить два списка (один вложен в другой)? Как я понимаю придётся циклически перебирать оба списка и сохранять их поля, а потом аналогичным способом восстанавливать при загрузке. Надо ли использовать Stores.Writer.WriteStore? Из модуля ObxStores непонятно, как использовать WriteStore для списков.
Код:
TYPE
   myKey = POINTER TO RECORD
      day, month, year: BYTE;
      price: SHORTREAL;
      next: myKey;
   END;
   turn = POINTER TO RECORD (Stores.Store)
      name: ARRAY 256 OF CHAR;
      key: myKey;
      firstKey: myKey;
      next: turn;
   END;

PROCEDURE (t: turn) Externalize (VAR w: Stores.Writer);
VAR
   auxiliaryNames: turn;
   auxiliaryKeys: myKey;
BEGIN
   StdLog.String ("Сохраняю");
   auxiliaryNames := t;
   WHILE auxiliaryNames # NIL DO
      w.WriteString (auxiliaryNames.name);
      auxiliaryKeys := auxiliaryNames.firstKey;
      WHILE auxiliaryKeys # NIL DO
         w.WriteByte (auxiliaryKeys.day);
         w.WriteByte (auxiliaryKeys.month);
         w.WriteByte (auxiliaryKeys.year);
         w.WriteSReal (auxiliaryKeys.price);
         auxiliaryKeys := auxiliaryKeys.next
      END;
      auxiliaryNames := auxiliaryNames.next
   END
END Externalize;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование Stores
СообщениеДобавлено: Пятница, 13 Декабрь, 2019 18:33 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 243
Stores гарантирует, что можно многократно сохранять один и тот же Store, а в выходной файл попадет только 1 экземпляр данных; при это при многократном чтении будет возвращаться один и тот же указатель. Но для этого нужно, чтобы MyKey был расширением Stores.Store. Иначе вам придется самостоятельно обеспечивать "недублирование" - т.е. по сути делать тот же Stores, но только для своего списка. Я бы сделал на базе Stores вот так:

Код:
TYPE MyKey = POINTER TO RECORD (Stores.Store) ... END;

PROCEDURE WriteList (t: Turn; w: Stores.Writer);
BEGIN
  WHILE t # NIL DO w.WriteStore(t); t := t.next END;
  w.WriteStore(NIL)
END WriteList;

PROCEDURE WriteKeys(k: MyKey; wr: Stores.Writer);
BEGIN
  WHILE k # NIL DO wr.WriteStore(k); k := k.next END;
  wr.WriteStore(NIL)
END WriteKeys;

PROCEDURE (t: Turn) Externalize (VAR w: Stores.Writer);
  VAR auxiliaryKeys: MyKey;
BEGIN
  w.WriteString (t.name); WriteKeys(t.firstKey, w)
END Externalize;

PROCEDURE (k: MyKey) Externalize (VAR wr: Stores.Writer);
BEGIN
  w.WriteByte (auxiliaryKeys.day);
  w.WriteByte (auxiliaryKeys.month);
  w.WriteByte (auxiliaryKeys.year);
  w.WriteSReal (auxiliaryKeys.price)
END Externalize;


Тогда чтение можно организовать по такой схеме:

Код:
REPEAT rd.ReadStore(st);
  IF st # NIL THEN ASSERT(st IS Turn, 20);
    (* append store to the end of list *)
  END
UNTIL st = NIL


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2020, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB