Szerző Téma: Globális változók  (Megtekintve 1041 alkalommal)

Nem elérhető rewan

  • 960
    • Profil megtekintése
Globális változók
« Dátum: 2016. Március 02. - 18:07:54 »
0
Sziasztok!
A jelenleg írt modomban néhány változót globálisként hoztam létre, így nem kell minden egyes helyen külön megcsinálni őket, de felmerült,
hogy több játékosnál(hosszabb timer futás, nagyobb lag, stb) esetleg összeakadhat, illetve egy adat így kiüthet egy másikat.
A mod elején létrehozom az X,Y,Z,A változókat(float-ok), és pl egy GetPlayerPos-nál csak beírkálom őket, vagy egy object pozíció, vagy bármi más.
Fontos szabály, hogy csak 1 \"publicon\" belül használom az adatot(1 parancs, 1 timer publicja, stb), nem viszem át máshova.
Így elképzelhető, hogy mégis felülíródik az érték?
Kényelmes és talán a szervernek is jót tesz, hogy nem kell folyton létrehoznia őket, de ha van esély a hibázásra, akkor nem éri meg.

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
Globális változók
« Válasz #1 Dátum: 2016. Március 02. - 22:07:23 »
+3
SA-MP szerver egy szálon fut, egyszer létrehozott globális változót pl. a pozíció tárolásra használhatsz húzezer helyen is, lassabb nem lesz. Csak annyi, hogy ahogy a következő GetPlayerPos lefut, a változó értéke felül lesz írva.  Ha ilyesmit akarsz csinálni, hogy lekérni a pozícióját, és megnézni hogy egy zónán belül-e van, vagy hogy Z > 50, akkor ez a megoldás ide tökéletes. Én pl. globális változót használok a jármű id lekérésére is.
Viszont itt jön a fő hátulütője az egésznek, hogy ha hülyeséget csinálsz a globális változóval, pl kihagyod, hogy beleolvasod a GetPlayerVehicleID(), akkor a fordító nem fog hibázni és az előző értékével fog lefutni a funkció. Jópárszor szoptam már ezmiatt, főleg a globális stringek miatt amiket formázásra használok. Mostnai fejjel nagyon meggololnám, hogy mire használok globális változót az előbb említett dolgok miatt, viszont a módot nemfogom újraírni  :D

Nem elérhető rewan

  • 960
    • Profil megtekintése
Globális változók
« Válasz #2 Dátum: 2016. Március 02. - 22:58:58 »
0
főleg a globális stringek miatt amiket formázásra használok.[/quote]
Igen, nálam is van már 3 külön str :D (parancs-sql-minden más felosztásra).
Akkor lehet érdemes kicsit visszább venni ebből az irányból... Főleg ha belegondolok, hányszor maradt le egy GetPlayerPos pl.
Még elgondolkozok rajta -mert viszont kényelmes és nincs változótenger 10 soronként-, köszönöm a választ. :)
Még hagynám a témát nyitva picit, hátha valakinek lesz még hozzáfűzni valója, utána zárom!

Nem elérhető Kovacs_Richard

  • 1743
  • HRP Fejlesztő
  • Discord: Kovacs_Richard#0321
    • Profil megtekintése
    • Hun Role Play Web
Globális változók
« Válasz #3 Dátum: 2016. Március 03. - 10:55:50 »
+1
Én ha egy adatot globálisan akarok felhasználni akkor globálisan hozom létre, ha lokálisan akkor lokálisan...
Kb ez nálam olyan, mintha létrehoznék egy osztályt C#-ban, és a függvényen belül összerakott stringeket egy static változóban tárolnám...nem erre való! persze van amikor direkt azért rakja össze az ember, mert onnan akarja felhasználni, de felesleges ha lokálisan akarod használni...és ugye még egy hiba forrás, mert véletlen olyan üzenetet láthat a játékos ami nem is neki szól!
És ugye ha valaki talál egy ilyen bugos parancsot amit 10000 évente 1x használunk és nem derül ki a bugja, csak ő tud róla akkor ezzel vissza is tud élni...vagy olyan üzeneteket tud olvasni amiket nem kéne, vagy olyan helyre teleportálni ahova nem kéne tudnia...
stb...
ez egy játéknál oké még kisebb gond, de egy komolyabb programnál végzetes hiba lehet...
Én pl olyan helyen dolgozok, ha egy ilyen dolog miatt hiba lenne abból elég nagy botrány lehetne...
Szóval én 1000+1x is átgondolnám miben milyen veszélyt látok...
Emberek vagyunk hibázunk, de nem mind1 milyen árat fizetünk a hibáinkért :)
1-1 ilyen rossz szokás a későbbi pályafutásodra is hatással lehet...amíg sa-mp szerveren bugot okoz az még a legkisebb probléma, de ha esetleg később egy komoly programon dolgozol és egy ilyen bug miatt valaki személyes adata kikerül abból per meg mi egyéb lehet...
Ha annyira nem akarsz mindenhol létrehozni változókat akkor inkább macroval csináld...
pl:
 
#define CREATE_LOCAL_VARS new string[128]; new tmp = 0; // ...

 
és akkor minden CallBack és Function elejére odarakod...
pl:
 
public OnPlayerConnect(playerid)
{
    CREATE_LOCAL_VARS
    // ...
    return 1;
}
Régóta nem tevékenykedem, mint SA-MP scripter.
HRP Fejlesztő.

Nem elérhető rewan

  • 960
    • Profil megtekintése
Globális változók
« Válasz #4 Dátum: 2016. Március 03. - 12:37:58 »
0
Köszönöm a választ, a kettőtök hozzászólása meggyőzött arról, hogy jobb ha félreteszem a lustaságot és létrehozok mindent helyileg.
Így belegondolva igen kellemetlen lenne egy str változóban ragadt jelszó például, főleg, hogy nem is hashelve tárolom még ott, mert
csak az sql-en alakítom át...
A macro ötleted nekem megtetszett, bár nem fogom használni, mert nem kell mindenhol string és float változó(ezekből használtam globális változókat).
Köszi még egyszer mindkettőtöknek, zárom! :)

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal