Hlavní moderátor Popular Post vEnd 279 Odesláno: 7. Únor, 2015 Hlavní moderátor Popular Post Share Odesláno: 7. Únor, 2015 Původně jsem to v plánu neměl, ale rozhodl jsem se, že tu trochu objasním, jak funguje ternární operátor ? : Obtížnost: Jak to funguje Nejprve trochu nezbytné teorie, tento operátor se nazývá ternární, protože, jako jediný v pawn, pracuje se třemi operandy. první operand ? druhý operand : třetí operand _ Operandem nazýváme výraz, se kterým operátor pracuje. Tohle by myslím stačilo, teď se podívejme na to, jak funguje. logický výraz ? pravda : nepravda _ Operátor nejprve vyhodnotí logický výraz, pokud je tento výraz pravdivý (true), vrátí to, co je za otazníkem. Pokud je výraz nepravdivý (false), tak vrátí to, co je za dvojtečkou. Uvedu příklad: #define CERVENA 0xFF0000FF #define MODRA 0x0000FF00 new color; color = GetPlayerTeam(playerid) == 1 ? CERVENA : MODRA; Nejprve dojde k vyhodnocení logického výrazu, kterým je GetPlayerTeam(playerid) == 1. Pokud hráčův tým je skutečně tým s ID 1, tak se do proměnné color uloží hodnota za otazníkem, tedy CERVENA. Pokud ovšem má hráčův tým jiné ID, uloží se do proměnné hodnota za dvojtečkou, tedy MODRA. Využití v praxi Ne všechno se dá pochopit z teorie, proto je lepší to ukázat na několika příkladech z praxe. Hráčův tým Vezměme si ještě jednou příklad seshora a trochu jej upravme. Budeme chtít, aby se proměnné color nastavila CERVENA, pokud bude hráčův tým mít ID v rozmezí od 1 do 10. Pokud ne, nastaví se proměnné hodnota MODRA. Jak to lze řešit přes podmínky: if(GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10) color = CERVENA; else color = MODRA; _ Jak my to vyřešíme šikovně přes ternární operátor: color = GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10 ? CERVENA : MODRA; GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) - logický výraz CERVENA - hodnota, která se uloží, když je logický výraz pravdivý/true MODRA - hodnota, která se uloží, když je logický výraz nepravdivý/false Pokud se v tom pomalu ztrácíte a přijde vám to nepřehledné, můžete si to ozávorkovat: color = (GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10) ? (CERVENA) : (MODRA); _ Else if? Někteří z vás si možná řeknou "A co když potřebuji další podmínku, tedy else if?!" I tohle je samozřejmě pomocí ternárního operátoru možné, ale předem vás varuji, že se v tom možná začnete ztrácet. Zadání je následující: pokud má hráčův tým ID 1, nastaví se CERVENA, pokud má ID 2, nastaví se MODRA, pokud má jiné ID, nastaví se ZELENA. color = (GetPlayerTeam(playerid) == 1) ? (CERVENA) : ((GetPlayerTeam(playerid) == 2) ? (MODRA) : (ZELENA)); Za dvojtečku jsme přidali další ternární operátor. Pokud se ID rovná jedné, není problém, nastaví se CERVENA. Pokud se jedné nerovná, přeskočí za dvojtečku, zde narazí na další ternární operátor. Vyhodnotí další logický výraz. Pokud se ID rovná dvěma, nastaví se hodnota MODRA. Pokud to nebude ani jedna a ani dva, tak je to logicky jiné ID => nastaví se ZELENA. Šlo by to takhle větvit i dál, vždy by se za dvojtečku přidal další ternární operátor, ale při větším počtu bude lepší využít klasických podmínek, popř. switche. Příklad na závěr A dáme si ještě příklad na závěr. Skloňování v češtině programátorům leckdy dost komplikuje práci, výsledek výpisu hlášek se nám mnohdy nelíbí, například tady: new pocetHracu = 3,str[145]; format(str,sizeof str,"%i hráčů na serveru.",pocetHracu); SendClientMessageToAll(-1,str); _ Server nám vypíše tohle: 3 hráčů na serveru. _ Ale my chceme, aby vypisoval: 1 hráč na serveru. 2/3/4 hráči na serveru. 5/6/atd. hráčů na serveru. _ Zkrátka aby to vypsalo správný tvar slova hráč podle počtu. Lze to řešit přes podmínky nebo switch: switch(pocetHracu) { case 1: format(str,sizeof str,"%i hráč na serveru.",pocetHracu); case 2,3,4: format(str,sizeof str,"%i hráči na serveru.",pocetHracu); default: format(str,sizeof str,"%i hráčů na serveru.",pocetHracu); } _ Ale my si to zkrátíme na jeden řádek pomocí ternárního operátoru. format(str, sizeof str,"%i %s na serveru.",pocetHracu,(pocetHracu == 1) ? ("hráč") : ((pocetHracu < 5) ? ("hráči") : ("hráčů"))); Za specifikátor %s se dosadí jeden z tvarů slova hráč. Je to také krásná ukázka toho, že ternární operátor lze použít i v parametru funkce. Ještě jedno upozornění na závěr, když má tento operátor vracet řetězec, tak jej uzavřete do závorek vždy! Nevím, zda problém stále trvá, ale dříve byly problémy s tím, že když to nebylo v závorkách, pawno mohlo spadnout. Edit: Potvrzeno, problém stále trvá, pokud řetězec do závorek neuzavřete, kompilátor přestane pracovat. Tímto ukončuji návod, doufám, že si z něj někteří něco odnesou a že vám tento operátor třeba v něčem ulehčí nebo pomůže. Pokud jste narazili na nějakou chybu nebo se chcete na něco zeptat nebo se jen vyjádřit, pište. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený. 7 Link to comment Share on other sites More sharing options...
Mort 29 Odesláno: 7. Únor, 2015 Share Odesláno: 7. Únor, 2015 Zkráceně, ternární operátor je podmínka, ze které musí vést i záporná větev. Pěkný návod rep+ P.S. Ještě jedno upozornění na závěr, když má tento operátor vracet řetězec, tak uzavřete ho do závorek vždy! Nevím, zda problém stále trvá, ale dříve byly problémy s tím, že když to nebylo v závorkách, pawno mohlo spadnout. Ano, kompilátor přestane pracovat. Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 7. Únor, 2015 Author Hlavní moderátor Share Odesláno: 7. Únor, 2015 Zkráceně, ternární operátor je podmínka, ze které musí vést i záporná větev. Pěkný návod rep+ P.S. Ano, kompilátor přestane pracovat. je fajn, že jsi to potvrdil, část o řetězci a závorkách upravena jinak k té zkrácené verzi, jako resumé je to fajn a díky Link to comment Share on other sites More sharing options...
eXot 18 Odesláno: 7. Únor, 2015 Share Odesláno: 7. Únor, 2015 Takto má vyzerať návod, rep+ Link to comment Share on other sites More sharing options...
ATomas 296 Odesláno: 7. Únor, 2015 Share Odesláno: 7. Únor, 2015 (upraveno) Jen takovy mini detail format(str, sizeof str,"%i %s na serveru.",pocetHracu,(pocetHracu == 1) ? ("hráč") : (pocetHracu > 5) ? ("hráčů") : ("hráči"))); Aby jsi zbytecne nemusel vyhodnocovat podminky tri staci misto ni dat jednu Samozrejme pak kod napsat s tim ohledem jestli se casteji stava ze je hrac 1 nebo jich je vic jak 5 atp.. Ja abych pravdu rekl nerad skladam terarni operatory zasebou, protoze pak je dost neprehledy a dost mi to pripomina kdyz v exelu pises vsechnu tu slataninu do jednoho radku Pokud teda nejdes pres makro Edited 7. Únor, 2015 by ATomas Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 7. Únor, 2015 Author Hlavní moderátor Share Odesláno: 7. Únor, 2015 Jen takovy mini detail format(str, sizeof str,"%i %s na serveru.",pocetHracu,(pocetHracu == 1) ? ("hráč") : (pocetHracu > 5) ? ("hráčů") : ("hráči"))); Aby jsi zbytecne nemusel vyhodnocovat podminky tri staci misto ni dat jednu Samozrejme pak kod napsat s tim ohledem jestli se casteji stava ze je hrac 1 nebo jich je vic jak 5 atp.. upraveno Link to comment Share on other sites More sharing options...
jenkings 122 Odesláno: 8. Únor, 2015 Share Odesláno: 8. Únor, 2015 #define CERVENA 0xFF0000FF #define MODRA 0x0000FF00new color;color = GetPlayerTeam(playerid) == 1 ? RED : MODRA; Možná by to chtělo udělat si v tom trochu pořádek Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 8. Únor, 2015 Author Hlavní moderátor Share Odesláno: 8. Únor, 2015 #define CERVENA 0xFF0000FF #define MODRA 0x0000FF00 new color; color = GetPlayerTeam(playerid) == 1 ? RED : MODRA; Možná by to chtělo udělat si v tom trochu pořádek vidím vidím, chtěl jsem mít všechny identifikátory v češtině, ale můj návyk zapisovat je anglicky nakonec vyhrál upraveno 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