Вверх ↑
Этот топик читают: Гость
Администрация
Ответов: 15294
Рейтинг: 1518
#16: 2005-04-22 23:19:05 ЛС | профиль | цитата
AlexKir, для выкладывания примеров программ есть раздел Upload, либо комнаты.

И еще совет: обратите внимание на использование компонент StrCat и MathParse из вашего примера в схеме ниже:
[code:1]Add(Button,971111,112,140) {
Left=110
Top=140
Font=[MS Sans Serif,8,0,0,1]
link(onClick,9425103:doCalc,[])
}
Add(MathParse,9425103,161,140)
{
MathStr="8 + 10"
link(onResult,7404940:doStrCat,[])
}
Add(StrCat,7404940,217,140)
{
Str1="Результат: "
link(onStrCat,14457796:doMessage,[])
}
Add(Message,14457796,280,140)
{
}
[/code:1]

так в калькуляторе DoData и Memory не нужны совершенно.
карма: 26
0
Ответов: 9906
Рейтинг: 351
#17: 2005-04-22 23:40:11 ЛС | профиль | цитата
"AlexKir" писал(а):
К сожалению мне не удалось справится с обработкой исключений в МатПарсере "штатно" ( те не влезая в код компонента)

AlexKir, не понятно, нужны разъяснения


Да, и еще.... Разница только стилистическая, но я бы делал так:
[code:1]Add(MainForm,8767041,98,21) {
Left=20
Top=105
Width=225
Height=288
Color=32768
Font=[MS Sans Serif,8,0,0,1]
Caption="Calk"
BorderStyle=6
DragForm=0
}
Add(Button,13441086,161,238)
{
Left=25
Top=105
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="1"
Data=String(1)
link(onClick,14176315:doWork1,[(207,244)])
}
Add(Button,6883369,161,182)
{
Left=70
Top=105
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="2"
Data=String(2)
link(onClick,8299961:doWork3,[(207,188)])
}
Add(Button,14766010,98,273)
{
Left=115
Top=105
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="3"
Data=String(3)
link(onClick,11222772:doWork2,[(163,279)(142,279)])
}
Add(Button,1382853,98,238)
{
Left=160
Top=145
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="+"
Data=String(+)
link(onClick,11222772:doWork1,[(151,244)])
}
Add(Button,7724731,98,308)
{
Left=25
Top=145
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="4"
Data=String(4)
link(onClick,11222772:doWork3,[(151,314)])
}
Add(Button,3133314,98,203)
{
Left=70
Top=145
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="5"
Data=String(5)
link(onClick,11222362:doWork3,[(151,209)])
}
Add(Button,16175944,98,133)
{
Left=115
Top=145
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="6"
Data=String(6)
link(onClick,11222362:doWork1,[(151,139)])
}
Add(Button,15074715,98,168)
{
Left=160
Top=185
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="-"
Data=String(-)
link(onClick,11222362:doWork2,[])
}
Add(Button,272987,35,147)
{
Left=25
Top=225
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="0"
Data=String(0)
link(onClick,1491768:doWork3,[(88,153)])
}
Add(Button,4246599,35,357)
{
Left=115
Top=185
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="9"
Data=String(9)
link(onClick,13670035:doWork3,[(88,363)])
}
Add(Button,5894250,35,287)
{
Left=70
Top=185
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="8"
Data=String(8)
link(onClick,13670035:doWork1,[(88,293)])
}
Add(Button,11901354,35,322)
{
Left=25
Top=185
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="7"
Data=String(7)
link(onClick,13670035:doWork2,[])
}
Add(Button,9567953,35,252)
{
Left=70
Top=225
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="."
Data=String(.)
link(onClick,14591964:doWork3,[(88,258)])
}
Add(Button,2620168,308,63)
{
Left=115
Top=225
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="="
link(onClick,2874976:doCalc,[])
}
Add(Button,11604068,161,77)
{
Left=160
Top=225
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="C"
Data=String()
link(onClick,2557462:doText2,[])
}
Add(Button,14987044,35,42)
{
Left=25
Top=65
Width=35
Height=30
Font=[MS Sans Serif,8,1,0,1]
Caption="Exit"
link(onClick,8767041:doClose,[])
}
Add(Edit,2557462,259,70)
{
Left=20
Top=25
Width=185
Height=30
Color=0
Font=[Terminal,14,5,65280,1]
Text=""
link(onChange,2874976:doMathStr,[])
}
Add(Label,14858966,161,28)
{
Left=15
Width=47
Height=19
Color=32768
Font=[MS Sans Serif,12,1,65535,1]
Caption="Niiy"
}
Add(HubEx,14176315,203,266)
{
link(onEvent,14132847:doWork3,[(228,279)])
}
Add(HubEx,11222772,147,266)
{
link(onEvent,14176315:doWork2,[])
}
Add(StrCat,14298895,259,217)
{
link(onStrCat,8279080:doWork3,[(301,223)(301,149)(235,149)])
link(Str1,2557462:Text,[(265,174)(265,174)])
}
Add(MathParse,2874976,364,63)
{
DataCount=1
MathStr="%1"
Point(doMathStr)
link(onResult,8279080:doWork1,[(406,69)(406,53)(235,53)])
}
Add(HubEx,11222362,147,161)
{
link(onEvent,8299961:doWork2,[])
}
Add(Button,2865572,35,182)
{
Left=160
Top=105
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption=")"
Data=String())
link(onClick,14591964:doWork1,[(88,188)])
}
Add(Button,1002532,35,217)
{
Left=70
Top=65
Width=40
Height=35
Font=[Fixedsys,17,0,0,1]
Caption="*"
Data=String(*)
link(onClick,14591964:doWork2,[])
}
Add(Button,14155146,35,112)
{
Left=115
Top=65
Width=40
Height=35
Font=[MS Sans Serif,18,0,0,1]
Caption="/"
Data=String(/)
link(onClick,1491768:doWork2,[])
}
Add(Button,1499230,35,77)
{
Left=160
Top=65
Width=40
Height=35
Font=[MS Sans Serif,8,0,0,1]
Caption="("
Data=String(()
link(onClick,1491768:doWork1,[(88,83)])
}
Add(HubEx,8299961,203,161)
{
link(onEvent,14132847:doWork1,[(228,174)])
}
Add(HubEx,8279080,231,63)
{
link(onEvent,2557462:doText,[(256,76)(256,76)])
}
Add(HubEx,14132847,224,210)
{
link(onEvent,14298895:doStrCat,[])
}
Add(HubEx,1491768,84,105)
{
link(onEvent,8299961:doWork1,[(207,118)])
}
Add(HubEx,14591964,84,210)
{
link(onEvent,14132847:doWork2,[])
}
Add(HubEx,13670035,84,315)
{
link(onEvent,14176315:doWork3,[(207,328)])
}[/code:1]
карма: 9

0
Гость
Ответов: 17029
Рейтинг: 0
#18: 2005-04-23 01:03:59 правка | ЛС | профиль | цитата


Редактировалось 3 раз(а), последний 2021-05-21 08:37:34
карма: 0

0
Ответов: 9906
Рейтинг: 351
#19: 2005-04-23 12:29:14 ЛС | профиль | цитата
AlexKir,
1) Есть маленькая тонкость: "узлы" это лишь понятие среды, и не добавляют ни одного байта кода, в отличии от Hub и GetData. Появились они, исторически, позже, и оба варианта разветвителей живут вместе, прежде всего, в силу соображений совместимости.
2) Использование данных, передающихся через поток, экономит (как Вы могли заметить) коды, хотя, возможно, менее очевидно. Ну а приоритеты HiAsm по выбору направления приема данных описаны в справке HiAsm.chm/Основы/Вступление
3) Ваш самый первый вариант, безусловно, работоспособен. Никаких претензий. Просто делимся соображениями

4) Зато в Дельфях исключения перехватываются. И выброшены только проверки, перехватываемые FPU. Там полная корректность, за исключением одной тонкости, о которой скажу ниже.
Про характеристику "гнуснейший" рунтайма - согласен. Не солидно
Под FPC, на данный момент, мы не имеем портированного с KOL модуля ERR. Именно он обеспечивает фичу exception. Стандартные средства Дельфи просят для этого около 100К кода дополнительно, а KOL - 6. Есть разница, однако. Если средства перехвата в FPC (недавно появившиеся, как Вы сказали) такого же калибра, что и в Дельфях, то это проблема....
А дальше альтернатива: а) Если мы отказываемся от технологии exception, то надо добавлять, удаленную ранее систему проверок, и вариант Дельфи переводить на эту же технологию. б) Трудимся над внедрением технологии под FPC, и здесь обнаруживаем новые подводные камни.

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

А что со вторым вариантом Да все отлично, кроме двух незадач... Первая - еще не знаю, как это сделать под FPC. Но, думается, что это физически преодолимо, все-таки.
Вторая - исключения в ObjectPascal (т.е. и в Дельфях тоже) полностью игнорируют факт расхода динамической памяти "незаконченными" продпрограммами. В отличии от C++, где существуют списки необходимых для выполнения деструкторов. Видимо, связано с идеологической разницей в языках: в C++ вызов конструкторов/деструкторов производится автоматически, а в паскалях - ручками. Этим сейчас страдает FMP - существует безвозвратный (не такой уж большой, если один раз) расход памяти при ошибках в компиляции строки. В MP такого нет, но не надо кричать ура Там возможен вызов вычислительного процесса через верхнюю точку, а там в свою очередь возможны исключения (вспомните вышестоящую сентенцию об "элементарных" мат-элементах), которые честно перехватываются (:! вызывающим парсером - и чего будет с памятью, не ясно
Вобщем-то, проблему расхода памяти при исключениях в FMP персонально преодолеть можно - организовать ручками список необходимых деструкторов, который реализуется в обработчике исключений. Но остается вышеупомянутый вопрос вызова схемных блоков HiAsm через верхние точки элемента

===================================
Вобщем, застряло это как-то на фазе подобных философских размышлений, что не совсем хорошо, естественно..............
карма: 9

0
Ответов: 963
Рейтинг: 12
#20: 2005-04-23 18:31:54 ЛС | профиль | цитата
Кстати, есть еще комиляторы"условно совместимые с Дельфи"
Virtual Pascal и кажется ТNТ Рascal.
(Но последний комерческий хотя и дешевле Дельфи разумеется.)
карма: 0

0
Администрация
Ответов: 15294
Рейтинг: 1518
#21: 2005-04-23 21:36:19 ЛС | профиль | цитата
Virtual Pascal - совместим, но еще более далек от Delphi чем FPC в виду меньшей распространенности. ТNТ Рascal - тут все и так ясно.
карма: 26
0
21
Сообщение
...
Прикрепленные файлы
(файлы не залиты)