Jump to content

Recommended Posts

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.

  • Líbí se mi to! (+1) 3
Link to comment
Share on other sites

  • Hlavní moderátor

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

  • Líbí se mi to! (+1) 3
Link to comment
Share on other sites

  • 2 weeks later...

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é. icon_e_biggrin.gif

 

 

Uvedieš mi príklad, ako použiť enum bez identifikátoru? napr. ako si spomenul na tie dialogy icon_e_wink.gif Díky

Edited by Quiter
Link to comment
Share on other sites

  • Hlavní moderátor

Uvedieš mi príklad, ako použiť enum bez identifikátoru? napr. ako si spomenul na tie dialogy icon_e_wink.gif Díky

Vždyť tam ten příklad máš.


enum
{
    DIALOG_COSI,
    DIALOG_WHATEVER
    // ...
}
Link to comment
Share on other sites

 

Vždyť tam ten příklad máš.


enum
{
    DIALOG_COSI,
    DIALOG_WHATEVER
    // ...
}

 

Ale ako to použijem v ShowPlayerDialog? Tak ako pri klasickom define?

  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • Hlavní moderátor

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

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