Всех приветствую. При разработке системы возник вопрос, связанный с cJass. Возможно ли как-то отловить функцию, но только для определенной переменной с ранее определенным названием.
Например, мне нужно, чтобы для SYSTEM_HASHTABLE = Hashtable_7 при написании кода FlushChildHashtable(SYSTEM_HASHTABLE,какая-то целочисленная) данная функция заменялась на FlushChildHashtable_HSD ввиду того, что первый аргумент именно SYSTEM_HASHTABLE, а вызов FlushChildHashtable(otherHashtable,какое-то число) игнорировался и оставался как есть. Как такое возможно реализовать через перехват функций (hook или дефайн, чтобы срабатывало избирательно при наличии четко определенного аргумента)?

Принятый ответ

define <FlushChildHashtable(SYSTEM_HASHTABLE,> = FlushChildHashtable_HSD(
функция FlushChildHashtable_HSD должна принимать лишь 1 параметр (инт)
либо можно так
define FlushChildHashtable(a, b) = {
    if(`a` == "SYSTEM_HASHTABLE"){
        FlushChildHashtable_HSD(b)
    }else{
        FlushChild##Hashtable(a, b)
    }
}
в результате второго варианта FlushChildHashtable(hash, 5) будет заменено на
if ( "hash" == "SYSTEM_HASHTABLE" ) then
	call FlushChildHashtable_HSD(5)
else
	call FlushChildHashtable(hash, 5)
endif
первый вариант предпочтительнее если подобных переменных немного
второй если необходимо передавать в функцию FlushChildHashtable_HSD не только инт но и сам хэштейбл
если же тебе нужно проверять не по названию а по значению то используй 2 вариант
только вместо строк сравнивай сами переменные
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
13
6 лет назад
Отредактирован Пушистый
0
Конкатенация (##) не вариант в данном случае.
3
28
6 лет назад
Отредактирован nvc123
3
define <FlushChildHashtable(SYSTEM_HASHTABLE,> = FlushChildHashtable_HSD(
функция FlushChildHashtable_HSD должна принимать лишь 1 параметр (инт)
либо можно так
define FlushChildHashtable(a, b) = {
    if(`a` == "SYSTEM_HASHTABLE"){
        FlushChildHashtable_HSD(b)
    }else{
        FlushChild##Hashtable(a, b)
    }
}
в результате второго варианта FlushChildHashtable(hash, 5) будет заменено на
if ( "hash" == "SYSTEM_HASHTABLE" ) then
	call FlushChildHashtable_HSD(5)
else
	call FlushChildHashtable(hash, 5)
endif
первый вариант предпочтительнее если подобных переменных немного
второй если необходимо передавать в функцию FlushChildHashtable_HSD не только инт но и сам хэштейбл
если же тебе нужно проверять не по названию а по значению то используй 2 вариант
только вместо строк сравнивай сами переменные
Принятый ответ
0
13
6 лет назад
0
nvc123, большое спасибо за идею. Добавил немного условной компиляции. В итоге получилось так:
define{
    <FuncA> (a,b) = {
        #if a == SYSTEM_HASHTABLE
            Func##A(a,b)
        #else
            Func##B(a,b)
        #endif
    }
}
Чтобы оставить комментарий, пожалуйста, войдите на сайт.