Приятная черта языка - декларация over. Например:
- Код: Выделить всё
Bytes byte,dim(4) !массив из четырех байтов
ALong long,over(bytes)
Метки всегда начинаются с первого символа строки, операторы - со второго или последующих. Метка от описания отделяется пробелом или табуляцией. Точка с запятой в качестве разделителя операторов поддерживается, но обязательна только при записи нескольких операторов в одной строке, а так концом оператора является конец строки. Восклицательный знак - начало строчного комментария. Операторные скобки не используются, в конце составного оператора может стоять или слово end или точка. Секция описания данных начинается с начала исходника и заканчивается на ключевом слове code, которое не нуждается в закрывающем "тэге" типа "end."
Вышеприведенная запись обозначает, что переменные Bytes и ALong занимают одно и то же место в памяти. В Pascal такое возможно, как я знаю, только для вариантных частей record-ов и невозможно для обычных переменных.
Так вот, у этой group (и родственной ей файловой record) есть одна примечательная черта - группа рассматривается как строка длиной sizeof(компоненты_группы), и я могу обратиться к любому байту группы как к элементу массива:
- Код: Выделить всё
AGroup group
Bytes byte,dim(10)
Str string(20) !строка длиной 20 символов
.
SuperStr string(size(AGroup)),over(AGroup) !просто строка поверх группы
code !начало исполняемой секции исходника
agroup.str='freepascal.ru'
agroup.bytes[1]=5
agroup[11]='g' !11-ый байт группы, он же - первый байт переменной agroup.str, меняется на 'g' и получаем 'greepascal.ru'
SuperStr[11]='f' !и снова возвращаемся к 'freepascal.ru'
- Код: Выделить всё
type rec=record
bla-bla-bla
end;
superrec=record
case boolean of
true: (bla:rec);
false: (blabla:array[sizeof(rec)] of char
end;
По приведенным выше причинам я считаю такой подход правильным, но не слишком удобным - на фига два типа (или один, но сразу - запись с вариантами). А что скажут более опытные паскалеведы? Может есть что-то, о чем я не знаю?
Где-то в TFM я видел нечто, похожее на varptr в бейсике, то есть - способ получить адрес переменной в памяти, но что я там найду? Чистые данные или данные и служебный оверхэд?
Для чего это нужно? Да элементарно! Всё та же система тестирования - для удобства работы мне нужны сложные структуры, а для удобства шифрования мне проще с ними работать как с потоком байтов или символов, чтобы в файл писать просто массив данных безо всякой видимой глазом структуры.