Tablice dynamiczne dla początkujących
diablix
08.09.2011
Już jest taki temat ale postanowiłem że opiszę to prościej, tak żeby początkujący mogli to szybciej zrozumieć
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
Następnie go deklarujemy
Składnia funkcji ArrayCreate
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.
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
lub
Czym się różnią te dwie funkcje?
Dla obiektów typu int/float
Również mamy dwie opcję do wyboru
lub
Funkcje te działają tak samo jak dla obiektów string
Nasza pierwsza funkcja z użyciem tablic dynamicznych mogła by wyglądać tak
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
Usuwanie zawartości komórek
Powrót do spisu↵
Składnia funkcji
which - uchwyt tablicy zwracany poprzez ArrayCreate
item - numer(index) elementu
Dla przykładu, jeżeli chcemy "wyczyścić" drugą komórkę, zrobimy to tak
Czyszczenie tablic
Powrót do spisu↵
Jak zwykle pisałem późno, więc pewnie coś pomyliłem. Opinie mile widziane
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
Muzzi
08.09.2011
Dobrze, czysto a zarazem dokładnie
W porównaniu do tego <klik> tutaj wszystko opisane tak aby każdy nawet ten 'zielony' zrozumiał.
Użytkownik Muzzi edytował ten post 08.09.2011 23:06
W porównaniu do tego <klik> tutaj wszystko opisane tak aby każdy nawet ten 'zielony' zrozumiał.
Użytkownik Muzzi edytował ten post 08.09.2011 23:06
mierzwi 09.09.2011
no dla takich zielonych to dobrze wytłumaczone, ale mógłbyś jakieś lepsze zastosowanie podać tego niż dodawanie nicków do tablicy...
diablix
09.09.2011
Przecież reszta przykładów to wystarczy sama wyobraźnia i pomysły.. Ja tylko zastosowanie funkcji wytłumaczyłem
DarkGL
09.09.2011
bo programowania nie zaczyna się od tablic dynamicznych trzeba mieć już doświadczenie w programowaniu żeby zrozumieć tamten tutorial , dynamiczne są wolniejsze od standardowych ale w niektórych przypadkach warto ich użyć można z nich zrobić np. stos z c++
G[o]Q
09.09.2011
stosu jako takiego nie zrobisz bo nie masz tutaj wskazników tablice dynamiczne to bardziej cos jak klasa vector chociaz nie do konca
R3X
09.09.2011
Array: to uniwersalny typ służący za tablicę (wektor), listę, kolejkę czy nawet stos. Ten ostatni można przecież zaimplementować bez alokacji na zwykłej tablicy nawet w Pawnie. Połączenie Array: i Trie: lub nVault daje funkcjonalność zbliżoną do STLa z C++
Wskaźniki w Pawnie są, jeśli zgodzimy się nazwać wskaźnikiem zmienną przechowujące adres innej zmiennej. Tylko brak alokacji ogranicza ich zastosowanie.
Wskaźniki w Pawnie są, jeśli zgodzimy się nazwać wskaźnikiem zmienną przechowujące adres innej zmiennej. Tylko brak alokacji ogranicza ich zastosowanie.
G[o]Q
10.09.2011
R3X pisząc stos mialem na mysli cos co dziala jak stos czyli ze elementy dodajemy tylko na samej jego górze i tylko z góry mozemy je zdjąć to samo kolejka dodajemy na koncu a zabieramy z początku owszem jesli nie bedziemy inaczej uzywac tablic to bedzie to stos kolejka ale tylko umownie.
co do list to array wlasnie idealnie pasują do tego zeby nazwac je listą bo dodajemy gdzie chcemy i zabieramy skąd chcemy
co do list to array wlasnie idealnie pasują do tego zeby nazwac je listą bo dodajemy gdzie chcemy i zabieramy skąd chcemy
Gh0st
10.09.2011
Jak zwykle, spoko Tut .
estetyka 10/10
Opis 10/10
Nawet ja zrozumiałem coś nowego
estetyka 10/10
Opis 10/10
Nawet ja zrozumiałem coś nowego