
Spis
Wstęp o tablicach dynamicznych↵
Tworzenie dynamicznych tablic↵
Dodawanie elementów do tablicy↵
Sprawdzanie zawartości komórek↵
Usuwanie zawartości komórek↵
Czyszczenie tablic↵
Czym się różnią dynamiczne tablice od zwyczajnych ?
Możesz ustalić wielkość tablicy w kodzie, jednak nawet jeżeli jej komórki zostaną wypełnione, tablica zostanie dynamicznie "powiększona"
Tablice te oczywiście są globalne.
Tworzenie dynamicznych tablic
Powrót do spisu↵
Tworzymy nowy obiekt
new Array:gArray;
Następnie go deklarujemy
Składnia funkcji ArrayCreate
ArrayCreate(cellsize = 1, reserved = 32)
cellsize - oznacza wielkość komórek pamięci.
Dla przechowywania obiektów typu string podajemy długość tekstu.
Dla obiektów int/float jest to jeden.
reserved - ile komórek pamięci ma zarezerwować, gdy podamy 5 będzie to 5. Czym się to różni od zwyczajnych tablic?
W tablicach dynamicznych ilość komórek jest przydzielana nawet w trakcie, gdy plugin już jest zainstalowany na serwerze, np gdy jej zabraknie.
public plugin_init() {
gArray = ArrayCreate(32, get_maxplayers());
}
Jak widzisz nasza tablica będzie przechowywać łańcuchy o maksymalnej długości 32.
Zarezerwowaliśmy ilość komórek równą maksymalnej ilości graczy, powiedzmy że będziemy
przechowywać imiona graczy.
Dodawanie elementów do tablicy
Powrót do spisu↵
Dla obiektów typu string
Mamy dwie opcje do wyboru
ArraySetString(Array:which, item, const input[]);
lub
ArrayPushString(Array:which, const input[]);
Czym się różnią te dwie funkcje?
- Pierwsza funkcja zmienia wartość tekstową wskazanego elementu tablicy.
- Druga natomiast dodaje do pierwszej wolnej komórki (Nie używanej, czyli zazwyczaj po ostatnim dodanym elemencie).
Dla obiektów typu int/float
Również mamy dwie opcję do wyboru
ArraySetCell(Array:which, item, any:input]);
lub
ArrayPushCell(Array:which, any:input);
Funkcje te działają tak samo jak dla obiektów string
Pierwsza funkcja zmienia zawartość danej komórki pamięci
Druga natomiast dodaje do pierwszej wolnej komórki (Nie używanej, czyli zazwyczaj po ostatnim dodanym elemencie).
Nasza pierwsza funkcja z użyciem tablic dynamicznych mogła by wyglądać tak
public dodajImieDoTablicy(id){
new sName[32];
get_user_name(id, sName, sizeof sName - 1);
if(ArraySize(gArray)){
new sTempName[32];
for(new i = 0 ; i < ArraySize(gArray) ; i ++){
ArrayGetString(gArray, i, sTempName, sizeof sTempName - 1);
if(equal(sTempName, sName)){
log_amx("Error! Juz istnieje element o tej samej zawartosci (tablica gArray)");
return;
}
}
}
ArraySetString(gArray, id, sName);
client_print(id, 3, "Twoje imie to : ^"%s^"", sName);
}
Funkcja zmieni(nie mylić z doda) wartość elementu tablicy równego id, jeżeli jeszcze nie ma takiej wartośći w danej tablicy.
Sprawdzanie zawartości komórek
Powrót do spisu↵
Jak już zauważyłeś punkt wyżej, żeby sprawdzić zawartość komórki która mieści obiekt typu string potrzebna jest nam pętla for
Tak samo jest w momencie gdy chcemy sprawdzić tablicę która mieści obiekty typu int
tylko że zamiast funkcją equal, sprawdzamy normalnym operatorem
==
for(new i = 0; i < ArraySize(gArray) ; i++){
if(id_gracza == ArrayGetCell(gArray, i)){
client_print(0, 3, "Zgadza sie!");
}
}
Usuwanie zawartości komórek
Powrót do spisu↵
Składnia funkcji
ArrayDeleteItem(Array:which, item)
which - uchwyt tablicy zwracany poprzez ArrayCreate
item - numer(index) elementu
Dla przykładu, jeżeli chcemy "wyczyścić" drugą komórkę, zrobimy to tak
ArrayDeleteItem(gArray, 2);
Czyszczenie tablic
Powrót do spisu↵
ArrayClear(Array:which)
Jak zwykle pisałem późno, więc pewnie coś pomyliłem. Opinie mile widziane
