Форум Pawn.Wiki - Воплоти мечту в реальность!: extract params вместо sscanf2 - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
extract params вместо sscanf2
Оценка: ***** 1 Голосов

#1
Пользователь офлайн   m1n1vv 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Всем привет. В этом уроке вкратце расскажу, что такое extract params в DC_CMD.

  • Стандартное использование параметров

    Чаще всего встречается такой формат объявления параметров, где в качестве их используются сами params. Если в команде используется 1 параметр, то это не страшно, но при множестве к params добавляется массив с его "номером". Массивы в какой-то степени грузят сервер.

    if (sscanf(params, "is[32]", params[0], params[1]))
    	return SendClientMessage(playerid, -1, !"Ошибка");

    Где:
    • i - целое число;
    • s - элемент строки.

    Пример команды:

    CMD:test(playerid, params[])
    {
    	if (sscanf(params, "is[32]", params[0], params[1]))
    		return SendClientMessage(playerid, -1, !"/test id message");
    
    	SendClientMessage(params[0], -1, params[1]);
    
    	return 1;
    }


  • Переменные как параметры

    Также можно в начале команды создать переменные, и в дальнейшем использовать их как параметры.

    new
    	id,
    	mes[32];
    
    if (sscanf(params, "is[32]", id, mes))
    	return SendClientMessage(playerid, -1, !"Ошибка");

    Пример команды:

    CMD:test(playerid, params[])
    {
    	new
    		id,
    		mes[32];
    
    	if (sscanf(params, "is[32]", id, mes))
    		return SendClientMessage(playerid, -1, !"/test id message");
    
    	SendClientMessage(id, -1, mes);
    
    	return 1;
    }


  • extract params

    Теперь о главном. extract params может создать переменные, которые заменят множество params[] и заодно проверять, правильно ли указаны параметры команды в дальнейшем использовании.

    Для переменной с массивом есть специальный тег: string.

    extract params -> new id, string:mes[32]; else
    	return SendClientMessage(playerid, -1, !"Ошибка");

    Это будет скомпилировано как:

    new id, string:mes[32];
    if (unformat(params, "is[32]", id, mes))
    	return SendClientMessage(playerid, -1, !"Ошибка");
    

    Пример команды:

    CMD:test(playerid, params[])
    {
    	extract params -> new id, string:mes[32]; else
    		return SendClientMessage(playerid, -1, !"/test id message");
    
    	SendClientMessage(id, -1, mes);
    
    	return 1;
    }

    В основном это просто немного упрощает использование sscanf. Разницы в скорости нет никакой. "extract" - это обычный макрос.

    #define extract%0->%1; EXTRN%1;unformat(_:EXTRZ:EXTRV:EXTRX:%0,##,%1,,);

    Такой же, как и "unformat", который является функцией "sscanf".

    native sscanf(const data[], const format[], {Float,_}:...);
    native unformat(const data[], const format[], {Float,_}:...) = sscanf;


Скачать sscanf2: https://yadi.sk/d/k5s9eLjYvrQjy

Автор урока: m1n1vv

Сообщение отредактировал m1n1vv: 19 января 2019 - 18:05

10

#2
Пользователь офлайн   Ukrainian 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Как нащот скорости?
И заодно тему апну
0

#3
Пользователь офлайн   m1n1vv 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияUkrainian (03 октября 2016 - 15:28) писал:

Как нащот скорости?
И заодно тему апну

В основном это просто немного упрощает использование sscanf
0

#4
Пользователь офлайн   Pa4enka 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияUkrainian (03 октября 2016 - 15:28) писал:

Как нащот скорости?
И заодно тему апну

extract вообще не уступает по скорости стандартному способу sscanf(...).

По теме: всегда хотел научится этому способу. Но практически не нашел нормальных уроков. Благодарю!

Немного наркомании:
if(sscanf(params, !"is[32]", params[0], params[1]))

Сообщение отредактировал Pa4enka: 03 октября 2016 - 15:35

0

#5
Пользователь офлайн   m1n1vv 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияPa4enka (03 октября 2016 - 15:33) писал:

Немного наркомании:
if(sscanf(params, !"is[32]", params[0], params[1]))


Тоже можно, но я решил не перегибать палку.
0

#6
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияUkrainian (03 октября 2016 - 15:28) писал:

Как нащот скорости?
И заодно тему апну

Разницы в скорости нет никакой. "extract" - это обычный макрос
#define extract%0->%1; EXTRN%1;unformat(_:EXTRZ:EXTRV:EXTRX:%0,##,%1,,);

Такой же, как и "unformat", который является функцией "sscanf"
native sscanf(const data[], const format[], {Float,_}:...);
native unformat(const data[], const format[], {Float,_}:...) = sscanf;

1

#7
Пользователь офлайн   m1n1vv 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (04 октября 2016 - 08:54) писал:

Разницы в скорости нет никакой. "extract" - это обычный макрос
#define extract%0->%1; EXTRN%1;unformat(_:EXTRZ:EXTRV:EXTRX:%0,##,%1,,);

Такой же, как и "unformat", который является функцией "sscanf"
native sscanf(const data[], const format[], {Float,_}:...);
native unformat(const data[], const format[], {Float,_}:...) = sscanf;


Добавлю в урок
0

#8
Пользователь офлайн   Morphone 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
+ Тоже взял себе на вооружение, так как удобнее.
0

#9
Пользователь офлайн   Danny_Marcelo 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
На сколько я знаю, то, что указано вот тут: "is[32]" нужно всегда писать [128], т.к. ниже 128, в консоль выдаётся сообщение о переполнении буфера.
sscanf warning: String buffer overflow.

Но это если только используется ввод какого - либо текста.

А вот поводу extract params, совсем не знал о данной функции. Будем совершенствоваться)

Сообщение отредактировал Danny_Marcelo: 31 октября 2016 - 04:03

0

#10
Пользователь офлайн   m1n1vv 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDanny_Marcelo (31 октября 2016 - 03:58) писал:

На сколько я знаю, то, что указано вот тут: "is[32]" нужно всегда писать [128], т.к. ниже 128, в консоль выдаётся сообщение о переполнении буфера.
sscanf warning: String buffer overflow.



Если в команде есть проверка не длину введенного сообщения, то не будет

Сообщение отредактировал m1n1vv: 31 октября 2016 - 04:34

1

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика