Все вручную указывает количество массива через констант например
Работает
constant integer COUNT = 5
array memory[COUNT]
Решил сделать при init
integer count = 0
array memory[count]
когда при init указываю count +1 и так далее если параметры увеличивает но как видите ругает нельзя без константов
Есть ли другое решение?
Например val array = new Array<5> Другого не нашел решения

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

В структурах нужно обязательно указывать размер массива, так как для каждого поля создаётся массив (размер которого 8192). После на каждую инстанцию структуры отводится столько ячеек из 8192, сколько есть максимальный размер массива, который используется в структуре.
struct MyStruct
	integer array u[3]
	integer array k[5]
	integer array t[10]
endstruct
На каждый объект этой структуры будет отведено 10 ячеек из 8192, при этом ячейка 0 занята на "null" структуры, а 8191 не используется. То есть всего объектов мы можем единовременно иметь 8190 / 10 = 819. Если захотим создать больше, будут выводиться ошибки, если включён Debug Mode, а объект просто не будет создан: функция allocate вернёт 0.
А чтобы использовать константы в определении размера массивов, пишите так:
globals
 constant integer H = 500
 constant integer P = 2 * H
endglobals

struct MyStruct
	static constant integer U = 400
	integer array z[P]
endstruct
Тут нужно отметить факт, что константы должны быть заданы чётко. vJass не будет вычислять P при компиляции, потому размер массива z в структуре равен 2 - первому числу, которое встречается в выражении P. Компилятор vJass просто копирует значение переменной и генерирует Jass код. Отсюда вытекает, что вы не можете регулировать размер массива во время игры - он отводятся при компиляции и записан в коде.
А вообще, читайте это. Там всё рассказано очень хорошо (почти).
0
17
6 лет назад
0
нет ненужно указывать размер масива кроме двумерного и который в структуре,масив обьявляеться
int memory[]
void myfunc(){
memory[count]=3553
}
0
21
6 лет назад
Отредактирован scopterectus
0
Это же нужно специально для vJASS, чтобы использовать размер массива больше 8192. Если указать, например, 16384, то будут созданы два массива указанного типа, но ячейка массива с индексом больше 8191 уже будет храниться во втором массиве с индексом 0 и т. д.. А указывать меньше 8192 нет смысла, все равно будет создан обычный массив.
0
23
6 лет назад
0
не я при старта игры создаю типов через структур и структура имеет static счетчик даного типа после чего из него создаем массив нужный количество ячеек но ругает
а не вносить операция
0
21
6 лет назад
Отредактирован scopterectus
0
pro100master, ну укажите тогда максимально возможное большое число.
0
23
6 лет назад
Отредактирован pro100master
0
struct TypeState
	static count = 0
	method create ....
endstruct

struct DataUnit
	array integer states[TypeState.count]
endstruct
Вот код пример набросал
при старта игры создаю 2 тип state
а счетчик стал 2
потом при слздание DataUnit с привязка юнит создает нужное количесто статов
Вот набросок описал....
могу подругому сделать но не очень например array[(int(this) - 1) * TypeState.count + type] = 0
учитивая массив ограничено а хеш как обычно медленно работает
2
21
6 лет назад
Отредактирован scopterectus
2
globals
    integer array myVar [20999]
endglobals

function myFunc takes nothing returns nothing  
    set myVar[ 9999 ] = 1
endfunction
globals
	integer array s__myVar
	integer array s__2myVar
	integer array s__3myVar
endglobals

function sg__myVar_get takes integer i returns integer
    if(i<8191) then
        return s__myVar[i]
    elseif(i<16382) then
        return s__2myVar[i-8191]
    else
        return s__3myVar[i-16382]
    endif
endfunction

function sg__myVar_set takes integer i,integer v returns nothing
    if(i<8191) then
        set s__myVar[i]=v
    elseif(i<16382) then
        set s__2myVar[i-8191]=v
    else
        set s__3myVar[i-16382]=v
    endif
endfunction

function myFunc takes nothing returns nothing
    call sg__myVar_set(9999,1)
endfunction
Как видите, указывать размер нужно лишь в тех случая, когда размер массива больше 8192 или в структурах, в противном случае указывать размер массива не надо.

Конкретно в Вашем случае рекомендую использовать возможное максимальное число.

В vJASS тоже есть ограничения, максимальный размер массива в vJASS - 409550.
0
28
6 лет назад
Отредактирован PT153
0
В структурах нужно обязательно указывать размер массива, так как для каждого поля создаётся массив (размер которого 8192). После на каждую инстанцию структуры отводится столько ячеек из 8192, сколько есть максимальный размер массива, который используется в структуре.
struct MyStruct
	integer array u[3]
	integer array k[5]
	integer array t[10]
endstruct
На каждый объект этой структуры будет отведено 10 ячеек из 8192, при этом ячейка 0 занята на "null" структуры, а 8191 не используется. То есть всего объектов мы можем единовременно иметь 8190 / 10 = 819. Если захотим создать больше, будут выводиться ошибки, если включён Debug Mode, а объект просто не будет создан: функция allocate вернёт 0.
А чтобы использовать константы в определении размера массивов, пишите так:
globals
 constant integer H = 500
 constant integer P = 2 * H
endglobals

struct MyStruct
	static constant integer U = 400
	integer array z[P]
endstruct
Тут нужно отметить факт, что константы должны быть заданы чётко. vJass не будет вычислять P при компиляции, потому размер массива z в структуре равен 2 - первому числу, которое встречается в выражении P. Компилятор vJass просто копирует значение переменной и генерирует Jass код. Отсюда вытекает, что вы не можете регулировать размер массива во время игры - он отводятся при компиляции и записан в коде.
А вообще, читайте это. Там всё рассказано очень хорошо (почти).
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.