DUŽINA STRINGOVAUvodVećina PAWN skriptera je nekako zakljuÄila da dužina svakog stringa mora biti 256. Isto tako su zakljuÄili da je najveći mogući string veliÄine 256. Za to su najverovatnije kriv GodFather koji je skoro najviÅ¡e koriÅ¡teni gamemod u SA:MPu. U GodFatheru su SVI stringovi 256. I kada pocetnik skripter promatra skriptu vjerovatno je to svjesno ili nesvjesno uoÄio i sad to koristi
Objašnjenje stringaString u PAWNu je zapravo array slova. On je null terminated odnosno završava s \0 (ASCII kod: 0)
new
string[8] = "Pozdrav";
Taj string je zapravo dug 8 Äelija zbog toga jer je duljina teksta 7 Äelija te joÅ¡ jednu Äeliju zauzima /0.
To se može napisati i ovako
new
string[8] = {'P','o','z', 'd','r', 'a','v','\0'};
Ili:
new
string[8] = {80, 111, 122, 100, 114, 97, 118, 0};
ZnaÄi 80,111,122,100,114,97 i 118 su slova a 0 je null terminator koji zavrÅ¡ava string.
Kada vi napravite ovo:
new
string[256];
Vi zapravo svaki cell od njih 256 stavljate na 0 što traje
Zašto ne koristiti 256?Sporo je zbog toga jer vi stavljate 256 cellova na 0 što traje.
Predpostavimo da je vaÅ¡ najveći admin level 9999. I Å¡to se onda dogaÄ'a. Recimo da želite formatirati string da ispiÅ¡e vaÅ¡ admin level:
format(string,sizeof(string),"Moj admin level je %i", adminlvl);
I sad imamo 20Äelija teksta + MAXIMALNO 4Äelija koje nam trebaju za adminlvl + 1Äelija za null(/0)
ZnaÄi da nam treba MAKSIMALNO 25 Äelija. Ako vi stavite 256 onda zauzmete 924bajta u serverskoj memoriji koji vam za niÅ¡ta ne služe (to je skoro kilobajt !!!)
- Maksimalni input u SA:MPu je 128
S obzirom da je najveći mogući input u SA:MPu 128 slova, zašto koristiti duplo veći string da bi ga spremili?
- Maksimalni output u SA:MPu je 128
Ako radite komandu tipa /ooc, nemojte koristiti 256 zbog toga jer je najveći mogući output 128 pa bi onda bezveze napravili 512bajta u serverskoj memoriji ako ih nikad nećemo koristiti.
public OnPlayerCommandText(playerid, cmdtext[])
{
new
string[256],
cmd[256];
cmd = strtok(cmdtext, idx);
if (strcmp(cmd, "/broj", true) == 0)
{
format(string, sizeof (string), "Nasumicni broj: %d", random(27));
SendClientMessage(playerid, 0xFF0000AA, string);
}
}
Ovdje je puno stvari loÅ¡e napravljeno. Za poÄetak koristi se strtok i loÅ¡ procesor komandi. Ali to ću obraditi sljedeći put.
new
string[256],
cmd[256];
ZaÅ¡to dvije, kada već server zna koja komanda je stisnuta zaÅ¡to ponovo ne iskoristiti isti string kada vam viÅ¡e netreba. Samo povecavate duljinu i koliÄinu podataka na serveru.
new
string[256];
Zašto 256 kad je najveći input/output SA:MPa 128.
Bolja verzija bi bila
public OnPlayerCommandText(playerid, cmdtext[])
{
new
string[128]; // cmdtext nikad neće biti veći od 128
string = strtok(cmdtext, idx);
if (strcmp(string, "/broj", true) == 0)
{
format(string, sizeof (string), "Nasumicni broj: %d", random(27));
SendClientMessage(playerid, 0xFF0000AA, string);
}
}
Kada da koristim 256?Kada je potrebno, ponekad su veliki stringovi i viÅ¡e nego potrebni. NajÄešće u SQL queryima i Äitanju podataka, ali i onda vrijedi sve ovo gore.
SQL querysi mogu biti jako dugi, ali opet vrijedi sve ovo gore. nemojte stavljati 256, 512 ili 1024 Äim vidite query.
U sluÄaju kad neznate koliko će biti velik fajl koji Äitate se može koristiti 256 samo da pokrijete sve moguÄnosti.
CREDITS: LordShigi - Pisanje Tutoriala
Y-Less pisanje tutoriala na engleskom s kojeg su preuzeti mnogi sadržaji.
odlicno. brate. sam nist jos ne kontam. xD
Odlicno si to napravio! Vidio sam to na SA:MP forumu od Y-Lessa, ali sad je ovo super sto je sad i na Balkan SA:MP-u ;)
Ne, nego preveo kako treba. To ti se tako prevodi u hrvatskom.