Clamp
Lost in space
offline
Опыт:
71,158Активность: |
String2Code
сабж в названии - возможно ли это? просто надо формировать название функции из существующих данных и вызывать таймером, создавать свою функцию с запуском таймера каждому из 144 вариантов для вызова через ExecuteFunc("") не хочется. |
08.01.2012, 00:37 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
vladfaust
offline
Опыт:
12,714Активность: |
Где-то док говорил про массивы дефайнов... Можно так сделать. |
08.01.2012, 00:48 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,158Активность: |
"когда-то где-то кто-то как-то что-то зачем-то..." конкретно и с примерами пожалуйста. |
08.01.2012, 00:56 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hares
полупротосс
offline
Опыт:
6,966Активность: |
Делаешь хэш-таблицу. В неё забиваешь, привязанные по id таймера, string-имена ф-ий. После этого пишешь например сие, можно и не его:
((код
function TimerExecuteFunc takes nothing returns nothing
call ExecuteFunc(LoadStr(HashTable, StringHash("String2Code"), GetHandleId(GetExpiredTimer()))) endfunction ...
Вызов ф-ии: local timer t = CreateTimer() call SaveStr(HashTable, StringHash("String2Code"), GetHandleId(GetExpiredTimer())), "MyFunc") call TimerStart(t, 3.1415926, true, function TimerExecuteFunc) ... )) Угу? Hares добавил:
В принципе можно через массив глобалок, но мне откровенно говоря лень (+ ещё и она дольше работает) писать необходимую ф-ию, а именно: ((код
globals
string array ExecutableFunctions timer array ExecutingTimers boolean array EBound endglobals function TimerExecuteFunc takes nothing returns nothing
local timer t = GetExpiredTimer() local integer i = 0 loop exitwhen i > EBound if (ExecutingTimer[i] == t) then call ExecuteFunc(ExecutableFunctions[i]) endif exitwhen ExecutingTimer[i] == t set i = i+1 endloop set t = null endfunction И, соответственно:
... local timer t = CreateTimer() set EBound = EBound + 1 set ExecutingTimer[EBound] = t set ExecutableString[EBound] = "MyFunc" call TimerStart(t, 3.1415926, true, function TimerExecuteFunc) set EBound = EBound - 1 ... )) Hares добавил: Ужасный jass. Зачем я вздумал на нём писать? для наглядности?.. Отредактировано Hares, 08.01.2012 в 14:38. |
08.01.2012, 01:57 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,158Активность: |
Угу? |
08.01.2012, 11:03 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
Clamp, а что ты тогда хочешь? |
08.01.2012, 12:52 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hares
полупротосс
offline
Опыт:
6,966Активность: |
» Просто делаешь так:
((код
globals
string array ExecutableFunctions timer array ExecutingTimers boolean array EBound endglobals function TimerExecuteFunc takes nothing returns nothing
local timer t = GetExpiredTimer() local integer i = 0 loop exitwhen i > EBound if (ExecutingTimer[i] == t) then call ExecuteFunc(ExecutableFunctions[i]) endif exitwhen ExecutingTimer[i] == t set i = i+1 endloop set t = null endfunction )) И так:
((код
function TimerStartString takes timer t, real interval, boolean peiodic, string codename returns nothing
set EBound = EBound + 1 set ExecutingTimer[EBound] = t set ExecutableString[EBound] = codename call TimerStart(t, interval, periodic, function TimerExecuteFunc) set EBound = EBound - 1 endfunction )) ((код
И, соответственно: ... local timer t = CreateTimer() call TimerStartString(t, 3.1415926, true, "MyFunc") ... )) Эта ф-ия принимает таймер, интервал, булевое значение "переодично или нет" и строку с именем функции. Или тогда понятно объясни, что и зачем тебе надо. |
08.01.2012, 14:38 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J64_
offline
Опыт:
4,724Активность: |
далее уже массивом
|
08.01.2012, 20:15 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|