например
есть функция
function Myasnik takes nothing returns nothing
local timer t
тут действия тока integerы отличаются
я мог бы сделать так call Myasnik('A000',xxxx,xxxx, и.т.д)
но передача к функциям занимает время
я не давно начал изучать cjass и vjass
на 60% усвоил, помогло сжать коды, но функции похожие нет, мне на vjass struct и method не понятно, короче как сделать так чтоб
одинаковые функции вызывались коротким кодом, как переменные (разумеется только в редакторе NewGen, дальше ведь декомпиляция идет или вроде оптимизация конвертация кода на станд.jass)
struct
вроде люди тут хранять как переменную функции?
endstruct
set t=null
endfunction

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

Функшн поинтеров помимо типа code в жассе нет. Можно полагаться только на ExecuteFunc, куда аргументы передаются только глобалками, соответственно никакого тайпчекинга.
Использовать можно например так
struct mystruct
    static method mymethod takes nothing returns nothing
        call BJDebugMsg("this works")
    endmethod
endstruct

function myfunction takes nothing returns nothing
    call ExecuteFunc(mystruct.mymethod.name) //ExecuteFunc compatibility

    call OnAbilityCast('A000',mystruct.mymethod.name)
    //for example, caster system's OnAbilityCast, requires a function name
endfunction
Взято из vjass manual.
0
17
7 лет назад
Отредактирован ledoed
0
от структур и методов лутше отказаться так как создаются триггеры и функции к ним лутше имитировать структуру библиотеками и областями вроде кода больше писать но на самом деле при компиляции его будет меньше +структур в том что к ним можно обращаться из любого куска кода и к методам также из любого куска структуры в которой он находиться
0
17
7 лет назад
0
ledoed, структуру билбилотеками?
смысле макросы, они ведь не хранят функцию
0
17
7 лет назад
Отредактирован ledoed
0
макросы тут причём
смотри пример
library main{
	
	public void A(){
	
	
   }

}
//что ниже это клочек кода как вызвать эту функцию
void Activ(){
	main_A()
}

а хранить так информацию в структурах 
struct  A{

float x
float z

}
это аналогично
library B{
public float x[]
public float y[]
}


void Activ(){
в одном случае что там записано можно так получить структуры
float f=A.x
библеотекой
float g=B_x[какой те нужен интекс]
}
если непонел чем плохи структуры то смотри x и y это масивы на самом деле без статических переменных массив на полную нельзя будет использовать тоесть
struct  A{

static A a[]
float x
float z

}
и уже можно на полную использовать

void Activ(){
	
	A.a[нужный индекс].x=50.
	//или
	A h=A.create()
	h.a[12].x=50.
	h.destroy
}
0
30
7 лет назад
Отредактирован Clamp
0
от структур и методов лутше отказаться так как создаются триггеры и функции к ним
Эти триггеры на практике не используются и влияют на производительность кода только тем, что они объявляются как переменные, не более. Не надо распространять дезинформацию.

передача к функциям занимает время
Мы живём не в том веке, чтобы считать такты процессора. Можно ради своеобразного удовольствия вообще весь код развернуть в пару функций, но хоть как-нибудь заметного прироста производительности это не даст.

ledoed, описанный тобой способ становится тяжёлым в использовании, если в структуре есть хотя бы пять мемберов, и практически нереальным, если хотя бы один из них является массивом.

на самом деле без статических переменных массив на полную нельзя будет использовать тоесть
С чего бы это? На каждого мембера структуры в vJASS выделяется один массив, то есть если в структуре используется массив размером [5], то суммарное количество активных экземпляров структуры не должно превышать 8190/5, что, в принципе, всё равно более, чем достаточно.
0
29
7 лет назад
Отредактирован Doc
0
Функшн поинтеров помимо типа code в жассе нет. Можно полагаться только на ExecuteFunc, куда аргументы передаются только глобалками, соответственно никакого тайпчекинга.
Использовать можно например так
struct mystruct
    static method mymethod takes nothing returns nothing
        call BJDebugMsg("this works")
    endmethod
endstruct

function myfunction takes nothing returns nothing
    call ExecuteFunc(mystruct.mymethod.name) //ExecuteFunc compatibility

    call OnAbilityCast('A000',mystruct.mymethod.name)
    //for example, caster system's OnAbilityCast, requires a function name
endfunction
Взято из vjass manual.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.