Приятная черта языка - декларация 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 в бейсике, то есть - способ получить адрес переменной в памяти, но что я там найду? Чистые данные или данные и служебный оверхэд?
Для чего это нужно? Да элементарно! Всё та же система тестирования - для удобства работы мне нужны сложные структуры, а для удобства шифрования мне проще с ними работать как с потоком байтов или символов, чтобы в файл писать просто массив данных безо всякой видимой глазом структуры.





 , но ведь можно любые типы данных записать в поток (TStream, TFileStream) и уже с этим потоком работать как с последовательностью байтов - шифруйте, дешифруйте, удаляйте, добавляйте байты, в общем, что хотите то и делайте.
 , но ведь можно любые типы данных записать в поток (TStream, TFileStream) и уже с этим потоком работать как с последовательностью байтов - шифруйте, дешифруйте, удаляйте, добавляйте байты, в общем, что хотите то и делайте.
