OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 20:32

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




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Работа со строками
СообщениеДобавлено: Суббота, 07 Ноябрь, 2009 22:52 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
На groups.google.com нашел такой вопрос:
How do people use Strings in Oberon?

Do you set a predefined limit like in Pascal, where one was limited to
255?

Isn't it about time that the string problem be solved? Do you use a
pointer to an array of characters?

How to do simple string operations? Very important in desktop and
internet programming! Maybe not so important for certain tasks such as
embedded programming for helicopter control.. but..

Please inform? Can an easy to use garbage collected string be made in
a library module or must it be built into the language at some point?

It's really a simple question that cannot be easily answered anywhere
in the documentation or on oberon enthusiast websites, and I think it
is a serous problem. The question is: how in the world does one begin
to use strings in oberon 2, or oberon 07 or oberon 1? Is Blackbox
Component Pascal the only one that tried to address this problem and
did work there if so?

I don't think that knowing the string is 200 or 1000 characters long
really helps in programming for many tasks. It is equivalent to
defining your integer length each time - why is integer just integer
and not integer[Max:200].

Меня интересует аналогичный вопрос. Есть ли какие-нибудь модули для работы со строками произвольного размера? Насколько удобно работать с этим модулем?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Суббота, 07 Ноябрь, 2009 23:11 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Подсистема Text (TextModels.Model). Достаточно удобно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Суббота, 07 Ноябрь, 2009 23:16 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Если не нужны вставки в произвольное место, и т.п., а нужно что-то на системном уровне, то Files.File.

Например, всякие серверные вещи с HTTP и т.п.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Суббота, 07 Ноябрь, 2009 23:42 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Как мне кажется, TextModels.Model и Files.File предназначены несколько для других вещей. И использование их для хранения строк будет как "стрельба из пушки по воробьям", так как в этих записях есть много разных полей, которые для работы со строками просто не нужны.

Если Вы знакомы с Delphi, то там есть тип string, размер которых ограничен 2 гигабайтами. И можно достаточно просто сделать конкатенацию строк, поиск в строке, можно обратиться к произвольному символу строки и т.д. Нужен модуль, который может выполнять аналогичные функции на обероне или компонетном паскале.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Суббота, 07 Ноябрь, 2009 23:53 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да не получится сделать "строки вообще".

Надо понимать, какие операции необходимы.

Например, операции с 0-terminated строками требуют перевычисления длины, что дорого.
И т.д.

Для полноценных манипуляций со строками, действительно, можно отталкиваться от TextModels.

Если же нужен просто большой буфер - то Files.File.
(вообще уверенно рекомендую воспринимать Files.File как абстракцию растущего массива, под любые нужды).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Воскресенье, 08 Ноябрь, 2009 00:02 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Илья Ермаков писал(а):
Если же нужен просто большой буфер - то Files.File.
(вообще уверенно рекомендую воспринимать Files.File как абстракцию растущего массива, под любые нужды).


Честно говоря не понимаю, как Files.File может быть растущим массивом. Если открыть System\Docu\Files.odc
Type = ARRAY 16 OF CHAR;

File = POINTER TO ABSTRACT RECORD
type-: Type;
(f: File) Length (): INTEGER, NEW, ABSTRACT;
(f: File) NewReader (old: Reader): Reader, NEW, ABSTRACT;
(f: File) NewWriter (old: Writer): Writer, NEW, ABSTRACT;
(f: File) Flush, NEW, ABSTRACT;
(f: File) Register (name: Name; type: Type; ask: BOOLEAN; OUT res: INTEGER), NEW, ABSTRACT;
(f: File) Close, NEW, ABSTRACT;
(f: File) InitType (type: Type), NEW
END;

Если судить по этому описанию, то эта запись содержит поле type с типом Type.
Где здесь массив, который может расти?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Воскресенье, 08 Ноябрь, 2009 00:06 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Делаете WriteBytes - оно растёт.

Естественно, подразумевается, что у Вас есть реализация Files.File над памятью (или Вы её попросили у кого-нибудь :) ).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Воскресенье, 08 Ноябрь, 2009 00:27 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
PROCEDURE (w: Writer) WriteBytes* (IN x: ARRAY OF BYTE; beg, len: INTEGER), NEW, ABSTRACT;

Позволяет записать массив байтов. А если мне например надо сконкатенировать 2 строки, размеры которых я не знаю, то это уже не получиться сделать или же надо сначала узнать длину одной из "Files.File строк", выделить память под массив байт, скопировать туда содержимое Files.File, затем передать это в WriteBytes. Что не очень удобно.

Согласен, что, возможно, Files.File и TextModels.Model можно использовать с некоторыми ограничениями в качестве строк, но это получается не универсально. Например, также просто как в Delphi не получется.
Код:
var
  a, b, c: string;
begin
  a := ...;
  b := ...;
  c := a + b;
end.


Насчет обертки над байтами для Files.File: у меня такой нет и считаю, что это не очень хорошая идея использовать Files.File для работы со строками, даже если бы была такая обертка. Одно то, что надо будет вводить дополнительные сущности Reader, Writer уже усложняет работу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Воскресенье, 08 Ноябрь, 2009 01:13 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Согласен, что, возможно, Files.File и TextModels.Model можно использовать с некоторыми ограничениями в качестве строк, но это получается не универсально.


Что касается Files, то я подчеркнул, что это не для случая интенсивных разрезок-склеек и т.п.
А вот TextModels однозначно сильнее, в общем случае, чем string, потому что за разрезка и оперирование фрагментами строк и проч. в Дельфи дороги, + есть всякие тонкие скрытые проблемы за этим string (много обсуждались в эпоху расцвета Дельфы). В частности, система оптимизирует - shares куски этих строк по чтению; реально копирует только при записи и т.п. На любой скрытой оптимизации рано или поздно вылезает какая-то гадость (и она там вылезала).

Цитата:
Насчет обертки над байтами для Files.File: у меня такой нет и считаю, что это не очень хорошая идея использовать Files.File для работы со строками

Смотря где. Если речь о системном программировании - то как раз очень хорошая. Например, в HTTP-сервере.
А понятие "работа со строками" вообще страшно размытое. Надо определиться, что требуется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Воскресенье, 08 Ноябрь, 2009 01:25 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Илья Ермаков писал(а):
Цитата:
А понятие "работа со строками" вообще страшно размытое. Надо определиться, что требуется.


В принципе те строки, которые есть в Компонентном паскале, меня практически устраивают, за исключением того, что надо указывать сколько символов выделить под строку (VAR str: ARRAY X OF CHAR; ). То есть требуется, чтобы с новым типом, можно было делать все тоже самое, что можно делать с обычными строками, только не надо было определять X, а он определялся бы автоматически.

А вообще изначально вопрос, который стоял в первом посте, и который меня интересовал.
How do people use Strings in Oberon?
Из ваших ответов я понял, что
Александр Ильин использует TextModels.Model, а
Вы (Илья Ермаков) используете Files.File
Еще мне интересно, как другие используют строки?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Воскресенье, 08 Ноябрь, 2009 01:41 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Нет, если Вы понимаете под строками "просто строки" (т.е. всякую мелочь на каждом шагу в программе), то конечно же, для этого я использую просто ARRAY OF CHAR.

Files.File идёт в дело, если нужно, например, Web-формы генерировать, с UTF-8 работать, ну и т.п.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Воскресенье, 08 Ноябрь, 2009 09:08 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Я в последнее время для работы с SQL-запросами на верхнем уровне стал использовать TextModels. Проблем не ощущаю :)

P.S. Всякая мелочёвка - да, по-прежнему используется ARRAY OF CHAR.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Воскресенье, 08 Ноябрь, 2009 10:12 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Вообще-то довольно развитая библиотека для работы со строками есть в составе ПО web сервера http://www.o3-software.de/en/Products.xhtml. В частности там есть процедуры перевода TextModel в string и наоборот.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Воскресенье, 08 Ноябрь, 2009 23:13 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Я в XDS использую динамические строки, т.е. указатели на ARRAY OF CHAR. По сути, это аналог дельфийских строк. Проблем не вижу. Кстати, а что за проблемы со строками в дельфях?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Воскресенье, 08 Ноябрь, 2009 23:30 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Я уже указал на проблему Дельфы - оптимизацию строк. Когда Вы присваиваете s1 := s2, реального копирования не происходит. И даже, по-моему, при строковых операциях куски общими могут оставаться...
А реально разделение будет выполнено при записи. А иногда (если не того уровня средство применили, которое про оптимизацию не знает) можно такую петрушку получить, если изменяете строку s1, и вдруг побочные эффекты на совершенно посторонние строки идут.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Понедельник, 09 Ноябрь, 2009 00:32 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Прошу прощения, я не понял, что вы имеете в виду.
Да, при присваивании копирования не происходит. Разве это недостаток?
Цитата:
А реально разделение будет выполнено при записи
Что вы имеете в виду?
Цитата:
А иногда (если не того уровня средство применили, которое про оптимизацию не знает) можно такую петрушку получить, если изменяете строку s1, и вдруг побочные эффекты на совершенно посторонние строки идут.
Это, вероятно, с использованием явного преобразования типов, что-то вроде PChar(s)?
Ну так это уже не дельфийские строки...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Понедельник, 09 Ноябрь, 2009 00:59 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Что вы имеете в виду?


Вот Вы начнёте применять к s2 операцию типа Replace и т.п. - тут рантайм должен будет понять, что строку менять собрались - и перед этим создать реальную копию (иначе поменяется и "ничего не подозревающая" s1, которую когда-то присвоили в s2).
Механизм работает; но в каких-то тонких ситуациях промахивается.


Цитата:
Да, при присваивании копирования не происходит. Разве это недостаток?


Люди, глядя на определение языка, имеют право думать, что string - это просто динамический массив символов. И в каком-то месте они налетают на такие оптимизации реализации.

Вообще, я для себя выработал железное правило: любые внизу лежащие механизмы с неявным поведением - зло. Потенциальный источник проблем. Помеха к нормальному проектированию... и т.д. Внизу лежащие компоненты должны делать конкретную работу; если же туда пытаются засунуть принятие решений ("умность"), то это выходит боком.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Понедельник, 09 Ноябрь, 2009 01:32 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Рантайм там состоит только в организации сборки мусора подсчётом ссылок.
Всё остальное делается ручками (или уже сделано ручками в библиотеках).
И ни в каких тонкостях механизм не промахивается, если не использовать
какие-то низкоуровневые средства. Насколько я знаю, именно они являются
проблеммой дельфей, а не идея организации строк.

В обероне точно такая же идея строк работает железобетонно.

Может, у вас есть крнкретная информация о недостатках динамических строк,
не связанных с низкоуровневыми средствами?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Понедельник, 09 Ноябрь, 2009 11:22 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В Обероне я явно использую POINTER TO ARRAY. И я уже отвечаю за то, как с ним работаю.
Если я присваиваю ptr1 := ptr2, то я, естественно, получаю одну строку и два указателя на неё. А если мне надо копировать, я должен сам за это отвечать (NEW, s2^ := s1$).
В Delphi же это сделано неявно. Т.е. после s2 := s1 это формально разные объекты (я могу их изменять независимо), в силу же оптимизации s2 и s1 сначала указывают на один объект. И только по необходимости когда-то рантайм разведёт их.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа со строками
СообщениеДобавлено: Вторник, 10 Ноябрь, 2009 11:14 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Илья Ермаков писал(а):
Механизм работает; но в каких-то тонких ситуациях промахивается

Угу, наступали.
Применяешь к строке winAPI типа CharLower, и получаешь сурпризы в самых неожиданных местах...
И как "правильно" обойти эти грабли, тоже фиг поймешь.


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

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


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

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


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

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