Поскажите, в чём беда...
Реальность показывает, что ВСЁ в норме!
Однако программа запускается не всегда.
WHAT TO DO, HOW TO BE?
zen
Поскажите, в чём беда...
Реальность показывает, что ВСЁ в норме!
Однако программа запускается не всегда.
WHAT TO DO, HOW TO BE?
zen
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Спасибо, конечно, большое.
Дайте пожалуйста ссылку на pdf, если есть.
Но мы здесь не из-за программирования, а из-за Атари.
Я вовсе не собираюсь заучивать алгоритмы, хотя приходилось этим заниматься для своих целей.
Я столкнулся с тем, что несмотря на правильный алгоритм, в эмуляторе запуск программки получается нестабильным.
Попробую на живой машине и на другом эмуляторе... Потом сообщу.
- - - Добавлено - - -
Кажется понял.
Думаю, хромает эмуляция управления памятью в эмуляторе.
В Алтирре всё запускается стабильно. Уря, товарищи!
- - - Добавлено - - -
Ну, что же?
Пора предлагать структуру хендла окна...
Это будет запись.
В записи будет храниться описание конкретного окна.
Предлагается следующее...
_с - Капча окна
_a - флаг активности
_i - флаг инверсии
_x, _y - координаты
_w, _h - размеры
_b - указатель на буфер на куче
Структура оконной системы легче всего описывается стеком.
Структура меню в окне лучше всего описывается двусвязным списком.
Я может быть что-то упустил... подскажите, pls.
Не беда.
... Надо добавить глобальное описание рамок окна. То есть псевдографика и её инверсия.
... Зато, строку меню добавить локально в хендл.
zen
Последний раз редактировалось ezswift; 18.07.2018 в 09:56.
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Вот моя цитата из предыдущего поста:
"Структура оконной системы легче всего описывается стеком."
Вопрос в том, понимаете ли Вы, что Стек, Кью, Дек,Три - это РОЛИ.
А вот Актёр = Список.
Вы также можете понять, что ЛЮБАЯ роль = ОГРАНИЧЕНИЕ Актёра!!!
Он САМ - сможет сыграть ВСЁ!
Я это к тому, что ВСЕ динамические Ёрзания - это Роли!!!
Есть Главная роль = Список!
Есть Универсальная Главная роль = Многосвязный Список!
А после этого идёт сценарий...
По сценарию можно из Многосвязного списка создать ВСЕ нижеуказантые сущности...
Стек = вход и выход с одной стороны!
Кью = вход с одной, а выход с другой стороны!
Дек = Куда хочешь заходи, откуда хочешь выходи!
Три = Со входа ЗАХАДИ ДАРАГОЙ, а выхода два:
- налево пойдёшь - БАШКА ЙОК
- направо пойдёшь - ЖОПА СЫКТЫМ
В общем, грустно.
Я всё к тому, что ВСЕ роли надстраиваются над односвязным, либо над многосвязным списком!!!
Но они = ПРОИЗВОДНЫЕ от списков!
Реализуются, кстати, и массивами!
Последний раз редактировалось ezswift; 26.07.2018 в 11:50.
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Наиболее универсальным линейным списком, является Двусвязный Список.
Это - мультиконтейнер, с которым можно работать как с единым объектом.
В то же время, так как такой мультиконтейнер программно абстрагирован от содержимого каждого узла, то приходится описывать также и содержимое узлов.
Сначала давайте разберёмся с узлами списка.
Вот прямая аналогия - вагон состава:
1. Узлом списка является Платформа (node)
2. Частью двусвязного списка Платформа становится ТОЛЬКО после того как к ней прикреплены передняя и задняя сцепки (prev, next). На платформе они антисимметричны!, то есть зацепление происходит только если применены разные сцепки.
3. Контейнер может быть разного типа (сухогруз, цистерна...), но должен быть правильно описан.
Вот картинка схемы двусвязного узла:
Аналогия почти совершенная.
Откуда ведётся доступ?
Разумеется из кабин машинистов, то есть машиниств Тягача и машиниств Толкача.
Зачем такое излишество? Это - для свободы доступа к любому узлу и для поддержания Целостности списка. (при длинном составе, возможен разрыв сцепок, поэтому аналогия прослеживается и здесь.)
Даже, потеряв один адрес (толкача, например) мы можем методом траверсирования (от тягача) его просто восстановить. Это справедливо для любого звена списка.
А вот сам двусвязный список:
Как Вы видите, присутствует и тягач и толкач (header, trailer).
Роль создаваемых переменных - только коммуникативная.
Это аналог радиосвязи от сортировочной станции (или от выпускающей станции) до машинистов.
Теперь о различных функционалах списка.
Идея такова: в заыисимости от задачи, создаётся переменная, которая упрощает (сильно ограничивает) доступ к элементам списка.
То есть сам список может значительно больше, но задача этого не требует.
1. Самый простой функционал - стек.
Создаваемая для коммуникации переменная может доступаться только до header. И с header можно либо взять, либо положить туда какие-то значения.
2. Следующий функционал - очередь посложнее, так как создаваемая для коммуникации переменная может доступаться и до trailer(только для того чтобы положить данные) и до header, чтобы снять оттуда данные.
3. Следующий функционал - двунаправденная очередь.
Это самый интересный функционал и сегодня я Вам продемонстрирую программку, которая с ним работает.
Так как это всё же очередь, то создаваемая для коммуникации переменная может доступаться как до header, так и до trailer. Однако цель диктует расширение доступа то есть можно как положить, так и забрать данные как с header, так и с trailer.
Во всех случаях описанных функционалов доступ к внутренним узлам невозможен, то есть траверсирования в чистом виде НЕТ! (А список это может!)
Вот текст программки:
А вот результат:Код:program deque; type (* Container type *) infoT = Char; (* Types for DLL *) linkT = ^nodeT; nodeT = Record data: infoT; next, prev: linkT; End; (* Type for deque *) deqT = Record front,rear: linkT; End; (* Useful functions *) Function isEmpty(Var deq: deqT): Boolean; Begin isEmpty := (deq.front = nil); End; Procedure printDeq(Var deq: deqT); Var p: linkT; Begin WriteLn( 'Printing Deque ...' ); writeln; If isEmpty(deq) Then Begin WriteLn('<empty>'); Exit; End; p := deq.front; While p <> nil Do Begin Write( p^.data, ' ' ); p := p^.next; End; WriteLn; End; Procedure pushFront(Var deq: deqT; Ch: infoT); Var neo: linkT; Begin new(neo); neo^.next := deq.front; neo^.prev := nil; neo^.data := Ch; If deq.front <> nil Then deq.front^.prev := neo Else deq.rear := neo; deq.front := neo; End; Procedure pushRear(Var deq: deqT; Ch: infoT); Var neo: linkT; Begin new(neo); neo^.next := nil; neo^.prev := deq.rear; neo^.data := Ch; If deq.rear <> nil Then deq.rear^.next := neo Else deq.front := neo; deq.rear := neo; End; Function popFront(Var deq: deqT): infoT; Var toDelete: linkT; Begin popFront := #0; If isEmpty(deq) Then Exit; toDelete := deq.front; deq.front := toDelete^.next; If deq.front <> nil Then deq.front^.prev := nil Else deq.rear := nil; popFront := toDelete^.data; Dispose(toDelete); End; Function popRear(Var deq: deqT): infoT; Var toDelete: linkT; Begin popRear := #0; If isEmpty(deq) Then Exit; toDelete := deq.rear; deq.rear := toDelete^.prev; If deq.rear <> nil Then deq.rear^.next := nil Else deq.front := nil; popRear := toDelete^.data; Dispose(toDelete); End; Procedure initDeq(Var deq: deqT); Begin deq.front := nil; deq.rear := nil; End; Procedure killDeq(Var deq: deqT); var D: infoT; Begin While not isEmpty(deq) Do D := popFront(deq); End; Var mD: deqT; Begin initDeq(mD); pushFront(mD, 'A'); pushFront(mD, 'B'); pushRear(mD, 'F'); pushRear(mD, 'G'); writeln; writeln('Forward traversing'); printDeq(mD); writeln; writeln('Backward traversing'); writeln('Printing Deque ...'); writeln; While not isEmpty(mD) Do WriteLn( popRear(mD) ); killDeq(mD); End.
zen
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
гм. нам читали эти лекции о списках на первом курсе. выглядело как rocket science.
Здравствуйте Шынни.
Ну, честно скажу, что то, что тема сложна, то это заслуга препов.
Методика преподавания - от простого к сложному.
Всегда в первую очередь давали самый простой Односвязный список.
В то же время, при нём присутствовали ВСЕ сложности, связанные со списками!
Для чего нужно заглавное звено? Можно ли программировать без него.
На чём можно строить Деки, Стеки и очереди?
То есть, вроде просто, но жуть как сложно, так как Односвязный список НЕ УНИВЕРСАЛЕН.
Начинали бы с двусвязного... Усложнение мизерное, но на нём сразу можно делать все функционалы.
То есть выучил двусвязные и УЖЕ знаешь односвязные.
Хочешь строить деревья - пожалуйста...
Подпрограммы работы с Деком пригодны и для Стека и для Очереди.
До сих пор интернет полон байками о том, что на двусвязном списке нельзя построить стек.
МОЖНО!
Для полной библиотеки Двухсвяхных списков нужно ещё маленько функций для доступа в середину списка.
Всё остальное готово.
zen
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Думаю нам тоже это читали на первом курсе по "паскалю" но так как препод стоял у доски и шото мямлил себе под нос читая прямо с какой-то переводной книжки красного цвета про borland 5.5 то "в теме" ни одного человека на потоке не было (может и были но я их не знаю). Это я про наше образование.
Но и про сам вопрос тоже не все так просто. Вот нам дают некую парадигму что можно добавить контейнер или вставить или убрать... выглядит все как сказка какая-то, особенно для меня который к тому времени уже знал как написанны игры под ZX. Я думал: ОГО, чувакам пофиг сколько кода и данных надо будет чтоб организовать "КУЧУ памяти" и потом ее обслуживать. А тем кто попридумывал эти списки про КУЧУ думать и не надо было она у них просто УЖЕ была и все тут. Не говоря уже о том что 99% алгоритмов в заумных книгах никогда не обсуждают вопросы лимитов адресного пространства или глубину машинного стека (просто подразумевается что стека должно хватить так же как и памяти). Кроме того не рассматривается НИКОГДА альтернатива... ну простой массив. Короче все эти заумные вещи которым учат (а их там сотни! ооп, патерны, рекурсионные алгоритмы) довольно бесполезные вещи когда надо написать 99% эффективный код (а в нашем 8-bit хобби это именно так).
Самое интересное - это применение. Например, можно ли сортировать двухсвязный список? и применима ли модель стека?
На zx я тоже баловался с Паскалем из-за рекурсивного алгоритма. Но Hisoft беден по сравнению с Borland.
- - - Добавлено - - -
чот я не понял - вроде бы должно быть A B G F
Можно сортировать любое "множество" (в конце концов можно эмулировать поведение реализуя нужный интерфейс). Да и вообще разница только в реализации (скорость\ресурсоемкость доступа, добавления, замены, убирания зависит от реализации). Применим ли стек... ГЫ, алгоритмов сортировки придумали штук 50...80 вполне возможно что стеки в некоторых из них вполне применимы. Кроме того стек реализованный в процессорах это МАССИВ с дополнительной функцией быстрого занесения\вычитывания по специальному указателю.
Последний раз редактировалось bigral; 27.07.2018 в 13:54.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)