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

get_user_nameco wpisuje w tablice, jeżeli ma ona wielkość 32, a nick tylko 4


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

#1 Eustachy8

    Wszechpomocny

  • Użytkownik

Reputacja: 116
Zaawansowany

  • Postów:304
  • Imię:Kuba
  • Lokalizacja:Buczacz
Offline

Napisano 11.07.2012 17:08

Witam!

gdy pobieram przez tą funkcję nick do tablicy z 33 znakami, a nick ma tylko 4, co jest wpisywane od nick[4] do nick[32]?
  • +
  • -
  • 0

24azdk0.jpg
b_350_20_692108_381007_FFFFFF_000000.png
 


#2 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 11.07.2012 17:42

nick[4] przyjmie wartość znaku końca tabeli, tzw. NULL, zapisywany
\0
Pozostał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.
Spoiler


#3 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 11.07.2012 17:52

Automatyczna wiadomość


Ten temat został przeniesiony z forum

AMX Mod XPytania

do

Scripting AMXXPytania

#4 Eustachy8

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 116
Zaawansowany

  • Postów:304
  • Imię:Kuba
  • Lokalizacja:Buczacz
Offline

Napisano 11.07.2012 18:16

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;
}

Użytkownik Eustachy8 edytował ten post 11.07.2012 18:17

  • +
  • -
  • 0

24azdk0.jpg
b_350_20_692108_381007_FFFFFF_000000.png
 


#5 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1 592
Godlike

  • Postów:2 733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 11.07.2012 18:45

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;
}

To już nie łatwiej przez replace ;) ?
  • +
  • -
  • 0

If you can dream it, you can do it.


#6 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 11.07.2012 19:09

Pomijając switch, w pawnie przykład dla gracza o nicku
Jan Test
#include <amxmodx>
#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");
}
wbrew pozorom, po wpisaniu komendy "un" w konsoli, nie napisze "T", lecz "Test",
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_*

  • Gość

Reputacja: 0

Offline

Napisano 11.07.2012 19:25

Funkcja get_user_name(id, nick[], size) pobierze nick gracza id i umieści go w tablicy nick[] o rozmiarze size,
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_
Jan Test_aaaaaaaaaaaaaaaaaaaaaa_
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.

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ść
Test
bowiem 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 Eustachy8

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 116
Zaawansowany

  • Postów:304
  • Imię:Kuba
  • Lokalizacja:Buczacz
Offline

Napisano 11.07.2012 20:10

już teraz pojmuję ;D

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
Spoiler


idzie to rozwiązać w jakiś inny sposób?

Użytkownik Eustachy8 edytował ten post 11.07.2012 20:20

  • +
  • -
  • 0

24azdk0.jpg
b_350_20_692108_381007_FFFFFF_000000.png
 


#9 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 11.07.2012 20:27

Odnośnie switcha, w pawnie możesz użyć jako case jedynie liczby.

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

O ile się uprzesz, dla krótkich stringów, możesz skorzystać z funkcji tego typu: http://pastebin.com/LJYjZFCD

Polecam Ci jednak zastosować metodę, jak niżej:

if(warunek1)
komenda1;
else if(warunek2)
komenda2;
else if(warunek3)
komenda3;
else
komendaX;


#10 Eustachy8

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 116
Zaawansowany

  • Postów:304
  • Imię:Kuba
  • Lokalizacja:Buczacz
Offline

Napisano 11.07.2012 21:10

to mam zrobić 60 if'ów? Przecież to będzie patologia, pornografia i profanacja w jednym ;D A po za tym, każdy znak jest przecież jakąs tam liczbą w kodzie asci


Użytkownik Eustachy8 edytował ten post 11.07.2012 21:12

  • +
  • -
  • 0

24azdk0.jpg
b_350_20_692108_381007_FFFFFF_000000.png
 


#11 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 11.07.2012 21:14

hmm.. można to także zrobić serią wyrażeń regularnych, dokładnie poprzez replace, o czym pisał speedkill.

#12 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 11.07.2012 21:19

Pomijając switch, w pawnie przykład dla gracza o nicku

Jan Test
#include <amxmodx>
#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");
}
wbrew pozorom, po wpisaniu komendy "un" w konsoli, nie napisze "T", lecz "Test",
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.

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

A zamiast znaku kończącego można używać 0, bo NULL = 0.
  • +
  • -
  • 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_*

  • Gość

Reputacja: 0

Offline

Napisano 11.07.2012 21:26

Słuszna uwaga, jednak jako takiego switcha dla liter w pawnie nie ma.
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 Eustachy8

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 116
Zaawansowany

  • Postów:304
  • Imię:Kuba
  • Lokalizacja:Buczacz
Offline

Napisano 11.07.2012 21:30

pomysł zaczerpnąłem z pluginu z zegarami (timeleft i prawdziwa godzina) tam musiał tylko liczby od 0-59 zmieniać na index by wklejać na ścianę obrazki. Ja muszę wszystkie znak z klawiatury. W PAWNie pierwszy raz biorę się za ambitniejszy plugin (do tej pory tylko c++) i nie do końca rozumie wasze pomysły. Ale z tego co mi wiadomo pisząc 'm' m jest liczbą
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

  • +
  • -
  • 0

24azdk0.jpg
b_350_20_692108_381007_FFFFFF_000000.png
 





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

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