Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.
|
Данные в DelphiВ статье "Представление информации в ЭВМ средствами Turbo Pascal" подробно описано, как с помощью несложной "самодельной" программы Data Explorer можно изучать хранение различных типов данных в среде Turbo Pascal. Но этот DOS-ориентированный компилятор с каждым годом выглядит все архаичнее... (В свое оправдание напомню читателю, что статья была написана и опубликована в 1999 году, когда переход на Delphi только начался) Но как быть сейчас, когда большинство программ (даже консольных приложений) разрабатывается в среде Delphi? Попытка перенести Data Explorer в Delphi наталкивается на совершенно неожиданную трудность: начиная со второй версии, Delphi уже не поддерживает доступ из Паскаля к ОЗУ сегментным методом (проще говоря, нет функций seg( ) и ofs( ), через которые мы раньше получали доступ к байтам, в которых лежит значение переменной; нет и самого предопределенного массива mem[ ]). К счастью, в языке Delphi Object Pascal появляется новое средство, которое позволяет решить возникшую проблему доступа к байтам переменной: директива absolute. Она дает возможность "назначить" переменной некоторый адрес памяти, в частном случае такой же, как у другой, ранее описанной, переменной. Рассмотрим пример. Пусть у нас описана строковая переменная s и байтовый массив соответствующего размера b: Видно, что адрес массива задан через адрес строковой переменной s, а значит, совпадает с ним. Следовательно, байтовый массив b и строка s в ОЗУ окажутся совмещенными и к байтам последней мы получим непосредственный доступ. В частности, элемент b[0] будет являться не чем иным, как длиной строки. Примечание. В данном примере мы ведем обсуждение "классических" строковых переменных, длина которых не превышает 255 символов и хранится в нулевом байте; в Delphi их называют ShortString и поддерживают из соображений совместимости. Таковыми по умолчанию считаются те переменные, для которых длина задана явным образом (в квадратных скобках). Что касается переменных, просто объявленных как STRING, то они "устроены по-другому": их длина уже может достигать 2 Гб, так что там сама длина явно занимает не один байт. Любопытно, что тип WideString поддерживает символы Unicode. Используя описанную выше конструкцию, можно реализовать доступ к байтам переменной любого типа, что нам, собственно, и требовалось.
Легко понять, что программа берет последовательные байты строки и выводит их десятичные значения. На рисунке видны характерные коды цифр, пробела и заглавных букв начала латинского алфавита. Используя описанную идею, реализовать Data Explorer под Delphi уже не составит особого труда. Если вас заинтересовала описаная технология изучения содержимого переменных в Delphi, могу порекомендовать посмотреть статью "Изучение средствами Delphi способов хранения в компьютерной памяти различных данных". |