[SourcePawn] Урок 10 - ADT Trie (StringMap)

T

Tolyan

Подскажите а можно (пользуясь enum и StringMap) сделать как-бы 3 мерный динамический массив..

Т.е

"kay_1" - {{1,2,3},{4,5,6},{7,8,9}}
.
.
.
"kay_N" - {{1,2,3},{4,5,6},{7,8,9}}
--- Добавлено позже ---
Или с помощью какого инструмента посоветуете это сделать.. ?
 
Последнее редактирование модератором:

R1KO

fuck society
Сообщения
9,460
Реакции
7,799
  • Команда форума
  • #22
@Tolyan, StringMap подойдет.
PHP:
trie.Set/GetArray("key", {1, 2, 3}, 3);
 
T

Tolyan

trie.Set/GetArray("key", {{1, 2, 3},{1, 2, 3},{1, 2, 3}}, 3);

может вы имели введу так?)) 3 мерный же нужен))
--- Добавлено позже ---
Скажите а что быстрее ExplodeString или trie.Set/GetArray("key", {{1, 2, 3},{1, 2, 3},{1, 2, 3}}, 3); ?

может записать туда строку и разбирать ее (нужно будет часто) или лучше в массивах? что быстрей выполняется?
--- Добавлено позже ---
@Tolyan, StringMap подойдет.
PHP:
trie.Set/GetArray("key", {1, 2, 3}, 3);
Подскажите пожалуйста, придумал одну идею но никак не могу ее реализовать.

PHP:
StringMap SkinValueStrMap;

    enum visual
    {
        Handle hat,
        Handle mask
    }

    enum type
    {
        Handle pos,
        Handle ang
    }

    enum value
    {
        float x,
        float y,
        float z
    }[PHP]

Суть в том чтоб с помощью StringMap хранить нужные мне параметры в нужно месте.
"key_1" - {hat,mask}
hat - {pos,ang}
pos  - {0.0, 0.0, 0.0}

Не могу понять как получить так значения или записать его в StringMap возможно идея глупа в плане читабельности кода, но удобная в моем случае да и для саморазвития интересно.

Помогите пожалуйста примером записи и получения, большое спасибо.
--- Добавлено позже ---
enum value
{
float:x, - ругается на эту строку, делаю без float то ругается на строку ниже
float:y,
float:z
}

any[] arrayvalue = new any[value];
arrayvalue[x] = 1.0; - на эту строку
arrayvalue[y] = 2.0;
arrayvalue[y] = 3.0;
 
Последнее редактирование модератором:

R1KO

fuck society
Сообщения
9,460
Реакции
7,799
  • Команда форума
  • #24
@Tolyan, использовать разные ключи для разных массивов
 

Exle

Участник
Сообщения
190
Реакции
216
@Tolyan
PHP:
enum value
{
    Float:x,
    Float:y,
    Float:z
};
или
PHP:
#define x 0
#define y 1
#define z 2
#define xyz 3

float value[xyz];
value[x] = 0.0;
value[y] = 0.0;
value[z] = 0.0;
 
Последнее редактирование:
T

Tolyan

PHP:
StringMap SkinValueStrMap;

enum sv
{
    float:pos[3],
    float:ang[3]
}

 {
    SkinValueStrMap = new StringMap();
    any[] array = new any[sv];
   
    array[pos] = {0.0,0.0,50.0};
    array[ang] = {0.0,0.0,0.0};
   
    SkinValueStrMap.SetArray("xxx", array, sv); // Записали
}
{
    any[] array = new any[sv];
    SkinValueStrMap.GetArray("xxx", array, sv); //Получили
   
    float f_temp[3];
    f_temp = array[pos];
    PrintToChatAll("f_temp > %0.1f %0.1f %0.1f", f_temp[0],f_temp[1],f_temp[2]); // f_temp[2] = 0.0 а должен 50.0  - почему?
}
 

R1KO

fuck society
Сообщения
9,460
Реакции
7,799
  • Команда форума
  • #27
@Tolyan,
upload_2017-12-27_12-23-22.png
здесь возможно должно быть 6
 

Exle

Участник
Сообщения
190
Реакции
216
@Tolyan
в enum
PHP:
enum
{
    0,            // int
    bool:1,       // bool
    Float:2,      // float, а ты пишешь float: , компилятор по идее ругаться должен
    String:3[],   // char[]
    Handle:4,     // Handle
};
 

Banana

Участник
Сообщения
909
Реакции
114
@Tolyan, можно сделать IntToString

PHP:
public void OnPluginStart()
{
    StringMap hTrie = new StringMap();

    hTrie.SetString("key 1", "dfsknj234");
    hTrie.SetString("key 2", "d2knj234");
    hTrie.SetString("key 3", "564sdf");

    hTrie.SetValue("int_ket", 1930);

    hTrie.SetArray("arr_key", {4, 6, 2}, 3);

    hTrie.Remove("int_ket");
    hTrie.Remove("arr_key");

    hTrie.SetString("key 5", "dffsk234dafnj234");
    hTrie.SetString("key 8", "d2kn324123j234");
    hTrie.SetString("key 9", "fghds");

    StringMapSnapshot hTrieSnapshot = hTrie.Snapshot();
    int i, iSize;
    char szBuffer[64], szKey[32];
    iSize = hTrieSnapshot.Length;
    PrintToServer("Size(hTrieSnapshot) = %i", iSize);
    for(i = 0; i < iSize; ++i)
    {
        hTrieSnapshot.GetKey(i, szKey, sizeof(szKey));
        PrintToServer("hTrieSnapshot[%i] = '%s'", i, szKey);
        hTrie.GetString(szKey, szBuffer, sizeof(szBuffer));
        PrintToServer("hTrie[%s] = '%s'", szKey, szBuffer);
    }
    delete hTrieSnapshot; // разве без этого не будет утечки памяти?
    delete hTrie;
}

delete hTrieSnapshot; // разве без этого не будет утечки памяти?

В вашем примере этого нет, но я думаю стоит добавить? если я не прав поправьте меня пожалуйста.
StringMapSnapshot · adt_trie · SourceMod Scripting API Reference - согласно описания нужно делать delete..
Сообщения автоматически склеены:

PS. Да ладно, еще Фениксу с wS осталось поставить лайк и можно будет на авку)))))
 
Последнее редактирование:

GT34M

Участник
Сообщения
79
Реакции
48
Как я понял StringMap.GetKey() убрали, как теперь можно циклом проходиться по нему?
А ещё ты забыл .Length заменить на .Size в примерах :) @R1KO
 

danil253467

💘Italo-Disco One Love💘
Сообщения
112
Реакции
68
Как я понял StringMap.GetKey() убрали, как теперь можно циклом проходиться по нему?
А ещё ты забыл .Length заменить на .Size в примерах :) @R1KO
Обьявляешь следующее:
C++:
StringMapSnapshot hStringMapSnapshot = hStringMap.Snapshot();
// Где hStringMap - наш исходный StringMap

И далее уже в цикле используешь это:
C++:
hStringMapSnapshot.GetKey(int index, char[] buffer, int maxlen)

Если в дальнейшем Snapshot более не пригодится, его нужно обязательно удалить:
C++:
delete hStringMapSnapshot;
 

GT34M

Участник
Сообщения
79
Реакции
48
Извиняюсь, что-то я вообще не увидел этого, там ведь так и написано было 🤣
Обьявляешь следующее:
C++:
StringMapSnapshot hStringMapSnapshot = hStringMap.Snapshot();
// Где hStringMap - наш исходный StringMap

И далее уже в цикле используешь это:
C++:
hStringMapSnapshot.GetKey(int index, char[] buffer, int maxlen)

Если в дальнейшем Snapshot более не пригодится, его нужно обязательно удалить:
C++:
delete hStringMapSnapshot;
 
Сверху Снизу