ATomas 286 Odesláno: 14. Leden, 2014 Share Odesláno: 14. Leden, 2014 Obtížnost: Zdravím,už je to několik let co se věnuji pawnu, ale pořád vídám, že level "pawnení" se na tomto fóru nějak zasekl a vesměs všíchni pouzívají ten stejný systém jak něco napawnit.Chtěl bych ukázat jak pracovat s proměnýmy typu pole. Většina lidí proměnou typu pole používá jen pro text nebo pro "playerid" a nemá ani páru ja kto vlastne funguje.Proměná pole je shluk za sebou jdoučích proměných. new pole[5]; = pole[0], pole[1], pole[2], pole[3], pole[4] new pole[10]; = pole[0], pole[1] .. pole[8], pole[9] Důležitým poznatkem je, že pokud je pole o rozměru 10 tak nejvyšší proměná je 9. Proč? protože začínáme nulou !Takže to "playerid" (Často to nazýváte proměnou pro hráče) je vlastně pole se kterým pracujete právě podle id daného hráče.A jak že funguje ten string? tak jsou preči písmena a ne čísla. Omyl!string(nejčastější pojmenování proměnné pole pro text) obsahuje čísla, a podle těchto čísel se zobrazují znaky z tabulky znaků. Protože má každý znak své pořadové číslo.Proměnná pole může mít i více než jeden rozměr (rozměrem rozumíme [] a v tom to číslo je celikost pole).Nejvíce lze udělat 3 rozměrné pole. Lze udělat i čtyřrozměrné, ale o tom pozdeji.. new pole[5][10]; = celkem 50 proměných, jakto? protože: pole[0][0], pole[0][1] .. pole[4][8], pole[4][9] new pole[5][10][15]; = celkem 750 proměných No konec té nudné teorie a teď si ukážeme jak nám to dokáže usnadnit život.Proměné pole (stejně jako te klasíské), lze nastavit nějakou hosnotu, kterou na začástku bude mít. A protože je to pole, tak jich lze nastavit více najednou, ale jak nato? lehce: new pole[5] = { 1, 5, 10, 6, 3, }; Tímto jsme dosahli tohoto: pole[0] = 1; pole[1] = 5; pole[2] = 10; pole[3] = 6; pole[4] = 3; No neni to pomohlnější ? Někteří řeknou že to vyjde nastejno, a vyní Vám ukážu, co nastejno určite nevýjde new pole[2][2] = { {0,1}, {2,3} }; A cože jsme to vlastne napsali? pole[0][0] = 0; pole[0][1] = 1; pole[1][0] = 2; pole[1][1] = 3; A pro trojrozměrné pole: new pole[][][] = { { {0,1}, {2,3} }, { {4,5}, {6,7} } }; tj. pole[0][0][0] = 0; pole[0][0][1] = 1; pole[0][1][0] = 2; pole[0][1][1] = 3; pole[1][0][0] = 4; pole[1][0][1] = 5; pole[1][1][0] = 6; pole[1][1][1] = 7; Tady už to stojí zato ne ? Určite jste si všimly, že tam najednou nejsou vyplměna velikosti polí. Ne nezapoměl jsem nato Ale komu by se chtělo u komplikovanějších a zdlouhavých proměných to počítat ? A hlavně, jakmile tam napíšete špatné číslo, tak si bude pawno stěžovatz, že bud je proměná malá nebo zase moc velká a nejsou nastaveny všechny údajeTakže to nemusíme řešit, protože pri kompilaci si tam pawno samo ty čísla dosadí.Ale určite si říkáte, že potřebujete vědět jak jsou pole velká kvůli použití ve sciptu.Nato nám slouží fizeoftakže pokud chceme velikost prvního rozměru použijeme sizeof(pole), pokud chcete druhý rozměr tak sizeof(pole[]) a pokud třetí tak sizeof(pole[][])A kde to v praxi použít?Jistě znáte takové ty systémy, kde máte AddNeco(123.4,236.1,1263.1,0,-1,"Text");Pak máte nějaká callback, kte se to nahrává do proměných a nějakou proměnou (nejčastějí count) si pocítáte kolik jich je naháno, a když máte malou proměnou tak zase musíte v gamemodu listovat a zvětšovat jiLze to řešit jednoduše, a pokud potřebujete do proměné pole nastavit více druhu proměných (integer, float atp..) poslouží vám k tomu enum enum ADD_INFO { Float:add_x, Float:add_y, Float:add_z, add_int, add_m, add_text[64], add_vec } new AddPromena[][ADDINFO] = { {123.4,236.1,1263.1,0,-1,"Text"},//pokud máte v enumu více údaju, něž nastavujete, ničemu to nevadí, když jim nenastavíte hodnotu, proste budou mit 0 {1263.11,23.4,236.1,1,-1,"Text2"} }; Tím jsme docílili tohoto: AddPromena[0][add_x] = 123.4; AddPromena[0][add_y] = 236.1; AddPromena[0][add_z] = 1263.1; AddPromena[0][add_int] = 0; AddPromena[0][add_m] = -1; AddPromena[0][add_text] = "Text"; AddPromena[0][add_vec] = 0; AddPromena[1][add_x] = 1263.11; AddPromena[1][add_y] = 23.4; AddPromena[1][add_z] = 236.1; AddPromena[1][add_int] = 1; AddPromena[1][add_m] = -1; AddPromena[1][add_text] = "Text2"; AddPromena[1][add_vec] = 0; Výhoda tohoto je ta, že nemusíte mít žádný callback pro nahrávání do proměných aní žádný count a nemusíte si hlídat velikost proměné. Prostě píšete a o nic se nestaráte, když potřebujete v kodu vědět kolik těch add je použijete sizeof(AddPromena) a jeto.Ovšem jedno důležité pravidlo pro správnou funkčnost, ty údaje v ennum musí jít přesně za seboutak, jak je zadáváte do té proměné.Pokud jste si všimli, tak i do enumu lze použít pole, ovšem jen jeden rozměr, takže pokud máme trojrozměrnou proměnou s enum kde je jeden rozměr, získáváme 4 rozměry. enum POLE_INFO { p_neco[12] } new pole[5][5][POLE_INFO]; pole[0][0][p_neco][0] = hodnota; Vidíte 4 rozměry jsou na světe údaje v enumu jsou chápana jako čísla a pokud v enumu potřebuje udělat mezeru, lze to enum POLE_INFO { p0,//0 p1,//1 p5 = 5,//5 p6,//6 p7,//7 } tímto jsme vytvořili enum o velikosti 8, tj 0,1,2,3,4,5,6,7 a tím že jsme 2,3,4 nedefinovali v enumuobdobně to lze i s násobevím, a lze i enumu nastavit, aby ty údaje v ní napsané mněli hodnoty ob, což jsem nikdy nevyužil, koho by to zajímalo jeto na wikině Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený. Link to comment Share on other sites More sharing options...
Tanga 131 Odesláno: 14. Leden, 2014 Share Odesláno: 14. Leden, 2014 (upraveno) KONEČNE PORIADNY NÁVOD.5/5 Ani som nečítal.Mám len otázku, existuje niečo ako "ukazovatele" v pawn?Lebo niektoré procedúry (getvehicleparams, ...) nevracajú hodnotu returnom, ale nastavujú použité argumenty na zistenú hodnotu.A štyri rozmery tu vždy boli.. Len niektorí prešli do štvrtej dimenzie 21.12.2012.. Máš velké medzery v tejto oblasti.. xD Edited 14. Leden, 2014 by Tango Link to comment Share on other sites More sharing options...
ATomas 286 Odesláno: 14. Leden, 2014 Author Share Odesláno: 14. Leden, 2014 KONEČNE PORIADNY NÁVOD. 5/5 Ani som nečítal. Mám len otázku, existuje niečo ako "ukazovatele" v pawn? Lebo niektoré procedúry (getvehicleparams, ...) nevracajú hodnotu returnom, ale nastavujú použité argumenty na zistenú hodnotu. A štyri rozmery tu vždy boli.. Len niektorí prešli do štvrtej dimenzie 21.12.2012.. Máš velké medzery v tejto oblasti.. xD Ano jsou, staci pouzit: stock neco(&promena) { promena = 5; } new Ukazatel; neco(Ukazatel); A Ukazatel ma hodnotu 5 Link to comment Share on other sites More sharing options...
Amenadiel 286 Odesláno: 18. Leden, 2014 Share Odesláno: 18. Leden, 2014 No tak díky ;D Docela dobrá rada. Link to comment Share on other sites More sharing options...
Globální moderátor Hip 191 Odesláno: 18. Leden, 2014 Globální moderátor Share Odesláno: 18. Leden, 2014 parádní.. dnes jsem se opravdu zase přiučil Link to comment Share on other sites More sharing options...
Frajtr 8 Odesláno: 18. Leden, 2014 Share Odesláno: 18. Leden, 2014 HARD ? hm nevim , pěkně si to rozepsal ale pvars to jistí ... Link to comment Share on other sites More sharing options...
ATomas 286 Odesláno: 19. Leden, 2014 Author Share Odesláno: 19. Leden, 2014 HARD ? hm nevim , pěkně si to rozepsal ale pvars to jistí ... Tohle jsou pole PVar je uplne neco jineho Link to comment Share on other sites More sharing options...
PiratesOfSamp 1 Odesláno: 6. Únor, 2014 Share Odesláno: 6. Únor, 2014 To asi nepochopim ale budu se snažit Link to comment Share on other sites More sharing options...
Mattsy 29 Odesláno: 13. Únor, 2014 Share Odesláno: 13. Únor, 2014 Výborné vysvetlené...nemohol by si urobiť tut aj na pokročilejšú prácu s poľami?? Myslím tým cyklusy a podmienky. Pýtam sa pretože pracujem na niečom a trápim sa s jednou vecou. Mám urobené dvojpole cez enum a v ňom prvý integer a potom súradnice ale ak v cykluse chcem porovnať integer v poli s premenou ktorú má hráč tak mi to vypíše SERVER: Unknown command. Konkrétnejšie: for(new i; i < MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { for(new v; v < sizeof(array); v++) { if(array[v][integer] == enum[i][premena]) { a[b] = v; b++; } } n = a[random(]; } } Je to callback ktorý vyvolávam cez príkaz. Myslím si že chyba je v podmienke čo som to prechádzal bod po bode, ale neviem prečo. Link to comment Share on other sites More sharing options...
ATomas 286 Odesláno: 13. Únor, 2014 Author Share Odesláno: 13. Únor, 2014 Výborné vysvetlené...nemohol by si urobiť tut aj na pokročilejšú prácu s poľami?? Myslím tým cyklusy a podmienky. Pýtam sa pretože pracujem na niečom a trápim sa s jednou vecou. Mám urobené dvojpole cez enum a v ňom prvý integer a potom súradnice ale ak v cykluse chcem porovnať integer v poli s premenou ktorú má hráč tak mi to vypíše SERVER: Unknown command. Konkrétnejšie: for(new i; i < MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { for(new v; v < sizeof(array); v++) { if(array[v][integer] == enum[i][premena]) { a[b] = v; b++; } } n = a[random(]; } } Je to callback ktorý vyvolávam cez príkaz. Myslím si že chyba je v podmienke čo som to prechádzal bod po bode, ale neviem prečo. Toto je pokrocilejsi tut na pole. To s cim chces ty pomoct se az tolik poli netyka, jako spis zapsani te podminky. Kazdopadne chybu vidim v tom ze nemuzes promenou nazvat "enum" protoze toto slovo je uz v pawnu zabrane pro neco jineho... Link to comment Share on other sites More sharing options...
Mattsy 29 Odesláno: 13. Únor, 2014 Share Odesláno: 13. Únor, 2014 Nenazval som ju enum...nekopíroval som to z kódu, len som to napísal tak aby si pochopil čo je čo...premena sa vola Info[nieco]...no ono chyba je zrejme v tom array[v]....hore to mám len ako new array[][array_enum] = { {1, 1.0, 2.0, 3.0} } Link to comment Share on other sites More sharing options...
_Martin_ 10 Odesláno: 13. Únor, 2014 Share Odesláno: 13. Únor, 2014 Mattsy tiež som mal problém keď som používal pole v cykle a vrátilo Unknown command. Týpek na SA-MP fóre mi prerobil tú podmienku v cykle na toto for (new v; v != sizeof (array); ++v) a odvtedy mi to nevypisuje. Link to comment Share on other sites More sharing options...
Mattsy 29 Odesláno: 13. Únor, 2014 Share Odesláno: 13. Únor, 2014 Mattsy tiež som mal problém keď som používal pole v cykle a vrátilo Unknown command. Týpek na SA-MP fóre mi prerobil tú podmienku v cykle na toto for (new v; v != sizeof (array); ++v) a odvtedy mi to nevypisuje. Mne to bohužiaľ nefunguje...tiež to rieším aj na samp fore a výsledok zatiaľ nula bodov :-/ akurát sa mi potvrdilo to že chyba je v cykluse a podmienke...konkrétne to v EDIT: Tak vlastne bol aj v tomto problém ale teraz mám problém s tým randomom... EDIT #2: všetko vyriešené Link to comment Share on other sites More sharing options...
ATomas 286 Odesláno: 15. Únor, 2014 Author Share Odesláno: 15. Únor, 2014 Nenazval som ju enum...nekopíroval som to z kódu, len som to napísal tak aby si pochopil čo je čo...premena sa vola Info[nieco]...no ono chyba je zrejme v tom array[v]....hore to mám len ako new array[][array_enum] = { {1, 1.0, 2.0, 3.0} } Akorat tim jsi v tom udelal jeste vetsi zmatek a stejnak ti nekdo tezko pomuze kdyz ukazes jenom pulku kodu... Link to comment Share on other sites More sharing options...
Mattsy 29 Odesláno: 15. Únor, 2014 Share Odesláno: 15. Únor, 2014 Akorat tim jsi v tom udelal jeste vetsi zmatek a stejnak ti nekdo tezko pomuze kdyz ukazes jenom pulku kodu... Bolo to v cykluse Jednoduchá chyba...ako vždy...tie najťažšie veci sú vždy najjednoduchšie...alebo aspoň majú najjednoduchšie riešenia ..ten kód na to bohato stačil Link to comment Share on other sites More sharing options...
ATomas 286 Odesláno: 15. Únor, 2014 Author Share Odesláno: 15. Únor, 2014 Bolo to v cykluse Jednoduchá chyba...ako vždy...tie najťažšie veci sú vždy najjednoduchšie...alebo aspoň majú najjednoduchšie riešenia ..ten kód na to bohato stačil Jo to tak byva. ale bez definice promenych nemohl nikdo vedet ze zasahujes do neexistujici promene, nebo spis to jsem vedel, ale nevedel jsem kde, protoze jsem nevedel jak mas ty pole velke Link to comment Share on other sites More sharing options...
Mattsy 29 Odesláno: 15. Únor, 2014 Share Odesláno: 15. Únor, 2014 Ono chyba bola len v znamienku....som to zistil cez plugin a potom som mal chybu v randome co som ani netusil....ale to bolo uz len mojou nepozornostou...zadaval som zly prikaz ako som upravoval Ten cyklus mi nacitaval o jednu polozku v array ako ich bolo...respektive chcel nacitat, preto to padalo Link to comment Share on other sites More sharing options...
ATomas 286 Odesláno: 15. Únor, 2014 Author Share Odesláno: 15. Únor, 2014 Ono chyba bola len v znamienku....som to zistil cez plugin a potom som mal chybu v randome co som ani netusil....ale to bolo uz len mojou nepozornostou...zadaval som zly prikaz ako som upravoval Ten cyklus mi nacitaval o jednu polozku v array ako ich bolo...respektive chcel nacitat, preto to padalo Vsak to jsem rikal Link to comment Share on other sites More sharing options...
Risontek 0 Odesláno: 24. Květen, 2014 Share Odesláno: 24. Květen, 2014 Dá sa s ENUMom urobiť pekné štruktúry enum _:StrukturaProfilu { Class:trieda, level, xp, opis[64], vyska } new Profiles[100][StrukturaProfilu]; stock Class:vrat_triedu(id) return Profiles[id][trieda]; stock vrat_xp(id) return Profiles[id][xp]; stock vrat_opis(id) return Profiles[id][opis]; stock nastav_xp(id) { Profiles[id][xp] = xp; } Link to comment Share on other sites More sharing options...
ATomas 286 Odesláno: 24. Květen, 2014 Author Share Odesláno: 24. Květen, 2014 Dá sa s ENUMom urobiť pekné štruktúry enum _:StrukturaProfilu { Class:trieda, level, xp, opis[64], vyska } new Profiles[100][StrukturaProfilu]; stock Class:vrat_triedu(id) return Profiles[id][trieda]; stock vrat_xp(id) return Profiles[id][xp]; stock vrat_opis(id) return Profiles[id][opis]; stock nastav_xp(id) { Profiles[id][xp] = xp; } A co ses nam timto snazil rict ? to co jsi tu ukazal je v tom prvnim topicu Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now