PDA

Просмотр полной версии : [Function] SwapVars - меняем данные целочисленных переменных местами.



Seviel
07.07.2017, 21:13
Описание:

SwapVars - меняет данные в целочисленных переменных местами(более лучшая версия данной функций находится в первом комментарии)

Параметры:

FisrtVar - первая переменная
SecondVar - вторая переменная


Возвращаемое значение:

Данная функция ничего не возвращает.

Код:


stock SwapVars(&FisrtVar, &SecondVar)
{
new UnrealVar = FisrtVar;
FisrtVar = SecondVar;
SecondVar = UnrealVar;
}


Пример использования:


public OnGameModeInit()
{
new a = 7, b = 3;
SwapVars(a, b);
printf("\ta: %d;b: %d", a, b);
return true;
}

http://ihost.pro-pawn.ru/image.php?di=I2XK

Я лишь хотел показать свою функцию, к сожалению моих знаний не хватило для более лучшей реализаций, но хочу поблагодарить VVWVV за более лучшую реализацию и название, спасибо.

Автор: Seviel

VVWVV
07.07.2017, 21:37
Слишком просто

Название не очень, поскольку мы лишь меняем значения, а не переменные местами.
Более того, мы можем использовать AMX-инструкции для быстрого перемещения значений между адресами.


stock swapvals(&var1, &var2) {
#emit lref.s.pri var1
#emit lref.s.alt var2
#emit sref.s.pri var2
#emit sref.s.alt var1
}

В данном случае мы не затрагиваем стек, а лишь используем регистры, что позволяет сделать код быстрее.

Fallen A.
07.07.2017, 23:00
Слишком просто

Название не очень, поскольку мы лишь меняем значения, а не переменные местами.
Более того, мы можем использовать AMX-инструкции для быстрого перемещения значений между адресами.


stock swapvals(&var1, &var2) {
#emit lref.s.pri var1
#emit lref.s.alt var2
#emit sref.s.pri var2
#emit sref.s.alt var1
}

В данном случае мы не затрагиваем стек, а лишь используем регистры, что позволяет сделать код быстрее.

В тему не вдавался, поэтому просто спрошу: безопасно ли это?

ziggi
07.07.2017, 23:10
Лучше просто назвать swap, как в C++ (http://ru.cppreference.com/w/cpp/algorithm/swap).

VVWVV
08.07.2017, 00:15
В тему не вдавался, поэтому просто спрошу: безопасно ли это?

С JIT плагином должен работать. Более того, компилятор просто не пропустит код, если вы передали вместо переменной, например, функцию, а тем более какое-либо значение, которое может вызвать поломку скрипта. Поэтому это более-менее безопасно.

Fallen A.
08.07.2017, 00:33
С JIT плагином должен работать. Более того, компилятор просто не пропустит код, если вы передали вместо переменной, например, функцию, а тем более какое-либо значение, которое может вызвать поломку скрипта. Поэтому это более-менее безопасно.

Благодарю за ответ.

Desulaid
17.07.2017, 07:11
Еще вариант:

stock SwapVars(&FisrtVar, &SecondVar)
{
FisrtVar = FisrtVar + SecondVar - (SecondVar = FisrtVar);
}

ziggi
17.07.2017, 07:48
Еще вариант:

stock SwapVars(&FisrtVar, &SecondVar)
{
FisrtVar = FisrtVar + SecondVar - (SecondVar = FisrtVar);
}

По производительности проигрывает.

Кстати, ещё так можно:

stock SwapVars(&FisrtVar, &SecondVar)
{
FisrtVar ^= SecondVar;
SecondVar ^= FisrtVar;
FisrtVar ^= SecondVar;
}

Glant
06.02.2018, 23:12
#define swap(%0,%1) %0 = %0 + %1 - (%1 = %0)

DeimoS
07.02.2018, 08:02
#define swap(%0,%1) %0 = %0 + %1 - (%1 = %0)

Выше уже давали такой вариант (вся разница только в том, что в виде функции) и указали, что вариант проигрывает в скорости

Daniel_Cortez
07.02.2018, 16:12
Выше уже давали такой вариант (вся разница только в том, что в виде функции) и указали, что вариант проигрывает в скорости
И что с того? В случае с функцией около половины времени уходит на сам вызов функции, с макросом такого нет.