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/ |