hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2019.08.25. 15:19



Jelenlévő felhasználók

Jelenleg 34 felhasználó van jelen :: 2 regisztrált, 0 rejtett és 32 vendég

A legtöbb felhasználó (652 fő) 2015.05.25. 22:38-kor tartózkodott itt.

Regisztrált felhasználók: Bing [Bot], 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  [ 3 hozzászólás ] 
Szerző Üzenet
 Hozzászólás témája: Általános kérdések
HozzászólásElküldve: 2019.04.12. 13:20 
Offline
Beavatott

Csatlakozott: 2018.01.28. 19:04
Hozzászólások: 69
Megköszönt másnak: 11 alkalommal
Megköszönték neki: 11 alkalommal
Sziasztok,
Volna pár kérdésem:
1. Mi a külömbség a static és a new között/melyiket mikor érdemesebb használni?

2. Ha két lehetőségünk van, érdemesebb if-et vagy switch-et használni? Ha az if érdemesebb, hány lehetőségtől preferálandó a switch?

Gondolok itt pl erre:
Kód:
if(x==2)
  x = 3
else
  x = 2

Kód:
switch(x)
{
  case 2: x = 3
  default: x = 2
}


3. Mi egyenlő a halmazoknál lévő "elem" kifejezéssel? Tehát, tegyük fel, hogy van egy halmazunk, benne 5 szám, akkor hogy írjuk meg, hogy ha x eleme annak a halmaznak akkor történjen valami?

4. Ügye van a switch-nél egy felsorolás, ( pl. case 1..9: ) alkalmazható ez, vagy bármi hasonló máshol, a for/while leszámításával? Elsősorban nekem az index jutott eszembe, ( [1..9] ez nem egy működő dolog ügyebár ) de akár ez halmazoknál működhet valamilyen módon? ( if(x */ide jönne az elem kifejezés*/ (1..9)) )

5. Mikor érdemes public-ot rakni és miért? Sokszor volt, hogy nem használtam egy-két helyen, de érdekelne, hogy mi a külömbség.

6. Érdemesebb sok, kicsi, incekkel összekötött plugint csinálni vagy egy nagyot, ami akár elérheti az 5-6ezer sort? Az, hogy ilyen módon kötöm össze a pluginokat nem növeli a ram/memória használatot?

_________________
Emeljük fel a cs1.6-ot a szutyokból, amiben most van! :D
Ha segítenél, ajánld ismerősöknek a játékot és ha értesz az amxx-hez csinálj fasza szervereket!
Cél: Játékosok és MINŐSÉGI szerverek gyarapítása! ;)
#makecs16greatagain


A hozzászólást 1 alkalommal szerkesztették, utoljára Vieni 2019.04.12. 16:25-kor.

Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Általános kérdések
HozzászólásElküldve: 2019.04.12. 15:32 
Offline
Senior Tag
Avatar

Csatlakozott: 2016.02.10. 12:46
Hozzászólások: 289
Megköszönt másnak: 39 alkalommal
Megköszönték neki: 105 alkalommal
Helló. Keresgéltem/utána néztem a dolgoknak, illetve felhasználtam az eddigi tudásom:

1. Static vs new
A new minden alkalommal létrehoz egy változót a memóriában, amikor pl. egy függvény meghívás történik, ezzel ellentétben
a static változót csak egyszer hozza létre a memóriában, amikor elsőnek meghívódik pl. a függvény.

AlliedModders-en találtam:
If it isn't being called more than 1 time per second the entire time the server is running, just use new.

Magyarul:
Ha nem hívodik meg több mint egyszer egy másodperc alatt a static, akkor használj new-t.

2. Switch vs if
Ha több mint 5 case-ed van, akkor használj switch-t, ellenkező esetben if-t.

3. Elem
Tudtom szerint nincs olyan utasítás, amivel egyből le tudod kérni, hogy egy elem benne van-e a halmazba.
Én for ciklussal szoktam megoldani:

  1. //A halmaz itt jelenleg globális
  2. public check_contain(elem){
  3.     for(new i; i < 5; i++) // Végig megyünk az 5 elemü halmazon
  4.         if(halmaz[i] == elem) // Leellenörizzük minden egyes elemre, hogy egyenlő-e a halmazban bármelyik elemmel
  5.             return 1; // Ha igen, akkor visszatérítjük az 1-et, ami azt jelenti, hogy benne van
  6.     return 0; // Ellenkező esetben 0-át térítünk vissza
  7. }
  8.  
  9. if(check_contain(5)) // Ellenőrizzük, hogy az 5-ös eleme-e a halmaznak
  10.     print("benne van");
  11. else
  12.     print("nincs benne");


Lehet nem túl optimális, de jelenleg más megoldást nem találtam rá.

4. Switch
Mivel növekvő sorrendbe vannak az index-ek az (1-9) intevallumban, akkor írhatod így:

  1. if(1 <= x <= 9) // x az index-et jelöli, olyan mintha ezt írnád: case 1..9:
  2.     print("Az x értéke 1 és 9 között van");



5. Normál/Public/Stock

a. Normál:
A típus nélküli függvényeket akkor érdemes használni, amikor olyan függvényt szeretnél, amit más plugin nem tud meghívni.
Pl.
  1. szorzat(szam1, szam2)
  2.     return (szam1 * szam2)

b. Public:
A public függvényeket bárki meghívhajta, azaz más pluginok vagy maga az AMXX.
Talán kicsit több CPU-t használnak. (AlliedModders)

6. Native
Ezt pontosan nem tudom, mivel még nem teszteltem le, hogy melyik optimálisabb.
Szerintem nagy különbség nem lehet a kettő között. Inkább a rosszul megírt plugin fogja növelni a használatot.

Én jelenleg is több plugint kötök össze include segítségével, amelyeket nem akarom belezsúfolni egy pluginba, hogy
utána zavarjanak. Szerintem így átláthatóbb.

Példa:
A Regisztrációs Rendszerem külön pluginba van, amelyből olyan dolgokat, hogy be van-e jelentkezve a játékos, a felhasználó azonosítóját és hasonlókat include (native) segítségével kérem le.

------

Ha valami hülyeséget írtam, akkor megkérlek javítsatok ki, illetve ha valami nem világos/nem írtam le elég érthetően, akkor szólj/szóljatok és újrafogalmazom.

Felhasznált odalak:
Katt.
Katt.
Katt.
Katt.

_________________
2b || !2b
that is the question.

Ők köszönték meg Dooz nek ezt a hozzászólást: Vieni (2019.04.12. 16:27)
  Népszerűség: 2.27%


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Általános kérdések
HozzászólásElküldve: 2019.04.17. 18:16 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2012.10.09. 13:48
Hozzászólások: 1429
Megköszönték neki: 163 alkalommal
Nagyszerű kérdések, nagyszerű válaszok! Látjátok feleim? :)

1. Mi a külömbség a static és a new között/melyiket mikor érdemesebb használni?
Azon kívül, amit Dooz kolléga is leírt, hozzátenném, hogy a new dinamikus, míg a static a nevében is benne van, statikus, nem változó, egy meghatározott értéket szokás tárolni benne, amit utána nem módosítunk.

2. Ha két lehetőségünk van, érdemesebb if-et vagy switch-et használni? Ha az if érdemesebb, hány lehetőségtől preferálandó a switch?
Itt sajnos nem érthetek egyet Doozzal. Nem feltétlenül darabszám kérdése a felhasználás módja. A vizsgálandó elem értékétől is függ, illetve hogy olvasható legyen a kód. Közelítsük meg érték szerint a témát, mivel ez a lényege. Case feltételt akkor szokás használni, ha pontosan tudjuk, mit kell vizsgálnunk.
Kód:
switch(var) {
  case 0, 1: vagy 0, vagy 1; break;
  case 2: biztosan 2; break;
  default: minden más esetben, ha a fenti esetek nem igazak;
}

Ez if-fel is megoldható persze:
Kód:
if(var == 0 || var == 1)
  vagy 0, vagy 1;
else if (var == 2)
  biztosan 2;
else
  minden más esetben, ha a fenti feltételek nem igazak;

Melyik a rövidebb, melyik a gyorsabb? :) Na látod.
Azonban nem mindig érdemes esetvizsgálatot végrehajtani, főleg akkor nem, amikor több esetben is ugyan azt akarjuk csinálni.
Itt van még egy példa. Az értékeket pontosan tudjuk.
Kód:
switch(var) {
  case 0: TODO1;  break;
  case 1: TODO1; break;
  case 2: TODO2; break;
  case 3: TODO2; break;
  case 4: TODO2; break;
  case 5: TODO3; break;
  default: NOT_TO_DO;
}

Kód:
if(var == 0 || var == 1) /*vagy ha tartományban akarunk gondolkodni, akkor*/ if(0 <= var <= 1)
  TODO1;
else if (var == 2 || var == 3 || var == 4) /* vagy */ if(2 <= var <= 4)
  TODO2;
else if (var == 5)
  TODO3;
else
  NOT_TO_DO;


Melyik a szebb, könnyebben olvashatóbb? Na látod. Szerintem is a második. :)
Szóval ez a kérdés nagyban függ a megoldandó feladattól. Nincs konkrét szabály, mikor mit kell használni. Mikor mit érdemes viszont van.
Az utolsó példánál maradjunk.
Mit csinál a switch?
Kód:
Az érték 0? Nem. Tovább.
Az érték 1? Nem. Tovább.
Az érték 2? Nem. Tovább.
Az érték 3? Igen. Végrehajtás. Stop, ne vizsgálja tovább.

Mit csinál az if?
Kód:
Az érték 0 vagy 1? Nem. Tovább. VAGY, amit írtam. Az érték 0-val nagyobb vagy egyenlő és 1-nél kisebb vagy egyenlő? Nem. Tovább.
Az érték 2 vagy 3 vagy 4? Igen. VAGY, amit írtam. Az érték 2-nél nagyobb vagy egyenlő és 4-nél kisebb vagy egyenlő? Igen. Végrehajtás. Kilépés a feltételből.


Melyik használ több erőforrást? Szerintem is az első. Ez rossz. Törekedjünk a minél gyorsabb megvalósításra.

Remélem így már átlátod és te is tudsz dönteni. :)


3. Mi egyenlő a halmazoknál lévő "elem" kifejezéssel? Tehát, tegyük fel, hogy van egy halmazunk, benne 5 szám, akkor hogy írjuk meg, hogy ha x eleme annak a halmaznak akkor történjen valami?
Dooooooooooooooooooz. Keresés progtétel. While ciklus és ellenőrzés.
Kód:
new i = 0; // Definiáljuk a ciklusváltozót.
while (i < halmaz mérete && halmaz[i] != 5) // Ha a ciklusváltozó kisebb, mint a keresett halmaz mérete és ha a halmaz i. eleme nem egyenlő 5-tel
  i++; // Nem talááált. Keresünk tovább.

// Ha a ciklus valamelyik feltétele igaz lesz, a program ki fog lépni a ciklusból. A ciklusváltozó fogja megmondani az eredményt.

if(i < 5) // Ha a ciklusváltozó kisebb maradt, mint a halmaz mérete, azaz nem ért végig, a feltétel nem teljesült és találtunk egy olyan elemet, aminek értéke 5.
  Benne van a keresett szám a halmazban;
else // A program végig ért a cikluson, azaz nincs olyan elem, aminek értéke 5.
  Nincs benne a keresett szám a halmazban; 


Azonban ha listát, array-t használunk, arra van függvény: ArrayFindValue vagy ArrayFindString
Kód:
ArrayFindValue(Array:which, any:item);
which - Array handle - azaz melyik array-ben
item - Value to search for - melyik érték veszi fel az értéket

Return - Array index on success, -1 if the value can't be found. A visszatérési érték az elem indexe lesz, ellenkező esetben, ha nem talált, -1.


Ennek felhasználására egy példa:
Kód:
new i = ArrayFindValue(Array, 5);

if (i != -1)
  FOUND!;
else
  NOT_FOUND;

Remélem ez is hasznodra válik. Progtételt tessék megtanulni!

4. Ügye van a switch-nél egy felsorolás, ( pl. case 1..9: ) alkalmazható ez, vagy bármi hasonló máshol, a for/while leszámításával? Elsősorban nekem az index jutott eszembe, ( [1..9] ez nem egy működő dolog ügyebár ) de akár ez halmazoknál működhet valamilyen módon? ( if(x */ide jönne az elem kifejezés*/ (1..9)) )

While-ban nem használhatsz esetvizsgálatra ciklust. Ezért jobb tartományban gondolkodni, amit fentebb is leírtam, lásd 2. kérdést.

5. Mikor érdemes public-ot rakni és miért? Sokszor volt, hogy nem használtam egy-két helyen, de érdekelne, hogy mi a külömbség.
Helyes Dooz válasza. Habár a CPU használat ennél az esetnél elhanyagolható. Kivéve ha egy másik plugin végtelen ciklusban hivatkozik a függvényre. Az para. :)

6. Érdemesebb sok, kicsi, incekkel összekötött plugint csinálni vagy egy nagyot, ami akár elérheti az 5-6ezer sort? Az, hogy ilyen módon kötöm össze a pluginokat nem növeli a ram/memória használatot?
Sok kicsi sokra megy. :) Jobban átláthatóbb a kód, te is jobban eligazodsz egy rendesen felépített struktúrán, mint egy tízezer soros kódon. :)
Az erőforrás használata attól függ, hogy írják meg a kódot. :)

_________________
Minden jót! :)

Ők köszönték meg BeepBeep nek ezt a hozzászólást: Dooz (2019.04.18. 10:49)
  Népszerűség: 2.27%


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


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 3 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 és a hlmod.hu csapata
Portal: Kiss Portal Extension © Michael O'Toole