Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.

  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Troche o enum


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
22 odpowiedzi w tym temacie

#1 Miczu

    Godlike

  • Przyjaciel

Reputacja: 646
Wszechmogący

  • Postów:2862
Offline

Napisano 03.07.2008 15:51

*
Popularny

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.
  • +
  • -
  • 5

#2 FakeNick

    Zaawansowany

  • Użytkownik

Reputacja: 52
Pomocny

  • Postów:115
  • GG:
  • Lokalizacja:Słupca
Offline

Napisano 03.07.2008 16:25

caze cztery: //code

;>

Nie przejmujesz sie literowka O:)
  • +
  • -
  • 0

#3 Kubaczek <3

    Zaawansowany

  • Użytkownik

Reputacja: 17
Początkujący

  • Postów:116
  • Steam:steam
  • Lokalizacja::)
Offline

Napisano 10.03.2010 14:15

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

  • +
  • -
  • 0

#4 Mochi

    Zaawansowany

  • Użytkownik

Reputacja: 16
Początkujący

  • Postów:81
  • Lokalizacja:asd
Offline

Napisano 10.03.2010 14:18

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

#5 destrojer

    Nowy

  • Pijawka

Reputacja: 19
Początkujący

  • Postów:4
  • Lokalizacja:gdzies na swiecie
Offline

Napisano 11.03.2010 19:48

*
Popularny

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

  • +
  • -
  • 7

#6 Miczu

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 646
Wszechmogący

  • Postów:2862
Offline

Napisano 11.03.2010 19:58

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

#7 destrojer

    Nowy

  • Pijawka

Reputacja: 19
Początkujący

  • Postów:4
  • Lokalizacja:gdzies na swiecie
Offline

Napisano 11.03.2010 20:08

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

  • +
  • -
  • 3

#8 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 20.04.2010 12:49

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

  • +
  • -
  • 4
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#9 Savage

    Początkujący

  • Zbanowany

Reputacja: 0
zer0.

  • Postów:12
Offline

Napisano 29.04.2010 12:28

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 }


#10 .minD

    Wszechobecny

  • Użytkownik

Reputacja: 58
Pomocny

  • Postów:451
  • Lokalizacja:Łódź
Offline

Napisano 22.05.2010 19:12

30 ma wartosc 21, a np. 33 ile ma? 24?
  • +
  • -
  • 0

#11 R3X

    Godlike

  • Przyjaciel

Reputacja: 2960
Godlike

  • Postów:4247
  • Lokalizacja:Nie
Offline

Napisano 20.09.2010 14:25

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
  • +
  • -
  • 2

#12 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1339
Godlike

  • Postów:3556
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 20.09.2010 14:56

R3X a czy twoj kod czasem nie pokaze tego ze 2x tworzysz zmienna id :?: i w tablicach nie powinien byc jeszcze 1 wymiar ([id]) :?:
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#13 R3X

    Godlike

  • Przyjaciel

Reputacja: 2960
Godlike

  • Postów:4247
  • Lokalizacja:Nie
Offline

Napisano 20.09.2010 14:59

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
  • +
  • -
  • 0

#14 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1339
Godlike

  • Postów:3556
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 20.09.2010 15:10

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
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#15 R3X

    Godlike

  • Przyjaciel

Reputacja: 2960
Godlike

  • Postów:4247
  • Lokalizacja:Nie
Offline

Napisano 20.09.2010 16:52

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

  • +
  • -
  • 0

#16 Owner123

    Wszechpomocny

  • Użytkownik

Reputacja: 144
Zaawansowany

  • Postów:331
  • Lokalizacja:Barty ;]
Offline

Napisano 20.09.2010 17:19

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

  • +
  • -
  • 0

#17 R3X

    Godlike

  • Przyjaciel

Reputacja: 2960
Godlike

  • Postów:4247
  • Lokalizacja:Nie
Offline

Napisano 20.09.2010 17:39

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
  • +
  • -
  • 0

#18 ZiuTeK

    Wszechwiedzący

  • Użytkownik

Reputacja: 133
Zaawansowany

  • Postów:507
  • Lokalizacja:inąd
Offline

Napisano 20.11.2010 18:20

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 ?
  • +
  • -
  • 0

#19 Knopers

    Nie patrz tak na mnie !

  • Przyjaciel

Reputacja: 587
Wszechwiedzący

  • Postów:2013
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Cz-wa
Offline

Napisano 20.11.2010 18:31

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.
  • +
  • -
  • 1

#20 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1339
Godlike

  • Postów:3556
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 20.11.2010 18:54

Knopers

player_class[id]=Ninja to to samo co player_class[id]=7
  • +
  • -
  • 1
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych