Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » adt_array.inc - разные типы данных в массиве (CreateArray)
adt_array.inc - разные типы данных в массиве
_wS_ Дата: Воскресенье, 21.10.2012, 18:56:49 | Сообщение # 1
Может хранить разные типы данных: массивы, строки, числа и тд.
Доступ к элементам осуществляется по индексам, как и в обычных массивах.

Handle:CreateArray(blocksize=1, startsize=0);

Code
Создает динамический глобальный массив ячеек (может расти и уменьшаться).
Работает медленнее, чем обычный массив.

blocksize - размер, количество ячеек для каждого элемента, как new xz[][размер] (нельзя изменить после создания)
startsize - индекс, позиция первого элемента (начало)

ClearArray(Handle:array);

Code
Удаляет все элементы, очищает массив - то же, что и ResizeArray(0)

Handle:CloneArray(Handle:array);

Code
Делает точную копию массива и возвращает новое Handle. Копия и оригинал - никак не связаны между собой.

bool:ResizeArray(Handle:array, newsize);

Code
Изменение размера массива. Если размер меньше текущего размера, то массив усекается.
newsize - количество элементов в массиве

GetArraySize(Handle:array) - возвращает количество элементов в массиве

PushArrayCell(Handle:array, any:value); - добавляет в конец массива значение (int, float, Handle, byte)
PushArrayString(Handle:array, const String:value[]); - строку
PushArrayArray(Handle:array, const any:values[], size=-1); - массив (size = кол-во элементов в массиве)

any:GetArrayCell(Handle:array, index, block=0, bool:asChar=false);

Code
Получить (int, float, Handle, byte)

block = блок для чтения (полезно, если его размер > 0)
asChar = читать как байт (необязательно)

GetArrayString(Handle:array, index, String:buffer[], maxlength);

Code
Получить строку. Возвращает количество символов в строке.

GetArrayArray(Handle:array, index, any:buffer[], size=-1); - получить массив

SetArrayCell(Handle:array, index, any:value, block=0, bool:asChar=false); - изменть значение в массиве
SetArrayString(Handle:array, index, const String:buffer[]); - изменить значение (строку) в массиве
SetArrayArray(Handle:array, index, const any:values[], size=-1); - массив

ShiftArrayUp(Handle:array, index);

Code
Сдвигает элементы вправо на 1 шаг, начиная с index.
В итоге размер массива увеличивается на 1 и текущее значение в позиции index становится неопределенным.

RemoveFromArray(Handle:array, index);

Code
Удаляет элемент из массива по индексу. Те индексы, которые правее, смещаются влево на 1 шаг.

SwapArrayItems(Handle:array, index1, index2); - меняет местами элементы

FindStringInArray(Handle:array, const String:item[]);

Code
Ищет строку в массиве и возвращает ее индекс-позицию, или -1, если не найдена

FindValueInArray(Handle:array, any:item)

Code
Работает как и FindStringInArray, только ищет (int, float, Handle, byte)

Код для теста:

Code
public OnPluginStart()
{
     new Handle:ar = CreateArray();
     PushArrayCell(ar, 5);
     PushArrayCell(ar, 12345.07);
     PushArrayString(ar, "music");

     PrintToServer("элементов в массиве: %d\n", GetArraySize(ar));

     PrintToServer("index 0 = %d", GetArrayCell(ar, 0));
     PrintToServer("index 1 = %f", Float:GetArrayCell(ar, 1));

     decl String:info[7]; GetArrayString(ar, 2, info, 7);
     PrintToServer("index 2 = %s", info); // строка обрезана, т.к. массив создан с маленьким размером
}
 
TEIN Дата: Воскресенье, 17.02.2013, 10:22:19 | Сообщение # 2
Сообщений: 550
Репутация: 73 [ +/- ]
Вопросы в файле

Прикрепления: ccwS.sp(1Kb)
 
_wS_ Дата: Воскресенье, 17.02.2013, 15:10:18 | Сообщение # 3
Вопросы писать нужно прямо здесь - поиск/помощь другим - не для тебя одного же, у кого-то такие же вопросы.

Цитата
new Handle:ar = CreateArray():
new String:str[][] = {"test_array", "test", "super_test"};
PushArrayString(ar, str);

Вопрос 1. Как добавить str в массив сразу, то есть не по отдельности?

PushArrayArray(ar, str, sizeof(str)); - так пробуй, или цикл:

PushArrayString(ar, str[0]);
PushArrayString(ar, str[1]);
PushArrayString(ar, str[N]);

Цитата
Вопрос 2. Как можно искать строки в массиве без учета регистра?

FindStringInArray - разве там есть что-то о регистре? Нет. Значит нельзя, ищет с учетом регистра.
 
panorama Дата: Пятница, 22.11.2013, 13:11:22 | Сообщение # 4
Сообщений: 206
Репутация: 2 [ +/- ]
Еще вопрос возможно ли взять последний символ из строки ?
Как например в php
Код

$kod = substr("Последняя буква а", -1);// Вернет "а"   

Также и в sourcespawn есть что-нибудь ?
 
_wS_ Дата: Пятница, 22.11.2013, 14:08:27 | Сообщение # 5
Так наверн

Код
new String:s[] = "abcd";
PrintToServer("%c", s[strlen(s)-1]);
 
panorama Дата: Пятница, 22.11.2013, 14:34:37 | Сообщение # 6
Сообщений: 206
Репутация: 2 [ +/- ]
Цитата _wS_ ()
Так наверн

Код
new String:s[] = "abcd";
PrintToServer("%c", s[strlen(s)-1]);

Спасибо !
 
Valeriks Дата: Пятница, 26.09.2014, 18:06:36 | Сообщение # 7
Сообщений: 102
Репутация: 3 [ +/- ]
Чего-то я вообще не втыкаю... допустим
Код
h_Chisla // есть переменная в которой меняются числа

new Handle:ar = CreateArray();
PushArrayCell(ar, h_Chisla); //  записываем наши числа из переменой h_Chisla в ar

а как дальше проверить есть ли там нужное нам число из всей кучи?

так
Код
new h_resultat = FindValueInArray(ar, h_Chisla);
if(h_resultat == h_Chisla) PrintToChatAll("%d", h_resultat);

Или может есть другие способы, гораздо проще?

п.с. Мне просто нужно чтобы все числа из переменной записывались, и при необходимости я мог бы проверить есть такое число. Если повтор, отбрасываем.. если нет, записываем и т.д.
 
Sallcom Дата: Пятница, 26.09.2014, 21:59:01 | Сообщение # 8
Сообщений: 206
Репутация: 31 [ +/- ]
Цитата Valeriks ()
п.с. Мне просто нужно чтобы все числа из переменной записывались, и при необходимости я мог бы проверить есть такое число. Если повтор, отбрасываем.. если нет, записываем и т.д.


Код

#include <sourcemod>    

public OnMapStart(){   
     new Handle:hArray = CreateArray(), iNumber = 123456887;

     while(iNumber > 0){
         if(FindValueInArray(hArray, iNumber%10) == -1)
             PushArrayCell(hArray, iNumber%10);
         iNumber /= 10;
     }
}  


Сообщение отредактировал Sallmap - Пятница, 26.09.2014, 23:46:13
 
Valeriks Дата: Суббота, 27.09.2014, 14:33:39 | Сообщение # 9
Сообщений: 102
Репутация: 3 [ +/- ]
Благодарю за разъяснения. Буду пробовать.
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » adt_array.inc - разные типы данных в массиве (CreateArray)
Страница 1 из 11
Поиск: