←  Tutoriale

AMXX.pl: Support AMX Mod X i SourceMod

»

Zmienne - Co I Jak?

  • +
  • -
darkman - zdjęcie darkman 30.01.2009

Po pierwsze - co to jest zmienna? Najprościej ujmując zmienna jest to obszar ulokowany w pamięci komputera przechowywujący dane różnego typu np. index gracza, informacje o aktualnej broni, życiu, armor etc. Można na nich wykonywać przeróżne operacje np. pre/post de/inkrementacja(zwiększenie/zmniejszenie o 1) dodawanie, mnożenie, dzielenie, odejmowanie itp. Przy ich tworzeniu automatycznie ustawiane są na 0( nie przechowywują żadnych danych, są po prostu puste) chyba, że zechcemy inaczej dopisując po nazwie "= wartość".

----------------------------------------------------------------------------------------------------------------------------------
Tworzeniu zmiennych są przypisane trzy pojęcia, mianowicie:

Deklaracja:
Po prostu utworzenie zmiennej, bez nadawania jej wartości:
new zmienna;

Inicjacja:
Pierwsze przypisanie wartości do zmiennej po jej utworzeniu:
new zmienna;
zmienna = 1;

Definicja:
Jednoczesne zadeklarowanie i zainicjowanie zmiennej:
new zmienna = 2;

----------------------------------------------------------------------------------------------------------------------------------

W Pawnie można spotkać następujące typy zmiennych:

Integer:
Zmienna przechowywująca dowolne liczby całkowite np. 1, 2, 124, 553562 i wszystkie inne.
Ich deklaracja jest bardzo prosta:
new zmienna;

Float:
Zmienna przechowywująca liczby zmiennoprzecinkowe np. 3.5, 7.0, 2.1.
Deklaracja:
new Float:zmienna

String:
Zmienna przechowywująca string - ciąg znaków. Po nazwie wystarczy dodać dwa nawiasy(lub więcej w zależności jaką tablice chcemy stworzyć)
Deklaracja:
new zmienna[ilosc_znakow_tablicy];

Bool:
Tzw. zmienna logiczna, która przechowuje tylko wartość true(1), lub false(0). Zazwyczaj używane do tego, żeby określić czy coś jest włączone, lub nie.
Deklaracja:
new bool:zmienna;

Stock:
Wiele osób używa je, ale tak naprawdę nie wie jak one działają. Zmienne te są tworzone tylko wtedy, jeżeli są używane, w innym wypadku kompilator je ignoruje. Zazwyczaj używane w plikach nagłówkowych .inc .
Deklaracja:
stock zmienna;

----------------------------------------------------------------------------------------------------------------------------------

Operacje na zmiennych:

Jest możliwych kilka sposobów. Pierwszy to umieszczenie znaku dodawania przed znakiem równości.

zmienna += wartość

Zostanie ona powiększona o podaną wartość.

Sposób drugi:

zmienna = zmienna + wartość

Zostaje pobierana aktualna wartość zmiennej i o ile ma zostać powiększona.

Zamiast plusa można użyć innych znaków np. odejmowania(-), mnożenia(*), dzielenia(/), dzielenia z resztą(%)

Inkrementacja i Dekrementacja

----------------------------------------------------------------------------------------------------------------------------------


Stałe:
Działają tak samo jak zmienne, lecz zmienną ich nie można nazwać gdyż byłaby to kompletna sprzeczność. Różnią się tym, że poprzez cały czas mają jedną wartość, która zostanie im przypisana, nie można na nich wykonywać żadnych operacji oprócz pobierania ich wartości. Przy tworzeniu przed nazwą trzeba dodać przedrostek 'const'

Makrodefinicje:
Bardzo podobne do zmiennych, działają na zasadzie "niech X będzie Y". Tak więc jeżeli do makrodefinicji X przypiszemy Y każdorazowe wpisanie w kodzie X skutkuje wywołaniem Y. Programiści używają ich najczęściej aby zaoszczędzić sobie wpisywania długich nazw funkcji, lub ścieżek do plików. Nie ma ograniczeń co do typu przechowywanych w nich danych. Tworzenie:

#define NAZWA_MAKRODEFINICJI KOD_KTORY_MA_ONA_ZASTEPOWAC

Przykład:

#define func1 server_exec()

----------------------------------------------------------------------------------------------------------------------------------

Widoczność zmiennych:
Występują dwa typy zmiennych jeżeli chodzi o ich widoczność - zmienne lokalne i globalne.

Zmienne globalne są tworzone poza wszystkimi funkcjami, najczęściej na początku kodu pod dyrektywami(dla zachowania estetyki) i można je używać w każdym miejscu. Zmienne lokalne są przeciwieństwem - deklarowane wewnątrz jakieś funkcji i używanie tylko w niej.

W najbliższym czasie opisze jeszcze tablice i ich używanie.
Użytkownik benio101 edytował ten post 20.01.2013 23:43
lit.
Odpowiedz

  • +
  • -
Miczu - zdjęcie Miczu 30.01.2009

new zmienna[];
sprawdzales czy tak mozna? Z tego co sie orietuje zapis [] mozna tylko stosowac w celu samo dopasowania sie tablicy do ilosci elementow (new zmienna[] = "dadadada" // new zmienna[] = {1,2,3,4,54,5,1,3,5,1})
Odpowiedz

  • +
  • -
R3X - zdjęcie R3X 30.01.2009

Kompiluje się bez problemu, ale bezpieczniej ustalić maksymalny zakres indeksów. Z typów zmiennych to spotkałem się jeszcze z Handle: jako uchwyt połączenia z bazą danych czy samego zapytania SQL.

Kompiluje się bez problemu
hehe ;) sry, przy próbie przypisania wartości wywala błąd
Odpowiedz

  • +
  • -
darkman - zdjęcie darkman 30.01.2009

poprawione, kiedys to rozszerze bardziej
Odpowiedz

  • +
  • -
mgr inż. Pavulon - zdjęcie mgr inż. Pavulon 30.01.2009

ja tu widzę jeden "błąd", a raczej niedomówienie.
brak tablicy jako takiej. w końcu przecież np string jest tylko tablica przechowująca zmienne typu char ?
ale równie dobrze może być tablica zmiennych typu int, tablice wielowymiarowe itd.
Odpowiedz

Seba - zdjęcie Seba 30.01.2009

sprawdzales czy tak mozna? Z tego co sie orietuje zapis [] mozna tylko stosowac w celu samo dopasowania sie tablicy do ilosci elementow (new zmienna[] = "dadadada" // new zmienna[] = {1,2,3,4,54,5,1,3,5,1})

Ta, ale jak już tak chcesz robić, to lepiej używać dynamicznych tablic.

brak tablicy jako takiej. w końcu przecież np string jest tylko tablica przechowująca zmienne typu char ?

Sure, zapomniał też dopisać że na końcu stringu null musi być.
Odpowiedz

  • +
  • -
berix - zdjęcie berix 03.02.2009

przy stałych można także dodać
new const nazwa[] = "ciag znakow"
Odpowiedz

  • +
  • -
destrojer - zdjęcie destrojer 24.02.2010

Tak wiem, że temat ma ponad rok i z góry przepraszam za odkop, ale nie mogę tak tego zostawić.

Po 1 nie wiem jak się uczyłeś, ale nie rozpowszechniaj takich bzdur dobrze?
Po 2 zmienne w tym sensie co Ty przedstawiłeś definiujemy a nie deklarujemy. Jest różnica między tymi pojęciami.
Po 3

Najprościej ujmując zmienna jest to obszar ulokowany w pamięci komputera przechowywujący dane różnego typu

jak już chcesz tak pisać to uważaj na słownictwo. Nie ma czegoś takiego jak OBSZAR PAMIĘCI, jak już to komórka pamięci i nie jest to język prosty jeśli chodzi o tłumaczenie czegoś zielonym.
Po 4

Inicjacja:
Pierwsze przypisanie wartości do zmiennej po jej utworzeniu:

new zmienna;
zmienna = 1;

rozumiem, ze inicjacja seksualna tak? Zmienne się inicjALIZuje. Poza tym to jest przypisanie do zmiennej wartości a nie zainicjalizowanie jej.

Po 5

Przy ich tworzeniu automatycznie ustawiane są na 0( nie przechowywują żadnych danych, są po prostu puste)

zero jest logicznym fałszem więc jest wartością mój drogi.

Po 6

String:
Zmienna przechowywująca string - ciąg znaków. Po nazwie wystarczy dodać dwa nawiasy(lub więcej w zależności jaką tablice chcemy stworzyć)
Deklaracja:

new zmienna[ilosc_znakow_tablicy];

zmienna może Ci co najwyżej przechować jeden znak. Teraz czas na małą zabawę. Jestem zielony i czytam to co napisałeś w nawiasie. Tworzę coś takiego
new a[[[[[[[[2]]]][[]]][[]]]]];
, zrobiłem tak bo napisałeś to bardzo skrótowo i tym samym nie zrozumiale dla noobków.

Po 7

W Pawnie można spotkać następujące typy zmiennych:

w PAWN nie ma TYPÓW zmiennych, są tylko tagi.

Po 8

Stock:
Wiele osób używa je, ale tak naprawdę nie wie jak one działają. Zmienne te są tworzone tylko wtedy, jeżeli są używane, w innym wypadku kompilator je ignoruje. Zazwyczaj używane w plikach nagłówkowych .inc .
Deklaracja:

stock zmienna;

kiedy świnie zaczną latać. Takie coś (bo nie mam pomysłu jak to nazwać) wywoła tylko błędy i nic więcej. Jeśli nie wiesz czym jest stock to nie pisz o tym dobrze?

Już mi się nie chce wyliczać, znudziło mi sie

Stałe:
Działają tak samo jak zmienne, lecz zmienną ich nie można nazwać gdyż byłaby to kompletna sprzeczność. Różnią się tym, że poprzez cały czas mają jedną wartość, która zostanie im przypisana, nie można na nich wykonywać żadnych operacji oprócz pobierania ich wartości. Przy tworzeniu przed nazwą trzeba dodać przedrostek 'const'

Makrodefinicje:
Bardzo podobne do zmiennych, działają na zasadzie "niech X będzie Y". Tak więc jeżeli do makrodefinicji X przypiszemy Y każdorazowe wpisanie w kodzie X skutkuje wywołaniem Y. Programiści używają ich najczęściej aby zaoszczędzić sobie wpisywania długich nazw funkcji, lub ścieżek do plików. Nie ma ograniczeń co do typu przechowywanych w nich danych. Tworzenie:

Wyjaśniłeś to bardzo pobieżnie. Nie wspomniałeś jaka różnica miedzy stałą a makrodefinicją, nie wspomniałeś dlaczego w pewnych sytuacjach stosowanie makrodefinicji jest mniej praktyczne niż stałych. Mały przykład
new const a = 2 + 2;
#define WYNIK       2+2

printf(" Wynik 1:  %i\n Wynik2: %i", (a * 2), WYNIK * 2 );

W 1 przypadku wynikiem bedzie 8, w drugim 6. Dlaczego? Bo kompilator zastępuje każda definicję jej wartością.


Trochę już zmęczony jestem.

Nigdy więcej nie patrz na mnie takim wzrokiem

Nigdy więcej nie miej takich zimnych oczu

Pozdrawiam.

Dziękuję, dobranoc
D.
Użytkownik destrojer edytował ten post 24.02.2010 23:21
Odpowiedz

  • +
  • -
Miczu - zdjęcie Miczu 24.02.2010

Na pierwszy post wybrales takie wyprawcowanie, zawsze to lepsze niż cześć w dziale "przywitaj się".

Bo kompilator zastępuje każda definicję jej wartością.

To też można różnie odczytać, bo jaka jest wartość "2+2". Ja bym powiedział ze kompilator pawn'a zastępuje wszystkie definicje, zdefiniowanym kodem (pewnie da sie do tego przyciepic :F). Hmm... najlepsza analogia do tego, to chyba jest jak zastąp wszystkie w notatniku lub innym edytorze - zastepuje podane słowo (definicje) podanym kodem, bez jego przetwarzania (liczenia, etc), tylko tak jak jest podany, dlatego "WYNIK * 2" zostaje zastąpiony na "2 + 2 * 2" co daje inny winik niż "(a * 2)" gdzie wartość "a" jest wczesniej obliczana.

w PAWN nie ma TYPÓW zmiennych, są tylko tagi.

Nie bardzo wiem co masz na myśli, chodzi ci o to, że Float: i zwykła zmienna całkowita mają tyle samo bajtów i tylko tag je od siebie rozróżnia? Bo w każdym języku programowania zapis jest na maszynie binarny, wiec to jakoś nie szczególne wytłumaczenie, a typ całkowity i zmiennoprzecinkowy jakoś lepiej mi pasują.

PS. jak masz ochotę możesz napisać wlasnego tutka, mamy tendencje zostawiać tylko te lepsze.
Odpowiedz

  • +
  • -
destrojer - zdjęcie destrojer 25.02.2010

Mam na myśli to, że pawn jest językiem bez typowym, czyli zmienne/tablice mogą przechowywać podobne wartości. Może mało zrozumiale to jakiś przykład dam. (trochę już zmęczony jestem i kiepsko mi się myśli)
new
		a,
		bool:b;
		
	b = 3.14;
	printf("%f", b);
	a = b;
	printf("%f", a);
Mam nadzieję, że to wyjaśni większość pytań.

PS. jak masz ochotę możesz napisać wlasnego tutka, mamy tendencje zostawiać tylko te lepsze.

mam bardzo dobry poradnik o zmiennych napisany, ale niestety sam prowadzę forum o PAWN i sam chyba najlepiej rozumiesz.
Odpowiedz

  • +
  • -
ParadisO - zdjęcie ParadisO 10.10.2011

w C++ jest jeszcze zmienna "double", która o ile dobrze pamiętam jest podobna do zmiennej float lecz jest bardziej dokładna, wyświetla 2 miejsca po przecinku.
Czy jest taka zmienna w amxx ?? lub czy da się w ten sposób użyć zmiennej float ??

(%0.0f%s)", perc,"%%"

ten kawałek kodu jest z diablo moda lecz nie pamiętam czy to pokazuje w takiej dokładności jakbym chciał
Użytkownik ParadisO edytował ten post 10.10.2011 21:27
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 10.10.2011

(%0.xf%%)", perc
 
tak gdzie x oznacza ile liczb po przecinku ma pokazać jak wpiszesz 2 to pokaże dwie liczby po przecinku itp.
poczytaj
http://amxx.pl/dokum...ja/f1366/format
Odpowiedz

  • +
  • -
ParadisO - zdjęcie ParadisO 10.10.2011

dzięki
Odpowiedz

  • +
  • -
emanuel.wloch - zdjęcie emanuel.wloch 19.01.2013

Dobrze wytłumaczone.Apropo, znalazłem literówke. :)
#define NAZWA_MAKRODEFINCJI KOD_KTORY_MA_ONA_ZASTEPOWAC
#define NAZWA_MAKRODEFINICJI KOD_KTORY_MA_ONA_ZASTEPOWAC

(20.01.2013 23:43):
Poprawione

Użytkownik emanuel.wloch edytował ten post 19.01.2013 23:05
Odpowiedz