Проблема со сканированьем.
#1

Всем доброго времени суток , у меня такая проблема:
Вообщем бывает человек 10 - 11 попадает под этот баг при большом онлайне .
PHP код:
#define PlayerIsNotOnline                "Игрок не в игре!" 
Это переменная для
PHP код:
else if(!IsPlayerConnected(params[0])) return SendClientMessage(playerid0xBEBEBEAAPlayerIsNotOnline); 
и если игрок в сети , он почему то его не видеть и так на любой команде , подскажите в чем может быть проблема.
Reply
#2

Использование params[*] в качестве "любое число, но не символ текста параметров" для лохов и говнокодеров.

Потому что вы в IsPlayerConnected() передаёте число от 33 до 127 или от 192 до 255, либо некоторые из диапазона от 129 до 191.

P.S.: ваша Ванга.
Reply
#3

как решить проблему?. я попросил помощи.
Reply
#4

Ваш срок бесплатной подписки на Вангу закончился.
Вообще-то вас даже троллить не нужно, вы сами шоу запилили.
Ну ладно... "Как быть?" значит? - Ладно, отвечу "использовать что-то иное, но не params[0]".

+в репу за помощь
Reply
#5

Quote:
Originally Posted by Mutha_X
Посмотреть сообщение
Ваш срок бесплатной подписки на Вангу закончился.
Вообще-то вас даже троллить не нужно, вы сами шоу запилили.
Ну ладно... "Как быть?" значит? - Ладно, отвечу "использовать что-то иное, но не params[0]".

+в репу за помощь
т.е. по Вашему код рода:
PHP код:
cmd:warn(playeridparams[]){
    if(
Player[playerid][pAdminPlayer] < LEVEL_WARN) return -1;
    if(
sscanf(params,"ds[30]",params[0],params[1])) return SendClientMessage(playerid, -1""ISSYSTEMSG"/warn [ID] [причина]");
    
GiveWarn(playerid,params[0],params[1]);
    return 
true;

Является быдлокодом, а код вида:
PHP код:
cmd:warn(playeridparams[]){
    if(
Player[playerid][pAdminPlayer] < LEVEL_WARN) return -1;
    new 
givedplayerid,warnreason[30];
    if(
sscanf(params,"ds[30]",givedplayerid,warnreason)) return SendClientMessage(playerid, -1""ISSYSTEMSG"/warn [ID] [причина]");
    
GiveWarn(playerid,givedplayerid,warnreason);
    return 
true;

является грамотным?
Reply
#6

ну вообще-то да
Reply
#7

Спасибо буду знать.
Reply
#8

Quote:
Originally Posted by Gettopro
Посмотреть сообщение
т.е. по Вашему код рода:
Является быдлокодом, а код вида:
является грамотным?
Почитайте на тему (само)документирующегося кода.
Чтобы по быстрому понять какой новый смысл приобретает ячейка params[0] или params[1] вам надо было прописать соответствующий комментарий (а даже его у вас нет).

А если вам нужно тысячу таких команд проверить в сжатые сроки?
А если у вас команда в 500 строк? А если там ещё несколько раз меняет свой смысл params[0]? А если вы захотите модифицировать такую команду где-то посередине, а при этом забудете или перепутаете (проморгаете) строку, где меняется смысл params[0]?

Если вам нравится такой затратный по времени фетиш, можем только посочувствовать.
Reply
#9

Более того, обращение к ячейке массива происходит медленнее, чем к переменной. Но удобство чтения кода, конечно, куда более значимый пункт.
Reply
#10

Убери оператор else перед проверками.
Reply
#11

спасибо попробую
Reply
#12

Quote:
Originally Posted by Mutha_X
Посмотреть сообщение
Почитайте на тему (само)документирующегося кода.
Чтобы по быстрому понять какой новый смысл приобретает ячейка params[0] или params[1] вам надо было прописать соответствующий комментарий (а даже его у вас нет).

А если вам нужно тысячу таких команд проверить в сжатые сроки?
А если у вас команда в 500 строк? А если там ещё несколько раз меняет свой смысл params[0]? А если вы захотите модифицировать такую команду где-то посередине, а при этом забудете или перепутаете (проморгаете) строку, где меняется смысл params[0]?

Если вам нравится такой затратный по времени фетиш, можем только посочувствовать.
Ко всему вышеперечисленному следует записать краш в случае, когда команда с таким вот params[0]/params[1], которые обрабатываются в sscanf и в которой учтена возможность необязательных параметров, вызывается без параметров вообще (просто ввод команды). То бишь, вот такой код:
PHP код:
CMD:commandname(playeridparams[])
{
    
sscanf(params"I(-1)I(-1)"params[0], params[1]); 
    return 
true;
}
//
cmd::commandname(playerid"");// Ну или игрок просто введёт команду без параметров 
= краш, ибо sscanf отчаянно начнёт пытаться записывать данные в ячейки, которых просто не существует.
Reply
#13

Поменял все команды , и все же косяк остается.
Что посоветуете?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)