Troche o enum
Miczu
03.07.2008
enum to jest sprytny sposob by zamiast korzystac z niewygodnych cyft, zmienic je w wiecej nam mowiace nazwy.
Teraz bardziej opisze zagadnienie.
kolejne enum'y moga miec dowolna wartosc, ale wypada by wartosci im przypisane byly poukladane rosnaco ;-)
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.
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]=AlienChyba 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.
Kubaczek <3
10.03.2010
Da się do enuma wpisać cyfry? Bo błędy mi wychodzą jak daje cyfry
Użytkownik kubaku4 edytował ten post 10.03.2010 14:16
new next[33]
enum {250=0, 500, 750, 1000, 1500, 2000}
Użytkownik kubaku4 edytował ten post 10.03.2010 14:16
Mochi
10.03.2010
enum zamienia liczby na słowa ...
Nie możesz dać tam liczb.
I totalna bzdura
255=0 ?
Nie możesz dać tam liczb.
I totalna bzdura
255=0 ?
destrojer
11.03.2010
Enum to odpowiednik typu wyliczeniowego z np. takiego C++. To o czym napisałeś można odnieść do stałych ewentualnie makrodefinicji.enum to jest sprytny sposob by zamiast korzystac z niewygodnych cyft, zmienic je w wiecej nam mowiace nazwy.
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.
Ale można "pokazac" o ile ma zmieniać sie domniemana wartość stałych (domyślnie jest to += 1).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.
enum (+=10) { z, x, c, v }; printf("%d", c);
enum nadaje wartość stałym (nie słowom, samo słowo to tylko odwołanie do komórki pamięci) poprzez domniemanie.enum zamienia liczby na słowa ...
Nie możesz dać tam liczb.
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
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
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
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
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
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:
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:
zaskutkuje to tym, że elementy będą miały następujące wartości:
Mam nadzieję, że komuś to się przyda
Użytkownik GwynBleidD edytował ten post 20.04.2010 12:50
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=16Przydatne, 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
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
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 }
R3X
20.09.2010
Podczas czytania podręcznika Pawna znalazłem ciekawy akapit o strukturach. Pola enuma mogą reprezentować tablice
Dzięki temu enum może działać jak struct z C/C++
Jest jeszcze problem typów o który wspominał destrojer, ale łatwo go ominąć z pomocą _: przy wpisywaniu i TYP: przy odczycie
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
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])
R3X
20.09.2010
Dzięki poprawiłem testowałem na pojedynczym rekordzie, a chciałem wkleić przykład z tablicą rekordów i nie poszło mi
co do new id; to nie , ale to i tak globalny event więc tamto id wyżej jest zawsze = 0 == niepotrzebne
co do new id; to nie , ale to i tak globalny event więc tamto id wyżej jest zawsze = 0 == niepotrzebne
G[o]Q
20.09.2010
jesli dobrze rozumiem to kod moglby wygladac tez tak (jesli ktos nie rozumie istoty enuma)
tutaj troszke szerzej opisane
[TUTORIAL] "Structs" in pawn - AlliedModders
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
R3X
20.09.2010
Pamiętaj, że 32-elementowej tablicy znaków nie zapiszesz w 1 komórce
Twój kod traktuje pola tak:
nick = 0 fragi = 32 smierci = 33
Twój kod traktuje pola tak:
nick = 0 fragi = 1 smierci = 2
Owner123
20.09.2010
Nie wywaliło ci tag mistmatch ? Co do tematu można jeszcze dodać Floata:
Użytkownik Owner123 edytował ten post 20.09.2010 17:27
#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
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
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 ?
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 ?
Knopers
20.11.2010
sądzę że uda ci się to zrobić tak :
Co do 2-giego pytania które się wiąże z 3-cim to odpowiedź brzmi: tak.
new liczba = _:Ninja
Co do 2-giego pytania które się wiąże z 3-cim to odpowiedź brzmi: tak.