Problem z przesyłaniem danych przez task
Rivit
04.03.2014
Witam.
Mam taki problem.
Po wpisaniu komendy nic się nie dzieje. Myślę, że to wina (moja) przesyłania danych przez task.
Czy to jest poprawne?
register_clcmd("say /r", "r")
public r() restarty(4)
restarty(ile_razy) { new params[1] params[0] = ile_razy set_task(2.0, "ustawienia", _, params, 1, "a", ile_razy) } public ustawienia(parametry[]) { new ilosc = parametry[0] if(ilosc == 4) ZAPISUJ = true client_print(0, print_chat, "START") }
Seba 04.03.2014
Jak chcesz przekazac zmienna typu int to nie wysylaj jako string tego tylko uzyj taskid do przekazania parametru
sebul
04.03.2014
Seba 04.03.2014
Nie bardzo wiesz o czym mowiesz - parametr do przeslania przez task to zwykla tablica
GwynBleidD
04.03.2014
parametr do przeslania przez task to zwykla tablica
Czytanie ze zrozumieniem się kłania Wszak tablica intów to zwykła tablica, przynajmniej w PAWNie.jako string, tylko jako tablica intów
Ale niestety gdy przesyłamy taki string czy tablicę na zewnątrz to tu już jest różnica. O ile w tablicy możemy przesłać string to w drugą stronę niekoniecznie, bo mechanizm natywów i forwardów z AMXX utnie komórki tablicy do 1 bajta. Takie coś ma miejsce np w info w menu. No i 2 różnica, że string musi być zakończony zerem (nullem, a nie zerem jako znak ASCII).
A co do przesyłania pojedynczej wartości poprzez ID: jest problem, gdy chcielibyśmy restarty przerwać... jakie ID ma task? wszak ilość restartów się cały czas zmienia, a robić do tego globalną zmienną dodatkowo to kompletny bezsens. Wtedy jest łatwiej przekazać ID stałe, a zmienną w tablicy. Co innego, gdy mamy task per gracz, wtedy ID gracza może wędrować przez ID taska, o ile nie przekazujemy dodatkowo czegoś więcej. Tak samo możemy natrafiać na problem konfliktów ID taska wewnątrz pluginu, dochodzi nam wtedy niewygodne dodawanie i odejmowanie stałych. Lepiej jest przyzwyczaić się do przekazywania parametrów przez tablicę data i mieć spokój. Gdy rozbudowujemy plugin nie trzeba przerabiać tego, bo jeden parametr nam już nie wystarcza, wystarczy powiększyć tablicę.
Wracając do problemu - przecież wewnątrz taska ZAWSZE ile_razy będzie równe tyle samo, bez względu na to który raz się task wywołuje. Chyba nie taki miałeś cel
sebul
04.03.2014
No raczej chyba wiem co napisałem ;]Nie bardzo wiesz o czym mowiesz - parametr do przeslania przez task to zwykla tablica
Napisałeś, żeby parametru nie wysyłać jako string, tylko dać go w taskid, no to sprostowałem, to co napisałeś, bo w tasku nie wysyłamy stringa (tablicy charów), tylko właśnie tablicę intów. Akurat to jest jakaś różnica, bo tak jak to wyżej zostało napisane, przy dodawaniu elementów do menu w jednym parametrze możemy przekazać właśnie string (tablicę charów), żeby potem go w handlerze odczytać, a w tasku możemy przekazać tablicę intów, a jak chyba wiesz, char ma dużo mniejszy zakres niż int.
Rivit
04.03.2014
Zamierzenie jest takie:
Wywoluje kilka razy w kodzie restarty. Jako parametr podaje 2 potem 3 i potem 4 (w roznych miejscach w kodzie). I teraz chce do publica przeslac ta liczbe (ile razy), po to by ustawic bool:ZAPISUJ na true. Co do taskID to nie będę robil bo nie chce go zatrzymywac itp.
Jak to zrobic?
Seba 04.03.2014
Nie bardzo rozumiem do czego dążycie. W tasku jako parametr można wysłać co się tylko chce, więc w czym problem ?
sebul
04.03.2014
Nie bardzo rozumiem do czego dążycie. W tasku jako parametr można wysłać co się tylko chce, więc w czym problem ?
W tym. Chodziło po prostu o to, że napisałeś "string", a string to tablica charów, a char ma zbyt mały zakres, żeby tak wszystko można było wysyłać, bo dużych wartości byś nie wysłał, jeśli rzeczywiście by tak było.to nie wysylaj jako string tego
Rivit
04.03.2014
xenos
04.03.2014
register_clcmd("say /r", "r") public r() restarty(4) restarty(ile_razy) { new data[1]; data[0]=ile_razy ; set_task(2.0, "ustawienia", .parameter=data, .len=1); } public ustawienia(parametry[]) { new ilosc = parametry[0] if(ilosc == 4) ZAPISUJ = true client_print(0, print_chat, "START") }
Niide
04.03.2014
Nie wiem czy dobrze zrozumiałem, ale czy nie lepiej zdefiniować na początku pluginu nowej zmiennej np. "parametr" i potem użyć tego w ten sposób?
new parametr[5];
restarty(ile_razy) { parametr = ile_razy; set_task(2.0, "ustawienia", _, _, _, "a", ile_razy) } public ustawienia() { if(parametr == 4) ZAPISUJ = true client_print(0, print_chat, "START") }
Jeżeli nie (źle zrozumiałem) to minusujcie ile wlezie
BTW. W Twoim kodzie jest tak, że task uruchomi się ile_razy(=4) z rzędu, nie wiem czy takie było zamierzenie więc nic z tym nie robiłem...
Edited by Niidek, 04.03.2014 18:31.
Rivit
04.03.2014
Nie chce globalnych. Po cos ktos zrobil przesylanie parametrow przez task.
@Xenos
twoj kod wykona sie tylko raz. A ja chce zeby wykonal sie 4 (tyle ile podasz w parametrze funkcji restarty)
xenos
04.03.2014
To polecam rekurencje - użucie funkcji w funkcji z mniejsząjąca się iloscią obrotów
przykład
if(parametr >1) restarty(parametr-1)
Edited by xenos, 04.03.2014 22:01.
GwynBleidD
04.03.2014
1. Gdy podajemy tablicę z danymi do set task, to nasz task otrzymuje 2 parametry, tą tablicę i jej wielkość (długość). Ty pobierasz tylko jeden z nich i to może być problemem.
2. Czy chcesz, żeby przy 4krotnym wywołaniu tasku (ile_razy = 4) do każdego została przekazana liczba 4 czy do 1 wywołania 1, do 2 wywołania 2 itp?
3. Jaki cel ma zmienna zapisuj?
Rivit
05.03.2014
ad 2. Chce zeby task sie wykonal 4 razy (4 razy napis start), ale musze przeslac ile_razy bo chce ustawic zmienna a true.
ad 3. Odpowiada za zapis nvault if(zapisuj) to zacznij zapisywac. (ogolnie to malo istotne w tym momencie)
Seba 05.03.2014
Nie bardzo rozumiem do czego dążycie. W tasku jako parametr można wysłać co się tylko chce, więc w czym problem ?
W tym. Chodziło po prostu o to, że napisałeś "string", a string to tablica charów, a char ma zbyt mały zakres, żeby tak wszystko można było wysyłać, bo dużych wartości byś nie wysłał, jeśli rzeczywiście by tak było.to nie wysylaj jako string tego
Wciąż nie rozumiem o czym piszesz. Jako parametr w set_task mogę przekazać każdy rodzaj zmiennej dostępnej w PAWNie i nie wiem o jakich zakresach mówisz.
Przykład: https://forums.allie...600&postcount=5
Edited by Seba, 05.03.2014 11:16.
sebul
05.03.2014
Ale czy ja napisałem, że nie można? Tak jak już wspomniałem, chodziło tylko o to, że napisałeś "string", czyli tak jakby ograniczyłeś możliwości przekazywania parametru w set_task, a jak wiesz (bo to właśnie napisałeś), parametr ten może przyjmować dużo więcej niż tylko string i o to cały ten "spór". Teraz rozumiesz?
GwynBleidD
05.03.2014
public ustawienia(data[], len)ofc nazwy dowolne.
ad 2. Dalej mi nie odpowiedziałeś na pytanie... wywołujesz funkcję restarty z parametrem = 4, ta funkcja odpali 4x task. Do każdego odpalenia tasku zostanie przekazany parametr. Czy chcesz, żeby był to ten sam parametr, czyli do każdego taska pójdzie 4 (co spowoduje 4x zapisanie się danych do nvault) czy chcesz przekazać do każdego taska inny parametr, zwiększany co task, czyli pójdzie po kolei 1 do pierwszego taska, 2 do drugiego itp? Bo to, co Ty zrobiłeś jest równe pierwszemu. Jeśli chcesz 2 musisz zmienić podejście, wywołując set_task kilka razy, np w pętli albo wewnątrz wykonywanego taska.