Вверх ↑
Этот топик читают: Гость
Главный модератор
Ответов: 2997
Рейтинг: 395
#1: 2014-04-10 02:47:19 ЛС | профиль | цитата
На форуме обсуждали возможность создания пользовательских типов (классов). Эта тема давно обдумывалась и даже были попытки ее реализации в виде отдельного проекта пакета CNET. Теперь предлагается к рассмотрению вторая попытка сделать что-то похожее на реализацию наследования классов в парадигме схемотехники HiAsm. Это не полноценное решение, а только концепт. Для тестирования были сделаны несколько элементов и пример создания с их помощью двух пользовательских классов, которые, в свою очередь, являются наследниками третьего базового класса. В примере создаются экземпляры двух пользовательских классов и проверяется доступ к полям экземпляров базового и производного классов. Причем, для базового класса используется ссылка (link) на элемент для одновременного редактирования всех его экземпляров. Пример для тестирования: http://svn.hiasm.com/packs/CNET/Example/Class/UserClass.sha
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
vip
#1.1контекстная реклама от партнеров
Главный модератор
Ответов: 2997
Рейтинг: 395
#2: 2014-04-30 19:34:28 ЛС | профиль | цитата
На данный момент реализованы несколько основных элементов для создания пользовательского типа (класса):
  • Constructor - конструктор;
  • Destructor - деструктор;
  • Const - константа;
  • Field - поле;
  • Property - свойство;
  • Indexer - индексатор;
  • Method - метод;
  • Event - событие;
    Для обращения «снаружи» к членам класса созданы интерфейсные элементы:
  • FieldRW
  • PropertyRW
  • IndexerRW
  • ConstR
  • DoMethod
    Внутри класса интерфейсные элементы подключаются к внутренним членам класса с помощью менеджеров.
    Если в стандартном пакете MultiElement - это изначально отдельный unit (класс),
    то в пакете CNET «мультик» представляет собой только абстрактный уровень иерархии схемы,
    упрощающий её визуальное восприятие. Поэтому сделать из «мультика» пользовательский тип (класс)
    несколько сложнее чем в пакете Windows. Получается что все, помещённые в «мультик» элементы,
    определяются в создаваемом пользовательском типе. Следует также различать обращение к внутренним
    членам класса «внутри» класса и «снаружи» - для этого, как правило, реализованы соответствуюшие методы.
    Возможно, в будущем, получится унифицировать доступ, если появится точный критерий определения источника
    вызова.

    Примеры использования пользовательского типа:
    http://svn.hiasm.com/packs/CNET/Example/Class/UserClassStatic.sha
    http://svn.hiasm.com/packs/CNET/Example/Class/SingletonMultithread.sha
    http://svn.hiasm.com/packs/CNET/Example/Class/UserIndexer.sha
    http://svn.hiasm.com/packs/CNET/Example/graphics/Arcanoid2.sha
    http://svn.hiasm.com/packs/CNET/Example/graphics/DynamicBall_3.sha
  • карма: 6
    Дорогу осилит идущий. Install/Update HiAsm.NET
    2
    Голосовали:miver, Konst
    Главный модератор
    Ответов: 2997
    Рейтинг: 395
    #3: 2014-05-04 00:55:03 ЛС | профиль | цитата
    Пример использования пользовательского класса и вычисление абсолютно упругого соударения большого количества окружностей:
    cnet_collisions_balls.png

    карма: 6
    Дорогу осилит идущий. Install/Update HiAsm.NET
    0
    файлы: 2cnet_collisions_balls.png [21.8KB] [806], dynamiccollisionsball.sha [14.9KB] [443]
    Главный модератор
    Ответов: 2997
    Рейтинг: 395
    #4: 2014-05-14 00:48:03 ЛС | профиль | цитата
    Экспериментальная оптимизация компонента Hub:
    smarthub.sha
    smart_hub2.png
    code

    #hws
    ...
    public MyForm(string[] args) {
    ...
    MessageBox.Show("");
    MessageBox.Show("");
    }
    private void onClick5(Object sender, EventArgs args) { // Button5:"Push"
    Hub2("HiAsm Studio!");
    }
    private void Hub2(string data) {
    MessageBox.Show(data);
    MessageBox.Show(data);
    }
    private void onClick6(Object sender, EventArgs args) { // Button6:"Push"
    Hub2("Hello World!");
    }
    ...
    Логика оптимизации примитивна: если Hub «вызывается» только раз, то компонент работает как прежде. Все последующие «вызовы» формируют новый метод и в целевой код попадает только вызов этого метода.
    карма: 6
    Дорогу осилит идущий. Install/Update HiAsm.NET
    2
    файлы: 2smarthub.sha [632B] [429], smart_hub2.png [2.2KB] [670]
    Голосовали:Konst, miver
    Ответов: 758
    Рейтинг: 112
    #5: 2014-05-19 10:24:14 ЛС | профиль | цитата
    Nic, Заметил проблемы с конвертацией. Можно что-то сделать?
    code_33615.txt
    карма: 1

    0
    файлы: 1code_33615.txt [728B] [563]
    Главный модератор
    Ответов: 2997
    Рейтинг: 395
    #6: 2014-05-19 11:37:53 ЛС | профиль | цитата
    Поправил
    карма: 6
    Дорогу осилит идущий. Install/Update HiAsm.NET
    0
    Ответов: 758
    Рейтинг: 112
    #7: 2014-05-19 15:18:43 ЛС | профиль | цитата
    Теперь непонятно как работает
    Выше приведенная схема дает код
    code_33616.txt
    Почему не так
    code_33617.txt
    карма: 1

    0
    файлы: 2code_33616.txt [564B] [465], code_33617.txt [435B] [522]
    Главный модератор
    Ответов: 2997
    Рейтинг: 395
    #8: 2014-05-19 20:58:12 ЛС | профиль | цитата
    miver писал(а):
    Теперь непонятно как работает

    Код экспериментальный - предлагайте свой вариант - рассмотрим и оставим лучший.
    карма: 6
    Дорогу осилит идущий. Install/Update HiAsm.NET
    0
    Ответов: 758
    Рейтинг: 112
    #9: 2014-05-22 17:23:35 ЛС | профиль | цитата
    Nic, предлагаю такой вариант кода компонента Hub
    code_33645.txt
    Если б можно было предварительно определить типы всех входных данных, то можно было бы не формировать процедуру для данных одного типа. То есть когда тип данных встречается только один раз.
    карма: 1

    0
    файлы: 1code_33645.txt [1.1KB] [498]
    Главный модератор
    Ответов: 2997
    Рейтинг: 395
    #10: 2014-05-22 19:31:46 ЛС | профиль | цитата
    Что будет с оптимизацией для такой схемы:
    code_33648.txt

    карма: 6
    Дорогу осилит идущий. Install/Update HiAsm.NET
    0
    файлы: 1code_33648.txt [875B] [515]
    Ответов: 758
    Рейтинг: 112
    #11: 2014-05-23 10:25:41 ЛС | профиль | цитата
    HubEx не оптимизирует ничего и поэтому будет как раньше
    code_33649.txt
    карма: 1

    0
    файлы: 1code_33649.txt [541B] [487]
    Главный модератор
    Ответов: 2997
    Рейтинг: 395
    #12: 2014-05-23 10:53:46 ЛС | профиль | цитата
    Вот именно, хотя обычный Hub - вызывается трижды.
    карма: 6
    Дорогу осилит идущий. Install/Update HiAsm.NET
    0
    Ответов: 758
    Рейтинг: 112
    #13: 2014-05-23 12:44:03 ЛС | профиль | цитата
    Nic, можно ли вставлять код после вызова всех точек doEvent
    Если да, то можешь подсказать как
    карма: 1

    0
    Главный модератор
    Ответов: 2997
    Рейтинг: 395
    #14: 2014-05-23 14:00:32 ЛС | профиль | цитата
    miver писал(а):
    можно ли вставлять код после вызова всех точек doEvent?

    Для этого надо уметь определять какой вызов хаба последний, что, наверное, невозможно при рекурсивном обходе дерева элементов.
    карма: 6
    Дорогу осилит идущий. Install/Update HiAsm.NET
    0
    Ответов: 4622
    Рейтинг: 746
    #15: 2014-05-23 14:22:36 ЛС | профиль | цитата
    Nic, так ты же добавил "финализирующий" метод в кодогенератор? В процессе работы компонента собирается вся нужная информация из doEvent, затем в "финале" генерируется окончательный код. Нет?
    карма: 26

    0
    Сообщение
    ...
    Прикрепленные файлы
    (файлы не залиты)