Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Tablice dynamiczne dla początkujących


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
12 odpowiedzi w tym temacie

#1 diablix

    emeryt

  • Przyjaciel

Reputacja: 507
Wszechwiedzący

  • Postów:663
  • GG:
  • Steam:steam
  • Imię:Daniel
  • Lokalizacja:Warszawa
Offline

Napisano 08.09.2011 22:53

*
Popularny

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 ;)
  • +
  • -
  • 11

#2 Muzzi

    Guru

  • Przyjaciel

Reputacja: 228
Wszechwidzący

  • Postów:772
  • Lokalizacja:Kraków
Offline

Napisano 08.09.2011 23:03

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

  • +
  • -
  • 0

#3 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 09.09.2011 09:02

jak dla mnie tamten poradnik lepszy :/
  • +
  • -
  • 1
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#4 sharkowy

    Lokalna anomalia sejsmiczna o nieustalonej genezie.

  • Przyjaciel

Reputacja: 113
Zaawansowany

  • Postów:1 981
Offline

Napisano 09.09.2011 09:26

Bardzo ładnie. Ave!
  • +
  • -
  • 0

#5 mierzwi

    Banned

  • Zbanowany

Reputacja: 235
Wszechwidzący

  • Postów:651
  • Lokalizacja:Polska
Offline

Napisano 09.09.2011 13:57

no dla takich zielonych to dobrze wytłumaczone, ale mógłbyś jakieś lepsze zastosowanie podać tego niż dodawanie nicków do tablicy...

jeśli masz fejsa i chcesz mi pomóc to wejdź tutaj: Zaproś kumpla by lubił nasz sklep | Facebook

na pewno jakoś C się odwdzięczę!


#6 diablix

    emeryt

  • Autor tematu
  • Przyjaciel

Reputacja: 507
Wszechwiedzący

  • Postów:663
  • GG:
  • Steam:steam
  • Imię:Daniel
  • Lokalizacja:Warszawa
Offline

Napisano 09.09.2011 13:59

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

#7 byCZUS

    Listonosz

  • Support Team

Reputacja: 752
Guru

  • Postów:459
  • GG:
  • Steam:steam
  • Lokalizacja:GW
Offline

Napisano 09.09.2011 14:00

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

Dziękuje, dobranoc.


#8 diablix

    emeryt

  • Autor tematu
  • Przyjaciel

Reputacja: 507
Wszechwiedzący

  • Postów:663
  • GG:
  • Steam:steam
  • Imię:Daniel
  • Lokalizacja:Warszawa
Offline

Napisano 09.09.2011 15:01

Dodałem kotwice, teraz temat wygląda ciekawiej :)
  • +
  • -
  • 0

#9 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 09.09.2011 15:35

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++ ;)
  • +
  • -
  • 0

#10 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 09.09.2011 21:22

stosu jako takiego nie zrobisz bo nie masz tutaj wskazników tablice dynamiczne to bardziej cos jak klasa vector chociaz nie do konca :D
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#11 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 09.09.2011 23:50

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.
  • +
  • -
  • 0

#12 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 10.09.2011 10:37

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
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#13 Gh0st

    :)

  • Power User

Reputacja: 852
Czempion

  • Postów:920
  • GG:
  • Imię:Tomek
  • Lokalizacja:Rabka-Zdrój
Offline

Napisano 10.09.2011 18:23

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

Nawet ja zrozumiałem :o coś nowego xD
  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych