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

Strumienieciekawostka :P


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

#1 R3X

    Godlike

  • Przyjaciel

Reputacja: 2 987
Godlike

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

Napisano 19.07.2010 14:35

Strumienie

Zupełnie zbędna biblioteka wprowadzająca do kodu 2 strumienie: cout i cin. O ile ten wyjścia (cout) jeszcze można nazwać strumieniem to wejściowy(cin) na pewno nim nie jest. Szalę przeważa brak dynamicznego zarządzania pamięcią, więc właściwie strumieniami w kontekście C++ nie są. Tylko nazywają się tak samo.

Jeśli uważasz, że czytając tych kilka zdań straciłeś tylko czas to chyba wystarczy - dalej jest jeszcze gorzej.

Ale mniejsz o to :) Do rzeczy

Cout
cout zbiera dane różnych typów do stringa. w pawnie operatorów bitowych nie da się przeciążyć, więc konstrukcja opiera się na znakach arytmetycznych: *, / i %

Przygotowanie tego strumienia do pracy wymaga przypisania wartości do cout z enum określającego co chcesz zrobić z zawartością strumienia.

OS_STD oznacza 'sam sobie wymyśle gdzie', następne 4 to nic innego jak client_print a ostatni to ColorChat() (wymaga własnoręcznego dołączenia <colorchat>)
enum OutStream{
OS_STD,
OS_CENTER,
OS_CHAT,
OS_CONSOLE,
OS_NOTIFY,
OS_COLORCHAT
}

np.
cout = OS_STD

obsługiwane są następujące przepisania
cout * liczba
cout * Float:liczbaRzeczywista
cout / pojedynczy_znak
cout % s(string)
Przeciążanie operatorów z argumentami będącymi tablicami nie przypadło do gustu kompilatorowi, więc żeby przesłać stringa trzeba użyć makra s(). Pobiera ono adres (wskaźnik) i na nim operuje funkcja przepisania.

Przesłania można ze sobą spokojnie łączyć:
cout % s("Graczu nr ") * id  % s(" masz predkosc ") * 250.0

dla typu innego niż OS_STD do wysłania zawartości zaleca się operator >

cout = OS_CHAT;
cout % s("Graczu nr ") * id  % s(" masz predkosc ") * 250.0;
id < cout;

Oprócz tego zawartość strumienia jest w przypisana do
cout@
np
cout = OS_STD;
cout % s("Wiadomosc testowa nr ") * (numer++);
log_amx("%s", cout@);


Formatowanie danych umożliwia funkcja
setPrecision(const szPrecision[] = "%")
ustawia ona format dla danych, współpracuje z wszystkimi 3 znakami: * / %

przepisanie liczby całkowitej po setPrecision("%") da w wyniku format "%d"
przepisanie liczby całkowitej po setPrecision("%02") da w wyniku format "%02d"

Precyzja nie jest resetowana po użyciy, trzeba to zrobić ręcznie.

Przykład
cout = OS_STD;
cout % s("Wiadomosc testowa nr ") * setPrecision("%02") * (numer++) % setPrecision("%" ) % s("a Pi = ")  * 3.14;
log_amx("%s", cout@);


Jeśli pomiędzy 2 przepisaniami nie między cout = ... to dane strumienia będą łączone. Powyższy przykład można więc zapisać tak:
cout = OS_STD;
cout % s("Wiadomosc testowa nr ");
cout * setPrecision("%02") * (numer++) % setPrecision("%" ) 
cout % s("a Pi = ")  * 3.14;
log_amx("%s", cout@);

Taki efekt jest możliwy nie tylko w wywołaniu jednej funkcji, dlatego ważna jest inicjalizacja cout, czyli np. cout = OS_STD.




Cin
Pobiera dane z parametrów komendy (register_concmd), eventu (register_event) czy wiadomości (register_message).

enum InStream{
IS_CMD,
IS_EVENT,
IS_MESSAGE
}


Przykład inicjalizacji
cin = IS_EVENT
Pobiera są kolejne dane zaczynając od 0. Zmianę numeru aktualnego parametru umożliwia operator ++ i --. Jeśli chcemy drugi parametr komendy to będzie wyglądało tak:

cin = IS_CMD
cin++;cin++;
za tym kodem pobrać można drugi argument komendy.

Tu też jest kilka operatorów przesłania.
cin * s(liczbaCalkowitaLubZnak)
cin / s(liczbaRzeczywista)
cin[ string ]

cin >= s(zmiennaNaWynik)
operator >= pobiera ilość dostępnych parametrów (wynik read_argc czy read_datanum)
Tutaj wszystkie typu wymagają użycia makra s(), a string ma osobne makro z nawiasem (cin[]) do uwzględnienia długości łańcucha.

Mamy komendę np.

amx_jump <ile_razy> <jak_wysoko>

żeby pobrać parametry do zmiennych można użyć kodu:
cin = IS_CMD
cin++;//Parametry zaczynają się od 1

new ileRazy, Float:jakWysoko;
cin * s(ileRazy) / s(jakWysoko);



W załączniku przykład użycia:
stream - ColorChat
stream2 - OS_STD
instream <int> <float> <string> - czytanie parametrów komend
deathmsg - logi z przeczytania argumentów eventu

Załączone pliki


  • +
  • -
  • 2

#2 Miczu

    Godlike

  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 19.07.2010 16:05

Rozumiem, że ty robiłeś cały kod?

Takie pytanie... co bym musiał robić by się opłacało tego użyć - czyli kiedy to mogę użyć bo sporo tego jest :unsure:
  • +
  • -
  • 0

#3 R3X

    Godlike

  • Autor tematu
  • Przyjaciel

Reputacja: 2 987
Godlike

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

Napisano 19.07.2010 16:35

Rozumiem, że ty robiłeś cały kod?

tak, zapomniałem się podpisać w incu ;P

Kiedy się opłaca? Nadmiarowość jest delikatna przy cout (tylko wykonanie pośredniej funkcji operatora) nieco większa przy cin. Nadpisywanie operatów w założeniu ma ułatwiać pisanie czytelnego kodu, jednak kompilator narzuca tu takie ograniczenia, że wyszło dość skomplikowanie. Metoda wymaga co najmniej przyzwyczajenia.

Podczas pisania przykładowego kodu zauważyłem wygodę użycia cin, a cout może być dobry przy zbieraniu danych z różnych funkcji celowo pomijając przypisanie cout = OS_..., ale konkretnie po co to nie wiem.


W ostateczności kod jest demonstracją nadpisywania operatorów i użycia wskaźników :>
  • +
  • -
  • 1

#4 GT Team

    Ten lepszy xD

  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 14.10.2013 22:41

Fajne :D Tak jak wspomniałeś, mozna tym lepiej (czy. czytelniej) sformatować kod. Szkoda, że nie ma << i >> bo tak to całkiem inna sprawa.

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 





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

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