Просмотр полной версии : [Function] SwapVars - меняем данные целочисленных переменных местами.
Описание:
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
Слишком просто
Название не очень, поскольку мы лишь меняем значения, а не переменные местами.
Более того, мы можем использовать 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
}
В данном случае мы не затрагиваем стек, а лишь используем регистры, что позволяет сделать код быстрее.
В тему не вдавался, поэтому просто спрошу: безопасно ли это?
Лучше просто назвать swap, как в C++ (http://ru.cppreference.com/w/cpp/algorithm/swap).
В тему не вдавался, поэтому просто спрошу: безопасно ли это?
С JIT плагином должен работать. Более того, компилятор просто не пропустит код, если вы передали вместо переменной, например, функцию, а тем более какое-либо значение, которое может вызвать поломку скрипта. Поэтому это более-менее безопасно.
Fallen A.
08.07.2017, 00:33
С JIT плагином должен работать. Более того, компилятор просто не пропустит код, если вы передали вместо переменной, например, функцию, а тем более какое-либо значение, которое может вызвать поломку скрипта. Поэтому это более-менее безопасно.
Благодарю за ответ.
Desulaid
17.07.2017, 07:11
Еще вариант:
stock SwapVars(&FisrtVar, &SecondVar)
{
FisrtVar = FisrtVar + SecondVar - (SecondVar = FisrtVar);
}
Еще вариант:
stock SwapVars(&FisrtVar, &SecondVar)
{
FisrtVar = FisrtVar + SecondVar - (SecondVar = FisrtVar);
}
По производительности проигрывает.
Кстати, ещё так можно:
stock SwapVars(&FisrtVar, &SecondVar)
{
FisrtVar ^= SecondVar;
SecondVar ^= FisrtVar;
FisrtVar ^= SecondVar;
}
#define swap(%0,%1) %0 = %0 + %1 - (%1 = %0)
#define swap(%0,%1) %0 = %0 + %1 - (%1 = %0)
Выше уже давали такой вариант (вся разница только в том, что в виде функции) и указали, что вариант проигрывает в скорости
Daniel_Cortez
07.02.2018, 16:12
Выше уже давали такой вариант (вся разница только в том, что в виде функции) и указали, что вариант проигрывает в скорости
И что с того? В случае с функцией около половины времени уходит на сам вызов функции, с макросом такого нет.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot