Вверх ↑
Этот топик читают: Гость
Администрация
Ответов: 15295
Рейтинг: 1519
#136: 2012-01-06 00:07:20 ЛС | профиль | цитата
эти ф-ции не ошибки выводят, а stack tarce-ы всех вызовов внутри кодогенератора.

PS: добавлен вывод ошибки в отладочную консоль с именем файла, строкой и позицией в ней
карма: 27
1
Голосовали:iarspider
Ответов: 1841
Рейтинг: 369
#137: 2012-01-06 05:35:32 ЛС | профиль | цитата
Всем привет
Вот и мои 5 копеек
Всё же добил "кольцевание" и можно теперь при обнаружении замыкания на методе, вставлять альтернативный код а не лицезреть вылет среды.
Как это можно реализовать в С# я без понятия, но в purebasic вроде процедурами

Как работает:
Объявляем глобальную переменную (test) в hiSys.hws
Создаём массив в hiSys.hws с раннее объявленной переменной.
У элемента в каждом методе, необходимо прописать 2 переменные:
CP = 0
id = this.codename + '001' //001 порядковый номер функции.
Далее пытаемся найти в массиве наш уникальный id метода.
В случае если id найден, прерываем цикл, присваиваем переменной CP число 1 и потом пишем альтернативный код, который будет печататься в случае кольцевания на этом методе:

 for(i = 0; i < test.size(); i++)
if(test.get(i) == id)
i = test.size()
CP = 1
trace("Кольцевание") // альтернативный код
end
end

В случае если в массиве id не найден, отрабатываем 2 код:

 if (CP == 0)
test.add(id)
idx = test.size(id) - 1
trace("Нет кольцевания") //основной код
event('onMessage')
test.remove(idx)
end

В итоге, вот эта конструкция из CNET:

Add(EntryPoint,2953706,21,105)
{
link(onCreate,8005088:doWork2,[])
}
Add(Message,1517918,77,105)
{
link(onMessage,14233384:doRandom,[])
}
Add(Random,14233384,126,105)
{
link(onRandom,8005088:doWork1,[(170,111)(170,102)(67,102)])
}
Add(HubEx,8005088,63,105)
{
link(onEvent,1517918:doMessage,[])
}
будет отрабатывать также же как и в пакете windows...


Коды

hiSys.hws

//----------------------- SYSTEM ----------------------------------
func create(entry)
gvar(blk_vars, blk_procedure, blk_body, blk_event_gadget, blk, test)
test = new array()
...

hiMessage.hws

func doMessage(data)
CP = 0
id = this.codename + '001'

for(i = 0; i < test.size(); i++)
if(test.get(i) == id)
i = test.size()
CP = 1
trace("Кольцевание (doMessage)")
end
end

if (CP == 0)
test.add(id)
idx = test.size(id) - 1
trace("Нет кольцевания (doMessage)")
event('onMessage')
test.remove(idx)
end
end

func doMessage2(data)
CP = 0
id = this.codename + '002'

for(i = 0; i < test.size(); i++)
if(test.get(i) == id)
i = test.size()
CP = 1
trace("Кольцевание (doMessage2)")
end
end

if (CP == 0)
test.add(id)
idx = test.size(id) - 1
trace("Нет кольцевания (doMessage2)")
event('onMessage')
test.remove(idx)
end
end

Сейчас вот думаю, как это всё оптимизировать а также о возможных проблемах в будущем
карма: 1
0
Разработчик
Ответов: 4698
Рейтинг: 426
#138: 2012-01-06 12:22:28 ЛС | профиль | цитата
CriDos, такие оптимизации надо делать на уровне компилятора RTCG, а не делать костыли в коде.
карма: 10
0
Администрация
Ответов: 15295
Рейтинг: 1519
#139: 2012-01-06 13:55:52 ЛС | профиль | цитата
CriDos писал(а):
У элемента в каждом методе, необходимо прописать 2 переменные:

это похоже на решение?
карма: 27
0
Ответов: 1821
Рейтинг: 168
#140: 2012-01-06 19:38:23 ЛС | профиль | цитата
Непонимаю, почему у меня не вставляются и не компилируются схемы с интерфейсными компонентами?
карма: 5

0
Ответов: 1841
Рейтинг: 369
#141: 2012-01-07 00:19:57 ЛС | профиль | цитата
Dilma писал(а):
это похоже на решение?

Это решение, но оно естественно нуждается в оптимизации и применять его на данный момент нельзя
------------ Дoбавленo в 00.19:
Думаю это мой окончательный вариант, т.к. больше мыслей по упрощению нет...
Реализовал на примере элемента Message из пакета CNET.
hiSys.hws

исходник
hisys.hws

добавил глобальную переменную cil.
добавил массив cil.
добавил функцию cil (Check_Infinite_Loop)

//Check_Infinite_Loop
func cil(id)
for(i = 0; i < cil.size(); i++)
if(cil.get(i) == id)
i = cil.size()
cp = 1
end
end
return(cp)
end
hiMessage.hws

исходник
himessage.hws

С этими изменениями, следующая конструкция:

Add(EntryPoint,2953706,21,105)
{
link(onCreate,9561305:doEvent1,[])
}
Add(Message,7319166,140,105)
{
}
Add(Hub,9561305,70,105)
{
OutCount=3
link(onEvent1,1428281:doWork2,[])
link(onEvent2,1428281:doWork3,[(109,118)])
link(onEvent3,3686637:doWork2,[(112,125)(112,167)])
}
Add(HubEx,1428281,105,105)
{
link(onEvent,7319166:doMessage,[])
}
Add(Message,3837821,140,161)
{
link(onMessage,3686637:doWork1,[(184,167)(184,158)(123,158)])
}
Add(HubEx,3686637,119,161)
{
link(onEvent,3837821:doMessage,[])
}
из пакета CNET, компилируется без вылетов, а в окне отладке будет вот такой текст:

Подготовка к сборке проекта...
Генерация кода целевого языка
Кольцевание Message4001
Компоновка проекта...
Command line: csc.exe "/out:C:UsersAdminDesktopProject1.exe" /target:winexe "/win32res:D:Program FilesHiAsm_AltBuildElementscnetcodeallres.res" "D:Program FilesHiAsm_AltBuildElementscnetcodeProject1.cs"
Љ®¬ЇЁ«пв®а Microsoft (R) Visual C# 2010, ўҐабЁп 4.0.30319.1
(C) Љ®аЇ®а жЁп Њ ©Єа®б®дв (Microsoft Corp.). ‚ᥠЇа ў  § йЁйҐ­л.

Сборка завершена.

Вот
карма: 1
0
файлы: 2hisys.sha [8.2KB] [342], himessage.sha [669B] [334]
Администрация
Ответов: 15295
Рейтинг: 1519
#142: 2012-01-07 06:15:04 ЛС | профиль | цитата
CriDos, корректное решение это генерация ф-ции на элементе HubEx - т.е. тоже самое, что сегодня реализовано в FTCG MultiElment. Все остальное это костыли.
карма: 27
0
Ответов: 5446
Рейтинг: 323
#143: 2012-01-08 17:32:54 ЛС | профиль | цитата
В класс sys добавлен метод add_use(module), который является рекомендованным способом добавления директив "using <модуль>;" в код.
карма: 1

0
Ответов: 844
Рейтинг: 17
#144: 2012-01-20 19:58:04 ЛС | профиль | цитата
Большая прозьба добавти
аналог


Add(VBJScript,14305580,42,399)
{
Script=#
}

Из-за недостатков компонентов можно былобы решать проблему с помощью VBJScript,
карма: 0

0
Ответов: 3889
Рейтинг: 362
#145: 2012-01-20 20:04:19 ЛС | профиль | цитата
GAv писал(а):
Из-за недостатков компонентов можно былобы решать проблему с помощью VBJScript,

Тогда уж работу со всеми COM-серверами унифицировать. Недостатки(-ток?) компонентов можно было бы компенсировать InlineCode. Про отладку пока вообще молчим.
карма: 1

0
Ответов: 844
Рейтинг: 17
#146: 2012-01-20 20:24:44 ЛС | профиль | цитата
Ну чисто мне подуше VBJScript я тут лично за себя говорю а не общее хотения. но было бы хорошо icode и Vbs
карма: 0

0
Ответов: 5446
Рейтинг: 323
#147: 2012-01-20 22:37:13 ЛС | профиль | цитата
GAv, я всё понимаю, но из C# вызывать VBJscript... Это уже извращением попахивает.
карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#148: 2012-01-21 14:22:52 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2022-09-20 02:08:28
карма: 0

0
Ответов: 5446
Рейтинг: 323
#149: 2012-01-21 14:23:51 ЛС | профиль | цитата
217.118.79.22 (GAv?), может проще нужный функционал в виде компонентов реализовать?
карма: 1

0
Ответов: 3889
Рейтинг: 362
#150: 2012-01-21 14:27:43 ЛС | профиль | цитата
iarspider писал(а):
может проще нужный функционал в виде компонентов реализовать?

Если так важен синтаксис, сделать ему InlineCode на VB.NET, компилятор vbc.exe там рядом лежит, в папке фреймворка, вопрос только в том, как получать и линковать псевдокод (пока ещё не интересовался этим, но, по идее, должен быть способ). Хотя гораздо целесообразнее и логичнее сперва IC на C# прикрутить, IMHO.
карма: 1

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