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

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

Ответ
 
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Как передать локальный массив из 1 функции в другую?
Нужно передать локальный массив типа эффект из функции1, в которой этот эффект создается и которая вызывает другую функцию2, в которой этот эффект должен уничтожаться. Как реализовать?
Старый 02.02.2009, 01:18
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Никак xD Только пользоваться одним глобальным массивом.
Старый 02.02.2009, 02:39
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Vampirrr Он на то и локальный что используется только внутри функции!
Незя массив передать! Максимум мона делать отдельное действие для каждого элемента массива... Хотя чтото подсказывает мне что тебе это не подойдетЪ! )
Код:
function ffNew takes effect eff returns nothing
//нужные действия для элемента массива... например:
call DestroyEffect(eff)
endfunction

function ff takes nothing returns nothing
local effect array e
local integer i = 0
//твои действия и заполнение массива допустим 10 ячеек
    loop
        exitwhen i == 10
        set i = i+1
        call ffNew(e[i])        
        set e[i] = null
    endloop
endfunction


А ваще лучше юзать наверно Глобальный массив...
Старый 02.02.2009, 07:20
RazArt

offline
Опыт: 11,197
Активность:
Vampirrr, а что собстно нужно? Всмысле передать из чего во что
Старый 02.02.2009, 08:11
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
сделать массив глобальным.... или через кеш.... (да-да, ругайте.....)
Код:
function f takes string s,integer i returns nothing
    local integer j=0
    loop
    exitwhen j>i
        call DestroyEffect(get_object_eparam(null,s+I2S(j)))
        set j=j+1
    endloop
endfunction

...
call set_object_iparam(null,"effect0",H2I(effect[0]))
call set_object_iparam(null,"effect1",H2I(effect[1]))
call set_object_iparam(null,"effect2",H2I(effect[2]))
call f("effect",2)
Старый 02.02.2009, 10:29
Toadcop

offline
Опыт: 54,313
Активность:
лучше сделай 1 глобальный массив и сделай его 2ух мерным.
и передавать тебе надо будет тока индекс.

integer arr_2d_max=36 (разбиваем по 36 слотов)

set arr_data[index*arr_2d_max+offset] = x

index = типо id твоего 2Д массива ( =) )
offset = текущия ячейка в 2Д массиве т.е. от 0-35 или 1-36

тем самым если у нас размер = 36 то макс количество таких массивов будет
8190/36 = 227 что есть больше чем надо

ну очевидно если у тебя идут записи подряд то это всё оптимизируетса в вид

set locx=index*arr_2d_max
set arr_data[locx+offset] = x

но теперь стоит 2ая задачя это выделения id массива это делаетса тоже просто (и даже с защитой)
Код:
globals
   integer array arr_2d_stack
   boolean array arr_2d_stack_pos
   integer arr_2d_stack_max=0
   integer arr_2d_max=0
   integer arr_tmp=0
endglobals

function alloc_2d takes nothing returns integer
  if arr_2d_stack_max>0 then
    set arr_tmp=arr_2d_stack[arr_2d_stack_max]
    set arr_2d_stack_pos[arr_tmp]=true
    set arr_2d_stack_max=arr_2d_stack_max-1
    return set arr_tmp
  endif
    set arr_2d_max=arr_2d_max+1
    set arr_2d_stack_pos[arr_2d_max]=true
    return arr_2d_max
endfunction

function dealloc_2d takes integer id returns nothing
 if arr_2d_stack_pos[id] then
    set arr_2d_stack_pos[id]=false
    set arr_2d_stack_max=arr_2d_stack_max+1
    set arr_2d_stack[arr_2d_stack_max]=id
 endif
endfunction


alloc_2d = выделение id 2Д массива
dealloc_2d = иго удаление

это эта конструкция будет надёжно выделять тебе уникальные id
[+] замечание от NETRAT: орфография
Старый 02.02.2009, 14:34
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Vampirrr, еще можно использовать конструкцию вида
Код:
scope A
globals
integer array i
endglobals
//...
funtcion m takes nothing returns nothing
    local integer j=i[GetRandomInt(0,8191)]
endfunction
//...
funtcion m takes nothing returns nothing
    set i[GetRandomInt(0,8191)]=100500
endfunction
endscope
Старый 02.02.2009, 14:49
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
В продолжении темы: можно обернуть массив структурой, и обьявлять локальную переменную типа структуры.
Старый 02.02.2009, 15:15
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Garret, Toadcop, Hellfim, MF_Andreich, все бы хорошо, но у меня проблемы с глобальными, скопами и т.д. - у моего ГенПака аллергия на них (если вы мои предыдущие посты в этой теме не видели), он наотрез отказывается запускать карту если там есть хоть намек на globals или scope или что-то в этом роде(( я очень расстроен и не знаю как это исправить...

Gres, делал так, не подходит)
RazArt, как будет время, в аське объясню)
Старый 02.02.2009, 23:35
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Как я уже писал в другой твоей теме (ты про них забываешь, когда начинаешь новые?):
Цитата:
Сообщение от Van Damm
Проверь, включен ли JassHelper и не стоит ли "Disable vJass syntax" в меню JassHelper
Старый 03.02.2009, 00:08
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
Vampirrr мой способ не требует ген пака^^
Но это не значит, что он тру....
Старый 03.02.2009, 00:41
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Van Damm, как я уже писал в одной из предыдущих тем: ДжассХелпер включен, ДисейблВДжассСинтакс выключен =(

Garret, вот тоже начинаю думать про кеш..хотя хотелось бы все тки разобраться с текущими проблемами ГенПака..

Я тут подумал, а может такая фигня быть из-за того что у меня WEU+JNGP (типа WEU в GenPack'e)?
Старый 03.02.2009, 00:56
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Скачай чистый JNGP и не юзай WEU — кому он нужен?
Старый 03.02.2009, 02:01
Igores
НИИ 4А-Во! Кафедра Джасс.
offline
Опыт: 5,325
Активность:
Вампир, если эффектов не слишком много, то можешь попробовать заносить все элементы массива в одну глобальную переменную типа стринги, а потом во втором триггере по очереди их вытаскивать из строчки. С переводом в строку и позициями сам разберешься:-)
Старый 03.02.2009, 04:03
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Igores, ne viieet - 100 effectov i udalenie nacinaetsa posle togo, kak sozdastsa 21 effect, t.e. kogda sozdaetsa 21 effect 1 udalaietsa, 22 effect - udalaietsia 2 i t.d.
Старый 03.02.2009, 16:08
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Цитата:
Сообщение от Garret
сделать массив глобальным.... или через кеш.... (да-да, ругайте.....)
Код:
function f takes string s,integer i returns nothing
    local integer j=0
    loop
    exitwhen j>i
        call DestroyEffect(get_object_eparam(null,s+I2S(j)))
        set j=j+1
    endloop
endfunction

...
call set_object_iparam(null,"effect0",H2I(effect[0]))
call set_object_iparam(null,"effect1",H2I(effect[1]))
call set_object_iparam(null,"effect2",H2I(effect[2]))
call f("effect",2)


интерестно ты прекрепляешь к нечему
и кеш вообще не плох при использовании любых триггеров не использующих действия с малым периодом.
Старый 04.02.2009, 05:07
Ответ

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

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

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

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



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