OberonCore
https://forum.oberoncore.ru/

Странности создания текстов с помощью TextModels.Writer
https://forum.oberoncore.ru/viewtopic.php?f=23&t=2055
Страница 1 из 2

Автор:  Александр Ильин [ Воскресенье, 15 Ноябрь, 2009 23:33 ]
Заголовок сообщения:  Странности создания текстов с помощью TextModels.Writer

Код:
MODULE PrivTest;

   IMPORT Log := StdLog, TextModels;
   
   PROCEDURE Test3* ();
   VAR wrA,wrB: TextModels.Writer;
   BEGIN
      wrA := Log.text.NewWriter (wrA);
      wrB := Log.text.NewWriter (wrB);
      wrA.WriteChar ('A');
      wrB.WriteChar ('B');
      wrB.WriteChar ('B');
      wrA.WriteChar ('A');
      Log.Ln
   END Test3;

END PrivTest.

^Q PrivTest.Test3
У меня вместо "ABBA" получается "BABA", а если попробовать порядок "ABAB" то на выходе получим "BBAA".
Почему так? Это документированное поведение? Где оно описано?

Автор:  Валерий Лаптев [ Воскресенье, 15 Ноябрь, 2009 23:36 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Параллельные процессы-нити?

Автор:  Александр Ильин [ Воскресенье, 15 Ноябрь, 2009 23:38 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Валерий Лаптев писал(а):
Параллельные процессы-нити?
BlackBox 1.5.

Автор:  Валерий Лаптев [ Воскресенье, 15 Ноябрь, 2009 23:48 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Assert поставить после каждого врайтера?

Автор:  Александр Ильин [ Воскресенье, 15 Ноябрь, 2009 23:55 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Валерий Лаптев писал(а):
Assert поставить после каждого врайтера?
Что проверять в ASSERT'е?

Автор:  Валерий Лаптев [ Воскресенье, 15 Ноябрь, 2009 23:59 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Ничего не проверять. Сначала безусловный после одного, потом - после двух.
Или вместо констант поставить переменные - как тогда сработает?

Автор:  Александр Ильин [ Понедельник, 16 Ноябрь, 2009 00:08 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Валерий Лаптев писал(а):
Или вместо констант поставить переменные - как тогда сработает?
Точно так же сработает, проверял.
Валерий Лаптев писал(а):
Сначала безусловный после одного, потом - после двух.
Всё равно не понимаю, что там искать. Вот пример, который работает точно так же, хотя до вывода в журнал пишет в локальную TextModels.Model.
Код:
MODULE PrivTest;

   IMPORT Log := StdLog, TextModels;
   
   PROCEDURE Test3* ();
   VAR
      t: TextModels.Model;
      wrA,wrB: TextModels.Writer;
   BEGIN
      t := TextModels.dir.New ();
      wrA := t.NewWriter (wrA);
      wrB := t.NewWriter (wrB);
      wrA.WriteChar ('A');
      wrB.WriteChar ('B');
      wrB.WriteChar ('B');
      wrA.WriteChar ('A');
      Log.text.Append (t); (* BABA instead of ABBA *)
      Log.Ln;
      t := TextModels.dir.New ();
      wrA := t.NewWriter (wrA);
      wrB := t.NewWriter (wrB);
      wrA.WriteChar ('A');
      wrB.WriteChar ('B');
      wrA.WriteChar ('A');
      wrB.WriteChar ('B');
      Log.text.Append (t); (* BBAA instead of ABAB *)
      Log.Ln
   END Test3;

END PrivTest.

^Q PrivTest.Test3
Другими словами, дело не в журнале (Log) и какой-то параллельности записи него, а в устройстве самого TextModels.Model и особенностях его работы с TextModels.Writer. Вот только найти бы документацию по этим особенностям...

Автор:  Иван Кузьмицкий [ Понедельник, 16 Ноябрь, 2009 00:09 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Всё просто. Курьеры wrA и wrB имеют собственные позиции для записи в текст. Происходит вот что:

Код:
wrA.WriteChar ('A');
wrB.WriteChar ('B');
wrB.WriteChar ('B');
wrA.WriteChar ('A');


Пусть исходная позиция в тексте = P.
1. В свою текущую позицию P1 курьер wrA пишет 'A'.
2. В свою текущую позицию P2 курьер wrB пишет 'B'. Поскольку P2 = P, то 'B' вписывается перед 'A'. Результат: 'BA';
3. Далее, курьер wrB снова пишет 'B'. Получается 'BBA';
4. Теперь курьер wrA пишет 'A' в свою позицию P1. Поскольку его позиция равна P+1, то символ записывается перед второй буквой, что приводит к результату 'BABA'.

Автор:  Valery Solovey [ Понедельник, 16 Ноябрь, 2009 00:35 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Чёрт, пока ответ готовил, Иван сказал тоже самое. Только быстрее : )

Для наглядности вот:

BABA

Жирным помечены буквы, записанные второй раз.

А в программе можно посмотреть так:
Код:
wrA.WriteChar ('A'); Log.Char('[');Log.Int(wrA.Pos());Log.Int(wrB.Pos());Log.Char(']');Log.Ln();

Автор:  Валерий Лаптев [ Понедельник, 16 Ноябрь, 2009 00:38 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

То есть дело именно в том, что два разную врайтера...
Хотя пишут в один текст...
Интересно!

Автор:  Иван Кузьмицкий [ Понедельник, 16 Ноябрь, 2009 01:25 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Это блэкбоксовский шаблон "Carrier-Rider-Mapper", см. Глава 3 "Приёмы проектирования".

Автор:  Валерий Лаптев [ Понедельник, 16 Ноябрь, 2009 09:47 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Эт понятно...
Интересны следствия из такого положения... :)
Вот в С++, если связать две потоковые переменные с одним файлом - надо проверить.
1. Создаем пустой текстовый файл.
2. Потом начинаем туду писать двумя потоками.

Автор:  Trurl [ Понедельник, 16 Ноябрь, 2009 10:13 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Можно и без потоков. Открываем два раза один файл.

Автор:  Валерий Лаптев [ Понедельник, 16 Ноябрь, 2009 10:21 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Trurl писал(а):
Можно и без потоков. Открываем два раза один файл.

Потоки ввода-вывода. Должны быть две потоковых переменных, чтобы дважды открыть. Иначе будет вывод через один поток и все чисто последовательно.

Автор:  igor [ Понедельник, 16 Ноябрь, 2009 10:23 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

К слову будет сказать, имя процедуры WriteChar следовало бы заменить на InsertChar, чтобы не вводило в заблуждение. А потом добавить новую процедуру WriteChar, которая писала бы поверх символа.

Автор:  igor [ Понедельник, 16 Ноябрь, 2009 10:34 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

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

Автор:  Евгений Темиргалеев [ Понедельник, 16 Ноябрь, 2009 10:39 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

igor писал(а):
К слову будет сказать, имя процедуры WriteChar следовало бы заменить на InsertChar, чтобы не вводило в заблуждение. А потом добавить новую процедуру WriteChar, которая писала бы поверх символа.

igor писал(а):
В принципе можно сделать механизм, что-то типа менеджера курьеров, который регистрировал бы все вновь создаваемые курьеры, а затем автоматически корректировал бы позиции всех зарегистрированных курьеров, когда какой-нибудь райтер производит запись в текст...
имхо, не вижу смысла ни в том ни в другом.

Автор:  Валерий Лаптев [ Понедельник, 16 Ноябрь, 2009 10:39 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Паттерн Посредник! Mediator

Автор:  Евгений Темиргалеев [ Понедельник, 16 Ноябрь, 2009 10:46 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Исходный вопрос
Александр Ильин писал(а):
Почему так? Это документированное поведение? Где оно описано?
Ответ
TextModels docu писал(а):
PROCEDURE (wr: Writer) WriteChar (ch: CHAR)
NEW, ABSTRACT, Operation
Write character with attributes wr.attr. Nothing happens if ch is not writeable (see procedure WriteableChar).

Post
WriteableChar(ch)
wr.Pos() = wr.Pos'() + 1
~WriteableChar(ch)
wr.Pos() = wr.Pos'()
Изменяется положение только данного писателя (про другие ничего). (viewtopic.php?p=38034#p38034). Смысл что-то поверх этого изобретать. Было бы реально нужно - уже бы сделали до нас (тексты с системы Оберон идут).

Автор:  igor [ Понедельник, 16 Ноябрь, 2009 11:00 ]
Заголовок сообщения:  Re: Странности создания текстов с помощью TextModels.Writer

Евгений Темиргалеев писал(а):
имхо, не вижу смысла ни в том ни в другом.
Не настаиваю! Как я уже сказал:
igor писал(а):
Каждый решает для себя сам.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/