XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
String2Code
сабж в названии - возможно ли это? просто надо формировать название функции из существующих данных и вызывать таймером, создавать свою функцию с запуском таймера каждому из 144 вариантов для вызова через ExecuteFunc("") не хочется.
Старый 08.01.2012, 00:37
vladfaust

offline
Опыт: 12,714
Активность:
Где-то док говорил про массивы дефайнов... Можно так сделать.
Старый 08.01.2012, 00:48
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
"когда-то где-то кто-то как-то что-то зачем-то..."
конкретно и с примерами пожалуйста.
Старый 08.01.2012, 00:56
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
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
создавать свою функцию с запуском таймера каждому из 144 вариантов для вызова через ExecuteFunc("") не хочется.
Угу?
Старый 08.01.2012, 11:03
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Clamp, а что ты тогда хочешь?
Старый 08.01.2012, 12:52
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
J64_

offline
Опыт: 4,724
Активность:
  1. а ты имена функций делай в 16 СС
пример
void THISISMAYBECUTTEDUNDERSTR2CODEFUNCTION_0000(){}
void THISISMAYBECUTTEDUNDERSTR2CODEFUNCTION_0001(){}
void THISISMAYBECUTTEDUNDERSTR2CODEFUNCTION_000B(){}
void THISISMAYBECUTTEDUNDERSTR2CODEFUNCTION_000C(){}
далее уже массивом
  1. хеш как ни странно
  1. перебор массива
  1. как третий, но только без массива (с) Гуф
Старый 08.01.2012, 20:15
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 09:06.