PDA

Просмотр полной версии : [Вопрос] Вопрос по sscanf



Paradox
14.08.2019, 02:42
Доброе время суток.
Возник такой вот вопрос по sscanf, как исправить данное предупреждение?


sscanf warning: Strings without a length are deprecated, please add a destination size.


Сама команда:


COMMAND:test(playerid, params[])
{
new targetid, reason[16];
if(sscanf(params, "is[16]", targetid, reason)) return SendClientMessage(playerid, COLOR_WHITE, "Usage: /test [playerid] [reason]");
new str[32];
format(str, sizeof(str), "%s", reason);
SendClientMessage(playerid, COLOR_WHITE, str);
return true;
}

m1n1vv
14.08.2019, 07:02
new targetid, string:reason[16];


extract params -> new targetid, string:reason[16]; else
return SendClientMessage(playerid, COLOR_WHITE, "Usage: /test [playerid] [reason]");

DeimoS
14.08.2019, 09:52
Ты уверен, что ругается на эту команду? Данное предупреждение должно вылезать при подобном коде(
if(sscanf(params, "is", ...)
То бишь, когда для "s" не указан размер.

Paradox
14.08.2019, 13:30
Ты уверен, что ругается на эту команду? Данное предупреждение должно вылезать при подобном коде(
if(sscanf(params, "is", ...)
То бишь, когда для "s" не указан размер.

Да на нее, дело в том что я раньше работал без sscanf'a, сейчас вот, поставил, и это пока одна команда, так сказать создавал ее для теста.
P.S я так понял оно вылетает когда ввожу больше 16 символов.

m1n1vv
14.08.2019, 14:04
Используй extract params, раз вместо params используешь свои переменные

Paradox
14.08.2019, 14:46
спасибо, сейчас буду пробовать, отпишусь еще

DeimoS
14.08.2019, 15:31
Используй extract params, раз вместо params используешь свои переменные

А как он должен помочь? "extract params" - макрос, на выходе из которого получается тот же sscanf (точнее, unformat, но она перенимает весь функционал sscanf).

// Это, собственно, sscanf и unformat, который является аналогом sscanf
native sscanf(const data[], const format[], {Float,_}:...);
native unformat(const data[], const format[], {Float,_}:...) = sscanf;

// А это уже extract, который превращается в unformat
#define extract%0->%1; EXTRN%1;unformat(_:EXTRZ:EXTRV:EXTRX:%0,##,%1,,);
#define unformat(_:EXTRZ:EXTRV:EXTRX:%0,##,%1);%2else if (unformat(_:EXTRV:EXTRX:%0,##,%1))
// Тут ещё некоторое количество строк, "развёртывающих" макрос "extract"

Собственно, вот что твой код генерирует
new targetid, reason[16];if (unformat(_:EXTRV:EXTR8:EXTR9:EXTR0:EXTR1:EXTR2:EXTR3:EXTR8:EXTR9: EXTR8:EXTR9:EXTR0:EXTR1:EXTR2: params ,##is[16], targetid,reason))
return SendClientMessage(playerid, COLOR_WHITE, "Usage: /test [playerid] [reason]");

Убираем теги
new targetid, reason[16];if (unformat(params ,##is[16], targetid,reason))
return SendClientMessage(playerid, COLOR_WHITE, "Usage: /test [playerid] [reason]");

Делаем нормальные переносы и заменяем unformat на sscanf:
new targetid, reason[16];
if(sscanf(params, "is[16]", targetid,reason))
return SendClientMessage(playerid, COLOR_WHITE, "Usage: /test [playerid] [reason]");

Ну и сравниваем с тем, что было у автора изначально, видя, что отличий нет:
new targetid, reason[16];
if(sscanf(params, "is[16]", targetid, reason))
return SendClientMessage(playerid, COLOR_WHITE, "Usage: /test [playerid] [reason]");



Тут одно единственное исправление может быть - увеличение значения в скобках до нужного. В идеале вообще не ограничивать игрока и давать вводить до 128 символов (именно столько помещается в окно ввода сообщения в чат за раз), ибо в этом нет никакого смысла: вы особо ничего не сэкономите от ограничения и, при этом, добавите неудобств игроку, которому придётся высчитывать количество символов, которые он ввёл, так как в SA-MP не предусмотрен такой счётчик в окне чата.

Ну или забить и не делать ничего, ибо это просто предупреждение, которое не означает ничего плохого.

Daniel_Cortez
14.08.2019, 20:41
Буквально только что выложил новую версию dc_crashreport (http://pro-pawn.ru/showthread.php?16642&p=94839&viewfull=1#post94839) с выводом источников ошибок от sscanf2; советую проверить.