Możemy ich użyć zawsze, gdyż są składnikiem biblioteki <amxmodx>, bez której ciężko napisać jakikolwiek plugin.
1. Co to?
Tablica to zbiór danych tego samego typu. Mamy do nich dostęp przez nazwę tablicy i indeks pola. Jednak zwykłe tablice muszą mieć z góry założoną wielkość.
new g_CechaGracza[33]; //wielkość:33 new g_kolory[][]={"white","red"}; //wielkość:2x6
Dynamiczne tablice pozwalają na przechowywanie nieokreślonej (ale skończonej ) ilości danych. Dzięki temu wykorzystujemy dokładnie tyle miejsca w pamięci ile akurat potrzeba.
2. Tworzenie
Musimy zadeklarować tablicę.
new Array:MojaTablica;Jeśli jest globalna (dostępna z każdego miejsca w pluginie) nie możemy od razu jej stworzyć. W innym przypadku można zrobić to od razu przy deklaracji.
new Array:g_MojaTablica; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) g_MojaTablica=ArrayCreate(); }Interesuje nas ta linijka:
g_MojaTablica=ArrayCreate();
ArrayCreate(cellsize=1, reserved=32)
cellsize rozmiar komórki; dla liczby całkowitej rozmiar=1 (wartość domyślna),
jeśli elementy tablicy mają być zwykłą tablicą (czyli też stringiem) podajemy tu rozmiar tej tablicy[/list]reserved ilość tworzonych podczas inicjacji tablicy komórek;domyślnie rezerwowane są 32 pola
nie jest to maksymalna ilość danych, lecz po stworzeniu tablicy będzie miała ona na starcie tyle indeksów[/list]
3. Zapis danych
Cóż nam po pustej tablicy - pora uzupełnić ją danymi. Podstawową operacją jest Push. Polega ona na dodaniu nowego elementu na końcu tablicy. Nawet jeśli zarezerwowaliśmy 32 komórki pierwsze Push umieści dane w indeksie 0, drugie w 1 itd.
Dla tablicy o cellsize=1 używamy:
ArrayPushCell(Array:which, any:input);
Array:which docelowa tablica, podajemy tu nazwę naszej zmiennej typu Array:[/list]any:input dane, które umieszczone zostaną w tablicy; zmienna może być dowolnego typu
np. liczbą całkowitą/rzeczywistą, znakiem czy inną tablicą Array:[/list]
ArrayPushCell(g_MojaTablica,5);Jeśli jest to pierwszy Push g_MojaTablica w polu o indeksie 0 będzie zawierała liczbę 5.
Dla tablicy o cellsize>1 używamy:
ArrayPushString(Array:which, const input[]);
ArrayPushArray(Array:which, const any:input[]);
Array:which docelowa tablica, podajemy tu nazwę naszej zmiennej typu Array:[/list]input[] tutaj podajemy tablicę, która umieszczona zostanie w tablicy,
w przypadku PushString tablica musi być typu całkowitego (znaki) i powinna być zakończona bajtem zerowym '/0'
PushArray używamy przy pozostałych tablicach[/list]
Aby edytować wybrane pole tablicy używamy funkcji (zależnie od typu):
ArraySetCell(Array:which, item, any:input);
ArraySetString(Array:which, item, const input[]);
ArraySetArray(Array:which, item, const any:input[]);
Argumenty są prawie te same, funkcje działają analogicznie do Push, więc nie będę się rozpisywał.
Pojawił się nowy parametr:
item edytowany indeks; liczba porządkowa określająca położenie danych w tablicy[/list]jeśli chcemy zmienić piątkę z poprzedniego przykładu napiszemy tak:
ArraySetCell(g_MojaTablica,0,6);Teraz g_MojaTablica w polu o indeksie 0 będzie zawierała liczbę 6.
4. Odczyt danych
Zależnie od rodzaju przechowywanych danych używamy jednej z trzech funkcji:
ArrayGetCell(Array:which, item);
zwraca wartość z pola o indeksie item z tablicy which
ArrayGetString(Array:which, item, output[], size);
wypełnia (przez referencję ) tablicę output do maks. długości size tekstem z pola o indeksie item z tablicy dynamicznej which
ArrayGetArray(Array:which, item, any:output[]);
wypełnia (przez referencję ) tablicę output wartościami tablicy z pola o indeksie item z tablicy dynamicznej which
5. Przydatne funkcje
ArrayClear(Array:which);
czyści dynamiczną tablicę dynamiczną whichArraySize(Array:which);
zwraca ilość elementów tablicy dynamicznej which; ostatni indeks w g_MojaTablica (jeśli nie jest pusta) to (ArraySize(g_MojaTablica)-1)
6. Więcej?
Pełniejsza lista funkcji będzie pewnie w dokumentacji amxx.pl
Póki co radzę wpisać w AMXX-Studio gdzieś w kodzie słowo "Array" i jeśli korzystasz z podpowiedzi pokaże się przesuwana lista wszystkich funkcji z cellarray.inc
Powodzenia przy pisaniu pluginów korzystających z dynamicznych tablic!