hlmod.hu

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



Jelenlévő felhasználók

Jelenleg 197 felhasználó van jelen :: 1 regisztrált, 0 rejtett és 196 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  [ 7 hozzászólás ] 
Szerző Üzenet
 Hozzászólás témája: [TUT] Logikai változók ( bool típus )
HozzászólásElküldve: 2015.08.21. 14:44 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2015.04.10. 19:49
Hozzászólások: 610
Megköszönt másnak: 53 alkalommal
Megköszönték neki: 147 alkalommal
Sziasztok,

mivel többen érdeklődtek, hogy mik ezek a bool típusú változók, illetve mire is jók, ezért úgy döntöttem megírom ezt a kis apróságot, törekedtem arra, hogy a lehető legérthetőbb legyen, és ahogyan szépen haladunk a mély vízbe egy példakódon bemutassam, hogy hogyan is lehet szebbé, kedvezőbb memória használatúvá tenni ezt azt.

Először is szeretném kiemelni, hogy a pawn programnyelv sajnálatos módon eléggé típus szegény, és a bool típust sem tartalmazta alapból, ezért egy tag -ként van csak megoldva.

Hogy ez miért is fontos számunkra?
1. Létrehozásukkor ugyanúgy 0 a kezdőértéke, mint egy sima változónak, csak ezt logikai változóknál false értéknek fogjuk hívni.
2. Ugyanannyi memóriát, azaz 4 byte -t ( 32 bit -t) foglal le, mint a sima változók.

Hogyan néz ki ez a tag? ( Csak érdekességképpen )
SMA Forráskód: [ Mindet kijelol ]
  1. enum bool
  2. {
  3. false,
  4. true
  5. }


Most már láttuk, tudjuk az alapokat, szóval kezdjük is:

A logikai változóknak ( bool típusú változók / bináris változók / Boole-féle változók ) 2 értéke lehet, ez nem más mint a 'true' és a 'false', vagy felhasználási területtől függően szokták 'high' és 'low' -ként is alkalmazni, de ezek a kifejezések is csak számokat helyettesítenek:

true / high -> 1
false / low -> 0


Deklarálás

SMA Forráskód: [ Mindet kijelol ]
  1. new bool:logikai_valtozo;
  2.  
  3. //Persze lehet tömbje is ennek a változónak, ha szükséges:
  4.  
  5. new bool:logikai_valtozo[33];
  6.  
  7. //És végül, ha true értékkel szeretnénk létrehozni:
  8.  
  9. new bool:logikai_valtozo = true;
  10.  
  11. new bool:logikai_valtozo[33] = {true, ...};



Érték adás

Az előző részben láthattuk, hogy hogyan is lehet értéket adni egy bináris változónak, amikor true értékkel deklaráltuk, de itt egy példakód, hátha rásegít a megértésre:

SMA Forráskód: [ Mindet kijelol ]
  1. #include <amxmodx>
  2. #include <amxmisc>
  3.  
  4. new bool:logikai_valtozo[33];
  5.  
  6. public plugin_init()
  7. {
  8. register_clcmd("say /kikapcsol", "Kikapcsol");
  9.  
  10. register_clcmd("say /bekapcsol", "Bekapcsol");
  11. }
  12.  
  13. public Kikapcsol(id)
  14. {
  15. logikai_valtozo[id] = false;
  16. client_print(id, print_chat, "Kikapcsoltad!");
  17. }
  18.  
  19. public Bekapcsol(id)
  20. {
  21. logikai_valtozo[id] = true;
  22. client_print(id, print_chat, "Bekapcsoltad!");
  23. }


Így, ha beírod a chatbe, hogy "/bekapcsol", akkor kiírja hogy "Bekapcsoltad!" és átállítja a változónk értékét true -ra, ha pedig beírod, hogy "/kikapcsol", akkor kiírja hogy "Kikapcsoltad!" és a változónk értéke false lesz.


Logikai változó értékének felcserélése

Ha bool típusú változókkal dolgozunk gyakran szükségünk lehet arra, hogy felcseréljük a változó értékét. Erre létezik számos megoldás:

1. Ez a leggyakrabban alkalmazott megoldás amxmodx -es közegben még nem is nagyon láttam mást:
SMA Forráskód: [ Mindet kijelol ]
  1. if(logikai_valtozo == true)
  2. {
  3. logikai_valtozo = false;
  4. }
  5. else
  6. {
  7. logikai_valtozo = true;
  8. }
  9.  
  10. /*Magyarázat:
  11. Megnézzük, hogy ha true a változónk értéke, akkor beállítjuk false -ra, ha pedig más ( false ), akkor pedig beállítjuk true -ra.
  12. */


2. Ez ugyanaz a megoldás, csak a feltételes / hármas operátor segítségével:
SMA Forráskód: [ Mindet kijelol ]
  1. logikai_valtozo = (logikai_valtozo) ? (false) : (true);
  2.  
  3. /*Magyarázat:
  4. Ugyanaz, mint az előzőnél, csak a hármas operátor segítsége, ennek működési elve:
  5. (feltétel) ? (ha teljesül) : (ha nem)
  6. */


3. Ez a megoldás már kicsit rövidebb, matematikán alapul:
SMA Forráskód: [ Mindet kijelol ]
  1. logikai_valtozo = true - logikai_valtozo;
  2.  
  3. /*Magyarázat:
  4. Mivel az elején tisztáztuk, hogy a true és a false szó csak számokat helyettesít, ezért ez innentől csak ovis matek:
  5. ha true a változónk értéke:
  6. 1 - 1 = 0, szóval false lesz a változónk értéke.
  7. ha false a változónk értéke:
  8. 1 - 0 = 1, szóval true -ra változik a változónk értéke.
  9. */


4. Ez már egy elég pofás, rövid megoldás:
SMA Forráskód: [ Mindet kijelol ]
  1. logikai_valtozo = !logikai_valtozo;
  2.  
  3. /*Magyarázat:
  4. Ez a kis felkiáltójel ( ! ) a logikai tagadás jele:
  5. Ami nem true az false, és ami nem false az true <!-- s:D --><img src=\"{SMILIES_PATH}/icon_e_biggrin.gif\" alt=\":D\" title=\"nagyon boldog\" /><!-- s:D -->
  6. */


5. Ez a legrövidebb, és valószínűleg a leggyorsabban lefutó megoldás, alapja a bitenkénti "kizáró vagy" ( XOR, ^ ) logikai művelet:
SMA Forráskód: [ Mindet kijelol ]
  1. logikai_valtozo ^= bool:1;
  2. logikai_valtozo ^= true;
  3.  
  4. /*Magyarázat:
  5. Ez a művelet kizárólag akkor ad vissza igaz ( 1 ) értéket, ha az összevetett 2 bit különböző értékű:
  6.  
  7. Ha true a változónk értéke, akkor így néz ki a művelet:
  8. 0000 0000 0000 0000 0000 0000 0000 0001
  9. ^0000 0000 0000 0000 0000 0000 0000 0001
  10. =0000 0000 0000 0000 0000 0000 0000 0000
  11.  
  12. Ha pedig false, akkor így:
  13. 0000 0000 0000 0000 0000 0000 0000 0000
  14. ^0000 0000 0000 0000 0000 0000 0000 0001
  15. =0000 0000 0000 0000 0000 0000 0000 0001
  16.  
  17. +a "Tag mismatch" hibák elkerülése érdekében szükséges használni a bool: taget az 1-es elé, vagy true -t írunk a helyére.
  18. */


Esetleg, ha arra lenne szükségünk, hogy az érték megváltoztatása után tovább fusson a program, és mondjuk kiírja, hogy ki / be kapcsoltad, akkor arra is van lehetőségünk:

SMA Forráskód: [ Mindet kijelol ]
  1. if(logikai_valtozo)
  2. {
  3. logikai_valtozo = false;
  4. //Kikapcsoltuk
  5. }
  6. else
  7. {
  8. logikai_valtozo = true;
  9. //Bekapcsoltuk
  10. }


Ez is egy működő kód, de miért ne szakadnánk el az általános megoldásoktól, és használnánk az újonnan megismert érték felcserélési lehetőségeket:

SMA Forráskód: [ Mindet kijelol ]
  1. if( ( logikai_valtozo = (logikai_valtozo) ? (false) : (true) ) ) //Ez elég csúnyácska
  2. {
  3. //Bekapcsoltuk
  4. }
  5. else
  6. {
  7. //Kikapcsoltuk
  8. }
  9.  
  10. if( ( logikai_valtozo = true - logikai_valtozo ) ) //Ez se a legszebb
  11. {
  12. //Bekapcsoltuk
  13. }
  14. else
  15. {
  16. //Kikapcsoltuk
  17. }
  18.  
  19. if( ( logikai_valtozo = !logikai_valtozo ) ) //Alakul
  20. {
  21. //Bekapcsoltuk
  22. }
  23. else
  24. {
  25. //Kikapcsoltuk
  26. }
  27.  
  28. if( ( logikai_valtozo ^= true ) )
  29. {
  30. //Bekapcsoltuk
  31. }
  32. else
  33. {
  34. //Kikapcsoltuk
  35. }


Ezek alapján kiegészíthetjük az elején elkezdett kis példakódunkat egy újabb funkcióval:

SMA Forráskód: [ Mindet kijelol ]
  1. #include <amxmodx>
  2. #include <amxmisc>
  3.  
  4. new bool:logikai_valtozo[33]
  5.  
  6. public plugin_init()
  7. {
  8. register_clcmd("say /atkapcsol", "Atkapcsol");
  9.  
  10. register_clcmd("say /kikapcsol", "Kikapcsol");
  11.  
  12. register_clcmd("say /bekapcsol", "Bekapcsol");
  13. }
  14.  
  15. public Atkapcsol(id)
  16. {
  17. if((logikai_valtozo[id] ^= true))
  18. {
  19. client_print(id, print_chat, "Bekapcsoltad!");
  20. }
  21. else
  22. {
  23. client_print(id, print_chat, "Kikapcsoltad!");
  24. }
  25. }
  26.  
  27. public Kikapcsol(id)
  28. {
  29. logikai_valtozo[id] = false;
  30. client_print(id, print_chat, "Kikapcsoltad!");
  31. }
  32.  
  33. public Bekapcsol(id)
  34. {
  35. logikai_valtozo[id] = true;
  36. client_print(id, print_chat, "Bekapcsoltad!");
  37. }


Így, ha beírod chatbe, hogy átkapcsol, akkor átállítja a változónk értékét és kiírja, hogy ki vagy be kapcsoltad.


A memória használatról

Még az elején említettem, hogy a bináris változók is ugyanúgy 4 byte -t foglalnak le maguknak, mint a sima változók.
Hogy ez miért is baj nekünk?
- Mert konkrétan ennek a változó típusnak elég lenne 1 bit is, hogy működjön ( 31 bit fölösleges ).

A pawn programnyelven van lehetőségünk úgy nevezett char tömbös változókat készíteni, ezzel csak 1 byte * tömb mérete memóriát foglalunk le.

Deklarálás:
SMA Forráskód: [ Mindet kijelol ]
  1. new bool:logikai_valtozo[33 char];
  2.  
  3. //És persze itt is létrehozhatjuk true kezdőértékkel:
  4.  
  5. new bool:logikai_valtozo[33 char] = {true, ...};


Hivatkozás cellákra:
SMA Forráskód: [ Mindet kijelol ]
  1. public client_connect(id)
  2. logikai_valtozo{id} = true;
  3.  
  4. public client_disconnect(id)
  5. logikai_valtozo{id} = false;


Most, hogy már tudjuk, hogy kompromisszumok nélkül spórolhatunk memóriát tömbös logikai változóknál miért is ne vennénk elő a példakódunkat és alakítanánk át? :D
SMA Forráskód: [ Mindet kijelol ]
  1. #include <amxmodx>
  2. #include <amxmisc>
  3.  
  4. new bool:logikai_valtozo[33 char]
  5.  
  6. public plugin_init()
  7. {
  8. register_clcmd("say /atkapcsol", "Atkapcsol");
  9.  
  10. register_clcmd("say /kikapcsol", "Kikapcsol");
  11.  
  12. register_clcmd("say /bekapcsol", "Bekapcsol");
  13. }
  14.  
  15. public Atkapcsol(id)
  16. {
  17. if((logikai_valtozo{id} ^= true))
  18. {
  19. client_print(id, print_chat, "Bekapcsoltad!");
  20. }
  21. else
  22. {
  23. client_print(id, print_chat, "Kikapcsoltad!");
  24. }
  25. }
  26.  
  27. public Kikapcsol(id)
  28. {
  29. logikai_valtozo{id} = false;
  30. client_print(id, print_chat, "Kikapcsoltad!");
  31. }
  32.  
  33. public Bekapcsol(id)
  34. {
  35. logikai_valtozo{id} = true;
  36. client_print(id, print_chat, "Bekapcsoltad!");
  37. }


Ahogyan itt láthattuk, fontos, hogy egy char tömbös változónál szögletes ( [] ) helyett kapcsos ( {} ) zárójeleket kell használni!
Fontos: char tömbös változókat csak akkor érdemes használni memória spórolásra, ha a változóban csak 0 és 255 között tárolsz számokat, különben váratlan hibák léphetnek fel! -> bináris változókhoz tökéletes, hiszen itt csak 0 -t vagy 1 -t tárolunk.

Ezen kívül van egy másik megoldás is, ha több logikai változóra lenne szükségünk, amivel egy sima változóban képesek vagyunk akár 32 igaz / hamis értéket is tárolni, ha nem probléma ezt itt nem fejtegetném, itt van egy szép leírás:
[Leírás] Tippek és Trükkök ('char' tömbök, Bit-Flag és Egyéb) - kurta999 és itt az utolsó (Bitműveletek Bit-Flag) rész lesz az ami kell + itt is le van írva ez a char tömbös lehetőség.


Egész számok logikai változóvá konvertálása

Igen, erre is van lehetőségünk, ráadásul elég egyszerű:
SMA Forráskód: [ Mindet kijelol ]
  1. public Proba()
  2. {
  3. //Példaként vegyünk 2 változót a szemléltetéshez, az eredményt majd kiiratjuk chatben:
  4.  
  5. new sima = random(127)
  6. new bool:logikai = !!sima
  7. /*Ahogyan láthatjuk, az egész számot tároló változó vagy maga az egész szám elé kell tennünk két felkiáltójelet, és ezzel visszakapunk egy logikai értéket.*/
  8.  
  9. client_print(0, print_chat, "%i", logikai);
  10. }


Fontos: Csak és kizárólag akkor kapunk false értéket, ha az átalakítani kívánt szám egyenlő 0 -val, még negatív szám esetén is true értéket ad vissza + float számokkal nem működik.


Részemről ennyi lenne amit tudok, várom az észrevételeket, tanácsokat, illetve ha valamit rosszul írtam le / fejeztem ki, akkor szóljatok.

_________________
Néha itt, de többször nem.


A hozzászólást 2 alkalommal szerkesztették, utoljára Akosch:. 2015.08.24. 02:30-kor.

Ők köszönték meg Akosch:. nek ezt a hozzászólást (összesen 3): DecToR (2015.08.22. 00:00) • CrB (2015.08.24. 19:43) • davke1 (2015.12.04. 09:00)
  Népszerűség: 6.82%


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2015.08.22. 00:02 
Offline
Jómunkásember
Avatar

Csatlakozott: 2015.04.18. 17:14
Hozzászólások: 454
Megköszönt másnak: 48 alkalommal
Megköszönték neki: 32 alkalommal
Nos köszönöm szépen ezt a TUTORIÁLT A bool-ról, hisz számomra nagyon hasznos volt és nagyon jól elmagyaráztad, használata tényleg egyszerű csak át kell rendesen gondolni, nekem megért egy "KEZET" hisz szerintem nem 10percbe telt mire megcsinálod, de nagyon nagy gratuláció !! NAGYON JÓ!!! csak így tovább.

_________________
Nem Toretto vagyok!!! hanem s[T]* Levii (És le lehet szállni a Torreto-zásról)

Ts3 Ip: ts.beathost.ml:10005


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2015.08.24. 02:35 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2015.04.10. 19:49
Hozzászólások: 610
Megköszönt másnak: 53 alkalommal
Megköszönték neki: 147 alkalommal
Egész újraírva / gondolva + kiegészítve a char tömbös lehetőséggel. Szerintem most már teljes, de ha valaki szerint kimaradt valami szóljon.

_________________
Néha itt, de többször nem.


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2015.10.07. 10:56 
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
Szia!

Ezeket letesztelted? :)

_________________
Kód:
I'm back

Kép


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2015.10.07. 18:51 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2015.04.10. 19:49
Hozzászólások: 610
Megköszönt másnak: 53 alkalommal
Megköszönték neki: 147 alkalommal
Szia Metál :D

Char tömbökön kívül igen, bitműveletes dologgal van komolyabb tervem is ide, ha elkészül lesz egy példa :D

_________________
Néha itt, de többször nem.


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2015.10.08. 15:22 
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
Igazából a kérdésem a {}-re vonaqtkozott, úgy emlékeztem Amxben ez a funkciót nem vezették be. Tévedtem :)

_________________
Kód:
I'm back

Kép


Hozzászólás jelentése
Vissza a tetejére
   
HozzászólásElküldve: 2015.10.10. 23:02 
Offline
SM Fejlesztő
Avatar

Csatlakozott: 2012.10.18. 15:58
Hozzászólások: 2486
Megköszönt másnak: 28 alkalommal
Megköszönték neki: 132 alkalommal
Jesus crist

_________________
www.akosvagyok.hu


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  [ 7 hozzászólás ] 


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 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