Нужно сохранить массив переменных в хэш таблицу. Можно ли? И если нет, то как можно выкрутится?

avuremybe, в хэштейбле данные хранятся по 2 ключам
т.е. хэштейбл это двумерный массив (массив в массиве)
1 ключ используй как id юнита по которому сохраняешь данные
2 ключ это индекс твоего массива
зачем чтото придумывать
всеравно готов поспорить что ты используешь только 1 ключ а для второго какая нибудь константа
`
ОЖИДАНИЕ РЕКЛАМЫ...
20
Массивы в вц3 имеют размер в 8192 элемента. Можно ли сохранить переменную в хэштейбл? Да. А 8192 раза? Тоже да!
26
Diaboliko, ты предлагаешь сохранять каждую переменную из массива отдельно? у меня идея была в том, чтобы по одному ключу система могла достать нужный набор данных для любого юнита...
20
То есть? Как реализована ваша БД? Я не вижу проблемы
17
структуры используй
struct mystruct{

static mystruct My[]
float x
float y

}
пример
void MyFunc{

mystruct.My[0].x=GetUnitX(GetTriggerUnit())
mystruct.My[0].y=GetUnitY(GetTriggerUnit())
}
вроде так, давно структуры не использую + этого метода что можно делать так
и вытаскивать с любого места кода
void SetFunc(unit u,mystruct M){
	SetUnitX(u,M.My[0].x)
	SetUnitX(u,M.My[0].x)
}
или алтернативный вариант
library L{
	public float x[]
		public float y[]
}
сохранять так
void func(unit u){
	
	L_x[0]=GetUnitX(u)
		L_y[0]=GetUnitY(u)
}
но библеотека должна быть выше всего кода который её использует
32
Структруы Vjass в помощь, так же есть мемхак...
26
Diaboliko, я вяжу информацию к юниту через хэш.
Системы по универсальному ключу берут у обрабатываемого юнита нужную им информацию.
ledoed, я пока только jass изучаю. Где можно прочесть как это реализовано?
28
avuremybe, в хэштейбле данные хранятся по 2 ключам
т.е. хэштейбл это двумерный массив (массив в массиве)
1 ключ используй как id юнита по которому сохраняешь данные
2 ключ это индекс твоего массива
зачем чтото придумывать
всеравно готов поспорить что ты используешь только 1 ключ а для второго какая нибудь константа
Принятый ответ
20
А я использую параллельные массивы, каждый из которых по своей сути является столбцом БД, а номер строки хранится в UnitUserData. Вполне комфортно себя чувствую.
26
nvc123, второй ключ - это там где прописывается StringHash() либо указывается значение?
Я сейчас на работе, проверить на практике возможности не имею, но на сколько я понял мне нужно действовать следующим образом:
function MyFunc takes unit u returns nothing
local integer h = GetHandleId(u)
local integer i = 1
local integer array a
local integer array b
loop
exitwhen i>10
set a[i] = i
set b[i] = i
call SaveInteger(udg_ht, h, StringHash("a"+I2S(i)))
call SaveInteger(udg_ht, h, StringHash("b"+I2S(i)))
set i = i+1
endloop
endfunction
Diaboliko, грубо говоря, у тебя под каждого юнита отведена одна строка в твоем двумерном массиве?
Я о таком думал, но мне это не подойдет. У меня для каждого юнита хранится разное количество информации.
22
а не проше ли делать структура и хранить его как номер индификатора так быстрее....
integer(this) в хеш выташить проше через this(номер хеша)
struct Name
array a
array b
endstruct
Сохранить call SaveInteger(хеш юнитов, индификатор юнит, integer(Name))
Лучше через this с помошью оператор []
либо делать величина размера Например 0-9 это 1 массива
10-19 это 2 массив
call SaveInteger(udg_ht, h, i, StringHash("a"+I2S(i)))
call SaveInteger(udg_ht, h, i * 10, StringHash("b"+I2S(i)))
Вот так много варианта можно
28
avuremybe, второй это тот который не первый
функция SaveInteger принимает 4 параметра
хэш таблица
два ключа
сохраняемое значение
вот пример сохранения массива в таблицу
int myArray[]; // массив
int myArraySize; // количество элементов в массиве
function saveMyArray takes unit u returns nothing
	local integer h = GetHandleId(u)
	local integer i = 1
	call SaveInteger(udg_ht, h, 0, myArraySize) // сохраняем количество элементов
	loop
		exitwhen i>myArraySize
		call SaveInteger(udg_ht, h, i, myArray[i-1]) // сохраняем элемент из ячейки i-1
		set i = i+1
	endloop
endfunction

// узнать размер сохранённого массива
function getMyArraySize takes unit u returns int
	return LoadInteger(udg_ht, GetHandleId(u), 0)
endfunction

// получить элемент из сохранённого массива
function getMyElement takes unit u, integer index returns int
	return LoadInteger(udg_ht, GetHandleId(u), index+1)
endfunction
но лично я бы определил максимально возможное количество элементов у юнита и сделал через структуру вообще не используя хэш таблицу
define MAX_SIZE=10; // максимальное количество элементов у юнита

struct DataForUnit{
	int elements[MAX_SIZE];
	int size;
	
	// создание массива
	static thistype new(unit u){
		thistype this=thistype.create();
		size=0;
		attachToUnit(u, this); // атач структуры к юниту, способов сделать атач много, выбирай любой
		return this;
	}
	
	// добавление элемента
	thistype add(int element){
		elements[size]=element;
		size++;
		return this;
	}
	
	// получение элемента по индексу
	int get(int i){
		return elements[i];
	}
}

// как сохранять
unit u; // твой юнит
DataForUnit.new(u).add(1).add(2).add(3).add(4).add(5); // создаём массив для твоего юнита и добавляем к нему числа от 1 до 5

// как извлекать
unit u; // твой юнит
DataForUnit data=getAttachStruct(u); // получение структуры из юнита, зависит от способа атача
BJD(I2S(data.get(2))); // выводит на экран элемент под номером 2 т.е. число 3
если макс число не известно то можно через списки сделать
Чтобы оставить комментарий, пожалуйста, войдите на сайт.