Tanga 132 Odesláno: 21. Srpen, 2017 Share Odesláno: 21. Srpen, 2017 Obsah Úvod #define enum Ďalšie použitie 1. Úvod Napadlo mi, že rýchlejšie než vysvetliť niekomu čo je to enum, by bolo dať mu odkaz na nejaký návod. Žiadny som však nenašiel. Boli útržky toho čo je to enum tu a tam, ale nič čo by sa dalo ľahko nájsť. Enum slúži na náhradu direktív preprocesora (#define NIECO).Je prehľadnejší a umožňuje lepšiu kontrolu errorov pri kompilácii.Enum je skratka od enumeration, tj. výčet, vyčíslenie. V tomto návode teda ukážem riešenie konkrétnej úlohy dvomi spôsobmi. Pomocou #define a enum. Majme systém, ktorý kontroluje kde sa nachádzajú isté autá a či sú obsadené.Použijeme teda jednu globálnu premennú. 2. #define #define POSX 0 #define POSY POSX + 1 #define POSZ POSX + 2 #define OCCUPIED POSX + 3 #define VELKOST_POLA (OCCUPIED - POSX + 1) // 3-0+1=4 #define POCET_AUT 20 new Vozidla[POCET_AUT][VELKOST_POLA]; ... stock PouzitiePola() { printf("Velkost posledneho pola = %d", VELKOST_POLA); for (new i; i < sizeof (Vozidla); i++) if (Vozidla[i][OCCUPIED] == true) { printf("%f", Vozidla[i][POSX]); // len nejaky priklad } } 3. Enum Rovnakú funkcionalitu s použitím enumu by sme dosiahli nasledovným kódom.Nie je nutné písať názvy jednotlivých prvkov v enume veľkým písmom. Záleží na vašich preferenciách, mne celkom dáva zmysel, že keďže to nahrádza konštanty, tiež by to malo byť veľkým písmom. #define POCET_AUT 20 enum CarEnum { Float:POSX, // enum umoznuje jednoduchu a prehladnu kontrolu typov Float:POSY, Float:POSZ, bool:OCCUPIED }; new Vozidla[POCET_AUT][CarEnum]; ... stock PouzitiePola() { printf("Velkost posledneho pola = %d", _:CarEnum); for (new i; i < sizeof (Vozidla); i++) if (Vozidla[i][OCCUPIED]) { printf("%f", Vozidla[i][POSX]); // len nejaky priklad } } Možno ste si všimli v PouzitiePola() s enumom: printf("Velkost posledneho pola = %d", _:CarEnum); Tá časť _:CarEnum musí mať predponu _: inak by kompiler hodil warning. Fungovalo by to ajtak. Je to len bug kompilera.V praxi som vypísanie veľkosti enumu ešte nevidel, nebojte sa že by to hnusilo kód. Pre pokročilých: Bug kompilera? #include <a_samp> enum _:NoTag { a } enum Tag { a } main() { printf("tag default: %d = %x", tagof (NoTag), tagof (NoTag)); printf("tag enumu: %d = %x", tagof (Tag), tagof (Tag)); } Server log: SA-MP Dedicated Server ---------------------- v0.3.7-R2, (C)2005-2015 SA-MP Team ... [00:57:39] tag default: -- = 80000000 [00:57:39] tag enumu: -1073741808 = C0000010 4. Ďalšie použitie Enum nemusí číslovať od nuly, dá sa spraviť aj toto: #include <a_samp> enum TestEnum { PREMENNA = 5, PREMENNA2, PREMENNA3, // pauza PREMENNA4 = 25, PREMENNA5 }; main() { printf("%d, %d", _:PREMENNA3, _:PREMENNA5); } Server log: SA-MP Dedicated Server ---------------------- v0.3.7-R2, (C)2005-2015 SA-MP Team ... [01:05:25] 7, 26 Som presvedčený, že s enumami sa dajú robiť rôzne pekelné kúsky z ktorých ja žiadne nepoznám, určite ak nejaké máte, pridajte. 3 Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 22. Srpen, 2017 Hlavní moderátor Share Odesláno: 22. Srpen, 2017 Co třeba: enum LUL (+= 10) { lal, lel, lol, lul } // lal == 0, lel == 10, lol == 20 atd. Taky bys mohl uvést, že lze vytvořit enum bez identifikátoru, což se hodí na ID dialogů: enum { DIALOG_COSI, DIALOG_WHATEVER // ... } Je co doplňovat, ale jinak dobré. 3 Link to comment Share on other sites More sharing options...
Gameluner 3 Odesláno: 4. Září, 2017 Share Odesláno: 4. Září, 2017 Odpovím ti sic pozdě, ale mně se to líbí. Link to comment Share on other sites More sharing options...
Quiter 99 Odesláno: 5. Září, 2017 Share Odesláno: 5. Září, 2017 (upraveno) Co třeba: enum LUL (+= 10) { lal, lel, lol, lul } // lal == 0, lel == 10, lol == 20 atd. Taky bys mohl uvést, že lze vytvořit enum bez identifikátoru, což se hodí na ID dialogů: enum { DIALOG_COSI, DIALOG_WHATEVER // ... } Je co doplňovat, ale jinak dobré. Uvedieš mi príklad, ako použiť enum bez identifikátoru? napr. ako si spomenul na tie dialogy Díky Edited 5. Září, 2017 by Quiter Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 5. Září, 2017 Hlavní moderátor Share Odesláno: 5. Září, 2017 Uvedieš mi príklad, ako použiť enum bez identifikátoru? napr. ako si spomenul na tie dialogy Díky Vždyť tam ten příklad máš. enum { DIALOG_COSI, DIALOG_WHATEVER // ... } Link to comment Share on other sites More sharing options...
Quiter 99 Odesláno: 5. Září, 2017 Share Odesláno: 5. Září, 2017 Vždyť tam ten příklad máš. enum { DIALOG_COSI, DIALOG_WHATEVER // ... } Ale ako to použijem v ShowPlayerDialog? Tak ako pri klasickom define? 1 Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 5. Září, 2017 Hlavní moderátor Share Odesláno: 5. Září, 2017 Ano. Link to comment Share on other sites More sharing options...
DeNisKo 8 Odesláno: 5. Září, 2017 Share Odesláno: 5. Září, 2017 Ale ako to použijem v ShowPlayerDialog? Tak ako pri klasickom define? Tak že v enume máš ID dialogov od 0 tuším Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 5. Září, 2017 Hlavní moderátor Share Odesláno: 5. Září, 2017 Máte to dokonce napsáno (a ukázáno) v ukázkovém kódu na SA:MP wiki: http://wiki.sa-mp.com/wiki/ShowPlayerDialog // Define the dialog IDs either with an enum: enum { DIALOG_LOGIN, DIALOG_WELCOME, DIALOG_WEAPONS } 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