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

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

Закрытая тема
 
ScorpioN

offline
Опыт: 15,028
Активность:
Двумерный массив
Как реализовать 2 мерный массив? большого размера
a: array[1..128,1.128] of ...
и более большие?
Старый 08.10.2007, 12:53
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
a[(0..81)*100+(0..90)]
представь в таком виде и вписывай
Старый 08.10.2007, 13:34
ScorpioN

offline
Опыт: 15,028
Активность:
Цитата:
a[(0..81)*100+(0..90)]
представь в таком виде и вписывай

128*128=16384
лимит же 8190

ещё предложения есть?
Старый 08.10.2007, 14:53
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Цитата:
128*128=16384
лимит же 8190

81*100+90=8190 вот тебе и лимит
можно от начала ячейки отсчитывать
то есть элемент
a[80][35]
это будет a[8035]
a[3][94]=a[394]
главное не заюзай слева больше 81, а справа при 81 больше 90, а при остальных можешь до 99 юзать

другой вариант отсчитывать блоки от начала в jassnewgenpack можно такие создавать, почитай FaQ по нему, если адольф не расписал, то почитай ридми на английском
впринципе разницы почти нет
Старый 08.10.2007, 15:00
adic3x

offline
Опыт: 108,439
Активность:
про динамические массивы я неписал это точно, но структурами можно с помощью статических методов можно сделать хоть стомерный, причем каждый индекс будет до 8190...=)

ADOLF добавил:
хотя нет, хм... чет я запуталсо...

ADOLF добавил:
нет, всетаки можна, но щас леньки считать... короче код
Код:
struct x0
 integer i
endstruct

struct x1
 x0 x
endstruct

struct x2
 x1 x
endstruct

function Test takes nothing returns nothing
 local x2 x=16
 local x2 y=32

 set x.x=256
 set y.x=512

 set x.x.x=1024
 set y.x.x=2048
endfunction


ADOLF добавил:
хотя нет, помойму я всетаки напутал... чиорт!

ADOLF добавил:
а может и нед=) чет неварю седня=/
Старый 08.10.2007, 16:23
adic3x

offline
Опыт: 108,439
Активность:
так, если обращения редкие можно кешь юзать (хотя он зло -_-)
вобщем певая строка "name"+I2S(аргумент) вторая просто I2S(аргумент) ...
Старый 09.10.2007, 11:28
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Цитата:
Сообщение от ADOLF
так, если обращения редкие можно кешь юзать (хотя он зло -_-)

вобщем певая строка "name"+I2S(аргумент) вторая просто I2S(аргумент) ...

ну впринципе не совсем он зло, иногда он просто не заменим, но здесь можно сделать, как я писал, либо как в jass new gen pack:
Код:
type iar extends integer array[3]
type iar_ar extends iar array[3]

function test takes nothing returns arsample
 local iar_ar r=iar_ar.create()
 local integer i=0
 local integer j
     loop
         exitwhen i==iar_ar.size //holds size of the array type
         set r[i]=iar.create()
         set j=0
         loop
             exitwhen j==iar.size
             set r[i][j]=j*i
             set j=j+1
         endloop

         set i=i+1
     endloop
 return r
endfunction

пример описанный там, вроде максимум можно получить матрицу 90х91
Старый 09.10.2007, 11:42
adic3x

offline
Опыт: 108,439
Активность:
динам массивы - в основном для структур, что бы несокращать их размер массивом (да, в структурах возможны массивы ^_^). по сути таже разбивка, что ты писал в 2 и 4 посту...

ADOLF добавил:
+ по сути тот же вариант как и со структурами.
Старый 09.10.2007, 12:01
Harakternyk

offline
Опыт: 2,703
Активность:
В WEU (World Editor Unlimited) есть констант-функция неограниченного массива, который создётся на основе помещения в его индекс масива целочисленной глобальной переменной, индекс которой, благодаря указанной функции, являэтся почти неограниченным (допустимый период целочисленных значений в Jass составляет от -2147483647 до 2147483647). На основе примера этой функции, можно создать сколь-угодно "мерный" масив.

Код:

Цитата:
constant function HeapDescriptorArrayGet takes integer index returns integer

local integer arrayId = index / JASS_MAX_ARRAY_SIZE

local integer arrayIndex = index - index / JASS_MAX_ARRAY_SIZE * JASS_MAX_ARRAY_SIZE

if arrayId == 0 then

return udg_zz_heap_descriptor_array_0[arrayIndex]

endif

return 0xFFFFFFFF

endfunction
Старый 09.10.2007, 12:26
Toadcop

offline
Опыт: 54,313
Активность:
Harakternyk да мы все идиоты включетиленьно создателя унлимитеда (Mike) и PipeDream'a Vexorian и т.д. =)
в варе массивы это динамически расширяемывая структура они инциализируютьса по мере надобности (да массивы !) и представляют из себя хеш таблицу ^^ (да да) да когда по порядку записывать инфу в 8К слотов будет больше лагов чем если это сделать наоборот (начать с 8К) можете проверить ;) т.к. инциализировать таблицу он бцдет 1 раз =) а там постоянно будет иё расширять на степень 2 (ну при 128 256 512 и т.д.)

блинн ужос сотри =) я тебе напишу 8 массивов т.е. 65528 слотов =) тебе должно хватить...
Код:
globals
   real array X_cus_array00
   real array Y_cus_array00
   real array X_cus_array01
   real array Y_cus_array01
   real array X_cus_array02
   real array Y_cus_array02
   real array X_cus_array03
   real array Y_cus_array03
   real array X_cus_array04
   real array Y_cus_array04
   real array X_cus_array05
   real array Y_cus_array05
   real array X_cus_array06
   real array Y_cus_array06
   real array X_cus_array07
   real array Y_cus_array07

   real X_output=0
   real Y_output=0
endglobals


function SetBX takes integer i,real x,real y returns nothing
// use binary tree to set data
   if  i<32761 then
     if i<16381 then
       if i<8191 then
         set X_cus_array00[i]=x
         set Y_cus_array00[i]=y
       else
         set X_cus_array01[i-8191]=x
         set Y_cus_array01[i-8191]=y
       endif
     else
       if i<24571 then
         set X_cus_array02[i-16381]=x
         set Y_cus_array02[i-16381]=y
       else
         set X_cus_array03[i-24571]=x
         set Y_cus_array03[i-24571]=y
       endif
     endif
   else
     if i<49141 then
       if i<40951 then
         set X_cus_array04[i-32761]=x
         set Y_cus_array04[i-32761]=y
       else
         set X_cus_array05[i-40951]=x
         set Y_cus_array05[i-40951]=y
       endif
     else
       if i<57331 then
         set X_cus_array06[i-49141]=x
         set Y_cus_array06[i-49141]=y
       else
         set X_cus_array07[i-57331]=x
         set Y_cus_array07[i-57331]=y
       endif
     endif
   endif
endfunction

function GetBX takes integer i returns nothing // will return data into  X_output,Y_output
// use binary tree to set data
   if  i<32761 then
     if i<16381 then
       if i<8191 then
         set X_output=X_cus_array00[i]
         set Y_output=Y_cus_array00[i]
       else
         set X_output=X_cus_array01[i-8191]
         set Y_output=Y_cus_array01[i-8191]
       endif
     else
       if i<24571 then
         set X_output=X_cus_array02[i-16381]
         set Y_output=Y_cus_array02[i-16381]
       else
         set X_output=X_cus_array03[i-24571]
         set Y_output=Y_cus_array03[i-24571]
       endif
     endif
   else
     if i<49141 then
       if i<40951 then
         set X_output=X_cus_array04[i-32761]
         set Y_output=Y_cus_array04[i-32761]
       else
         set X_output=X_cus_array05[i-40951]
         set Y_output=Y_cus_array05[i-40951]
       endif
     else
       if i<57331 then
         set X_output=X_cus_array06[i-49141]
         set Y_output=Y_cus_array06[i-49141]
       else
         set X_output=X_cus_array07[i-57331]
         set Y_output=Y_cus_array07[i-57331]
       endif
     endif
   endif
endfunction


ну и всё тру аццовский метод =) круче нету...
так теперь... i = вся зависит от тебя =)

напр есть 128*128 = 16384 ну а i будет выполнятьса в виде.

set i=row*128+column =) вот и всё ;) надеюсь ты разберёшся.

бтв вот почему джасс рулит ! здесь решают креативные люди а не тупо программо задроты =)

Отредактировано Toadcop, 09.10.2007 в 13:35.
Старый 09.10.2007, 13:22
adic3x

offline
Опыт: 108,439
Активность:
добавлю только что тс аттачит два значения, а насколько я понимаю афтору хватит и одного=)
насчет функции характерника... ну принцип остатка от деления, как в ХАТ, только никаких проверок на стак. хотя нет... вообще непонял ниче=)
Старый 09.10.2007, 14:44
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
constant function
как может быть функция константная если в ней есть локалки О_о как я помню это уже динам функция =) параметры тока могут быть "константными" + это не играет роли... только константные перемменые имеют смысл т.к. после оптимизации оптимизатором Векса то они заменяет переменую на прямое значение == больше производительности ^^

я показал пример что там можно структуры заполнять ;) 1 движением руки =) можно вообще зделать функцию без параметров а параметры тоже передавать через переменные или что то вроде =) короче всё зависит от задачи...
Старый 09.10.2007, 15:52
Harakternyk

offline
Опыт: 2,703
Активность:
Toadcop , спасибо (правда, спасибо) - за алгоритм реализации большого двухменого массива и того, чем массив в Варе является, а также оптимального способа помещения значений его индекса - не знал, ибо программированием занимаюсь недавно и нерегулярно (не всегда есть время ). Что же касается особенностей отнесения функций к констатным, а также того, что задача может определять конкретную форму функций, то я это уже знал.
Функцию, которую я выложил в этой теме я выложил необдуманно - она годится только для "неограниченных" индексов массивов (я тестировал - вроде всё нормально, хотя мог чего-то и не учесть...) и разработана она не мной, а авторами WEU, о чём я уже говорил непрямо.
P.S. Считаю, что этот пост полезен тем, что подтверждает правильность (по отношению к тому, что выкладывал я) твоего алгоритма. Ещё раз спасибо
Старый 12.12.2007, 02:13
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
А двумерный Глобальный массив как сделать?? Что то в гуи у меня это не получилось... (вроде руки не очень кривые:) И вообще стоит ли делать один многоразрядный глобальный массив , а не кучу одномерных но также глобальных (при временами ну очень частому обращению к массиву)?
Старый 11.11.2008, 12:30
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
А двумерный Глобальный массив как сделать??

простыми средствами никак

Цитата:
один многоразрядный глобальный массив

и что ты понимаешь под многоразрядными массивами?
Старый 11.11.2008, 15:00
J
expert
offline
Опыт: 48,447
Активность:
он наверно хотел сказать многомерными
Старый 11.11.2008, 15:04
Elemental
Element Of Water
offline
Опыт: 1,072
Активность:
Ну ошибся чуть чуть:) а на jass как?
Старый 11.11.2008, 15:19
Закрытая тема

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

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

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

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



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