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_EVENTPobiera 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.
żeby pobrać parametry do zmiennych można użyć kodu:amx_jump <ile_razy> <jak_wysoko>
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