PDA

Просмотр полной версии : [Вопрос] Sscanf warning: No default value found.



nonfaktor
16.03.2014, 15:06
Вот команда:


CMD:ban(playerid,params[])
{
new id,reason[50],pName[MAX_PLAYER_NAME],string[128];
if(sscanf(params, "uS[50]", id, reason)) return SendClientMessage(playerid, -1, "Используйте: /ban [playerid] [Причина]");
else
{
if(PlayerInfo[playerid][Admin] >=4)
{
GetPlayerName(playerid, pName, MAX_PLAYER_NAME);
format(string,sizeof(string),"Игрок %s был забанен %s.Причина: %s",id,pName,reason);
SendClientMessageToAll(COLOR_RED,string);
BanEx(id, reason);
}
}
return 1;
}

L0ndl3m
16.03.2014, 15:46
CMD:ban(playerid, params[])
{
if(sscanf(params, "us[50]", params[0], params[1])) return SendClientMessage(playerid, -1, "Используйте: /ban [playerid] [причина]");
if(!IsPlayerConnected(params[0])) return SendClientMessage(playerid, -1, "Такого игрока нет на сервере.");
if(PlayerInfo[playerid][Admin] >= 4)
{
new sendername[MAX_PLAYER_NAME], targername[MAX_PLAYER_NAME];
static const msg[] = "Игрок %s был забанен %s. Причина: %s";
new str[sizeof(msg) - 6 + MAX_PLAYER_NAME * 2 + 30];
GetPlayerName(params[0], targetname, MAX_PLAYER_NAME);
GetPlayerName(playerid, sendername, MAX_PLAYER_NAME);
format(str, sizeof(str), msg, targetname, sendername, params[1]);
SendClientMessageToAll(COLOR_RED, str);
BanEx(params[0], params[1]);
}
return true;
}

DeimoS
16.03.2014, 16:07
Для чего

static const
?

^_^
16.03.2014, 16:11
Для чего

static const
?
Круче же.

L0ndl3m
16.03.2014, 16:13
Для чего

static const
?

Тык (http://pro-pawn.ru/showthread.php?7762-%D0%A7%D1%82%D0%BE-%D0%BB%D1%83%D1%87%D1%88%D0%B5-new-%D0%B8%D0%BB%D0%B8-static&p=31648&viewfull=1#post31648).

DeimoS
16.03.2014, 16:28
Тык (http://pro-pawn.ru/showthread.php?7762-%D0%A7%D1%82%D0%BE-%D0%BB%D1%83%D1%87%D1%88%D0%B5-new-%D0%B8%D0%BB%D0%B8-static&p=31648&viewfull=1#post31648).

Лол. Ну давай разберем по частям, тобою написанное)) Складывается впечатле... Хотя не, не будем о плохом. Просто ещё раз прочитай о предназначении const и static. Может и поймёшь почему я заострил на этом внимание :)

- - - Добавлено - - -


Круче же.

Типа, чем больше маркеров я использую, тем сильнее меня будут девушки любить :lol:

nonfaktor
16.03.2014, 16:45
Спасибо за помощь.Закройте тему.

Daniel_Cortez
16.03.2014, 17:14
Круче же.

Типа, чем больше маркеров я использую, тем сильнее меня будут девушки любить :lol:

Лол.
Это метод подсчёта размера форматируемой строки, который я не так давно расписывал в Учебнике (http://u.to/zPfrBA).

Пример:

new rand = random(100_000);
static const fmt_str[] = "rand = %d";
new string[sizeof(fmt_str)-2+5];
fotmat(string, sizeof(string), fmt_str, rand);
SendClientMessage(playerid, -1, string);
На самом деле полезный приём для экономии места в стеке. Зачем рассчитывать размер каждой строки самому, когда можно переложить эту задачу на компилятор?

DeimoS
16.03.2014, 17:21
Лол.
Это метод подсчёта размера форматируемой строки, который я не так давно расписывал в Учебнике (http://u.to/zPfrBA).

Пример:

new rand = random(100_000);
static const fmt_str[] = "rand = %d";
new string[sizeof(fmt_str)-2+5];
fotmat(string, sizeof(string), fmt_str, rand);
SendClientMessage(playerid, -1, string);
На самом деле полезный приём для экономии места в стеке. Зачем рассчитывать размер каждой строки самому, когда можно переложить эту задачу на компилятор?

Эмм, то есть использования сразу двух маркеров одновременно даёт возможность подсчитать размер строки? :shok::crazy:

^_^
16.03.2014, 17:28
Лол.
Это метод подсчёта размера форматируемой строки, который я не так давно расписывал в Учебнике (http://u.to/zPfrBA).

Пример:

new rand = random(100_000);
static const fmt_str[] = "rand = %d";
new string[sizeof(fmt_str)-2+5];
fotmat(string, sizeof(string), fmt_str, rand);
SendClientMessage(playerid, -1, string);
На самом деле полезный приём для экономии места в стеке. Зачем рассчитывать размер каждой строки самому, когда можно переложить эту задачу на компилятор?
Мы не имели ввиду почему не указан размер строки, а почему используется static const, когда можно использовать просто new (биты в .pwn файле экономим :dirol:).

Daniel_Cortez
16.03.2014, 17:30
Эмм, то есть использования сразу двух маркеров одновременно даёт возможность подсчитать размер строки? :shok::crazy:
Можно использовать и просто static, без const, но тогда будет сложнее понять назначение строки fmt_str, т.к. будет возможность изменить её содержимое. Код в первую очередь должен быть понятным, а не настроченным абы как за 3 секунды.

DeimoS
16.03.2014, 17:35
Можно использовать и просто static, без const, но тогда будет сложнее понять назначение строки fmt_str, т.к. будет возможность изменить её содержимое.

Речь как раз и идёт о том, что можно использовать просто static. И как же великое желание экономить память? Целый массив создаём ради того, чтоб вручную не высчитывать размер! Ай-яй-яй...

Daniel_Cortez
16.03.2014, 18:20
Речь как раз и идёт о том, что можно использовать просто static. И как же великое желание экономить память? Целый массив создаём ради того, чтоб вручную не высчитывать размер! Ай-яй-яй...

Если не использовать тот метод подсчёта и указывать форматную строку напрямую в format(), она всё равно будет храниться в секции данных. А значит место под неё будет выделяться в любом случае, со static const или без. Не будет же эта строка браться из ниоткуда!

DeimoS
16.03.2014, 18:22
Если не использовать тот метод подсчёта и указывать форматную строку напрямую в format(), она всё равно будет храниться в секции данных. А значит место под неё будет выделяться в любом случае, со static const или без. Не будет же эта строка браться из ниоткуда!

Ну так у тебя и массив, и format же... :(

Daniel_Cortez
16.03.2014, 18:40
Ну так у тебя и массив, и format же... :(
Это что-то меняет? В моём методе копия форматной строки в секции данных будет всего одна. По сути, использование static const для объявления той строки даёт лишь больше возможностей для обращения с ней (например, с тем же оператором sizeof). На общий размер содержимого секции данных это влиять не должно.

DeimoS
16.03.2014, 19:10
Это что-то меняет? В моём методе копия форматной строки в секции данных будет всего одна. По сути, использование static const для объявления той строки даёт лишь больше возможностей для обращения с ней (например, с тем же оператором sizeof). На общий размер содержимого секции данных это влиять не должно.


new rand = random(100_000);//Переменная намба уан
static const fmt_str[] = "rand = %d";//Переменная намба ту
new string[sizeof(fmt_str)-2+5];//Переменная намба фри
fotmat(string, sizeof(string), fmt_str, rand);//Как ты сказал выше, для хранения текста в format выделяется память, так что ещё минус память
SendClientMessage(playerid, -1, string);
не?

Daniel_Cortez
16.03.2014, 20:31
Как ты сказал выше, для хранения текста в format выделяется память, так что ещё минус память
Wut?! У тебя выше уже созданы 3 переменные и память под них выделена в секции данных и стеке. Где ты увидел выделение памяти в format ?

Ок, раз уж ты так не хочешь верить, попробуй вот что:

#include <a_samp>
main(){
new rand = random(100_000);
new string[32]; // не знаю, откуда это число, но пусть будет так
format(string, sizeof(string), "rand = %d", rand);
SendClientMessage(playerid, -1, string);
}


#include <a_samp>
main(){
new rand = random(100_000);
static const fmt_str[] = "rand = %d";
new string[sizeof(fmt_str)-2+5];
format(string, sizeof(string), fmt_str, rand);
SendClientMessage(playerid, -1, string);
}
Скомпилируй эти 2 скрипта с ключом "-a", чтобы сгенерировать ассемблерные листинги, и сравни получившиеся результаты.

DeimoS
17.03.2014, 08:23
Wut?! У тебя выше уже созданы 3 переменные и память под них выделена в секции данных и стеке. Где ты увидел выделение памяти в format ?

Ок, раз уж ты так не хочешь верить, попробуй вот что:

#include <a_samp>
main(){
new rand = random(100_000);
new string[32]; // не знаю, откуда это число, но пусть будет так
format(string, sizeof(string), "rand = %d", rand);
SendClientMessage(playerid, -1, string);
}


#include <a_samp>
main(){
new rand = random(100_000);
static const fmt_str[] = "rand = %d";
new string[sizeof(fmt_str)-2+5];
format(string, sizeof(string), fmt_str, rand);
SendClientMessage(playerid, -1, string);
}
Скомпилируй эти 2 скрипта с ключом "-a", чтобы сгенерировать ассемблерные листинги, и сравни получившиеся результаты.

Таки неверно выразился я. Оптимизация памяти не в смысле заполнения стэка, а в смысле тиков. Типа "Защем заставлять сервер выполнять лишние действия, когда можно обойтись без них, ко-ко-ко" :smile3: