OberonCore
https://forum.oberoncore.ru/

Хранение нескольких строковых значений в одном симв. массиве
https://forum.oberoncore.ru/viewtopic.php?f=27&t=6173
Страница 1 из 1

Автор:  Илья Ермаков [ Вторник, 21 Ноябрь, 2017 15:57 ]
Заголовок сообщения:  Хранение нескольких строковых значений в одном симв. массиве

Речь о том случае, когда для хранения строк используется обычный 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 на стеке, либо проходит итерационно.

Автор:  Valery Solovey [ Четверг, 30 Ноябрь, 2017 18:53 ]
Заголовок сообщения:  Re: Хранение нескольких строковых значений в одном симв. мас

В Си испокон веков сипользовали ноль в качестве SEP_CHAR. Я конкретной задачи не знаю, но может и Вам подойдёт нолик?

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

Автор:  Илья Ермаков [ Пятница, 01 Декабрь, 2017 01:05 ]
Заголовок сообщения:  Re: Хранение нескольких строковых значений в одном симв. мас

Ну а каким образом отличать конец значения от конца всех значений? Двумя 0X?
Наш вариант удобнее, т.к. можно любой разделитель применить.

Автор:  Александр Ильин [ Вторник, 19 Декабрь, 2017 00:02 ]
Заголовок сообщения:  Re: Хранение нескольких строковых значений в одном симв. мас

Илья, одобряю ваш вариант! Строка - это строка, компоненты строки - это компоненты строки. Всё чётко и понятно. Назначение первого символа разделителем позволяет однозначно закодировать хоть ноль компонентов, хоть один, хоть сколько. Даже можно автоматически выбрать разделитель такой, какой не встречается ни в одном из компонентов. Нужно только дополнительно принять, что ноль не может быть разделителем, чтобы не путать это с пустой строкой.

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

Автор:  Пётр Кушнир [ Вторник, 19 Декабрь, 2017 08:43 ]
Заголовок сообщения:  Re: Хранение нескольких строковых значений в одном симв. мас

Как положено, например, в потоковых бинарных протоколах, первым символом надо передавать длину тела сообщения :)

Автор:  albobin [ Вторник, 19 Декабрь, 2017 12:27 ]
Заголовок сообщения:  Re: Хранение нескольких строковых значений в одном симв. мас

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

Автор:  Илья Ермаков [ Вторник, 19 Декабрь, 2017 17:10 ]
Заголовок сообщения:  Re: Хранение нескольких строковых значений в одном симв. мас

Пётр Кушнир писал(а):
Как положено, например, в потоковых бинарных протоколах, первым символом надо передавать длину тела сообщения :)


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

Автор:  Пётр Кушнир [ Вторник, 19 Декабрь, 2017 20:26 ]
Заголовок сообщения:  Re: Хранение нескольких строковых значений в одном симв. мас

История разнообразных фэйлов с экранированием возможно перевешивает некрасивые символы в начале каждого чанка. С другой стороны пример unicode bom показывает, что вообще любая служебная информация внутри строки приводит к ошибкам.

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