hlmod.hu
https://hlmod.hu/

AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tömbök
https://hlmod.hu/viewtopic.php?f=55&t=3408
Oldal: 1 / 3

Szerző:  Metal [ 2012.02.12. 00:24 ]
Hozzászólás témája:  AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tömbök

Tömbök, Stringek, Többdimenziós tömbök

Tömbök
A tömb azonos típusú adatok halmaza, amelyek a memóriában folytonosan helyezkednek el. A tömb elemeire a tömb nevével és az indexelő operátorral ([]) hivatkozhatunk.

A tömböket nullától indexeljük. A fordító nem ellenőrzi a tömbindexeket, ezért hibás indexeléssel is lefordul a program, de futás közben ez több problémát is okozhat. Egyrészt felülírhatjuk a memóriában előtte vagy utána lévő adatainkat, másrészt akár olyan memóriaterületre próbálhatunk meg írni (vagy onnan olvasni), amely nem a pluginhoz tartozik, ekkor az AMX Mod X megszakítja a plugin futását és ezt az error logba jelzi.

Kód:
  1.  // Player tömb létrehozása, 32 tömbelemmel

  2. new Players[32]

  3. // Most már van egy 32 elemu tömbünk, az elemeire 0-ról n-1-ig (jelen esetben 0-tól 31-ig) hivatkozhatunk.

  4. // Tehát minden tömb elso eleme a 0. indexű elem.

  5.  

  6. // 0. indexű elemet 5re állítjuk.

  7. Players[0] = 5

  8.  

  9. // Az 1. indexű elembe belepakoljuk a 0. indexű elemet.

  10. Players[1] = Players[0]

  11.  

  12. // Példa hibás indexelésekre:

  13. // Egy 32 elemű tömb első eleme a 0. utolsó a 31.

  14. // Ez a kód nem fordul le, már fordítási időben hibát dob, mivel fix az értéke.

  15. Players[32] = 15

  16.  

  17. // Ez a kód lefordul, de futási idoben hibát dob. Eredménye: AMX Native Error 4 - AMX_ERR_BOUNDS

  18. new A=33

  19. Players[A] = 15

  20.  

  21. // Ez abszolút hibás        

  22. Players[-1] = 6

  23.  

  24. // Változót nem adhatunk meg csak úgy egy tömb deklarálásakor, mivel nem lehet meghatározni a méretét. Ha a változó konstans, vagy fordítási direktíva a mérete, akkor gond nélkül lefordul, mivel előre meghatározott értéket vehet fel. (Előbbi esetben futási időben, utóbbi esetben a fordító illeszti bele az értéket a fordítandó kódba)

  25. // Ez se nem konstans, se nem #DEFINE => Fordítási hiba

  26. new a = 3

  27. new BadArray[a]

  28.  

  29. // Ez egy jó, lefordítható kód.

  30. new const b = 3

  31. new GoodArray[b]


// Fordítási direktívával (lásd később)
Kód:
  1. #define ARRAY_SIZE 3

  2. new Array[ARRAY_SIZE]


Lehetőség van a tömb feltöltésére a deklarálás mellett. Az alábbi példa demonstrálja, miként tehetjük meg ezt:
Kód:
  1. new Numbers[4] = {0,1,2,3}

  2. // Megjegyzés: Ekkor pont annyi elemet kell megadni, ahány elemű a tömbünk.


Természetesen Float és Boolean típusú tömb is létrehozható, értékadással megspékelve
Kód:
  1. // Float tömb:

  2. new Float:Numbers[4] = {0.0, 1.2, 2.4, 3.8}

  3. // Boolean tömb

  4. new bool:playerHasGun[33] = {true, ...}

  5. // Megjegyzés: A Boolean tömb ekként való definiálása estén nem kell kiírni az összes true értéket, ugyanis ekkor az össze elem true lesz.

  6.  


Stringek

Észrevehetted, hogy a legfontosabb adattípus kihagytam: a karakterek. A Pawn nyelvben a karaktereket a számok reprezentálják, míg a stringeket a karakterek tömbje.
Példák:
Kód:
  1. // Létrehozunk egy "myString" nevu számtömböt ami a "Hello" karaktersorozatot fogja tárolni.

  2. // 6 eleme lesz a tömbnek, ebből 5 a karaktereknek van fenntartva.

  3. // Az utolsó tömbelem a 0 értéket veszi fel, ami jelzi a Pawn motorjának, hogy ez a tömb egy stringet tartalmaz.

  4. // Ebben az esetben nem kell kitenni a deklarációkor a tömb méretet, mivel maga a karaktersorozat fogja meghatérozni a tömbméretet.

  5. new myString[] = "Hello"


A most következő kód ugyanazt fogja csinálni, mint az előző. Hosszabb, és a több véthető hibalehetőség miatt nem ajánlott.
Kód:
  1. new myString[6]

  2. myString[0] = 'H'

  3. myString[1] = 'e'

  4. myString[2] = 'l'

  5. myString[3] = 'l'

  6. myString[4] = 'o'

  7. myString[5] = 0

  8. // Megjegyzés: mint írtam, az utolsó 0 jelzi, hogy a tömb egy stringet tartalmaz. Ha nem tennénk ki, nem lehetne stringként használni.


Az alábbi sorok kerülendők, mivel lehet, hogy lefordulnak, de futási időben könnyen túlcsordulási hibákat okozhatnak
Kód:
  1. new myString[6]

  2. myString = "Hello"     // INVALID!

  3. myString[0] = "Hello"  // INVALID!

  4. // Egy stringnek szánt tömbe adatot az alábbi módon rakhatunk:

  5. new goodString[7]

  6. copy(goodString, 6, "Hello")

  7. // Megjegyzés:Itt 6 hosszú stringet pakolunk be a tömbbe. Figyeljünk arra, hogy 7 byte másolása esetén a copy függvén képes egy extra byteot másolni a tömbbe a null karakter miatt, ami túlcsordulást okozhat.


További példák:
Kód:
  1. // A copy egy függvény, ami 3 paraméterből áll:

  2. copy(destination[], length, source[])

  3. // a source tömbből legfeljebb length hosszú stringet másol a destination tömbbe

  4.  

  5. // Végül megmutatom, miként reprezentálják a számok a karaktereket:

  6. new metal[6]

  7. metal[0] = 77

  8. metal[1] = 69

  9. metal[2] = 84

  10. metal[3] = 65

  11. metal[4] = 76

  12. metal[5] = 0

  13. // Ez a metal tömbbe beállítja a "METAL" stringet


Többdimenziós tömbök
A Pawn lehetőséget nyújt többdimenziós tömbök létrehozására. A titok annyi, hogy több [x] literálokat pakolunk a tömbünkhöz, s így egy n dimenziós tömböt kaphatunk. A most következő sorok taglalják ennek előnyeit és működését, a példákat kétdimenziós tömbbel mutatom be

Kétdimenziós tömb
Általában ilyen típusú tömböket használunk, ugyanis ezzel reprezentálhatunk egy táblázatot, ahol az első "dimenzió" határozza meg a sort, míg a második az oszlopot. (Szokás nxm es Mátrixnak is nevezni)

Kód:
  1. // Ez deklarál egy 50 sorból és 50 oszlopból álló táblát (aka kétdimenziós tömb)

  2. new BigArray[50][50]

  3. // Float típusú tömb, 25 sorral és 10 oszloppal

  4. new Float:BigArray[25][10]

  5.  

Példa egy 3x3as Mátrixra
Kód:
  1. new BigArray[3][3]

  2. BigArray[0][0] = 10

  3. BigArray[0][1] = 20

  4. BigArray[0][2] = 30

  5. BigArray[1][0] = 40

  6. BigArray[1][1] = 50

  7. BigArray[1][2] = 60

  8. BigArray[2][0] = 70

  9. BigArray[2][1] = 80

  10. BigArray[2][2] = 90

  11.  

  12. // Így képzelhető el a változónk tartalma:

  13.    0   1   2

  14. 0  10  20  30

  15. 1  40  50  60

  16. 2  70  80  90


Fontos megjegyezni, hogy néhány egydimenziós tömbökre implementál függvény nem működik a többdimenziós tömbökre.
Kód:
  1. // Például ilyen a sum_of_array() függvény, ami visszaadja  az első n elem összegét.

  2. new sum = sum_of_array(BigArray, 9)  // INVALID

  3. // Igy használható, de ekkor csak egy részét summázva:

  4. new sum = sum_of_array(BigArray[2], 3)


Ekkor a BigArray[2] tartalmazza a 2. egydimenziós tömbünket {7,8,9}. Természetesen van arra lehetőség, hogy saját függvényt implementáljunk a kétdimenziós tömbökre.
Például:
Kód:
  1. sum_of_table(array[][], rows, cols)

  2. {

  3.    new i, j, sum

  4.  

  5.    // Egymásba ágyazott for ciklusok segítenek abban, hogy végigiteráljunk a tömb elemein

  6.    for (i=0; i<rows; i++)

  7.    {

  8.       for (j=0; j<cols; j++)

  9.       {

  10.          sum += array[i][j]

  11.       }

  12.    }

  13.  

  14.    return sum

  15. }


Kétdimenziós tömbben is lehetséges a stringek tárolása:
Kód:
  1. new StringList[3][] = {"Hello", "my", "friend"}

  2. /*

  3.   StringList [0][0]-tól [0][5]-ig tartalmazza a "Hello" stringet

  4.   StringList [1][0]-tól [1][2]-ig tartalmazza "my" stringet

  5.   StringList [2][0]-tól [2][6]-ig tartalmazza "friend" stringet

  6. */


Ekkor a StringList az alábbi adatot tartalmazza: 0 1 2 3 4 5 6 0 H e l l o \0 1 m y \0 2 f r i e n d \0

Adatok összehasonlítása hasonlóan működik, mint az egydimenziós társaiknál.
Kód:
  1. if (StringList[0] == "Hello")       //INVALID

  2. if (StringList[0][0] == "Hello")    //INVALID

  3. if (equali(StringList[0], "Hello")) //Valid


Updated: 2012.02.13

Szerző:  kiki [ 2012.02.12. 07:21 ]
Hozzászólás témája:  Re: AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tö

Jólett:D

Szerző:  Metal [ 2012.02.13. 09:10 ]
Hozzászólás témája:  Re: AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tö

Up!
Volt benne 1-2 hiba s 1-2 dolgot átírtam/rendeztem.

Jelezzétek, ha valami nem tiszta, s kifejtem, ha valóban szükséges.

Szerző:  HunGamer [ 2012.02.13. 15:52 ]
Hozzászólás témája:  Re: AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tö

Metal írta:
Up!
Volt benne 1-2 hiba s 1-2 dolgot átírtam/rendeztem.

Jelezzétek, ha valami nem tiszta, s kifejtem, ha valóban szükséges.

Hát nekem lenne egy kérdésem:
A tömb 1 elemén csak 1 karakter lehet? Vagy ez is helyes:
Kód:
new Players[32]
Players[5] = 15

Szerző:  Metal [ 2012.02.13. 16:01 ]
Hozzászólás témája:  Re: AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tö

Természetesen helyes.
A vátozók számokat táronak, érdektelen milyen hosszúak.
Karakterek esetén csak EGY karaktert tárol:
Kód:
  1. new Players[32]

  2. // Ezek helyesek:

  3. Players[2]=12345

  4. Players[3]='a'

  5. // Ez helytelen

  6. Players[4]='aaa'

  7.  


Karakterekből azért csak egyet tárolhatunk, mert maga a karaktert egy szám ( a karakter ASCII kódja) reprezentálja.
Azaz
Kód:
new a=77
new b='M'
esetén
Kód:
a == b

igaz (egyenlőek)
HunGamer írta:
Metal írta:
Up!
Volt benne 1-2 hiba s 1-2 dolgot átírtam/rendeztem.

Jelezzétek, ha valami nem tiszta, s kifejtem, ha valóban szükséges.

Hát nekem lenne egy kérdésem:
A tömb 1 elemén csak 1 karakter lehet? Vagy ez is helyes:
Kód:
new Players[32]
Players[5] = 15

Szerző:  HunGamer [ 2012.02.13. 16:14 ]
Hozzászólás témája:  Re: AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tö

Még két kérdés. Ha így használom:
Kód:
new Players[32]
Players[id] = 15

Tudom hogy mire kell, hogy kell használni az ,id'-t de nem tudom, hogy ez mi. A játékos neve, esetleg egy ,,azonosíto" szám. Szóval, hogy miez?
2. Lehetséges-e hogy játékon belül megváltozik valakinek az id-je vagy ez állandó?

Szerző:  IrOn [ 2012.02.13. 16:15 ]
Hozzászólás témája:  Re: AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tö

HunGamer írta:
Még két kérdés. Ha így használom:
Kód:
new Players[32]
Players[id] = 15

Tudom hogy mire kell, hogy kell használni az ,id'-t de nem tudom, hogy ez mi. A játékos neve, esetleg egy ,,azonosíto" szám. Szóval, hogy miez?
2. Lehetséges-e hogy játékon belül megváltozik valakinek az id-je vagy ez állandó?

1-32 -ig vannak ID-k mivel 1 szerver max 32 slot lehet
az id változhat ha újracsatlakozik, azthiszem

Szerző:  kiki [ 2012.02.13. 17:12 ]
Hozzászólás témája:  Re: AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tö

id = index ez az a játékos akin a funkciot vegre akarod halytani, vagy akin vegre hajtodik!

Szerző:  Metal [ 2012.02.13. 18:39 ]
Hozzászólás témája:  Re: AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tö

1)

Ez azt jelenti, hogy a Players tömb id.eik elemének 15öt adsz értékül.
Az id helyett lehet más is, akár lócitrom, mivel az UGYANOLYAN változó, mint bármelyik más változó.

Az alábbi két kód (ciklus) futása után ugyanazok az elemek lesznek a tömbökben:

Kód:
new Players[10], Players2[10]

for (new id=0; id<10; id++)
    Players[id]=id*2;

for (new alma=0; alma<10; alma++)
    Players2[alma]=alma*2;

mind a 2 kód feltölti a tömbök elemeit 0-tól 18ig 2-esével haladva tehát végeredményben:
Kód:
for (new i=0; i<10; i++)
    if (Players2[i] == Players[i])
    {
        // ide mindig bejut, mivel mind2 tömb i. eleme ugyanaz lesz
    }


2)
Mikor egy játékos felcsatlakozik, akkor automatikusan kap egy idt, és midnig az első legkisebb nem foglalt azonosítót kapja meg
például:
1) Matyi
2) Sanyi
5) Béla
6) Árpi

Árpi lelép
1) Matyi
2) Sanyi
5) Béla

Zoli fellép:
1) Matyi
2) Sanyi
3) Zoli
5) Béla

Amit idt kaptak az nem változik
HunGamer írta:
Még két kérdés. Ha így használom:
Kód:
new Players[32]
Players[id] = 15

Tudom hogy mire kell, hogy kell használni az ,id'-t de nem tudom, hogy ez mi. A játékos neve, esetleg egy ,,azonosíto" szám. Szóval, hogy miez?
2. Lehetséges-e hogy játékon belül megváltozik valakinek az id-je vagy ez állandó?

Szerző:  Metal [ 2012.02.13. 18:49 ]
Hozzászólás témája:  Re: AmxModX Alapozó 04. - Tömbök, Stringek, Többdimenziós tö

WRONG! HAJT!

Igen, mikor fellép egy játékos, kap egy azonosítót amit idnek szoktak nevezni, de mint minden változó, utalhatsz rá "vizbicikli" névvel is, de az alap konvenció az, hogy id, vagy index-ként utalunk rá.

Még egy fontos megjegyzés: Ha bárhol látsz egy idt, az NEM feltétlenül azt jelenti, hogy az játékos id! Az csak egy változó, - ami lehet játékos id is - a kód fogja neked megmutatni, mire s hol használja fel.

kiki írta:
id = index ez az a játékos akin a funkciot vegre akarod halytani, vagy akin vegre hajtodik!

Oldal: 1 / 3 Minden időpont UTC+02:00 időzóna szerinti
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/