Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 5 из 5

Тема: numargs?

  1. #1
    Аватар для MassonNN
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±

    numargs?

    Пока на уровне новичка осваиваю работу с аргументами и непонятно как лучше сделать рабочий вариант этой функции:

    Код HTML:
    stock TimeFunction(func[], interval, const format[] = "", ...){
    	if(!strlen(format)) return SetTimer(func[], interval, false);
    	else {
    
    		new arg[numargs()];
    		for(new i = 3, j = numargs(); i < j; i++) arg[i-3] = getarg(arg, i);
    		return SetTimerEx(func[], interval, false, format[], arg);
    
    	}
    }
    Последний раз редактировалось MassonNN; 25.12.2019 в 18:23.

  2. #2
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Как-то так (va_SetTimerEx взята из библиотеки YSI).

    Ибо иначе передать аргументы в SetTimerEx ты никак не сможешь.

    1. stock va_SetTimerEx(const function[], interval, bool:repeating, const fmat[], STATIC_ARGS)
    2. {
    3. static
    4. sRet;
    5. new
    6. num_args,
    7. arg_start,
    8. arg_end;
    9. // Get the pointer to the number of arguments to the last function.
    10. #emit LOAD.S.pri 0
    11. #emit ADD.C 8
    12. #emit MOVE.alt
    13. // Get the number of arguments.
    14. #emit LOAD.I
    15. #emit STOR.S.pri num_args
    16. // Get the variable arguments (end).
    17. #emit ADD
    18. #emit STOR.S.pri arg_end
    19. // Get the variable arguments (start).
    20. #emit LOAD.S.pri STATIC_ARGS
    21. #emit SMUL.C 4
    22. #emit ADD
    23. #emit STOR.S.pri arg_start
    24. // Using an assembly loop here screwed the code up as the labels added some
    25. // odd stack/frame manipulation code...
    26. while (arg_end != arg_start)
    27. {
    28. #emit MOVE.pri
    29. #emit LOAD.I
    30. #emit PUSH.pri
    31. #emit CONST.pri 4
    32. #emit SUB.alt
    33. #emit STOR.S.pri arg_end
    34. }
    35. // Push the additional parameters.
    36. #emit PUSH.S fmat
    37. #emit PUSH.S repeating
    38. #emit PUSH.S interval
    39. #emit PUSH.S function
    40. // Push the argument count.
    41. #emit LOAD.S.pri num_args
    42. #emit ADD.C 16
    43. #emit LOAD.S.alt STATIC_ARGS
    44. #emit XCHG
    45. #emit SMUL.C 4
    46. #emit SUB.alt
    47. #emit PUSH.pri
    48. #emit MOVE.alt
    49. // This gets confused if you have a local variable of the same name as it
    50. // seems to factor in them first, so you get the offset of the local
    51. // variable instead of the index of the native.
    52. #emit SYSREQ.C SetTimerEx
    53. #emit STOR.pri sRet
    54. // Clear the stack.
    55. #emit CONST.pri 4
    56. #emit ADD
    57. #emit MOVE.alt
    58. // The three lines above get the total stack data size, now remove it.
    59. #emit LCTRL 4
    60. #emit ADD
    61. #emit SCTRL 4
    62. // Now do the real return.
    63. return sRet;
    64. }
    65.  
    66. stock TimeFunction(const func[], interval, const format[] = "", ...){
    67.  
    68. new
    69. args = numargs();
    70.  
    71. const ARGS_START = 3;
    72.  
    73. if (args > ARGS_START)
    74. {
    75. va_SetTimerEx(func, interval, false, format, ARGS_START);
    76. }
    77. else
    78. {
    79. SetTimer(func, interval, false);
    80. }
    81. }
    Последний раз редактировалось execution; 25.12.2019 в 20:07.

  3. Пользователь сказал cпасибо:
    MassonNN (25.12.2019)
  4. #3
    Аватар для MassonNN
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    О Господи, за что. А getarg ну никак?

  5. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от MassonNN Посмотреть сообщение
    О Господи, за что. А getarg ну никак?
    Можно и через getarg, но эта реализация будет максимально медленной относительно варианта на emit.

    Ну и да: ничего не хочу сказать, но твой код функционально эквивалентен
    1. SetTimerEx("SomeFunc", 1000, true, "");


    Можно ещё сделать так:
    1. native TimerFunction(funcname[], interval, repeating, const format[] = "", {Float,_}:...) = SetTimerEx;

    И тогда использование будет выглядеть так:
    1. TimerFunction("SomeFunc", 1000, true);

    Хотя, имхо, это какой-то говнокодинг.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #5
    Аватар для MassonNN
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    делаю эту функцию, чтобы другие функции можно было вызывать, в том числе нативные

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •