Jump to content

návod Používáni polí [****]


ATomas

Recommended Posts

Obtížnost: :4:

 

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 údaje

Takž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ží fizeof

takž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 ji

Lze 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 :d

ú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 enumu
obdobně 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

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 by Tango
Link to comment
Share on other sites

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

  • 3 weeks later...

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

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

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

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

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

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 :d a stejnak ti nekdo tezko pomuze kdyz ukazes jenom pulku kodu...

Link to comment
Share on other sites

Akorat tim jsi v tom udelal jeste vetsi zmatek :d 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 :d ..ten kód na to bohato stačil ;)

Link to comment
Share on other sites

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 :d ..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 :d

Link to comment
Share on other sites

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 :d 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

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 :d Ten cyklus mi nacitaval o jednu polozku v array ako ich bolo...respektive chcel nacitat, preto to padalo :)

Vsak to jsem rikal :d

Link to comment
Share on other sites

  • 3 months later...

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

 

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 ? :d to co jsi tu ukazal je v tom prvnim topicu :d

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...