Вообще говоря, чем дальше я забираюсь в Паскаль, тем мне больше нравится Никлаус Вирт.
Не зря он Нобелевский лауреат и автор Модулы2 и Ады, кроме Паскаля, разумеется.
Просто, прежде чем писать языки он последовательно трудился над философией языка.
ДА! Можно в какой-то степени говорить и о философии Си, но так вышло, что Ритчи и Керниган, всё же не Вирт и не швейцарцы.
Значит так, в саге о двусвязных списках я упустил важнейшую и единую для Паскаля вещь.
Попытаюсь сейчас исправить ситуацию...
Прежде всего мы со списками работаем только На Куче.
Однако, работа с ЛЮБОЙ динамической переменной ЕДИНООБРАЗНА для всего Паскаля!!!
1. Создаём ТИП УКАЗАТЕЛЯ, чтобы ссылаться не ещё неописанный объект.
2. Описываем ТИП объекта любой сложности, на имя которого и ссылается указатель.
3. Создаём данный объект на куче, выделяя для него память и инициализируя компоненты
4. ЗАТО обращаемся к объекту С ПОМОШЬЮ ПЕРЕМЕННОЙ, создаваемой в статической области программы и имеющей наш описанный ранее указательный тип.
5. Кроме этого мы всегда должны адресоваться к ТИПУ. Системный тип pointer не даст нам никакого доступа к зфпрашиваемому объекту.
Только к начальному адресу.
Давайте пройдёмся вдоль алгоритма:
То есть, получается некое разделение труда.Код:const maxC = 40; maxR = 24; type SAVMSC = ^scrT; scrT = array[1..maxR] of array[1..maxC] of byte; var scr: SAVMSC absolute $58;
- Сам указатель нетипизирован никак, лишь обозначен как указатель.
- Типизация объекта добавляет указателю тип этого объекта
- Создав переменную такого же типа мы из Паскаля с полным правом работаем с этой переменной как с типизированным объектом.
Из-за строгой типизации данных в Паскале совсем не тривиально создать такой объект, как байтовый буфер.
Сделаем это на Куче, и сделаем это с массивом байт.
Однако придётся вспомнить, что массив байт в Паскале всегда должен иметь РАЗМЕРНОСТЬ, как же быть, если массив наш динамический и размерности его мы не знаем?
Тогда вдумайтесь о чём я пытался сказать ранее: Мы создаём void указатель и типизируем его типом наших данных. ПРИ ЭТОМ ОБЪЕКТ НА КУЧЕ НЕ СОЗДАН! Просто компилятору уже известны НЕКОТОРЫЕ его атрибуты.
Переменная для доступа к объекту уже будет иметь эти атрибуты, а также те, которые мы дополнительно придадим при создании объекта.
zenКод:const (* Пусть это от балды будет размером нашего буфера *) (* Или Width*Heigth без разницы это определяется динамически в рантайме*) bytes = 960; type arrP = ^arrT; (* Тип Указателя на массив *) (* Тип Статического массива из одного байта *) arrT = array[1..1] of byte; var (* Переменная, пригодная для работы с одноразмерными массивами *) (* Размерность здесь существенна, а размер в байтах нет, так как массив на Куче НЕ СОЗДАН. *) A: arrP; begin (* Создаём на Куче массив байтов нужного размера *) getmem(A, sizeof(byte)*bytes); ... (* Работаем с ним *) (* Освобождаем память *) freemem(A, sizeof(byte)*bytes; end.




Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 

