Přejít na obsah

Variabilní počet parametrů a práce s nimi [****]

samp sa-mp Pawn tutorial parametr argument vEnd v3nd3tt4 tut

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

#1
vEnd

vEnd

    Emmet

  • Globální moderátor
  • Příspěvků: 606

*
POPULÁRNÍ

Zdravím, zase po dlouhé době jsem se rozhodl zde publikovat jeden ze svých návodů. Předem říkám, že se nejedná o nic, čemu by se měli věnovat začátečníci, takže pozdější dotazy typu "Co je to if? Co je to funkce? Co je to pawn?" budou pravděpodobně ignorovány. Řeč bude o variabilních parametrech funkce a práce s těmito parametry.
 
Obtížnost: :4:

 

Obsah

1. Úvod - základní principy a pojmy

2. Konstantní vs. variabilní parametry; kombinované parametry

3. Datové typy / tagy variabilních parametrů

4. numargs, getarg, setarg

5. Pořadí parametrů

 

Úvod

Než se do toho pustíme, uveďme a vysvětleme si pojmy, se kterými budeme pracovat. Je-li řeč o parametru (nebo také argumentu), je tím myšlen parametr/argument funkce. Variabilním (proměnným) počtem parametrů myslíme takové parametry, jejichž počet při definici funkce není pevně daný. To znamená, že při volání funkce můžeme dosadit vždy různý počet parametrů. Konec řečí, jdeme si ukázat, jak na to.

 

Konstantní vs. variabilní parametry

Ve většině případů pracujete s funkcemi, které mají konstantní (neměnný) počet parametrů. Může jít například o následující, notoricky známou funkci:

SendClientMessage(playerid,color,const message[]);

_

Při jejím volání se očekává, že pokaždé dosadíme 3 parametry (ID hráče, barvu zprávy a text zprávy), takže volání může vypadat například následovně: SendClientMessage(0,-1,"You're noob.").

 

Pak tu jsou ale funkce, které mají variabilní (proměnný) počet parametrů. Příkladem nám může být mnou definovaná funkce pro sčítání libovolného počtu celých čísel:

MultiSum(...)
{
    new num = numargs(),sum;
    for(new i;i<num;i++) sum += getarg(i);
    return sum;
}

_

Když budeme volat tuto funkci, můžeme dosadit kolik parametrů jen chceme. MultiSum(3,8), MultiSum(9,3,-1,5,3) i MultiSum(1,1,1,-5,1,4,2,3,5,8) bude fungovat a bude fungovat správně. Jistě vám už došlo, že variabilitu počtu nám zajišťují tři tečky.

 

Oba výše uvedené postupy lze zkombinovat, tedy určit několik pevně daných parametrů a zbytek nechat jako variabilní. Ale pozor, v tomto případě musí být konstatní parametry na začátku a tři tečky vždy na konci! Funkce pro formátování textu nám budiž příkladem:

format(output[], len, const format[], {Float,_}:...);

_

První tři parametry uvádíme vždy, další se odvíjí od počtu použitých specifikátorů. (více o funkci format)

 

Datové typy / tagy variabilních parametrů

Uvedeme-li při definici funkce pouhé tři tečky, funkce bude očekávat jen celočíselné parametry a řetězce. Chceme-li dosazovat i argumenty jiných datových typů / tagů (Float, File, Text apod.), zápis bude vypadat následovně:

Float:... //pouze pro desetinná čísla
{Float,_}:... //pro celá čísla, řetězce, čísla s desetinnou čárkou a logické hodnoty
{Float,bool}:... //pro desetinná čísla a logické hodnoty
{Text,Text3D,Menu}:... //pro ID textdrawů, 3D labelů a menu

_

A takto bychom mohli pokračovat dál. Princip spočívá v tom, že před tečky uvedeme příslušný tag, pokud je jich více, uzavřeme je do složených závorek { } a oddělujeme čárkou. Znak _ (podtržítko) nám zastupuje celá čísla, logické hodnoty a řetězce.

 

numargs, getarg, setarg

Varování: Tento způsob tvoření parametrů (zejména v případě polí a řetězců) je dosti pomalý. Jsou i rychlejší alternativy, pokud umíte pracovat s direktivou emit.

 

Nyní se dostáváme k funkcím, které pracují s parametry, jejichž počet neznáme. Již jsme je použili nahoře u funkce MultiSum.

 

numargs()

Tato funkce vrací celkový počet argumentů funkce, tedy i pevně dané argumenty, ne jen ty variabilní, na to pozor.

MultiSumWithException(exception,...)
{
    new num = numargs(),sum;
    for(new i=1;i<num;i++)
    {
        if(getarg(i) == exception) continue;
        sum += getarg(i);
    }
    return sum;
}
MultiSumWithException(4,1,5,3,4); //numargs vrátí číslo 5 (4 variabilní a 1 konstantní parametr)

_

getarg(arg,index=0)
Funkce vracející hodnotu argumentu podle zvoleného ID (arg). Začíná se od nuly, takže první argument bude mít ID 0, druhý ID 1 atd. Parametr index nám poslouží v případě, že v naší funkci použijeme řetězec nebo pole. Pole/řetězec se totiž jeví jako jeden argument (arg) a abychom se dostali k jeho buňkám / k jednotlivým znakům řetězce, musíme využít indexu (index). I tyto indexy začínají nulou.

PrintThirdNumberFromArrays(...) //při volání dosadím pole a řetězec
{
    new num = numargs();
    for(new i;i<num;i++)
    {
        printf("%i",getarg(i,2)); //výpis hodnoty třetí buňky pole / třetího znaku řetězce   
    }
}
PrintThirdNumberFromArrays({7,4,5,3},"ahoj"); //numargs vrátí číslo 2 (2 parametry - 1 pole a 1 řetězec), funkce vytiskne 5 a 111 (111 je hodnota znaku 'o' v ASCII tabulce, pro výpis znaku použijte specifikátor %c namísto %i)

_

setarg(arg,index=0,value)
Setarg nastavuje parametru hodnotu. Funguje podobně jako getarg, za arg dosadíme pořadí argumentu, index využijeme v případě polí a řetězců (jinak doplňte nulu) a za value novou hodnotu daného argumentu. Příklady:

setarg(0,.value=1); //nastaví 1. argumentu hodnotu 1
setarg(3,.value=Text3D:5); //nastaví 4. argumentu hodnotu ID 3D labelu 5 (pozor, argumenty musí tento tag podporvat, viz výš)

_

Pořadí parametrů

Tohle až tak s tématem nesouvisí, ale když už jsme se dostali tak daleko, uvedeme si i toto. V kódu výše jsme použili .value. Tato syntaxe nám slouží k tomu, abychom nemuseli dosazovat za index nulu, ta je totiž výchozí hodnotou tohoto parametru. Zkrátka jsem tím přeskočil defaultně určený argument. Toto přeskakování parametrů můžete vidět například zde. Když se nám zachce (ale podotýkám, že je to zbytečné), můžeme tím měnit i pořadí normálních argumentů:

SendClientMessage(0,0xFF0000FF,"Ahoj!"); //parametry doplněné v typickém pořadí playerid, barva, zpráva
SendClientMessage(.color=0xFF0000FF,.message="Ahoj!",.playerid=0); //tatáž funkce, akorát jsem změnil pořadí argumentů

_

Hodí se ještě uvést, že u variabilních parametrů toto nelze dělat. A proč? No protože nemají u definice funkce svůj název/identifikátor (jsou tam jen ty tři tečky, popř. tagy, to nestačí).

 

 

No a to máme vše. Doufám, že jste se něčemu přiučili, profesionálové mi to mohou zkontrolovat, grammarové hledat gramatické a pravopisné chyby, hnidopichové podotknout, že tenhle návod je i jinde (áno, překvapivě jsem ho taky psal já :o ) a ostatní mi vyjádřit svůj názor, budu rád. :d Ok, I'm out.

 

Ověřený návod

Tento návod prošel validací, a lze ho proto považovat za ověřený.


  • 7


96b259ac47244701b5097887d9439120.png

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
It's hard to follow the train when you are hauling two number nines; a number nine large; a number six with extra dip; a number seven; two number 45s, one with cheese; and a large soda. -guess who


#2
Albus Brambůrek

Albus Brambůrek

    [IScripting]

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

Steam Profile


     

Moc pěkný tutorial :)


  • 0

BananaCamp.eu - Herní portál.


#3
GaRGoyLeS

GaRGoyLeS

    I thought it was the end, but it was actually just the beginning

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

Skvělý návod, zase jsem se naučil něco novýho! :d


  • 0

#4
Danoslav

Danoslav

    Dwaine

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

dobra praca ;)


  • 0

#5
Paulee

Paulee

    Learning pawn ...

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

Steam Profile


                                           

Dobrá práce ;). Chtělo by to více takových tutoriálů. +rep


  • 0

#6
SkP_Teddy

SkP_Teddy

    Zero

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

Takéto návody mi tu chýbajú.. dobrá práca :d


  • 0

93.91.250.147:27341.jpg?size=500x100


#7
xhunterx

xhunterx

    Zero

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

Ja by som len doplnil, ze ak chcete nieco taketo:
test(a, b = 2, c = 3, ...) {}
A chcete pouzit defaultne hodnoty, mozete pouzit _
Cize npisete:
test(1, _, _, 4, 5, 6); // a = 1, b = 2, c = 3, ... = {4, 5, 6} 

Cize _ sa pouziva tam, kde chcete defaultny parameter a da sa to pouzit aj vo funkciach kde nie je variabilny pocet parametrov


Upraveno uživatelem xhunterx: 06 prosinec 2016 - 08:52:04

  • 1

Huntim si reputaciu, tak ak ti pomozem, tak pls +


#8
vEnd

vEnd

    Emmet

  • Globální moderátor
  • Příspěvků: 606
A hele kdo přišel. :d Vítej a díky za doplnění.
  • 0

96b259ac47244701b5097887d9439120.png

I always enjoy meeting people more chemically imbalanced than myself. -Trevor Philips
It's hard to follow the train when you are hauling two number nines; a number nine large; a number six with extra dip; a number seven; two number 45s, one with cheese; and a large soda. -guess who






Také označeno jedním nebo více klíčovými slovy: Návod, samp, sa-mp, Pawn, tutorial, parametr, argument, vEnd, v3nd3tt4, tut

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?