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.
|
get_user_nameco wpisuje w tablice, jeżeli ma ona wielkość 32, a nick tylko 4
#2 Gość_21977_*
Napisano 11.07.2012 17:42
\0Pozostałe wartości nie ulegną zmianie.
Warto także zauważyć, że
client_print(id,print_console,"%s",name[x]);przyjmie następujące wartości (licząc od zera):
- podciąg od znaku x do znaku 3. włącznie dla x<4
- ∅ dla x=4
- podciąg od znaku x do najbliższego znaku NULL rozłącznie dla x>4 i wskazującego na element inny, niż NULL.
- ∅ dla x>4 i wskazującego na element NULL.
#3 Gość_21977_*
Napisano 11.07.2012 17:52
Ten temat został przeniesiony z forum
AMX Mod X → Pytania
do
Scripting AMXX → Pytania
#4
Napisano 11.07.2012 18:16
pytałem, ponieważ potrzebne mi to przy switch'u, mogę w takim razie zrobić tak?:
switch(nick[i]] { case a: litera[i]=1; case b: litera[i]=2; case NULL: litera[i]=3; }
Użytkownik Eustachy8 edytował ten post 11.07.2012 18:17
#5
Napisano 11.07.2012 18:45
To już nie łatwiej przez replace ?przykład całkowicie przyciemnił całość, nie wiedziałem, czy zwraca NULL jak w C++
pytałem, ponieważ potrzebne mi to przy switch'u, mogę w takim razie zrobić tak?:switch(nick[i]] { case a: litera[i]=1; case b: litera[i]=2; case NULL: litera[i]=3; }
If you can dream it, you can do it.
#6 Gość_21977_*
Napisano 11.07.2012 19:09
Jan Test
#include <amxmodx>wbrew pozorom, po wpisaniu komendy "un" w konsoli, nie napisze "T", lecz "Test",
#include <amxmisc>
#include <fun>
#include <cstrike>
#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "vBullet."
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("un", "un")
}
public un(id){
new name[32];
get_user_name(id,name,4);
if(equal(name[4],"Test"))client_print(id,print_console,"Test");
else if(equal(name[4],"T"))client_print(id,print_console,"T");
else if(equal(name[4],"t"))client_print(id,print_console,"t");
else client_print(id,print_console,"default");
}
bowiem w Pawnie zwrócony zostanie podciąg aż do najbliższego znaku NULL rozłącznie.
Gryzie się to z wieloma innymi językami programowania, ale tak to wygląda dla pawna.
#7 Gość_21977_*
Napisano 11.07.2012 19:25
wstawiając kolejne znaki nicku do kolejnych komórek tablicy od zerowej począwszy.
Zamiast niewodocznego znaku NULL (\0) użyję podkreślenia (_)
Tak, dla przykładu, niech będzie tablica
new nick[32]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_"; // tablica nick[32] wypełniona 31 znakami "a", zawierająca na końcu (nick[31]) domyślnie znak NULL (\0)
Pobierając nick gracza o nicku
Jan Test, zmianna nick z postaci wyżej przybierze postać niżej:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_Zauważmy, że funckcja get_user_name() prócz nadpisania pierwszych n znaków tablicy (gdzie n to długość nicku) doda na końcu (w pozycji entej licząc od zera) znak NULL (\0) oznaczony podkreśleniem.
Jan Test_aaaaaaaaaaaaaaaaaaaaaa_
Pobranie nick[x] pobierze podciąg od znaku x (licząc od zera) do najbliższego (na prawo, numeracją wzwyż) znaku NULL rozłącznie.
Tym samym wywołanie nick[4] dla tablicy
Jan Test_aaaaaaaaaaaaaaaaaaaaaa_przyjmie wartość
Testbowiem rozpocznie pobieranie na 4. znaku (tyle wynosi x) i skończy na najbliższym znaku NULL, który jest tuż za wyrażeniem "Test",
a nie, jak byśmy podejrzewali, samą literę "T". I tym miłym akcentem zakończę ten przydługi wywód na ten temat.
#8
Napisano 11.07.2012 20:10
więc jak rozwiązać mój przypadek. Chcę byc nick był dzielony na każdą literę, która z kolei będzie zmieniana na odpowiadającą jaj liczbę, która będzie indexem obrazka z pliku sprites. robię plugin, który będzie wyświetlał na ścianie kto aktualnie otwiera a kto zamyka tabele (wraz z wynikami).
Chcę by to było równo, więc jeżeli ktoś ma 30 znaków w nicku a drugi ma tylko cztery, chcę dopełniać do 31 znaków tego co ma mniej spacjami. dlatego potrzebuję przechwytywać NULL by wiedzieć od kąd zacząć uzupełniać. Mogę więc zrobić tak?
case NULL: liczba[i]=1234;
aktualnie caly mój switch wygląda tak
idzie to rozwiązać w jakiś inny sposób?
Użytkownik Eustachy8 edytował ten post 11.07.2012 20:20
#9 Gość_21977_*
Napisano 11.07.2012 20:27
O ile się uprzesz, dla krótkich stringów, możesz skorzystać z funkcji tego typu: http://pastebin.com/LJYjZFCDYou cannot switch on a string in pawn, switch may only be used with integers. Also you don't need that format, sscanf formats name automatically. You will need to use strcmp and if/else if.
Polecam Ci jednak zastosować metodę, jak niżej:
if(warunek1)
komenda1;
else if(warunek2)
komenda2;
else if(warunek3)
komenda3;
else
komendaX;
#12
Napisano 11.07.2012 21:19
Mnie to nie zaskoczyło. A co do "if(equal(name[4],"T"))", to aby sprawdzić tylko jeden znak, to chyba trzeba użyć w equal 3 parametr, czyli wstawić 1, aby sprawdzało tylko jedną literę.Pomijając switch, w pawnie przykład dla gracza o nicku
Jan Test#include <amxmodx>wbrew pozorom, po wpisaniu komendy "un" w konsoli, nie napisze "T", lecz "Test",
#include <amxmisc>
#include <fun>
#include <cstrike>
#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "vBullet."
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("un", "un")
}
public un(id){
new name[32];
get_user_name(id,name,4);
if(equal(name[4],"Test"))client_print(id,print_console,"Test");
else if(equal(name[4],"T"))client_print(id,print_console,"T");
else if(equal(name[4],"t"))client_print(id,print_console,"t");
else client_print(id,print_console,"default");
}
bowiem w Pawnie zwrócony zostanie podciąg aż do najbliższego znaku NULL rozłącznie.
Gryzie się to z wieloma innymi językami programowania, ale tak to wygląda dla pawna.
A zamiast znaku kończącego można używać 0, bo NULL = 0.
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#13 Gość_21977_*
Napisano 11.07.2012 21:26
W 2. temacie podlinkowałem temat, który ma implementację switcha dla krótkich stringów, co dla pojedynczej litery przyniesie oczekiwany rezultat i jest godne uwagi.
Jednak ciekawym rozwiązaniem jest także zastosowanie funkcji replace. W rozważaniach skupiłem się na istocie pierwotnego pytania, dziękuję za doinformowanie.
#14
Napisano 11.07.2012 21:30
jeżeli odnosi się tu tak samo jak w c++ to do asci jest to liczba 133
Użytkownik Eustachy8 edytował ten post 11.07.2012 21:32
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych