а не замутить ли нам недосимулятр?

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

bar
Senior
Posts: 185
Joined: 07 Aug 2006 10:18

Post by bar »

Shaos wrote:Вот Александреску в 11 главе писал как сделать то, что ты хочешь:
=)
Его я так и не удосужился прочитать.
Shaos wrote:P.S. Лучше (и понятнее) писать на сях, тегируя объекты - код будет сильно прозрачней...
Угу. Тем более что искать где спереть александреску лень, а сайт тот показывает лишь несколько страниц излияний александреску, объясняющего, что он собирается сделать. И когда он подходит к самому интересному: к способу как сделать то, что он собирается сделать, сайт отказывается показывать дальше. Типа своих три страницы бесплатных вы уже прочитали (если я правильно понял ту французскую надпись).
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Shaos wrote:Александреску в 11 главе писал как сделать
Вот этот его DoubleDispatch и есть черезжопу. Вышеописанная проблема как раз, на мой взгляд, элегантно решается виртуальными функциями (см. код, который bar обозвал как черезжопу).
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
bar
Senior
Posts: 185
Joined: 07 Aug 2006 10:18

Post by bar »

b2m wrote:
Shaos wrote:Александреску в 11 главе писал как сделать
Вот этот его DoubleDispatch и есть черезжопу. Вышеописанная проблема как раз, на мой взгляд, элегантно решается виртуальными функциями (см. код, который bar обозвал как черезжопу).
Тебе нравится тот код?

У меня руки так и тянутся написать там комментарий о том, несмотря на одинаковый внешний вид тел функций point::distance(primitive*) и line_segment::distance(primitive*) -- это совершенно разный код, потому что используемый в них указатель this имеет разный тип. А я такое желание неуёмное желание комментировать склонен рассматривать как признак того, что код неудачен. Может всё дело в том что я в C++ не гуру совсем. Может для C++ подобное нормально. Но и всё ж...
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

bar wrote:Тебе нравится тот код?
Да, и я таким способом уже пользовался, когда делал интерпретатор пролога: используется при унификации двух произвольных объектов. Работает на ура, и кода не так уж много.
bar wrote:несмотря на одинаковый внешний вид тел функций point::distance(primitive*) и line_segment::distance(primitive*) -- это совершенно разный код
Думал-думал как избавиться от этих функций - никак не придумал. Похоже, это неотъемлемая часть этого метода. А ещё, не нравилась необходимость объявлять все эти виртуальные и по большей части абстрактные distance(point*),distance(line_segment*),... в базовом классе primitive. То есть при добавлении нового примитива приходилось менять не только объявление базового класса, но и классы, с которыми "контачит" новый примитив. Именно поэтому я предлагал вынести эту функциональность в отдельный законченный набор базовых классов.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
bar
Senior
Posts: 185
Joined: 07 Aug 2006 10:18

Post by bar »

b2m wrote:Думал-думал как избавиться от этих функций - никак не придумал. Похоже, это неотъемлемая часть этого метода.
Да, неотъемлимая. Но дело не в том чтобы избавится, а в том чтобы... Ненужный полиморфизм просто. Сбивающий с толку. Но кстати этого можно избежать, если не использовать перегрузку на этих виртуальных методах, то есть давать более подробные названия:

Code: Select all

virtual point_distance(point *p) = 0;
virtual segment_distance(line_segment *s) = 0;
На возможностях API этих классов оно никак не скажется, а вот код методов станет более очевидным.
b2m wrote:А ещё, не нравилась необходимость объявлять все эти виртуальные и по большей части абстрактные distance(point*),distance(line_segment*),... в базовом классе primitive.
А вот это, как раз, как я понял обдумав, офигенная фишка метода. Все эти методы объявляются в базовом как абстрактные, и если добавляя новый примитив мы, где-то в производном классе забыли дописать метод, то мы получим ошибку компиляции. В том же lisp'е, забывчивость приводит к run-time ошибками. Что не очень удобно данном случае. С тегированием будет то же самое. С DoubleDispatch не скажу -- до конца не дочитал, и не знаю чем там дело кончилось.
Ещё один плюс такого подхода -- нет необходимости ни в rtti, ни в тегировании.
Склоняюсь именно к нему.
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

bar wrote:давать более подробные названия:

Code: Select all

virtual point_distance(point *p) = 0;
virtual segment_distance(line_segment *s) = 0;
На возможностях API этих классов оно никак не скажется, а вот код методов станет более очевидным.
А вот это, мне кажется, делать не надо. Чаще всего ты будешь иметь дело именно с указателем на абстрактный primitive. Например список объектов для отрисовки. Поскольку тип примитива неизвестен, то неизвестно и какой из методов надо вызывать. А если метод один единственный, то и проблем нет.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
bar
Senior
Posts: 185
Joined: 07 Aug 2006 10:18

Post by bar »

b2m wrote:
bar wrote:давать более подробные названия:

Code: Select all

virtual point_distance(point *p) = 0;
virtual segment_distance(line_segment *s) = 0;
На возможностях API этих классов оно никак не скажется, а вот код методов станет более очевидным.
А вот это, мне кажется, делать не надо. Чаще всего ты будешь иметь дело именно с указателем на абстрактный primitive. Например список объектов для отрисовки. Поскольку тип примитива неизвестен, то неизвестно и какой из методов надо вызывать. А если метод один единственный, то и проблем нет.
Всё известно, перегрузка ведь не даёт ничего кроме синтаксических особенностей записи вызова функции. Если у нас есть point* мы можем вызвать point_distance, если есть primitive* мы можем вызвать primitive_distance. А какого именно типа у нас указатель хранит адрес примитива мы всегда знаем.
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

bar wrote:Всё известно, перегрузка ведь не даёт ничего кроме синтаксических особенностей записи вызова функции. Если у нас есть point* мы можем вызвать point_distance, если есть primitive* мы можем вызвать primitive_distance. А какого именно типа у нас указатель хранит адрес примитива мы всегда знаем.
Но, согласись, в основной программе кроме primitive_distance ты ничего другого не будешь использовать. Или ты хочешь отказаться от полиморфизма и хранить объекты каждого класса в отдельных коллекциях (которые хранят указатели на конкретный класс) и потом все пары обрабатывать? :)
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Lavr
Supreme God
Posts: 16687
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Джентльмены, извините за небольшой оффтоп, но люди вы эрудированные,
а меня вдруг очень заинтересовал следующий вопрос.

А под i8080(Z80) были какие-либо симуляторы электронных схем?
iLavr
User avatar
He3HauKo
Senior
Posts: 176
Joined: 09 Aug 2012 11:20
Location: 95.135.174.189

Post by He3HauKo »

Для симуляции не знаю, а вод для разводки дорожек точно было!
Хочу стать всезнайкой ;-)
User avatar
Lavr
Supreme God
Posts: 16687
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

He3HauKo wrote:Для симуляции не знаю, а вод для разводки дорожек точно было!
Да это все знают - Лэйаут... и его модификации...


А вот были ли какие-либо симуляторы электронных схем под i8080(Z80)?
Пусть даже самые простые...
iLavr
User avatar
Shaos
Admin
Posts: 24040
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Lavr wrote:
He3HauKo wrote:Для симуляции не знаю, а вод для разводки дорожек точно было!
Да это все знают - Лэйаут... и его модификации...


А вот были ли какие-либо симуляторы электронных схем под i8080(Z80)?
Пусть даже самые простые...
Ща сделаем ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16687
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:
Lavr wrote:А вот были ли какие-либо симуляторы электронных схем под i8080(Z80)?
Пусть даже самые простые...
Ща сделаем ;)
"Верю, ибо абсурдно..." (щютка :lol: )

А серьёзно - под Спецтрумом там или под СР/М?
iLavr
User avatar
Lavr
Supreme God
Posts: 16687
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:
Lavr wrote:А вот были ли какие-либо симуляторы электронных схем под i8080(Z80)?
А серьёзно - под Спецтрумом там или под СР/М?
Вот, к примеру, нашарил:

Image

MicroCap 3.0 — написанный на QuickBasic 3.0, который работал на XT.
Говорят, даже шевелился! :o
Значит и для i8080(Z80) может быть не всё так уж грустно? :roll:



PS. Пошустрил я в сети этот Micro-Cap III на Basюc-е - так ведь нету!!! :o
iLavr
User avatar
Lavr
Supreme God
Posts: 16687
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:
Lavr wrote:А вот были ли какие-либо симуляторы электронных схем под i8080(Z80)?
Ща сделаем ;)
А в принципе, как человек, имеющий опыт - ты как считаешь, ресурсов
популярных 8-биток могло хватить для эмуляции схем, или это всё ж "абсурдно" ?
iLavr