hlmod.hu
https://hlmod.hu/

Static Vs New
https://hlmod.hu/viewtopic.php?f=10&t=9736
Oldal: 1 / 1

Szerző:  Vinnice [ 2013.07.28. 08:42 ]
Hozzászólás témája:  Static Vs New

Sziasztok!

Azt szertném kérdezni ,hogy mi a különbség a

SMA Forráskód: [ Mindet kijelol ]
  1. static
és a
SMA Forráskód: [ Mindet kijelol ]
  1. new
között?

Mikor melyiket kell használni?

Én azt olvastam ,hogy a static az kevesebb cpu-t eszik, de gondolom nem lehet mindig csak static-kot használni egy pluginban.

Válaszokat előre is köszönöm.

Szerző:  Metal [ 2013.07.29. 14:32 ]
Hozzászólás témája:  Re: Static Vs New

Üdv

a "kevesebb cpu" érdekes kifejezés, bár valóban "jobb" ha jó helyen használják.

Bevezetőül:
Változót deklarálhatunk az alábbi kulcsszavak egyikével:
new, stock, public, static

Mindegyik változót hoz létre, de mindegyik kicsit eltér a másiktól, futási és/vagy fordítási különbségeket teremtve.
new: allokálja a memóriaterületet. Ha ez eljárásban történni, akkor az eljárás végén törlődik.
stock: hasonló a newhoz, a különbség fordítás időben történik: Amennyiben a változó nincs használva sehol sem, akkor a fordító nem építi bele a p-kódba. (kisebb memóriahasználatot vonva maga után, ami jó), s ezzel el tudjátok kerülni a variable is unused warningot.
public: new + az absztrakt gépe felküldi a változó nevét, s így az más pluginból elérhetővé válik (szerkeszthető, módosítható). Jó dolog, de inkább a natív az elterjedt, mivel az biztosít valamiféle interface-t, protokollt, s így szabályok is adhatóak a módosításához stb.
static: mint a new, de ha eljárásban definiálod, nem törlődik a memóriában, hanem ott marad. (Allokálási idő nem lesz, csak egyszer foglalja le, s az értékét is megtartja)

Továbbá tisztázzuk, hogy vannak
1) globális változók és
2) lokális változók

( Általában az okos, hozzáértő scriptelek (itt nem sok van, hehe :P) a globális változókat egy helyre gyűjtik, g_ pefixel (vagy simán g prefixel) ellátva, hogy tudják, ez elérhető bárhonnan, hisz a globális területen lett definiálva.)

A globális változók mindenhol elérhetőek (tehát mindig léteznek), így felesleges is staticcal deklarálni, mivel azok elérhetőek, tartalmukkal együtt.
A lokális változók azoka változók, amiket eljárásokban deklarálunk. Ezek , az eljárás lefutása végén eltűnnek a memóriából.
DE ha az eljárásban staticcal hozol létre változót, az nem törlődik ki.

newra és staticra mutatok egy egyszerű példascriptet.
Tesztelni nem teszteltem, csak szemléltetni akarom a kommentekben (isten ments, hogy valaki ezt feltegye valahova.... de ha vállalja a körberöhögést, felőlem :D), mikor "mi történik" a változóval
SMA Forráskód: [ Mindet kijelol ]
  1.  
  2. #include <amxmodx>
  3.  
  4. new bool:g_isAlive[33]
  5.  
  6. public plugin_init()
  7. {
  8. // Code
  9. }
  10.  
  11. public client_disconnect(id)
  12. {
  13. g_isAlive[id] = false; // Globális változó, ez bárhonnan elérhető
  14. }
  15.  
  16. public client_connect(id)
  17. {
  18. new Float:delay = 5.0; // csak lokális, eljárás után megszűnik
  19. set_task(delay, "print_task", id + 1337);
  20. g_isAlive[id] = false; // Globális változó, ez bárhonnan elérhető
  21. }
  22.  
  23.  
  24. public print_task(taskid)
  25. {
  26. new id = taskid - 1337;
  27.  
  28. static message[100]; // Egyszer lefoglalod, s a memóriában bent marad
  29. client_print(id, print_chat, message); // Elso futaskor ures stringet fog irni. majd ezt: "Ez itt egy udvozlo szovegecske"
  30. // A masodik plaernek meg ezt fogja irni 2*: "Ez itt egy udvozlo szovegecske"
  31.  
  32. if (!is_user_alive(id))
  33. {
  34. // set_task(Delay, "print_task", taskid); // Itt hiba lesz, delay csak a connect fgvben definiált. Átírjuk így 5.0-ra:
  35. set_task(5.0, "print_task", taskid);
  36. }
  37. else
  38. {
  39. format(message, 100, "Ez itt egy udvozlo szovegecske")
  40. client_print(id, print_chat, message);
  41. }
  42. }

Szerző:  Vinnice [ 2013.07.29. 15:03 ]
Hozzászólás témája:  Re: Static Vs New

Még egy kérdés.
Ezt lehet így is vagy csak a new operátorral?
SMA Forráskód: [ Mindet kijelol ]
  1. static bool:valami[33];

Szerző:  JoGoBeLLa [ 2013.07.29. 15:05 ]
Hozzászólás témája:  Re: Static Vs New

Vinnice írta:
Még egy kérdés.
Ezt lehet így is vagy csak a new operátorral?
SMA Forráskód: [ Mindet kijelol ]
  1. static bool:valami[33];

Szerintem csak new. operátorral.

Szerző:  kiki [ 2013.07.29. 15:42 ]
Hozzászólás témája:  Re: Static Vs New

Kikell próbálni, biztos lehet. De boolt inkább globálisan szoktuk többségben használni.

Szerző:  Metal [ 2013.07.29. 19:47 ]
Hozzászólás témája:  Re: Static Vs New

WRONG WRONMG és WRONG
Ahogy írtam, változókat ezekkel a kulcsszavakkal lehet deklarálni:
new, static, stock, public
A bool az egy TAG, ami osztályozza a változót.

Tehát ez így helyes:
Kód:
static bool:g_isAlive[33]


változódeklaráció szintaxisa:
<new, stock, static, public> [TAG:]<változó>

Olyan h általában globálisan használjuk, az irreleváns... tudsz olyan plugint is írni, amihez nincsenek globális változók, sőt, olyat is, amiben a bool változók mind csak eljárásokban vannak.
Ez az állítás így értelmetlen, logikátlan, számomra feldolgozhatatlan kijelentés...

Szerző:  Silent [ 2013.07.29. 20:36 ]
Hozzászólás témája:  Re: Static Vs New

Metal :DDDDDDDD NEMVAGYOKIDEGEES WRONGWRONG :DDDD

Egyébként a new az közelsem operátor..

+, -, *, &, :, =, ||, <, >, !

ezek operátorok..

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