OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 20 Август, 2018 07:51

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 21 Ноябрь, 2017 15:57 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8971
Откуда: Россия, Орёл
Речь о том случае, когда для хранения строк используется обычный ARRAY N OF CHAR, но последовательность строковых значений не экономично хранить в ARRAY N OF ARRAY M OF CHAR.

Конкретный пример:
в АСУТП специальная вьюшка-индикатор опрашивает контроллер, отправляя ему GetStatusMsg, а контроллер может вернуть от 0 до N отдельных аббревиатур для индикации.
Разумеется, никаких динамических массивов, вся информация должна передаваться через статические поля.

Итоговый вид:
Код:
      Status* = EXTENSIBLE RECORD
         indicate*: ARRAY 64 OF CHAR;
         color*: ARRAY 8 OF INTEGER
      END;


В indicate надо помещать НЕСКОЛЬКО отдельных строковых значений.
Альтернатива, естественно, типа: ARRAY 8 OF ARRAY 24 OF CHAR - но мы должны правильно оценить все пределы, и если действительно позволять разброс и по количеству элементов, и по длине не сильно ограничивать - то избыток по памяти. Для встроенки, например, уже ощутимо может быть.

Очевидный другой вариант - просто хранить в одной строке через разделитель.

Выбрали простое соглашение:
{SEP_CHAR {VAL_CHAR}}0X

Например: ":val1:val2:<пустое_знач>:val4"
Во-первых, избранный разделитель сразу указан в позиции 0. Во-вторых, конкатенировать очередное значение можно, не проверяя, пустая строка или не пустая.
Если нужен разделитель, гарантировано не входящий в строки, никто не мешает взять невидимые коды. Например, unit separator из ANSI: 1FX

Собиратель значения, таким образом, просто использует станадартную конкатенацию строк (+).

А получатель либо разворачивает в ARRAY OF ARRAY на стеке, либо проходит итерационно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 30 Ноябрь, 2017 18:53 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1537
Откуда: Беларусь, Минск
В Си испокон веков сипользовали ноль в качестве SEP_CHAR. Я конкретной задачи не знаю, но может и Вам подойдёт нолик?

"val1<0X>val2<0X>Val3<0X>"


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 01 Декабрь, 2017 01:05 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8971
Откуда: Россия, Орёл
Ну а каким образом отличать конец значения от конца всех значений? Двумя 0X?
Наш вариант удобнее, т.к. можно любой разделитель применить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Декабрь, 2017 00:02 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2289
Откуда: Россия, Санкт-Петербург
Илья, одобряю ваш вариант! Строка - это строка, компоненты строки - это компоненты строки. Всё чётко и понятно. Назначение первого символа разделителем позволяет однозначно закодировать хоть ноль компонентов, хоть один, хоть сколько. Даже можно автоматически выбрать разделитель такой, какой не встречается ни в одном из компонентов. Нужно только дополнительно принять, что ноль не может быть разделителем, чтобы не путать это с пустой строкой.

Ноль гораздо хуже ввиду неоднозначности: тут один ноль конец строки, там - два нуля конец строки. Чуть что перепутал - улетел за границу массива в неведомые дали (особенно в Си; в Обероне полегче с этим).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Декабрь, 2017 08:43 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2516
Откуда: Россия, Ярославль
Как положено, например, в потоковых бинарных протоколах, первым символом надо передавать длину тела сообщения :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Декабрь, 2017 12:27 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 675
Откуда: Псков
Из опыта в MUMPS схожие задачи решаются как по варианту Ильи Е. так и по намёку Петра К (перед подстрокой кодируется её длина)
Первый вариант проще, второй универсальней и оптимальней в части навигации по результирующей строке. По второму варианту в некоторых реализациях МUMPS построены встроенные функции работы со списками упакованными в строки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Декабрь, 2017 17:10 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8971
Откуда: Россия, Орёл
Пётр Кушнир писал(а):
Как положено, например, в потоковых бинарных протоколах, первым символом надо передавать длину тела сообщения :)


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Декабрь, 2017 20:26 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2516
Откуда: Россия, Ярославль
История разнообразных фэйлов с экранированием возможно перевешивает некрасивые символы в начале каждого чанка. С другой стороны пример unicode bom показывает, что вообще любая служебная информация внутри строки приводит к ошибкам.


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

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


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

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


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

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