←  Tutoriale

AMXX.pl: Support AMX Mod X i SourceMod

»

Tablice dynamiczne dla początkujących

  • +
  • -
diablix - zdjęcie 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

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).
W naszym wypadku lepiej będzie zastosować tą pierwszą funkcję.



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 ;)
Odpowiedz

  • +
  • -
Muzzi - zdjęcie 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
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 09.09.2011

jak dla mnie tamten poradnik lepszy :/
Odpowiedz

  • +
  • -
sharkowy - zdjęcie sharkowy 09.09.2011

Bardzo ładnie. Ave!
Odpowiedz

mierzwi - zdjęcie 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...
Odpowiedz

  • +
  • -
diablix - zdjęcie diablix 09.09.2011

Przecież reszta przykładów to wystarczy sama wyobraźnia i pomysły.. Ja tylko zastosowanie funkcji wytłumaczyłem ;)
Odpowiedz

  • +
  • -
byCZUS - zdjęcie byCZUS 09.09.2011

Ładny tutek =] dla zeroFCUF w sam raz ;) + dla Ciebie narobiłeś się ^^
Odpowiedz

  • +
  • -
diablix - zdjęcie diablix 09.09.2011

Dodałem kotwice, teraz temat wygląda ciekawiej :)
Odpowiedz

  • +
  • -
DarkGL - zdjęcie 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++ ;)
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie 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 :D
Odpowiedz

  • +
  • -
R3X - zdjęcie 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.
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie 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 :D
Odpowiedz

  • +
  • -
Gh0st - zdjęcie Gh0st 10.09.2011

Jak zwykle, spoko Tut .
estetyka 10/10
Opis 10/10

Nawet ja zrozumiałem :o coś nowego xD
Odpowiedz