PDA

Просмотр полной версии : [Вопрос] Интересная функция (для опытных)



Jake_Bat
18.11.2018, 21:04
Здравствуйте господа
К у меня есть функция
PLEVEL(playerid,operator value)
{
if(operator == +) PInfo[playerid][Level] += value;
}
Суть думаю проста
Можно реализовать к примеру строками, что по сути очевидный пример, но это слишком костыльно, а что если как-то иначе?
Не знаком с такими аргументами функций, до ужаса буду рад, если научите меня чему-то новому

Elrmrnt-Kritik
18.11.2018, 21:17
Так в GivePlayerMoney вы передаете число, которое будет либо положительным (со знаком плюс "+" или без знака), либо отрицательным (со знаком минус "-").

Аналогично можно поступить и в вашем примере:

new var1 = 4,
var2 = -4;

new sum1, sum2;


sum1 += var1; // это будет 0+4 = 4
sum2 += var2; // это будет 0+(-4) = 0-4 = -4


Но если изменяемое число константное и его знак зависит исключительно от того, передаете в функцию вы плюс ("+") или минус ("-"), то можно сделать как-то так:

stock SomeFunc(&value, symbol = '+')
{
const YOUR_NUMBER = 4;

if(symbol == '+') value += CONST_NUMBER; // = value + 4
else if(symbol == '-') value -= CONST_NUMBER; // = value - 4 = -4
}

Jake_Bat
18.11.2018, 21:39
Да я тупанул сам, с деньгами, просто задумался и моя логика мне говорила это, но Система 1 (Канеман) оказалась сильнее)) Сори :3
Но можно ли как-то без строк это все решить?
SetValue(playerid, +1)
{
Player[playerid][Int] += 1;
}
SetValue(playerid, -1)
{
Player[playerid][Int] -= 1;
}
SetValue(playerid, 1)
{
Player[playerid][Int] = 1;
}

Elrmrnt-Kritik
18.11.2018, 21:57
Быть может варианты есть и получше, но могу предложить такой:

stock SetValue(playerid, value, symbol = '+')
{
if(symbol == '=') Player[playerid][Int] = value;
else Player[playerid][Int] += value;
}


Соответственно, если value < 0, тогда будет вычитаться, если больше нуля, будет складываться.

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

А использовать тогда так:

SetValue(playerid, 2); // прибавит 2
SetValue(playerid, -2); // вычтет 2
SetValue(playerid, 2, '='); // приравняет к двум

Jake_Bat
18.11.2018, 22:02
Возможно я слишком много программировал, и это выбило меня из колеи((
По-моему то, что я хочу - анриал

ziggi
18.11.2018, 22:20
Лучше использовать отдельные функции для этих целей, чтобы не менять их смысл, понятный по названию.

stock SetValue(playerid, amount)
{
Player[playerid][Int] = amount;
}
stock GiveValue(playerid, amount)
{
Player[playerid][Int] += amount;
}

Jake_Bat
18.11.2018, 23:08
Спасибо
можно ли как-то enum передавать в функцию и дальше его изменять в теле функции?

ziggi
19.11.2018, 00:20
Спасибо
можно ли как-то enum передавать в функцию и дальше его изменять в теле функции?

Не понятно, поясни.

Jake_Bat
19.11.2018, 02:22
Ну к примеру, я хочу поместить в функцию какое-то перечисление и его менять там же, как это возможно?
SetPlay(playerid,Player[playerid][Level])
{
}
Будет просто значение создаваться в функции например 0 , 1, а я хочу если помещаешь что-то из enum'ов в аргумент , можно как-то изменять?
(что-то типа указателей, которые в плюсах)

ziggi
19.11.2018, 02:57
Не, я не могу понять. Примеры из плюсов можно?

Jake_Bat
19.11.2018, 08:41
int play = 0;
void Tam_4toto(int *play)
{
*play = 1;
}
play == 1

---
И что-то сделать с енумом вообще реально по аналогичному способу на pawn?

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

Может так можно сделать?
Func(&val)
{
val++
return val;
}
---
player[playerid][plevel] == 0
Func(player[playerid][plevel]);
player[playerid][plevel] == 1

ziggi
19.11.2018, 08:48
int play = 0;
void Tam_4toto(int *play)
{
*play = 1;
}
play == 1

---
И что-то сделать с енумом вообще реально по аналогичному способу на pawn?

stock Tam_4toto(&play)
{
play = 1;
}
Про енумы до сих пор не понимаю.
Можно так, например:
enum E_EXAMPLE {
E_EXAMPLE_X,
E_EXAMPLE_Y,
}

stock example(arr[E_EXAMPLE])
{
arr[E_EXAMPLE_X] += 1;
arr[E_EXAMPLE_Y] += 2;
}

main() {
new array[E_EXAMPLE];
array[E_EXAMPLE_X] = 100;
array[E_EXAMPLE_Y] = 200;
example(array);
printf("array[E_EXAMPLE_X] = %d, array[E_EXAMPLE_Y] = %d", array[E_EXAMPLE_X], array[E_EXAMPLE_Y]);
// "array[E_EXAMPLE_X] = 101, array[E_EXAMPLE_Y] = 202"
}

Jake_Bat
19.11.2018, 09:12
Спасибо, как буду у компа - напишу работает ли так, как хочу или нет, проверю несколькими способами и перешлю сюда, мне интересно, качественно ли они сделаны

Jake_Bat
20.11.2018, 22:58
Зигги, спасибо, все окей

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

Закройте тему пожалуйста, не могу найти способ , как закрыть