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

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

Ответ
 
prog

offline
Опыт: 32,865
Активность:
ScorpioT1000, речь о ХЕШТАБЛИЦАХ, ключи в которых могут принимать любое значение из диапазона integer. Для использования с хештаблицами и была написана функция StringHash. Естественно что ей плевать на ограничения массивов.
Да, отрицательные значения StringHash в свое время здорово попортили мне нервы пока я разобрался в чем дело.
Теперь об этой системе. В массив пишутся и достаются значения по индексу, который возвращает S2Ix. Поскольку работа идет с массивом, то возвращаемые значения обязаны попадать в диапазон от 0 до 8191. StringHash возвращает значения на всем диапазоне целых чисел и в чистом виде не может быть использована.
Теперь о способах решения проблемы. StringHash работает всегда одинаково (по крайней мере под одной операционной системой), это общее требование к хеш-функциям и близы его, слава богу, выполнили. Таким образом достаточно разработать алгоритм упаковки значений хешей односимвольных строк в диапазон допустимых индексов массива.
Ну а предлагаю я автору задуматься над тем, нужно ли ему это лишнее действие со строками, если лоадкод гораздо лучше делается без этого, на основе численного айдишника предмета, а не равкода.
Старый 03.04.2012, 17:52
ELITE
АДмин
offline
Опыт: 4,078
Активность:
prog, ты видимо не внимательный очень, и вероятно не знаешь (или не хочешь) решения моей задачи

как выше было сказано, я картостроением занимаюсь 3 недели (как и жассом)
хотя опыт программирования и знания есть (паскаль, с++, с#)
делаю глобальный и популярный проект (точнее переделываю по нормальному)
ну это не имеет значения

да и получить, как я писали уже, число из РАВ кода можно банально I2S(I000) - это работает
НО как передать вместо I000 переменную - и работать перестает
я пробовал разные варианты - но результат одинаковый - не берет он из переменной данные
\\\
поэтому надо другое, более сложное, но действующее решение

тк для сейв системы я не встречал подходящих систем, которые могут уместить все нужные мне данные менее чем в 20 символов

а использование чистого ID - длина кода будет большой, и кодирование более ёмким
Старый 03.04.2012, 17:58
ScorpioT1000
Работаем
offline
Опыт: отключен
prog, ты кому это рассказываешь? мы обсуждаем сейчас реализацию хештейбла внутри вара.
Хештейбл имеет ограниченный размер, так же как и массив и он гораздо меньше 2^32, другое дело, либо он побитово делит инт, либо... побитово делит этот инт)
ScorpioT1000 добавил:
ELITE, я же уже кидал статью xgm.ru/p/wc3/about_int
инт представляется в виде 4-аски в компиляторе и редакторе, на самом деле это такое же число, и в игре есть только int, там вообще нету аски, при загрузке игры все 'A000' превращаются в числа, кстати, cjass делает это уже при компиляции карты
Старый 03.04.2012, 18:07
prog

offline
Опыт: 32,865
Активность:
ELITE, извини за ругательства, но ты совсем идиот или притворяешься? почему ты зацикливаешься на работе со строковым равкодом, если равкод это ЧИСЛО! использование строкового равкода имеет смысл только если тебе надо вводить ПОЛНЫЙ равкод с клавиатуры. Во всех других случаях гораздо эффективнее работать с числом.
  • GetItemTypeId возвращает целое число
  • 'I000' тоже целое число, то что оно похож на равкод, это только способ записи
  • ты умеешь сохранять целые числа, не так ли?
  • два символа, в зависимости от длины твоего алфавита, дадут тебе минимум около 1000 значений, у тебя больше 1000 предметов в карте?
  • чтобы из огромного ID предмета получить число от 0 до 1000, вычитаем из него ID первого нестандартного предмета, а именно 'I000'.
еще не дошло? набросать тебе карту-пример?
prog добавил:
ScorpioT1000, не знаю сохранилась ли в сети статья об устройстве варовских хештаблиц, но там несколько более сложная система, которая изначально использовалась, кстати, для реализации MPQ, а потом уже ее дали на растерзание мапмейкерам, практически без изменений.
  1. берется хеш строки (в случае с mpq это был путь к файлу внутри архива)
  2. внутренним алгоритмом хештаблицы этот хеш сжимается до диапазона, ограниченного размерами таблицы.
  3. для mpq в случае совпадения сжатых хешей была предусмотрена линейная структура каждой ячейки таблицы, поиск в которой производился уже перебором, а записи хранились последовательно.
  4. для хештаблиц в jass, скорее всего, каждая 2-хештаблица, это, на самом деле, куча 1-хештаблиц, сложенных в одну 1-хештаблицу. (цифрами я обозначил количество ключей хештаблицы)
Старый 03.04.2012, 18:28
ScorpioT1000
Работаем
offline
Опыт: отключен
там несколько более сложная система, которая изначально использовалась, кстати, для реализации MPQ, а потом уже ее дали на растерзание мапмейкерам, практически без изменений.
берется хеш строки (в случае с mpq это был путь к файлу внутри архива)
внутренним алгоритмом хештаблицы этот хеш сжимается до диапазона, ограниченного размерами таблицы.
для mpq в случае совпадения сжатых хешей была предусмотрена линейная структура каждой ячейки таблицы, поиск в которой производился уже перебором, а записи хранились последовательно.
для хештаблиц в jass, скорее всего, каждая 2-хештаблица, это, на самом деле, куча 1-хештаблиц, сложенных в одну 1-хештаблицу. (цифрами я обозначил количество ключей хештаблицы)
это и есть самая простая система называется "инт хеш + массив + лист", я про неё вверху и говорил, но стринг хеш возвращает большое число, никаких записей не может быть 2^31 чисто изза того, что тогда адресация даже была 2^32, а это и значит, что либо половина битов идет на место в этом "массиве", а половина идет на место в "листе", либо стринг хеш нам дан в "чистом виде", а вычисление положения в массиве идет уже дальше, доступ к чему нам не дали (или дали в варовских hashtable? я в них не копался). Во втором случае мы ничего не сможем сделать, если только реализовывать собственный хештейбл в варе.
Старый 03.04.2012, 18:51
ELITE
АДмин
offline
Опыт: 4,078
Активность:
prog, да, я не понимаю! какая разница если я беру переменную числовую
или беру S2I(строкавая переменная)

и почему если "I000" то работает, а если переменная - то не запускается
-------

да я просил пример, как заставить из строковой ПЕРЕМЕННОЙ, возращающей I000 сделать число!
Старый 03.04.2012, 18:59
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
ну вот вводим в чат строку I000, преобразуем и создаём по этому равкоду итем
так надо?
Прикрепленные файлы
Тип файла: w3x Item.w3x (10.7 Кбайт, 5 просмотров )
Старый 03.04.2012, 19:16
ScorpioT1000
Работаем
offline
Опыт: отключен
ELITE, для этого какраз та система выше, которая не работает. А он предлагает изменить логику и исключить возможность хранения этих представлений в строках.
Старый 03.04.2012, 19:17
prog

offline
Опыт: 32,865
Активность:
ELITE, да чтоб у тебя глаза из жопы повылазили! и пусть мне за это влепят варн.
забудь о строковых переменных!
Вот тебе пример того, как можно сократить id предмета до порядкового номера. И затем по этому порядковому номеру получить предмет. Уж сохранить короткий порядковый номер ты, надеюсь, сможешь без нашей помощи - как-то же ты опыт и золото сохраняешь.
Прикрепленные файлы
Тип файла: w3x itemcode.w3x (17.6 Кбайт, 2 просмотров )
[+] 3 пункта от ScorpioT1000: 2.1 (оскорбление) грубо, хоть и верно
Старый 03.04.2012, 19:38
ELITE
АДмин
offline
Опыт: 4,078
Активность:
16GB, спасибо, то что надо

работает ИДЕАЛЬНО

ScorpioT1000, бери его код для раскодирования, всё пашет отлично
Старый 03.04.2012, 19:56
ScorpioT1000
Работаем
offline
Опыт: отключен
ELITE, 16GB, залейте тогда с меткой Наработки в xgm.ru/p/wc3
Старый 03.04.2012, 20:13
prog

offline
Опыт: 32,865
Активность:
ScorpioT1000, ты хоть видел что он там выложил?) на наработку это не тянет и, если не ошибаюсь, есть в библиотеке функций.
function S2HId takes string str returns integer
local string ASCII = "0123456789*******ABCDEFGHIJKLMNOPQRSTUVWXYZ******abcdefghigklmnopqrstuvwxyz"
local string s1 = SubString(str,0,1)
local string s2 = SubString(str,1,2)
local string s3 = SubString(str,2,3)
local string s4 = SubString(str,3,4)
local string S
local integer i = 0
local integer i1 = 0
local integer i2 = 0
local integer i3 = 0
local integer i4 = 0
  loop
    set S = SubString(ASCII,i,i+1)
    if S==s1 then
      set i1 = 48 + i
    endif
    if S==s2 then
      set i2 = 48 + i
    endif
    if S==s3 then
      set i3 = 48 + i
    endif
    if S==s4 then
      set i4 = 48 + i
    endif
    exitwhen i==74
    set i = i + 1
  endloop
return 16777216*i1+65536*i2+256*i3+i4
endfunction
и все.
Старый 03.04.2012, 20:16
ScorpioT1000
Работаем
offline
Опыт: отключен
Норм, объединить с обратной системой хельфима)
Надо чтобы это всё не завалялось в развалинах форума.
Старый 03.04.2012, 21:03
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
*да у меня и прямая своя есть =)
Ща я тогда запилю и выложу. Сообщение не удалять, так надо.
Прикрепленные файлы
Тип файла: w3x Ascii_to_int.w3x (17.6 Кбайт, 4 просмотров )

Отредактировано Hellfim, 05.04.2012 в 00:19.
Старый 04.04.2012, 01:10
ScorpioT1000
Работаем
offline
Опыт: отключен
Гдеж ты шлялся всё это время?
Старый 04.04.2012, 02:43
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Я что-то долго пытался придумать классный пример, но ничего из того, что бы выглядело круто кроме GetObjectName и работало полностью правильно мне в голову не пришло -.- Запилил в пост выше.
Hellfim добавил:
Ну и код для самых ленивых
» code
function I2RC takes integer dividend returns string
    local integer residue=0
    local string raw_code=null
    loop
        exitwhen dividend==0
        set residue=ModuloInteger(dividend,256)
        set dividend=dividend/256
        set raw_code=SubString(udg_ASCII,residue-33,residue-32)+raw_code
    endloop
    return raw_code
endfunction

function get_char_ascii_index takes string char returns integer
    local integer index=2
    local integer length=StringLength(char)
    if length==1 then
        if char=="!" then
            return 33
        elseif char=="\"" then
            return 34
        endif
        loop
            exitwhen index>93
            if SubString(udg_ASCII,index,index+1)==char then
                return index+32
            endif
            set index=index+1
        endloop
    endif
    return -1
endfunction

function RC2I takes string raw_code returns integer
    local integer result=0
    local integer char_index=4
    local integer ascii_index=0
    local integer modificator=1
    if StringLength(raw_code)==4 then
        loop
            exitwhen char_index==0
            set ascii_index=get_char_ascii_index(SubString(raw_code,char_index-1,char_index))
            if ascii_index!=-1 then
                set result=result+ascii_index*modificator
                set modificator=modificator*256
            else
                set result=-1
                exitwhen true
            endif
            set char_index=char_index-1
        endloop
    else
        set result=-1
    endif
    return result
endfunction

//===========================================================================
function InitTrig_Lib takes nothing returns nothing
    set udg_ASCII=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrs​tuvwxyz{|}~"
endfunction

Отредактировано Hellfim, 05.04.2012 в 00:19.
Старый 04.04.2012, 03:21
ELITE
АДмин
offline
Опыт: 4,078
Активность:
set dividend/=256
что это за равенство со слешем?

ELITE добавил:
Hellfim, сталкнулся с такой проблеммой
после пересохранения карты, даже без изменений - она перестает работать

что я делаю не так??

редактор jassnewgenpack5d
настроен согласно инструкции на ХГМ

Отредактировано ELITE, 04.04.2012 в 09:39.
Старый 04.04.2012, 09:29
ScorpioT1000
Работаем
offline
Опыт: отключен
set dividend = dividend / 256
после пересохранения карты, даже без изменений - она перестает работать
что у вас за проблемы =\ значит не так сконфигурен жнгп
Старый 04.04.2012, 11:56
Diazzz
Допустимый статус
offline
Опыт: 13,797
Активность:
ScorpioT1000, нет, каждую вторую с нестандартными системами. Но я уже разобрался. Элиту рассказал. Проблема была в том, что карта сохранялась на рабочий стол. Видимо на рабочий стол не сохраняет, т.к. в пути русские буквы есть, или что-то с эитим связанное. Карта пересохранилась свободно, парвда со 2го раза
Старый 04.04.2012, 12:51
ScorpioT1000
Работаем
offline
Опыт: отключен
Шапку не читаете xgm.ru/forum/showthread.php?t=13118
Старый 04.04.2012, 12:53
Ответ

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

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

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

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



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