←  Tutoriale

AMXX.pl: Support AMX Mod X i SourceMod

»

Troche o enum

  • +
  • -
Miczu - zdjęcie Miczu 03.07.2008

enum to jest sprytny sposob by zamiast korzystac z niewygodnych cyft, zmienic je w wiecej nam mowiace nazwy.
enum {zero=0,jeden,dwa,trzy,cztery}
Powyzsze mozna wykorzystac w takowy sposob:
new num = random_num(0,4)
switch(num)
{
   case zero:    //code
   case jeden:  //code
   case dwa:    //code
   case trzy:    //code
   case cztery: //code
}
Bardziej przydatne moze to byc w przypadku modow z kilkoma 'rasami':
new klasa[33]
enum {brak=0, Human, Ork, Elf, Goblin, Alien}
...
if(klasa[id]==Human) client_print(id,print_chat,"Jestes czlowiekiem")
...
//zmiana klasy
klasa[id]=Alien
Chyba rozumiecie o co biega ;-)

Teraz bardziej opisze zagadnienie.
enum {dziesiec=10,dwadziescia=20,trzydziesci,czterdziesci=40}
Jest to oczywiste, ze dziesiec ma wartosc 10, dwadziescia ma wartosc 20 i czterdziesci ma wartosc 40. Ale na co trzeba zwrocic uwage, to trzydziesci ma wartosc 21!. enum nie dziala jak exel, ze sam wie o ile sie zmieniaja kolejne wartosci.

kolejne enum'y moga miec dowolna wartosc, ale wypada by wartosci im przypisane byly poukladane rosnaco ;-)
enum {z=32,w=43,r=57,a=100,c=128}

Jesli macie jakies pytania to smialo.

PAWN ma wiele wlasnych enum'ow ktore pozwalaja nam np. zamiast stosowac niewygodnych id broni 22, stosowac CSW_M4A1.
Odpowiedz

  • +
  • -
FakeNick - zdjęcie FakeNick 03.07.2008

caze cztery: //code

;>

Nie przejmujesz sie literowka O:)
Odpowiedz

  • +
  • -
Kubaczek <3 - zdjęcie Kubaczek <3 10.03.2010

Da się do enuma wpisać cyfry? Bo błędy mi wychodzą jak daje cyfry
 new next[33]
enum {250=0, 500, 750, 1000, 1500, 2000}

Użytkownik kubaku4 edytował ten post 10.03.2010 14:16
Odpowiedz

  • +
  • -
Mochi - zdjęcie Mochi 10.03.2010

enum zamienia liczby na słowa ...
Nie możesz dać tam liczb.
I totalna bzdura
255=0 ?
Odpowiedz

  • +
  • -
destrojer - zdjęcie destrojer 11.03.2010

enum to jest sprytny sposob by zamiast korzystac z niewygodnych cyft, zmienic je w wiecej nam mowiace nazwy.

Enum to odpowiednik typu wyliczeniowego z np. takiego C++. To o czym napisałeś można odnieść do stałych ewentualnie makrodefinicji.

PAWN ma wiele wlasnych enum'ow ktore pozwalaja nam np. zamiast stosowac niewygodnych id broni 22, stosowac CSW_M4A1.


Ja optuje za tym, ze są to stałe, ew. makrodefinicji (mogę się mylić ponieważ nigdy na oczy nie widziałem zawartości bibliotek CS'a).

Mogłeś dodać, że enum'a można połączyć z tablicą co pozwoli na przyjemne jej indeksowanie.

enum  nazwa
{
    //nazwy_stalych
}
new tablica[nazwa];

Jest to możliwe ponieważ enum zwraca taki rozmiar co jego ostatnia wartość powiększona domyślnie o jeden (można to zmienić stosownym poleceniem). Można to sprawdzić za pomocą sizeof'a.
enum  nazwa
{
    //nazwy_stalych
}
new tablica[nazwa];
printf("%d", sizeof(tablica));

Co więcej możliwe jest użycie w enumie różnych tagów (umożliwia to przechowywanie wielu typów danych w jednej tablicy bez zbędnych ostrzeżeń ze strony kompilatora). To jest chyba jedyny przykład zastosowania "obiektowości" w PAWN.

Jest to oczywiste, ze dziesiec ma wartosc 10, dwadziescia ma wartosc 20 i czterdziesci ma wartosc 40. Ale na co trzeba zwrocic uwage, to trzydziesci ma wartosc 21!. enum nie dziala jak exel, ze sam wie o ile sie zmieniaja kolejne wartosci.

Ale można "pokazac" o ile ma zmieniać sie domniemana wartość stałych (domyślnie jest to += 1).
enum (+=10)
{
	z,
	x,
	c,
	v
};
printf("%d", c);

enum zamienia liczby na słowa ...
Nie możesz dać tam liczb.

enum nadaje wartość stałym (nie słowom, samo słowo to tylko odwołanie do komórki pamięci) poprzez domniemanie.

Można używać liczb w nazwach jednakże nie mogą one jednak być pierwszym znakiem w nazwie. To jest 123a jest niedozwolone, ale a123 już tak.
Użytkownik destrojer edytował ten post 11.03.2010 19:53
Odpowiedz

  • +
  • -
Miczu - zdjęcie Miczu 11.03.2010

destrojer jak zmienie nazwe tematu z "Troche o enum" na "Troche o enum w przystępny sposób" to poprawi ci humor? :F
Odpowiedz

  • +
  • -
destrojer - zdjęcie destrojer 11.03.2010

Moje czepialstwo wynika z nadmiernego perfekcjonizmu, nie bierzcie tych uwag jako chęć udowodnienia, że wszyscy się mylą a tylko ja mam racje. Ja też często popełniam błędy, ale inni zaraz mnie poprawiają pozwala mi to na samodoskonalenie się. Chcę i wam dać tę szanse. ZAWSZE można nauczyć się czegoś nowego. Jeszcze w roli ścisłości dodam, że stałe w enum'ach (nie ważne jaki tag im nadamy) możemy inicjalizować tylko i wyłącznie liczbą naturalną. Zapis
enum 
{
    Float:pi = 3.14
}
jest zatem zapisem błędnym.

PS. Nazwa tematu jest zależna od Ciebie. Niestety nie można wszystkiego wyjaśnić w prosty sposób (wówczas zawsze powstaną niedopowiedzenia).
Użytkownik destrojer edytował ten post 11.03.2010 20:10
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 20.04.2010

Drobne jeszcze uzupełnienie do postów destrojera, oto sposób na pogodzenie nazwy enuma ze zmianą zachowania wewnętrznego licznika:
enum nazwa (+=10) {
a=0,
b,
c,
d
}

Bo się trochę głowiłem, czy kompilator nie potraktuje tego jako definicję funkcji.

Drugi aspekt, licznik niekoniecznie musi być sumowany, można zastosować inne operatory, m.in mnożenie, odejmowanie. Przykład:
enum nazwa (*=2) {
a=1,
b,
c,
d,
e
}

zaskutkuje to tym, że elementy będą miały następujące wartości:
a=1
b=2
c=4
d=8
e=16
Przydatne, gdy w jednej zmiennej chcemy przechowywać kilka wartości logicznych, np jakieś ustawienia, wtedy wystarczy użyć:
settings = a|c|d


Mam nadzieję, że komuś to się przyda ;)
Użytkownik GwynBleidD edytował ten post 20.04.2010 12:50
Odpowiedz

Savage - zdjęcie Savage 29.04.2010

Bardzo przydatne, dzięki wam w końcu pojąłem funkcję "enum"

np. teraz wiem że Mag = 1, Mnich = 2 itd. przez tą funkcje możemy się nie katować i po prostu kod za nas to wszystko ponumeruje
enum { NONE = 0, Mag, Mnich, Paladyn, Zabojca, Nekromanta, Barbarzynca, Ninja, Hunter }
Odpowiedz

  • +
  • -
.minD - zdjęcie .minD 22.05.2010

30 ma wartosc 21, a np. 33 ile ma? 24?
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 20.09.2010

Podczas czytania podręcznika Pawna znalazłem ciekawy akapit o strukturach. Pola enuma mogą reprezentować tablice B)

Dzięki temu enum może działać jak struct z C/C++
enum staty{
	nick[32],
	fragi,
	smierci
}

new gStats[33][staty];

public plugin_init() {	
	register_event("ScoreInfo", "eventScoreInfo", "a");
}
eventScoreInfo(){
	new id = read_data(1);
	
	get_user_name(id, gStats[id][nick], 31);
	gStats[id][fragi] = read_data(2);
	gStats[id][smierci] = read_data(3);
}


Jest jeszcze problem typów o który wspominał destrojer, ale łatwo go ominąć z pomocą _: przy wpisywaniu i TYP: przy odczycie
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 20.09.2010

R3X a czy twoj kod czasem nie pokaze tego ze 2x tworzysz zmienna id :?: i w tablicach nie powinien byc jeszcze 1 wymiar ([id]) :?:
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 20.09.2010

Dzięki poprawiłem :P testowałem na pojedynczym rekordzie, a chciałem wkleić przykład z tablicą rekordów i nie poszło mi xD

co do new id; to nie :P, ale to i tak globalny event więc tamto id wyżej jest zawsze = 0 == niepotrzebne
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 20.09.2010

jesli dobrze rozumiem to kod moglby wygladac tez tak (jesli ktos nie rozumie istoty enuma)

enum staty{
        nick[32],
        fragi,
        smierci
}

new gStats[33][staty];

public plugin_init() {  
        register_event("ScoreInfo", "eventScoreInfo", "a");
}
eventScoreInfo(){
        new id = read_data(1);
        
        get_user_name(id, gStats[id][0], 32);
        gStats[id][32] = read_data(2);
        gStats[id][33] = read_data(3);
}

tutaj troszke szerzej opisane
[TUTORIAL] "Structs" in pawn - AlliedModders
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 20.09.2010

Pamiętaj, że 32-elementowej tablicy znaków nie zapiszesz w 1 komórce :P
nick = 0
fragi = 32
smierci = 33

Twój kod traktuje pola tak:
nick = 0
fragi = 1
smierci = 2
Odpowiedz

  • +
  • -
Owner123 - zdjęcie Owner123 20.09.2010

Nie wywaliło ci tag mistmatch ? Co do tematu można jeszcze dodać Floata:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>

enum _:Info
{
szNick[32],
iHealth
};

new gPlayer[33][Info];

public plugin_init()
{
register_plugin("Enum Test", "1.0.0", "Owner")
}

saveHealth(id)
{
get_user_name(id, gPlayer[id][szNick], 31);
gPlayer[id][iHealth] = _:pev(id, pev_health);
log_amx("%i", gPlayer[id][iHealth]);
}

loadHealth(id)
{
new Float:fZycie = Float:gPlayer[id][iHealth];
log_amx("%f", fZycie); // pomimo rzutowań wartość nie powinna się zmienić.
}

Użytkownik Owner123 edytował ten post 20.09.2010 17:27
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 20.09.2010

gPlayer[id][iHealth] = _:pev(id, pev_health);
to samo co
gPlayer[id][iHealth] = pev(id, pev_health);
gdyż pev zwraca inta przy 2 parametrach

nadanie tagów nie zmienia wartości bitów, więc zdrowie mieszczące się w rozsądnej granicy drukowane z %f da po prostu 0.0, a większe da jakiś ułamek zgodnie z IEEE 754
Odpowiedz

  • +
  • -
ZiuTeK - zdjęcie ZiuTeK 20.11.2010

Czy moze mi ktos odpowiedziec czy da sie znalezc numer enuma ?
Przykladowo tak jak w diablo mamy enumy klas, klasa numer 7 to ninja i ja to dobrze wiem ale jak moge otrzymac wartosc 7 wiedzac ze player_class[id]==Ninja ?
Czy tych wartosci mozna uzywac zamiennie ? czyli player_class[id]=7 to jest to samo co player_class[id]=Ninja ?
Odpowiedz

  • +
  • -
Knopers - zdjęcie Knopers 20.11.2010

sądzę że uda ci się to zrobić tak :
new liczba = _:Ninja


Co do 2-giego pytania które się wiąże z 3-cim to odpowiedź brzmi: tak.
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 20.11.2010

Knopers

player_class[id]=Ninja to to samo co player_class[id]=7
Odpowiedz