Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.orgfree.com

emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.


Учебные модели компьютера



Модели (software):

"Е14" (parallel !!!)
"S9PU" (parallel)

Модели (hardware):






Награды сайта
Награды сайта 2005

Данные в Delphi

В статье "Представление информации в ЭВМ средствами Turbo Pascal" подробно описано, как с помощью несложной "самодельной" программы Data Explorer можно изучать хранение различных типов данных в среде Turbo Pascal. Но этот DOS-ориентированный компилятор с каждым годом выглядит все архаичнее... (В свое оправдание напомню читателю, что статья была написана и опубликована в 1999 году, когда переход на Delphi только начался)

Но как быть сейчас, когда большинство программ (даже консольных приложений) разрабатывается в среде Delphi?

Попытка перенести Data Explorer в Delphi наталкивается на совершенно неожиданную трудность: начиная со второй версии, Delphi уже не поддерживает доступ из Паскаля к ОЗУ сегментным методом (проще говоря, нет функций seg( ) и ofs( ), через которые мы раньше получали доступ к байтам, в которых лежит значение переменной; нет и самого предопределенного массива mem[ ]).

К счастью, в языке Delphi Object Pascal появляется новое средство, которое позволяет решить возникшую проблему доступа к байтам переменной: директива absolute. Она дает возможность "назначить" переменной некоторый адрес памяти, в частном случае такой же, как у другой, ранее описанной, переменной.

Рассмотрим пример. Пусть у нас описана строковая переменная s и байтовый массив соответствующего размера b:

var s:string[10]; b:array [0..10] of byte absolute s;

Видно, что адрес массива задан через адрес строковой переменной s, а значит, совпадает с ним. Следовательно, байтовый массив b и строка s в ОЗУ окажутся совмещенными и к байтам последней мы получим непосредственный доступ. В частности, элемент b[0] будет являться не чем иным, как длиной строки.

Примечание. В данном примере мы ведем обсуждение "классических" строковых переменных, длина которых не превышает 255 символов и хранится в нулевом байте; в Delphi их называют ShortString и поддерживают из соображений совместимости. Таковыми по умолчанию считаются те переменные, для которых длина задана явным образом (в квадратных скобках). Что касается переменных, просто объявленных как STRING, то они "устроены по-другому": их длина уже может достигать 2 Гб, так что там сама длина явно занимает не один байт. Любопытно, что тип WideString поддерживает символы Unicode.

Используя описанную выше конструкцию, можно реализовать доступ к байтам переменной любого типа, что нам, собственно, и требовалось.
Простейший Data Explorer в Delphi

Вот пример простейшей программки. Создадим поле ввода Edit1, стандартную метку Label1 и кнопку Button1. На событие Button1Click напишем следующий обработчик:

procedure TForm1.Button1Click(Sender: TObject);
var s:string[10]; i:integer;
    b:array [0..10] of byte absolute s;
begin s:=Edit1.Text; Label1.Caption:='';
      for i:=1 to b[0] do
          Label1.Caption:=Label1.Caption+IntToStr(b[i])+' '
end;

Легко понять, что программа берет последовательные байты строки и выводит их десятичные значения. На рисунке видны характерные коды цифр, пробела и заглавных букв начала латинского алфавита.

Используя описанную идею, реализовать Data Explorer под Delphi уже не составит особого труда.

Если вас заинтересовала описаная технология изучения содержимого переменных в Delphi, могу порекомендовать посмотреть статью "Изучение средствами Delphi способов хранения в компьютерной памяти различных данных".


Автор сайта - Евгений Александрович Еремин (Пермский государственный педагогический университет). e_eremin@yahoo.com


Free Web Hosting