Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#61: 2005-06-28 01:30:07 ЛС | профиль | цитата
Ну и опять же, способ сортировки (даже в Вашей маленькой схеме) сомнения вызывает. А еще и все точки на линиях связи пронумерованы (в смысле, имеют свои иденты отличные от всего остального). И схемы тоже....
А если заводить отдельный счетчик на каждый класс - при внутреннем использовании (ну, например, при генерации кода), обрабатывая очередь из элементов схемы, я должен пользоваться не идентом (просто число), а парой - <номер>+<имя класса>. Это не увеличивает, мягко говоря, эффективность работы кодогенератора. Вот и спрашивается - ради чего

Вот сегодня получил от Nic-а его знаменитую схему (всего 50К под RAR-ом). Нажимаю <Статистика>, и вижу:
[code:1]В текущем контейнере: 284 Всего элементов: 11597[/code:1]
И какая сортировка здесь поможет :?:

И получается - куча напряга с непонятным результатом.
Опять же, ИМХО, конечно......
У Автора совершенно спокойно может оказаться другое мнение :)
карма: 9

0
Ответов: 963
Рейтинг: 12
#62: 2005-06-28 06:24:13 ЛС | профиль | цитата
При написании тестов для студентов я часто сталкивался с похожими
проблемами - и нечего все решалось.
(Там нужно было выдавать определенное количество вопросов
из определенных групп причем так чтобы соблюдать определенные
пропорции все это псевдослучайно и разумеется без повторов.)

Кстати сильно сомневаюсь что способ генерации "крякозяблов"
на много проще счетчиков. (а возможно что и сложнее)
Кстати для упрощения изменения я предложил править
уже при записи на диск.

Для чего все это надо ?

Для того чтоб иметь возможность контролировать код когда это понадобится .
- дело в том что 70970779 и 70170774 на глаз
совершено не различается сходу , а 000001 и 000009
различить и найти в коде куда как проще.
(В схеме еще ладно но на Паскала это полный "пушной зверек"
и кубатура шара в придачу... .)
карма: 0

0
Ответов: 9906
Рейтинг: 351
#63: 2005-06-28 10:42:54 ЛС | профиль | цитата
AlexKir, а я и не говорил, что задача не разрешимая, или бессмысленная. Говорил несколько другое:
    1) Это лежит на ветке "визуального программирования" - нет
    2) Это улучшит качество выходного продукта - нет
    3) Это совсем не имеет смысла - имеет[/list:u]И прибавлял, ИМХО, конечно.
    Ну а самое рациональное решение здесь - напрягать Автора не на собственные предпочтение (которые могут оказаться и не самыми удобными для остальных), а на предоставление возможности реализовывать свои предпочтения самостоятельно.
    Примеры:
    1) Команду <Копировать ссылку> каждый может поместить куда хочет, с помощью редактора команд. Вот я поместил в контекстное меню по правому клику на элементе....
    2) Разместить коды своих элементов можно там где вздумается. Ну и режимы оптимизации для компилятора, задаваемые через командную строку....
    3) Можно разделить работу среды и кодогенератора, вынеся последний в dll-ку. Уже сегодня пользователь может создавать свои типы проектов => можно создать проект генерации того самого кодогенратора. Но это на схеме HiAsm, а если Вам больше понравится в оболочке Дельфи - так совсем нет вопросов.
    Вот он-то и генерирует файлы контейнеров - к нему и вопросы по формированию имен, вплоть до переименования тех, которые не нравятся. А вот среда тогда становится языково-независимой, и, следовательно, нельзя делать вывод, что в любом гипотетическом языке устроены зоны видимости по аналогии с языками ВУ. Не факт => генерация идентов в среде должна быть уникальной по всему проекту, независимости от вложенности.
    Но если у пользователя (продвинутого в достаточной степени, конечно) есть возможность влиять на кодогенератор - так нумеруйте как хочется. А если Ваш вариант окажется удачным - так будет Вам большое спасибо от всех любителей кода

    Этот вопрос еще не закончен в достаточной степени, но таки обсуждался на форуме.
    Так что, присоединяйтесь, г-н барон....
    Присоединяйтесь...
карма: 9

0
Ответов: 963
Рейтинг: 12
#64: 2005-06-28 13:09:30 ЛС | профиль | цитата

AlexKir, а я и не говорил, что задача не разрешимая, или бессмысленная. Говорил несколько другое:
1) Это лежит на ветке "визуального программирования" - нет
2) Это улучшит качество выходного продукта - нет
3) Это совсем не имеет смысла - имеет


Вывод: все оставить как есть ни чего не менять ...

Ну а самое рациональное решение здесь - напрягать Автора не на собственные предпочтение (которые могут оказаться и не самыми удобными для остальных), а на предоставление возможности реализовывать свои предпочтения самостоятельно.


О да ! Как-же, как-же ...
Глобальные улучшения, универсальные решения - это
на самом деле БОЛЕЗНЬ большинства программистов.
(И моя, каюсь, тоже!)

Не стоит пренебрегать возможностью сделать что-то
лучше уже сейчас, не дожидаясь когда будет готов очередной
"перепотуммобиле" - возможно сразу решающий и эту и множество
других проблем. (Как показала практика часто универсальные решения
просто одни проблемы заменяют другими.)

На самом деле нужен БАЛАНС между частным и общим.
Хотя насчет кодагенератора в принципе согласен..
(Насчет мультиязыковости можно спорить, но это по идее никак не
отразится на любителях Паскаля (Пасквилянтах ) .)


Возвращаясь от прикладной философии "к нашим баранам"
То что я предлагаю по моему уж точно не хуже того что есть,
и для большинства просто просто пройдет незамеченным .
(По моему эти идентификаторы вообще рудимент скриптовых версий ХайАсма)


Этот вопрос еще не закончен в достаточной степени, но таки обсуждался на форуме.
Так что, присоединяйтесь, г-н барон....
Присоединяйтесь...


С удовольствием сиятельный граф Galkov !
Не будете ли так любезны подсказать ветку форума?
карма: 0

0
Администрация
Ответов: 15294
Рейтинг: 1518
#65: 2005-06-28 13:15:16 ЛС | профиль | цитата
Подход "ближе к делу" это правильный подход На счет простоты генерации идентификатора в настоящее время прав г-н Galkov, - она проста на столько, на сколько это вообще возможно. А именно к классу элемента добавляется его адрес в памяти, что обеспечивает 100% уникальность и ничего дополнительно делать не надо.
Поменять идентификатор можно самостоятельно в строке:
[code:1]CodeName := cgt.elGetClassName(e) + '_' + Int2Hex(e,6);[/code:1] кодогенератора(пока таковой есть только для PocketPC) например на простой счетчик:
[code:1]CodeName := cgt.elGetClassName(e) + '_' + Int2Str(ECount); inc(ECount);[/code:1]
карма: 26
0
Администрация
Ответов: 15294
Рейтинг: 1518
#66: 2005-06-28 13:23:56 ЛС | профиль | цитата
По моему эти идентификаторы вообще рудимент скриптовых версий ХайАсма

Не совсем так. Если внимательно посмотреть на формат SHA то станет ясно почему.
карма: 26
0
Ответов: 963
Рейтинг: 12
#67: 2005-06-28 13:38:00 ЛС | профиль | цитата
А я то думал! Еще простой вариант вариант получать ИД из адреса єлемента в памяти.
Зы
Ладно попробую сейчас написать свой утиль.
карма: 0

0
Ответов: 9906
Рейтинг: 351
#68: 2005-06-28 22:36:54 ЛС | профиль | цитата
Dilma, а почему тогда всего 6 цифр
+ Int2Hex(e,6);
Среда ведь вроде одна и та же, что для PocketPC, что для нормальных людей
карма: 9

0
Администрация
Ответов: 15294
Рейтинг: 1518
#69: 2005-06-29 00:29:22 ЛС | профиль | цитата
количество цифр ни на что по идее не влияет даже если адреса будут меньше 0x00100000
карма: 26
0
Ответов: 9906
Рейтинг: 351
#70: 2005-06-29 01:09:44 ЛС | профиль | цитата
Ну не факт, что диапазон адресов в 1метр уложится. В, не к ночи помянутом, статусплане, например......
карма: 9

0
Администрация
Ответов: 15294
Рейтинг: 1518
#71: 2005-06-29 01:35:04 ЛС | профиль | цитата
Так я и говорю что все равно. Вместо 6 можно и 8 поставить а можно и 1...
карма: 26
0
Ответов: 9906
Рейтинг: 351
#72: 2005-06-29 04:23:39 ЛС | профиль | цитата
Так вот чего я знаю про это на сегодняшний день:

1) Среда уже распознает наличие CodeGen.dll в папке соответствующего проекта, и если нашла таковую - готова радостно перепоручить кодогенерацию этой dll-ке

2) Результат работы (несколько StrList-ов) среда далее передаст одной из dll-к типа make_XXX. Так называемые генераторы проекта.
Исходники на эти dll-ки (кроме make_exe) лежат в папке %HiAsm%\plug, и, если ознакомиться с ними, приходит понимание как сделать свой проект (например, тот же отсутствующий make_exe, или генератор кодогенератора из схемы HiAsm)

3) CodeGen.dll экспортирует один метод:
function CreateCode(SDK:cardinal; cgt:PCodeGenTools):pointer; cdecl;[/code]
А возвращаемый поинтер - это такая штука:
type
  TCGrec = record
MainForm:string;
Vars,Units,IBody,Dead:PStrList;
end;
PCGrec = ^TCGrec;
StrList-ы - это заполненые заготовки кода: поля определения переменных (типа Button_4B77771), необходимые для включения юниты, коды инициализации (типа Button_4B77771.Caption:='Нажимай!'; ), строки для включения в деструктор - соответственно. В общем, если присмотреться к исходникам на dll-ки проектов - эти StrList-ы легко идентифицируемы.

4) Ну и самое непонятное - это предоставляемый средой список указателей на методы для использования:
 TCodeGenTools = object
   //~~~~~~~~~~~~~~~~~~~~~~~~ SDK ~~~~~~~~~~~~~~~~~~~~~~~~~~
sdkGetCount:function (SDK:cardinal):integer;
//возвращает количество элементов в схеме
sdkGetElement:function (SDK:cardinal; Index:integer ):cardinal;
//возвращает идент элемента по его Z-координате(индексу)
sdkGetElementName:function (SDK:cardinal; Name:PChar ):cardinal;
//возвращает идент элемента по имени его класса
//~~~~~~~~~~~~~~~~~~~~~~~~ Element ~~~~~~~~~~~~~~~~~~~~~~~~~~
elGetFlag:function (e:cardinal):cardinal;
//возвращает "хитрые" особенности элемента по его иденту
elGetPropCount:function (e:cardinal):cardinal;
//возвращает кол-во св-в элемента
elGetProperty:function (e:cardinal; Index:integer):PParamRec;
//возвращает целую структуру для конкретного св-ва с порядковым номером из INI
elIsDefProp:function (e:cardinal; Index:integer):boolean;
//возвращает True, если значение св-ва совпадает с заданным в INI файле, иначе False
elSetCodeName:function (e:cardinal; Name:pchar):cardinal;
//даем элементу свое любимое(уникальное) имя
elGetCodeName:function (e:cardinal):PChar;
//и получаем его обратно (если забыли)
elGetClassName:function (e:cardinal):PChar;
//а вот имя класса не мы давали - можем только узнать
elGetInfSub:function (e:cardinal):PChar;
//просто содержимое поля Sub из INI-файла элемента
elGetPtCount:function (e:cardinal):cardinal;
//получаем количество точек у элемента
elGetPt:function (e:cardinal; i:integer):cardinal;
//получаем идент точки по её индексу
elGetPtName:function (e:cardinal; Name:PChar):cardinal;
//получаем идент точки по её имени
elGetClassIndex:function (e:cardinal):byte;
//получаем подкласс элемента(константы типа CI_ХХХ)
elGetSDK:function (e:cardinal):cardinal;
//получаем идент внутренней схемы для контейнеров
elLinkIs:function (e:cardinal):boolean;
//возвращает True, если данный элемент является ссылкой либо на него ссылаются
elLinkMain:function (e:cardinal):cardinal;
//возвращает идент главного элемента(тот, на который ссылаются другие)
//~~~~~~~~~~~~~~~~~~~~~~~~ Point ~~~~~~~~~~~~~~~~~~~~~~~~~~
ptGetLinkPoint:function (p:cardinal):cardinal;
//возвращает идент точки, с которой соеденена данная
ptGetRLinkPoint:function (p:cardinal):cardinal;
//возвращает идент точки, с которой соеденена данная без учета точек разрыва и хабов
ptGetType:function (p:cardinal):cardinal;
//возвращает тип точек(константы pt_XXX)
ptGetName:function (p:cardinal):pchar;
//возвращает имя точки
ptGetParent:function (p:cardinal):cardinal;
//возвращает идент элемента, которому принадлежит точка
ptGetIndex:function (p:cardinal):cardinal;
//возвращает относительный индекс точки по пренадлежности к одной из 4х групп
pt_dpeGetName:function (p:cardinal):PChar;
//возвращает базовую часть имени динамических точек(для CI_DPElement)
//~~~~~~~~~~~~~~~~~~~~~~~~ Property ~~~~~~~~~~~~~~~~~~~~~~~~~~
propArrayCount:function (PRec:PParamRec):integer;
//возвращает количество элементов в массиве
propArrayGetItem:function (PRec:PParamRec; Index:integer):TParamRec;
//возвращает элемент массива по его индексу
//~~~~~~~~~~~~~~~~~~~~~~~~ Res ~~~~~~~~~~~~~~~~~~~~~~~~~~
resAddFile:function (Name:pchar):cardinal;
//добавляет имя файла в общий список временных файлов для последующего удаления
resAddIcon:function (P:PParamRec):PChar;
//добавляет иконку в ресурсы и в список временных файлов
resAddStr:function (P:PChar):PChar;
//добавляет строку в ресурсы и в список временных файлов
resAddStream:function (P:PParamRec):PChar;
//добавляет поток в ресурсы и в список временных файлов
resAddWave:function (P:PParamRec):PChar;
//добавляет звук в ресурсы и в список временных файлов
resAddBitmap:function (P:PParamRec):PChar;
//добавляет картинку в ресурсы и в список временных файлов
//~~~~~~~~~~~~~~~~~~~~~~~~ Other ~~~~~~~~~~~~~~~~~~~~~~~~~~
_Debug:function (Text:PChar; Color:cardinal):cardinal;
//выводит строку Text в окно Отладка цветом Color
GetCodePatch:function ():PChar;
//возвращает путь к папке code текущего пакета
ParamToText:function (p:PParamRec):PChar;
//переводит параметр в текст(в данной версии только для типа data_script)
end;
PCodeGenTools = ^TCodeGenTools;
Про них я кое чего знаю, кое что знаю но не точно, а кое чего не знаю...
Поэтому развернутого описания не получится. Хотя знаю точно, что в 148-й этот список уже немного другой (расширен несколько)

Ну вот и начало обсуждения может начаться с просьбы к [b]Dilma[/b] обновить этот список и дополнить(исправить :)) справа короткими комментариями.

Как результат, существует гипотеза, что продвинутый пользователь, обладая более подробными знаниями о вышеописанном, в состоянии и сам написать dll-ку, генерерующую те несложные коды, которые мы видим после Ctrl+D :lol:

Соответственно и предложение: давайте приобретать эти знания, расспрашивая [b]Dilma[/b]
Вот пусть он нам должит о состоянии дел на этом фронте. :)
Ну а мы ему, в ответ, сразу же расскажем, что он делает неправильно :D
карма: 9

0
Ответов: 963
Рейтинг: 12
#73: 2005-06-29 12:14:27 ЛС | профиль | цитата
Спасибо за информацию! Нужно будет хорошенько вникнуть.

А пока вот что : шарясь в каталогах я обнаружил схемы вроде about.sha.
Означает ли они наличие внутреннего интерпретатора и/или
возможности создавать оболочки элементов-компонентов для «Дизайн-Тайма»
(как в Дельфи) ?
Думаю что это было бы не плохо!

Зы :
Разобрался в опции «копировать ссылку» и прикрутил ее «по Галковски»
Но обнаружил забавный глюк попытавшись создать ссылку на МайнФорм
Кстати неплохо бы как то выделять ссылку на схеме(как ярлыки Винде) ,
а то можно удалить по ошибке оригинал .

«Мультики» тоже желательно сделать более различимыми – ну хоть-бы номер
в углу нарисовать что-ли и/или комментарий автоматом внутри вставлять
(Не важно что размер «квадратика» на схеме будет большой зато сразу будет
видно что к чему и почему – хинт (ИМХО) все же не то ... )
карма: 0

0
Ответов: 963
Рейтинг: 12
#74: 2005-06-29 13:09:39 ЛС | профиль | цитата
На счет мультиязыковости по размышлению имеет смысл.

Но думаю что не для "одно яйцевых" языков как С,Паскаль,Ада,Модула,Фортран...

А для более логически отличных таких как Форт,Пролог,Лисп,Руби...

Кстати рекомендую обратить внимание именно на Форт .
ИМХО этот язык просто создан для НиАсма !

Компактность кода может соперничать с чистым асемблером!

Наращиваемость конструкций (Гибкость!) не сравнятся ни каким другим языком.

Язык одновременно и высокого и низкого уровня и компилятор
и интерплетатор . (Есть возможность применения ООП)

Пугающая новичков «обратная польская запись» легко правится
простеньким набором слов на два три скрина по 10-15 строк кода.

Не хватает только развитой визуальной среды - не хватает ХайАсма!

http://www.forth.org.ru/
карма: 0

0
Администрация
Ответов: 15294
Рейтинг: 1518
#75: 2005-06-29 14:27:00 ЛС | профиль | цитата
А возвращаемый поинтер - это такая штука:

Добавлю, что эта структура на 100% определяется программистом и может содержать любые поля. В среде она никак не используется и нужно только очевидно для разделения генерируемого кода и проектов.

TCodeGenTools - комментарии будут попозже.

Означает ли они наличие внутреннего интерпретатора и/или
возможности создавать оболочки элементов-компонентов для «Дизайн-Тайма»(как в Дельфи) ?
Думаю что это было бы не плохо!

не означает. Поскольку в среде уже есть классы понимающие sha формат то грех их не использовать в качестве интерфейса. Однако свои компоненты вставить можно:
Помощь->Разработка->Класс Custom

Но обнаружил забавный глюк попытавшись создать ссылку на МайнФорм

Какой?

Кстати неплохо бы как то выделять ссылку на схеме(как ярлыки Винде) , а то можно удалить по ошибке оригинал

А как же она сейчас выделяется

Но думаю что не для "одно яйцевых" языков как С,Паскаль,Ада,Модула,Фортран...
А для более логически отличных таких как Форт,Пролог,Лисп,Руби...

Прошу ознакомится с пакетом FASM на основе одноименного ассемблера. Это действующий пакет с двумя примерами - отрисовкой линий на форме и закрытием формы по нажатию кнопки. В папке есть и скомпилированные EXE для ознакомления.
карма: 26
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)