Přejít na obsah

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



  • Pokud chcete odpovědět, přihlaste se
19 odpovědí

#1
ATomas

ATomas

    RZE for life, SP for ever !

  • Ověřený uživatel
  • Příspěvků: 2 821
  •   

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ě :)

 

[success='Ověřený návod']Tento návod prošel validací, a lze ho proto považovat za ověřený.[/success]


  • 0


play.superparba.eu:7777
www.superparba.eu
pawno.cz kazí dva typy lidí:
1. "Najdi do to na googlu/wiki" <- sakra tak od toho je tu ta sekce help ne ? Protože to asi nenašel / nepochopil / neví
2. Ovce. <- Člověk by se mohl smát kdyby to nebylo tak smutné jak tu někdo zavedl termín kid/děcko a všichni ho začali bezhlavě používat na každého, kdo se jenom opováží na něco zeptat nebo projevit svůj nazor.

#2
Tanga

Tanga

    Dieta internetu

  • Uživatel
  • Příspěvků: 1 142

Uživatelova ocenění

        

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


Upraveno uživatelem Tango: 14 leden 2014 - 17:59:57

  • 0

“The only Zen you find on the tops of mountains is the Zen you bring up there.” ~Robert M. Pirsig

 

96b259ac47244701b5097887d9439120.png

 

Ku kódu nezabudnite priložiť SSCCE.

Spoiler

#3
ATomas

ATomas

    RZE for life, SP for ever !

  • Ověřený uživatel
  • Příspěvků: 2 821
  •   

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


  • 0
play.superparba.eu:7777
www.superparba.eu
pawno.cz kazí dva typy lidí:
1. "Najdi do to na googlu/wiki" <- sakra tak od toho je tu ta sekce help ne ? Protože to asi nenašel / nepochopil / neví
2. Ovce. <- Člověk by se mohl smát kdyby to nebylo tak smutné jak tu někdo zavedl termín kid/děcko a všichni ho začali bezhlavě používat na každého, kdo se jenom opováží na něco zeptat nebo projevit svůj nazor.

#4
Amenadiel

Amenadiel

    Ken Rosenberg

  • Uživatel
  • Příspěvků: 2 383
  •   

Steam Profile


       

No tak díky ;D Docela dobrá rada.


  • 0

#5
Hip

Hip

    Maria Latore

  • Uživatel
  • Příspěvků: 2 590

Steam Profile

parádní.. :) dnes jsem se opravdu zase přiučil :)


  • 0

#6
Frajtr

Frajtr

    Madd Dog

  • Uživatel
  • Příspěvků: 1 613

HARD ? hm nevim , pěkně si to rozepsal ale pvars to jistí ...


  • 0

#7
ATomas

ATomas

    RZE for life, SP for ever !

  • Ověřený uživatel
  • Příspěvků: 2 821
  •   

HARD ? hm nevim , pěkně si to rozepsal ale pvars to jistí ...

Tohle jsou pole PVar je uplne neco jineho :d


  • 0
play.superparba.eu:7777
www.superparba.eu
pawno.cz kazí dva typy lidí:
1. "Najdi do to na googlu/wiki" <- sakra tak od toho je tu ta sekce help ne ? Protože to asi nenašel / nepochopil / neví
2. Ovce. <- Člověk by se mohl smát kdyby to nebylo tak smutné jak tu někdo zavedl termín kid/děcko a všichni ho začali bezhlavě používat na každého, kdo se jenom opováží na něco zeptat nebo projevit svůj nazor.

#8
PiratesOfSamp

PiratesOfSamp

    Zero

  • Uživatel
  • Příspěvků: 46

To asi nepochopim ale budu se snažit :d


  • 0

#9
Mattsy

Mattsy

    Rovinky jsou pro rychlá auta. Zatáčky jsou pro rychlé jezdce

  • Uživatel
  • Příspěvků: 3 283

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(b)];
}
}

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.


  • 0

!!! NIE SOM MATESSS A NEMÁM SHOOTER !!!

SVK_Mattsy.png
4e79071dddeb7643ddf3a57f06616a26.png


#10
ATomas

ATomas

    RZE for life, SP for ever !

  • Ověřený uživatel
  • Příspěvků: 2 821
  •   

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(b)];
}
}

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


  • 0
play.superparba.eu:7777
www.superparba.eu
pawno.cz kazí dva typy lidí:
1. "Najdi do to na googlu/wiki" <- sakra tak od toho je tu ta sekce help ne ? Protože to asi nenašel / nepochopil / neví
2. Ovce. <- Člověk by se mohl smát kdyby to nebylo tak smutné jak tu někdo zavedl termín kid/děcko a všichni ho začali bezhlavě používat na každého, kdo se jenom opováží na něco zeptat nebo projevit svůj nazor.

#11
Mattsy

Mattsy

    Rovinky jsou pro rychlá auta. Zatáčky jsou pro rychlé jezdce

  • Uživatel
  • Příspěvků: 3 283

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[i][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} }


  • 0

!!! NIE SOM MATESSS A NEMÁM SHOOTER !!!

SVK_Mattsy.png
4e79071dddeb7643ddf3a57f06616a26.png


#12
_Martin_

_Martin_

    Moderátor

  • Uživatel
  • Příspěvků: 810

Steam Profile


                           

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.


  • 0

Vg-logo.png

         IP: reborn.synbian.eu:7777


#13
Mattsy

Mattsy

    Rovinky jsou pro rychlá auta. Zatáčky jsou pro rychlé jezdce

  • Uživatel
  • Příspěvků: 3 283

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é :)


  • 0

!!! NIE SOM MATESSS A NEMÁM SHOOTER !!!

SVK_Mattsy.png
4e79071dddeb7643ddf3a57f06616a26.png


#14
ATomas

ATomas

    RZE for life, SP for ever !

  • Ověřený uživatel
  • Příspěvků: 2 821
  •   


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[i][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...


  • 0
play.superparba.eu:7777
www.superparba.eu
pawno.cz kazí dva typy lidí:
1. "Najdi do to na googlu/wiki" <- sakra tak od toho je tu ta sekce help ne ? Protože to asi nenašel / nepochopil / neví
2. Ovce. <- Člověk by se mohl smát kdyby to nebylo tak smutné jak tu někdo zavedl termín kid/děcko a všichni ho začali bezhlavě používat na každého, kdo se jenom opováží na něco zeptat nebo projevit svůj nazor.

#15
Mattsy

Mattsy

    Rovinky jsou pro rychlá auta. Zatáčky jsou pro rychlé jezdce

  • Uživatel
  • Příspěvků: 3 283

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 ;)


  • 0

!!! NIE SOM MATESSS A NEMÁM SHOOTER !!!

SVK_Mattsy.png
4e79071dddeb7643ddf3a57f06616a26.png


#16
ATomas

ATomas

    RZE for life, SP for ever !

  • Ověřený uživatel
  • Příspěvků: 2 821
  •   

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


  • 0
play.superparba.eu:7777
www.superparba.eu
pawno.cz kazí dva typy lidí:
1. "Najdi do to na googlu/wiki" <- sakra tak od toho je tu ta sekce help ne ? Protože to asi nenašel / nepochopil / neví
2. Ovce. <- Člověk by se mohl smát kdyby to nebylo tak smutné jak tu někdo zavedl termín kid/děcko a všichni ho začali bezhlavě používat na každého, kdo se jenom opováží na něco zeptat nebo projevit svůj nazor.

#17
Mattsy

Mattsy

    Rovinky jsou pro rychlá auta. Zatáčky jsou pro rychlé jezdce

  • Uživatel
  • Příspěvků: 3 283
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 :)
  • 0

!!! NIE SOM MATESSS A NEMÁM SHOOTER !!!

SVK_Mattsy.png
4e79071dddeb7643ddf3a57f06616a26.png


#18
ATomas

ATomas

    RZE for life, SP for ever !

  • Ověřený uživatel
  • Příspěvků: 2 821
  •   

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


  • 0
play.superparba.eu:7777
www.superparba.eu
pawno.cz kazí dva typy lidí:
1. "Najdi do to na googlu/wiki" <- sakra tak od toho je tu ta sekce help ne ? Protože to asi nenašel / nepochopil / neví
2. Ovce. <- Člověk by se mohl smát kdyby to nebylo tak smutné jak tu někdo zavedl termín kid/děcko a všichni ho začali bezhlavě používat na každého, kdo se jenom opováží na něco zeptat nebo projevit svůj nazor.

#19
Risontek

Risontek

    Zero

  • Uživatel
  • Příspěvků: 26

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;
}

  • 0
Programmer - HTML , CSS , PHP , C , PAWN

#20
ATomas

ATomas

    RZE for life, SP for ever !

  • Ověřený uživatel
  • Příspěvků: 2 821
  •   

 

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


  • 0
play.superparba.eu:7777
www.superparba.eu
pawno.cz kazí dva typy lidí:
1. "Najdi do to na googlu/wiki" <- sakra tak od toho je tu ta sekce help ne ? Protože to asi nenašel / nepochopil / neví
2. Ovce. <- Člověk by se mohl smát kdyby to nebylo tak smutné jak tu někdo zavedl termín kid/děcko a všichni ho začali bezhlavě používat na každého, kdo se jenom opováží na něco zeptat nebo projevit svůj nazor.





Také označeno jedním nebo více klíčovými slovy: Návod

0 uživatelů si prohlíží toto fórum

0 uživatelů, 0 návštěvníků 0 anonymních uživatelů

© 2015 IPS, Inc.

Zajímat Vás mohou ještě aktuální zprávy. sleviště, slevy dnes Herbalife je skvělou cestou pro dobré zdraví. Je libo dětský web?