Skocz do zawartości

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

Zmienne - Co I Jak?


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

#1 darkman

    Wszechwiedzący

  • Przyjaciel

Reputacja: 87
Zaawansowany

  • Postów:553
  • Lokalizacja:inactive
Offline

Napisano 30.01.2009 15:57

*
Popularny

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.

  • +
  • -
  • 8

#2 Miczu

    Godlike

  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 30.01.2009 16:07

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

#3 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

  • Postów:4 248
  • Lokalizacja:Nie
Offline

Napisano 30.01.2009 16:14

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

#4 darkman

    Wszechwiedzący

  • Autor tematu
  • Przyjaciel

Reputacja: 87
Zaawansowany

  • Postów:553
  • Lokalizacja:inactive
Offline

Napisano 30.01.2009 16:15

poprawione, kiedys to rozszerze bardziej
  • +
  • -
  • 0

#5 mgr inż. Pavulon

    C35H60Br2N2O4

  • Przyjaciel

Reputacja: 1 742
Godlike

  • Postów:6 881
  • Steam:steam
  • Imię:Konrad
  • Lokalizacja:Koniecpol
Offline

Napisano 30.01.2009 16:46

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

#6 Seba

    Wszechobecny

  • Zbanowany

Reputacja: 198
Profesjonalista

  • Postów:424
  • Lokalizacja:Internet
Offline

Napisano 30.01.2009 17:58

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

#7 berix

    Wszechwidzący

  • Użytkownik

Reputacja: 34
Życzliwy

  • Postów:254
  • Lokalizacja:Ruda sl (slaskie)
Offline

Napisano 03.02.2009 12:48

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

  • +
  • -
  • 0

#8 destrojer

    Nowy

  • Nowy

Reputacja: 19
Początkujący

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

Napisano 24.02.2010 23:19

*
Popularny

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

  • +
  • -
  • 7

#9 Miczu

    Godlike

  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 24.02.2010 23:54

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

#10 destrojer

    Nowy

  • Nowy

Reputacja: 19
Początkujący

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

Napisano 25.02.2010 00:12

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

#11 ParadisO

    Wszechmogący

  • Power User

Reputacja: 128
Zaawansowany

  • Postów:689
  • Lokalizacja:Częstochowa
Offline

Napisano 10.10.2011 21:23

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

  • +
  • -
  • 0

#12 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 981
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 10.10.2011 21:30

(%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
  • +
  • -
  • 1

#13 ParadisO

    Wszechmogący

  • Power User

Reputacja: 128
Zaawansowany

  • Postów:689
  • Lokalizacja:Częstochowa
Offline

Napisano 10.10.2011 21:47

dzięki
  • +
  • -
  • 0

#14 emanuel.wloch

    Nowy

  • Użytkownik

Reputacja: -1
Nowy

  • Postów:5
  • Lokalizacja:Zapałów
Offline

Napisano 19.01.2013 23:02

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

  • +
  • -
  • 0




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

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