hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2024.03.28. 17:09



Jelenlévő felhasználók

Jelenleg 255 felhasználó van jelen :: 1 regisztrált, 0 rejtett és 254 vendég

A legtöbb felhasználó (1565 fő) 2020.11.21. 11:26-kor tartózkodott itt.

Regisztrált felhasználók: Google [Bot] az elmúlt 5 percben aktív felhasználók alapján

Utoljára aktív
Ahhoz hogy lásd ki volt utoljára aktív, be kell jelentkezned.



Az oldal teljeskörű
használatához regisztrálj.

Regisztráció

Kereső


Új téma nyitása  Hozzászólás a témához  [ 24 hozzászólás ]  Oldal 1 2 3 Következő
Szerző Üzenet
HozzászólásElküldve: 2012.02.12. 00:24 
Offline
Imperátor
Avatar

Csatlakozott: 2009.04.21. 09:33
Hozzászólások: 3991
Megköszönt másnak: 5 alkalommal
Megköszönték neki: 135 alkalommal
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

_________________
Kód:
I'm back

Kép

Ők köszönték meg Metal nek ezt a hozzászólást (összesen 2): kiki (2012.09.29. 13:05) • LyleChriss (2015.07.30. 11:49)
  Népszerűség: 4.55%


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2012.02.12. 07:21 
Offline
Developer
Avatar

Csatlakozott: 2011.06.01. 21:11
Hozzászólások: 7962
Megköszönt másnak: 295 alkalommal
Megköszönték neki: 535 alkalommal
Jólett:D

_________________
http://www.easyrankup.eu


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2012.02.13. 09:10 
Offline
Imperátor
Avatar

Csatlakozott: 2009.04.21. 09:33
Hozzászólások: 3991
Megköszönt másnak: 5 alkalommal
Megköszönték neki: 135 alkalommal
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.

_________________
Kód:
I'm back

Kép


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2012.02.13. 15:52 
Offline
Félisten

Csatlakozott: 2012.01.07. 21:10
Hozzászólások: 850
Megköszönt másnak: 9 alkalommal
Megköszönték neki: 154 alkalommal
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

_________________
Megköszönni nem szégyen!
Csak kattints a Kép jelre. --->


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2012.02.13. 16:01 
Offline
Imperátor
Avatar

Csatlakozott: 2009.04.21. 09:33
Hozzászólások: 3991
Megköszönt másnak: 5 alkalommal
Megköszönték neki: 135 alkalommal
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

_________________
Kód:
I'm back

Kép


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2012.02.13. 16:14 
Offline
Félisten

Csatlakozott: 2012.01.07. 21:10
Hozzászólások: 850
Megköszönt másnak: 9 alkalommal
Megköszönték neki: 154 alkalommal
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ó?

_________________
Megköszönni nem szégyen!
Csak kattints a Kép jelre. --->


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2012.02.13. 16:15 
Offline
Tiszteletbeli

Csatlakozott: 2010.02.04. 19:12
Hozzászólások: 3528
Megköszönt másnak: 26 alkalommal
Megköszönték neki: 180 alkalommal
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

_________________
http://www.ebateam.eu/


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2012.02.13. 17:12 
Offline
Developer
Avatar

Csatlakozott: 2011.06.01. 21:11
Hozzászólások: 7962
Megköszönt másnak: 295 alkalommal
Megköszönték neki: 535 alkalommal
id = index ez az a játékos akin a funkciot vegre akarod halytani, vagy akin vegre hajtodik!

_________________
http://www.easyrankup.eu


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2012.02.13. 18:39 
Offline
Imperátor
Avatar

Csatlakozott: 2009.04.21. 09:33
Hozzászólások: 3991
Megköszönt másnak: 5 alkalommal
Megköszönték neki: 135 alkalommal
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ó?

_________________
Kód:
I'm back

Kép


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2012.02.13. 18:49 
Offline
Imperátor
Avatar

Csatlakozott: 2009.04.21. 09:33
Hozzászólások: 3991
Megköszönt másnak: 5 alkalommal
Megköszönték neki: 135 alkalommal
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!

_________________
Kód:
I'm back

Kép


Hozzászólás jelentése
Vissza a tetejére
   
Hozzászólások megjelenítése:  Rendezés  
Új téma nyitása  Hozzászólás a témához  [ 24 hozzászólás ]  Oldal 1 2 3 Következő


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég


Nyithatsz új témákat ebben a fórumban.
Válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.
Nem küldhetsz csatolmányokat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB® Forum Software © phpBB Limited
Magyar fordítás © Magyar phpBB Közösség
Portal: Kiss Portal Extension © Michael O'Toole