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

Dynamiczne Tablice


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

#1 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

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

Napisano 03.03.2009 19:21

*
Popularny

Dynamiczne Tablice

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!
  • +
  • -
  • 20

#2 darkman

    Wszechwiedzący

  • Przyjaciel

Reputacja: 87
Zaawansowany

  • Postów:553
  • Lokalizacja:inactive
Offline

Napisano 03.03.2009 22:39

ładnie, widać reksiu, że się starasz ^^
  • +
  • -
  • 0

#3 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 04.03.2009 09:17

hałhał, znaczy też mi się podoba :D
Skoro te tablice to taka wydajna sprawa to zastanawia mnie czemu prawie nigdzie tego nie widziałem.
  • +
  • -
  • 1

#4 R3X

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 987
Godlike

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

Napisano 04.03.2009 14:29

Dzięki ;)
Nie ma opisu cellarray.inc na funcwiki, więc nie każdy wie o istnieniu tej metody. Oprócz tego łatwiej używa się standardowych tablic, a przy małej ilości danych różnica w wykorzystaniu pamięci ma niewielkie znaczenie.

Osobiście używam dynamicznych tablic do przechowywania danych z plików .ini
  • +
  • -
  • 0

#5 mgr inż. Pavulon

    C35H60Br2N2O4

  • Przyjaciel

Reputacja: 1 742
Godlike

  • Postów:6 881
  • Steam:steam
  • Imię:Konrad
  • Lokalizacja:Koniecpol
Offline

Napisano 09.04.2009 16:17

Skoro te tablice to taka wydajna sprawa to zastanawia mnie czemu prawie nigdzie tego nie widziałem.

/**
* These arrays are intended to be used for a form of global storage without
* requiring a #define that needs to be increased each time a person needs more
* storage.
* These are not designed to be used as a replacement for normal arrays, as
* normal arrays are faster and should be used whenever possible.

*/

ale może i do czegoś się przydadzą.
  • +
  • -
  • 0

#6 R3X

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 987
Godlike

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

Napisano 09.04.2009 16:32

Przydają się jeśli nie znamy ilości danych wejściowych. W tym cała wydajność tych tablic, że zajmują dokładnie tyle miejsca ile potrzeba.

Widziałem, że użyto typu Array: w mapchooser.sma do przechowania nazw map, bo nie wiadomo czy na serwie jest ich 20 czy 200.
  • +
  • -
  • 0

#7 mgr inż. Pavulon

    C35H60Br2N2O4

  • Przyjaciel

Reputacja: 1 742
Godlike

  • Postów:6 881
  • Steam:steam
  • Imię:Konrad
  • Lokalizacja:Koniecpol
Offline

Napisano 09.04.2009 16:39

No tak wybór nie jest łatwy...
Trzeba zdecydować czy wykonywać więcej obliczeń czy zajmować więcej pamięci i obsługiwać ograniczony rozmiar tablicy.
Myślę nad nimi, ale dochodzę do wniosku że są problematyczne, zwłaszcza jeżeli chodzi o tablice wielowymiarowe.
nie da się tu pobrać danych jak zwykle w stylu:
new wartosc = tablica[x][y]
if (wartosc>z) ...
tylko trzeba:
new wartosc, tablica_tmp[yy]
ArrayGetArray(tablica, x, tablica_tmp)
wartosc = tablica[y]
if (wartosc>z) ...
chyba że się mylę.
  • +
  • -
  • 0

#8 R3X

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 987
Godlike

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

Napisano 09.04.2009 18:00

Zgadza się, trzeba wyciągnąć dane do zwykłej tablicy w takich przypadkach. Nie stanowi jednak to problemu, gdy korzyści z użycia dynamicznej tablicy są oczywiste. Trzeba określić, który rodzaj tablic jest lepszy do konkretnego zastosowania.
  • +
  • -
  • 0

#9 mgr inż. Pavulon

    C35H60Br2N2O4

  • Przyjaciel

Reputacja: 1 742
Godlike

  • Postów:6 881
  • Steam:steam
  • Imię:Konrad
  • Lokalizacja:Koniecpol
Offline

Napisano 09.04.2009 18:14

jest jeszcze coś gorszego od pobierania wartości z tablicy wielowymiarowej, a dokładniej jest to zmiana jednej wartości w takiej tablicy gdyż żeby zmienić jedną wartość trzeba i tak pobrać wszystkie. czyli zamiast:

tablica[x][y] = wartosc

trzeba by zrobić:

new tmp_arr[yy]
ArrayGetArray(tablica, x, tmp_arr)
tmp_arr[y] = wartosc
ArraySetArray(tablica, x, tmp_arr)

mam nadzieje że komplikacje są tego warte.
tylko że zaczynam już myśleć nad tym że lepiej wyjdę na 2 (dynamicznych) tablicach jednowymiarowych niż na jednej 2-wymiarowej, gdyż nie będą potrzebne żadne tablice tymczasowe - wystarczy ArrayGet{Set/Push}Cell()
  • +
  • -
  • 0

#10 R3X

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 987
Godlike

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

Napisano 10.04.2009 11:27

W większości wypadków standardowe tablice okazują się być rozwiązaniem lepszym, jednak gdy sytuacja wymaga maksymalnej elastyczności to problemy, o których piszesz nie mają już takiego znaczenia.
  • +
  • -
  • 0

#11 ogieR8

    Wszechmogący

  • Power User

Reputacja: 203
Profesjonalista

  • Postów:641
  • Imię:Mariusz
  • Lokalizacja:Ruda Śląska
Offline

Napisano 30.06.2012 21:38

A ja mam pytanie, sorry za odkop, ale akurat jestem zmuszony z powodu error'ów znajomego na edukowanie się Array'ów i.. cały czas na przykładach (+ Ci za to, bo na sucho to i chleba nie zjem) operujesz 'g_MojaTablica', a zadeklarowałeś 'newArray:MojaTablica;'. To tak ma dziwnie być, czy brakło Ci tego 'g_' na początku po Array: ?
  • +
  • -
  • 0

Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !


#12 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

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

Napisano 01.07.2012 10:57

Zwykła pomyłka
  • +
  • -
  • 0

#13 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 08.01.2015 02:38

Pytanie za 100 ptk, jak w pełni korzystać z wydajności jaką oferują te tablice skoro zeby np. pobrac ciag znakow i tak musze utworzyc tablice o okreslonej wielkosci?


  • +
  • -
  • 1

#14 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 08.01.2015 13:45

Zawsze możesz stworzyć tablicę tablic dynamicznych :)
  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#15 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

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

Napisano 08.01.2015 14:20

Pytanie za 100 ptk, jak w pełni korzystać z wydajności jaką oferują te tablice skoro zeby np. pobrac ciag znakow i tak musze utworzyc tablice o okreslonej wielkosci?

 

dynamiczna alokacja pamięci na podstawie sizeof


  • +
  • -
  • 0

#16 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 08.01.2015 15:15

dynamiczność tej tablicy polega na tym że możesz tam sobie wrzucać co chcesz i ile chcesz (teoretycznie) a zeby pobrać to co tam wrzuciłeś to wiadomo że musisz to zapisać do czegoś o rozmiarze tego co tam wrzuciłeś
  • +
  • -
  • 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

#17 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 08.01.2015 17:17

Tak mi przyszła do głowy myśl... skoro w pawnie są dynamiczne tablice i "słowniki"... dlaczego nie ma stringów?
sebul (08.01.2015 17:22):
Pewnie nikt o tym nie pomyślał ^ ^

  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#18 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 09.01.2015 12:15

Tak mi przyszła do głowy myśl... skoro w pawnie są dynamiczne tablice i "słowniki"... dlaczego nie ma stringów?

Stąd moje dziwne pytania w ostatnim czasie :D

 

 

Pytanie za 100 ptk, jak w pełni korzystać z wydajności jaką oferują te tablice skoro zeby np. pobrac ciag znakow i tak musze utworzyc tablice o okreslonej wielkosci?

 

dynamiczna alokacja pamięci na podstawie sizeof

 

Jak użyć sizeof do sprawdzenia wielkości danego obiektu w tablicy?


  • +
  • -
  • 0




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

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