User Tag List

Показано с 1 по 10 из 48

Тема: Паскаль о котором не знали...

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11

    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вообще говоря, чем дальше я забираюсь в Паскаль, тем мне больше нравится Никлаус Вирт.
    Не зря он Нобелевский лауреат и автор Модулы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 указатель и типизируем его типом наших данных. ПРИ ЭТОМ ОБЪЕКТ НА КУЧЕ НЕ СОЗДАН! Просто компилятору уже известны НЕКОТОРЫЕ его атрибуты.

    Переменная для доступа к объекту уже будет иметь эти атрибуты, а также те, которые мы дополнительно придадим при создании объекта.

    Код:
    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.
    zen
    Последний раз редактировалось ezswift; 15.07.2018 в 13:54.
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Компилятор языка Паскаль - планы на будущее
    от Bolt в разделе Программирование
    Ответов: 212
    Последнее: 13.10.2019, 17:12

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •