Блок 17. Разбор с Виндовс.

Блок 17. Разбор с Виндовс.

Небольшое замечание. Еще раз об структуре памяти. Некоторые размышления.

Небольшое замечание

Освоение давно уже идет не по дням, а по доступному свободному времени, которе появляется. Поэтому решил в дальнейшем вести по блокам – накопился какой-то блок информации, выложил.

Еще раз об структуре памяти

Нашел в файле ~af\lib\getxy.f функция получения координаты курсора в консоли. Привлекла она меня тем, что сделано получение информации через структуры. Решил попробовать ее переписать используя предложенную технику размещения временного буфера в стеке.

Нужно описание виндовой функции GetConsoleScreenBufferInfo В инете быстро находим ее русское описание .

Там же находим опсиание структуры данных, в которую эта функция размещает данные. Выпишем стркутуру данных в столбик с указанием полей и их длину в байтах. Благо мелкософт использует в наименованиях венгерскую нотацию и по имени переменной ясен ее тип, а соотвественно размер. dw – двойное слово (32 бита), w – слово (16 бит) и т.д.

 Структура Поле Размер     Размер
                в байтах   в ячейках Форта
COORD dwSize
	x	2
	y	2	cell

COORD dwCursorPosition x 2 y 2 cell

WORD wAttributes 2 .5cell

SMALL_RECT srWindow left 2 top 2 cell right 2 bottom 2 cell

COORD dwMaximumWindowSize; x 2 y 2 cell

Итого, под эту структуру данных требуется непрерывный участок памяти длиной около 6 ячеек. Для этого достаточно в стек знанести любые 6 чисел. А слово SP@ вернет адрес на начало этой области! Ведь стек растет в сторону младших адресов. Соответсвенно, параметры со стека снимаются в том же порядке, как они и описаны! И вот что получилось.

WINAPI: GetConsoleScreenBufferInfo kernel32.dll \ буду вызывать эту функцию

1 2 3 4 5 6 SP@ \ резервирую место на стеке под буфер H-STDOUT GetConsoleScreenBufferInfo DROP \ вызов функции \ в стеке, параметры, которая вернула функция \ но т.к. параметры 16-ричные, а стек понимает только 32-х \ то работаем со стеком, как с памятью, но читаем 16-ричные \ печатаю что получил SP@ W@ . \ структура dwSize : х SP@ 2 + W@ . CR \ y

SP@ 4 + W@ . \ dwCursorPosition x SP@ 6 + W@ . CR \ y

SP@ 8 + W@ . CR \ wAttributes

SP@ 10 + W@ . \ srWindow left SP@ 12 + W@ . \ top SP@ 14 + W@ . \ right SP@ 16 + W@ . CR \ bottom

SP@ 18 + W@ . \ dwMaximumWindowSize x SP@ 20 + W@ . CR \ y

2DROP 2DROP 2DROP \ подчищаю стек

И все! Получилось все предельно лаконично и без лишних дополнительных структур данных. Из этого примера сделать слово, которое бы возвращало бы нужные параметры, думаю совсем несложно... Кстати, определяет размер экрана в консоли оно правильно, так, у меня под ХР, она правильно указало его размер – 40х80.

Некоторые размышления

Предлагаемый подход прост, изящен, прекрасно вписывается в общую идеологию работы с фортом. Он не требует в явном виде выделения и осовобождения памяти под временные структуры. Но он подходит только для тех случаев когда используются сравнительно короткие структуры данных. Еще что можно заметить – это ручная интерпретаци и конвератция данных структур. Это самя сложная и нудная часть этого метода. Но в любом случае она всегда выполняется, при любом подходе. Весь вопрос – на какой только стадии. В этмо методе – на стадии освоения. Второе его преимущество – нет нужды в запоминании различных имен частных структур. Это всего лишь безымянные числа в стеке. Как нужно по логике программы, так их и называете. И код не засоряется..

Вот так и вырастают монстроидальное ПО. С одной стороны желание упростить работу, которое перерастает в дополнительный уровень сложности...

Про Фортовские библиотеки

Исследуя фортовские скрипты в папке devel особенно в подпапках lib пришел к интересному выводу – многие слова являются просто оберткой вызовов системных функций виндовс. С одной стороны, это упрощает работу программиста, т.к. он использует уже готовое, проверенное решение. Но с другой, нередко замедляет работу программы, особенно в случае частых вызовов такого слова. Другой аспект – от версии к версии поведение функций Мелкософт может менять... И сэконмленное время на первом этапе выливаетс в потерянное на последующих – тестирование на различных платформах, условные конструкции, учитывающие платформу. Сам поиск проблемы. В тяжелых случаях и просто необходимость написания всетаки своего кода. Думаю, что системные функции нужно использовать там где без них действительно трудно обойтись. Но нужно быть готовым ко всему...

Карта памяти

Задал в рассылку вопрос о распределении памяти в SP-Forth По ответу Ruvim составил следующие карты распределения памяти.





<<< Предыдущий Начало  
Copyright © Alex Furashev 2004

При цитировании, ссылка на оригинальный текст обязательна. Допускается копирование материалов только целиком, без внесения каких-либо изменений в оригинальный текст, меняющих смысл, структуру материала и проч.

Hosted by uCoz