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