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; У меня вместо "ABBA" получается "BABA", а если попробовать порядок "ABAB" то на выходе получим "BBAA".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 Почему так? Это документированное поведение? Где оно описано? |
Автор: | Валерий Лаптев [ Воскресенье, 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; Другими словами, дело не в журнале (Log) и какой-то параллельности записи него, а в устройстве самого TextModels.Model и особенностях его работы с TextModels.Writer. Вот только найти бы документацию по этим особенностям...
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 |
Автор: | Иван Кузьмицкий [ Понедельник, 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) Изменяется положение только данного писателя (про другие ничего). (viewtopic.php?p=38034#p38034). Смысл что-то поверх этого изобретать. Было бы реально нужно - уже бы сделали до нас (тексты с системы Оберон идут).
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'() |
Автор: | igor [ Понедельник, 16 Ноябрь, 2009 11:00 ] |
Заголовок сообщения: | Re: Странности создания текстов с помощью TextModels.Writer |
Евгений Темиргалеев писал(а): имхо, не вижу смысла ни в том ни в другом. Не настаиваю! Как я уже сказал: igor писал(а): Каждый решает для себя сам.
|
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |