OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 17 Ноябрь, 2019 12:41

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
СообщениеДобавлено: Воскресенье, 21 Ноябрь, 2010 20:52 
Аватара пользователя

Зарегистрирован: Суббота, 13 Ноябрь, 2010 14:09
Сообщения: 26
Не могу разобраться с сохранением данных в ББ, может кто-то может привести "детский" пример с store.stores.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 21 Ноябрь, 2010 21:28 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Хохулин Олег писал(а):
Не могу разобраться с сохранением данных в ББ, может кто-то может привести "детский" пример с store.stores.
Stores.Store -- это уже не по-детски.

Возможно, Вы хотите вот такого (создаем новый файл, записывает туда число, сохраняем, снова открываем, читаем это число; переменной n 100 нигде не присваивается, но будет напечатано в рабочий журнал именно 100, проверьте):

Код:
MODULE x;
   IMPORT  Log := StdLog, Files, Stores;
   
   PROCEDURE ex;
      VAR loc: Files.Locator;  f: Files.File;  wr: Stores.Writer;  rd: Stores.Reader;
         n, res: INTEGER;
   BEGIN
      loc := Files.dir.This(''); (*рабочая папка*)
      f := Files.dir.New( loc, FALSE ); (*новый файл в папке loc*)
      wr.ConnectTo( f ); (*подсоеднили объект записи*)
      wr.WriteInt( 100 ); (*пишем туда целое в двоичном виде*)
      wr.ConnectTo( NIL ); (*для порядка отсоединились*)
      f.Register('имя файла', '', Files.dontAsk, res); (*зафиксировали файл с указанным именем*)
      
      f := Files.dir.Old( loc, 'имя файла', FALSE ); (*открыли снова файл с этим именем в папке loc*)
      rd.ConnectTo( f ); (*подсоединили объект чтения*)
      rd.ReadInt( n ); (*считываем целое в переменную n*)
      Log.Int( n ); (*печатаем в рабочий журнал -- убеждаемся, что 100*)
   END ex;


BEGIN ex
END x.


Выполнять: Ctrl+F9 в сборках от И-21.


Последний раз редактировалось Info21 Воскресенье, 21 Ноябрь, 2010 21:35, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 21 Ноябрь, 2010 21:32 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Если хотите действительно по-детски, то смотрите i21примFiles в школьной сборке.
Там средство читать-писать только один файл в рабочей папке. (С локаторами можно в любую пойти.)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 21 Ноябрь, 2010 23:51 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2626
Откуда: Россия, Ярославль
пример-примером. А вообще, для какой задачи нужны Stores?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 09:19 
Аватара пользователя

Зарегистрирован: Суббота, 13 Ноябрь, 2010 14:09
Сообщения: 26
Среди кружковских (10-11 класс) проектов
- векторный учебный редактор для изучения векторов и координат.
- игра типа Героев меча и магии (II-III)
- игра типа "ascendancy" / "Master of orion - I-II"
- самоиграйка типа "жизнь", с возможностью эволюции
краеугольный камень ― сохранение/загрузка динамических массивов разнотипных объектов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 09:35 
Аватара пользователя

Зарегистрирован: Суббота, 13 Ноябрь, 2010 14:09
Сообщения: 26
Info21 писал(а):
Хохулин Олег писал(а):
Не могу разобраться с сохранением данных в ББ, может кто-то может привести "детский" пример с store.stores.
Stores.Store -- это уже не по-детски.

Возможно, Вы хотите вот такого (создаем новый файл, записывает туда число, сохраняем, снова открываем, читаем это число; переменной n 100 нигде не присваивается, но будет напечатано в рабочий журнал именно 100, проверьте):

Код:
MODULE x;
   IMPORT  Log := StdLog, Files, Stores;
   
   PROCEDURE ex;
      VAR loc: Files.Locator;  f: Files.File;  wr: Stores.Writer;  rd: Stores.Reader;
         n, res: INTEGER;
   BEGIN
      loc := Files.dir.This(''); (*рабочая папка*)
      f := Files.dir.New( loc, FALSE ); (*новый файл в папке loc*)
      wr.ConnectTo( f ); (*подсоеднили объект записи*)
      wr.WriteInt( 100 ); (*пишем туда целое в двоичном виде*)
      wr.ConnectTo( NIL ); (*для порядка отсоединились*)
      f.Register('имя файла', '', Files.dontAsk, res); (*зафиксировали файл с указанным именем*)
      
      f := Files.dir.Old( loc, 'имя файла', FALSE ); (*открыли снова файл с этим именем в папке loc*)
      rd.ConnectTo( f ); (*подсоединили объект чтения*)
      rd.ReadInt( n ); (*считываем целое в переменную n*)
      Log.Int( n ); (*печатаем в рабочий журнал -- убеждаемся, что 100*)
   END ex;


BEGIN ex
END x.


Выполнять: Ctrl+F9 в сборках от И-21.


Огромный респект :D Info 21
Раз уж начали может быть приведете пример сохранение/загрузка динамических массивов из объектов 2-х типов (ну, например, кругов и треугольников)? От этого кажется уже будет понятнее как "танцевать"...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 09:48 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4525
Откуда: Россия, Орёл
Хохулин Олег писал(а):
Раз уж начали может быть приведете пример сохранение/загрузка динамических массивов из объектов 2-х типов (ну, например, кругов и треугольников)? От этого кажется уже будет понятнее как "танцевать"...
Посмотрите viewtopic.php?f=28&t=797


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 12:30 
Аватара пользователя

Зарегистрирован: Суббота, 13 Ноябрь, 2010 14:09
Сообщения: 26
Евгений Темиргалеев писал(а):
Хохулин Олег писал(а):
Раз уж начали может быть приведете пример сохранение/загрузка динамических массивов из объектов 2-х типов (ну, например, кругов и треугольников)? От этого кажется уже будет понятнее как "танцевать"...
Посмотрите viewtopic.php?f=28&t=797

:? Да это, конечно, динамический массив с элементами 2х типов... Я обычная серая учительская масса. Сколько как вы думаете мне понадобиться времени (одновременно с основной работой), чтобы выцепить оттуда то, что относится к персистентам. Там даже комментариев нет.
Вот я уже сообразил, что комманда на сохранение поступает из меню...
<Удалено модератором (оффтоп)>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 13:04 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4525
Откуда: Россия, Орёл
Там несколько конкретных примеров Stores. Думал, что по имени базового типа и именам абстрактных методов можно найти...

Команда на сохранение: wr.WriteStore(x)
Код:
      Star = POINTER TO RECORD (Stores.Store)
         point: Point;
         owner: Gamer;
         buildTurn, totalBuildTurns: INTEGER;
         slots: ARRAY playersCount OF RECORD
            ships: Ships;
            dest: Ship
         END
      END;

      Ship = POINTER TO RECORD (Stores.Store)
         destroyed: BOOLEAN;
         point: Point;
         dest, port: Star;
         speed, force: REAL;
         (* non serializable fields: *)
         turnDistance: INTEGER
      END;

      Ships = RECORD
         n: INTEGER;
         buff: POINTER TO ARRAY OF Ship
      END;
Код:
   PROCEDURE (star: Star) Externalize (VAR wr: Stores.Writer);
      VAR i: INTEGER;
   BEGIN
      star.point.Externalize(wr);
      wr.WriteStore(star.owner);
      wr.WriteInt(star.buildTurn);
      wr.WriteInt(star.totalBuildTurns);
      FOR i := 0 TO playersCount - 1 DO
         star.slots[i].ships.Externalize(wr);
         wr.WriteStore(star.slots[i].dest)
      END
   END Externalize;

   PROCEDURE (star: Star) Internalize (VAR rd: Stores.Reader);
      VAR store: Stores.Store; i: INTEGER;
   BEGIN
      star.point.Internalize(rd);
      rd.ReadStore(store);
      IF store # NIL THEN star.owner := store(Gamer) END;
      rd.ReadInt(star.buildTurn);
      rd.ReadInt(star.totalBuildTurns);
      FOR i := 0 TO playersCount - 1 DO
         star.slots[i].ships.Internalize(rd);
         rd.ReadStore(store);
         IF store # NIL THEN star.slots[i].dest := store(Ship) END
      END
   END Internalize;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 13:45 
Аватара пользователя

Зарегистрирован: Суббота, 13 Ноябрь, 2010 14:09
Сообщения: 26
сПАсибо, изучаю :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 15:12 
Аватара пользователя

Зарегистрирован: Суббота, 13 Ноябрь, 2010 14:09
Сообщения: 26
Тупой вопрос: уже два раза за последний час я что-то неудачно нажал на клавиатуре :oops: и "стрелочки" в КП перестают двигать позицию в тексте !!! После этого стрелки сдвигают текст относительно окна.
Караул!!! Второй раз забиваю установленный КП оригиналом из архива. Подскажите, где я так глупо лажаюсь?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 15:41 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Хохулин Олег писал(а):
"стрелочки" в КП перестают двигать позицию в тексте !!! После этого стрелки сдвигают текст относительно окна.
Это не кнопка Scroll Lock? Вверху справа.
Она может быть вплотную к типа Home, и нажиматься заодно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 15:53 
Аватара пользователя

Зарегистрирован: Суббота, 13 Ноябрь, 2010 14:09
Сообщения: 26
Черт, такая детская глупость... А я думал, что это «слабодокументированная» особенность КП....
Собрался перевести и, несколько упростив, выложить здесь адаптированные для начинающих http://www.zinnamturm.eu/downloadsOS.htm OOP Examples for Beginners и OO Collection Example. (обильно обкомментировав :) )
Уважаемые мэтры :wink: стоит ли заморачиваться? Кроме меня это кому-то будет нужно?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 16:09 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Конечно, хорошие примеры всегда хорошо иметь.
Прежде чем выкладывать у Цинна, стоит выложить на тестирование здесь, на форуме. А в дальнейшем можно разместить в коллекции Цинна и в Вики.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 16:17 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Я для себя написал такой модуль, чтобы понять как действует Stores.

Переопределяемый метод Externalize отвечает за сохранение записи модели, унаследованной от Stores.Store. Internalize, соответственно, отвечает за воспроизведение записи из файла.

Код:
MODULE TestFileOfRecord;
 
    IMPORT Files, Stores, Log := StdLog;
 
    TYPE
        Record* = POINTER TO RECORD (Stores.Store)
            x, y: REAL
        END;
 
    PROCEDURE (r: Record) Externalize- (VAR wr: Stores.Writer);
        VAR k: INTEGER;
    BEGIN
        r.Externalize^(wr);
        wr.WriteReal(r.x); wr.WriteReal(r.y)
    END Externalize;
 
    PROCEDURE (r: Record) Internalize- (VAR rd: Stores.Reader);
        VAR k: INTEGER;
    BEGIN
        r.Internalize^(rd);
        rd.ReadReal(r.x); rd.ReadReal(r.y)
    END Internalize;
 
    PROCEDURE ExportToFile* (r: Record; f: Files.File);
        VAR wr: Stores.Writer;
    BEGIN
        wr.ConnectTo(f);
        wr.WriteStore(r)
    END ExportToFile;
 
    PROCEDURE ImportFromFile* (OUT r: Record; f: Files.File);
        VAR rd: Stores.Reader; s: Stores.Store;
    BEGIN
        rd.ConnectTo(f);
        rd.ReadStore(s); r := s(Record)
    END ImportFromFile;
 
    PROCEDURE Run*;
        VAR
            rec: Record; f: Files.File; res: INTEGER;
    BEGIN
        NEW(rec);
 
        rec.x := 10; rec.y := 20;
 
        f := Files.dir.New(Files.dir.This("."), Files.exclusive);
        IF f # NIL THEN
            ExportToFile (rec, f);
            f.Register("records", "dat", Files.dontAsk, res);
            IF res # 0 THEN
                Log.String("Error #"); Log.Int( res ); Log.Ln
            END
        END;
 
        rec := NIL
    END Run;
 
END TestFileOfRecord.


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

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


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

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


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

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