Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 2 ПерваяПервая 1 2
Показано с 11 по 17 из 17
  1. #11
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Losyash Посмотреть сообщение
    Данную функцию можно использовать в сумме с глобальной переменной.
    Например:
    Мы объявим глобальную переменную:

    PHP код:
    new 
           
    global_string256 ]; 
    После этого, мы добавляем в тело функции, данный участок кода. (Иными словами, мы очищаем глобальную переменную)
    PHP код:
    global_string[0] = EOS
    Далее, нам необходимо будет статичные аргументы отделить от динамичных и пустить цикл, с которыми в свою очередь будут работать функции - getarg(...).
    Нет смысла использовать такой подход, ибо если вы не будете использовать global_string, то переменная всё равно будет инициализирована в сегмент данных. И ещё, вы всегда можете оптимизировать способ с обычными функциями - есть тема на форуме от DC. Кстати, может возникнуть ряд других проблем.

    Цитата Сообщение от Losyash Посмотреть сообщение
    Таким образом, глобальная переменная, будет автоматически очищаться при инициализации функции.
    Ну, а идеальный вариант, это конечно же использование директивы #define.
    PHP код:
    #define prepare(%0,%1,%2,%3) global_string[0] = EOS; format(global_string, sizeof global_string, %2, %3); SendClientMessage(%0, %1, %2) 
    Но опять же и здесь нас ожидают подводные камни.
    Например, будет проблема для тех, кто привык писать функции подобным образом:

    PHP код:
    prepareplayeridC_WHITE"Playerid: %d",
                     
    playerid
           
    ); 
    К тому же, массив не отчищается. Символ нуля указывает на окончание строки.

    Цитата Сообщение от Losyash Посмотреть сообщение
    Таким образом, глобальная переменная, будет автоматически очищаться при инициализации функции.
    Точнее сказать: "вызов функции".
    Последний раз редактировалось VVWVV; 18.05.2016 в 19:30.

  2. #12
    Аватар для Found
    G

    Статус
    Оффлайн
    Регистрация
    18.05.2016
    Адрес
    041b0438043f04
    Сообщений
    35
    Репутация:
    9 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Нет смысла использовать такой подход, ибо если вы не будете использовать global_string, то переменная всё равно будет инициализирована в сегмент данных. И ещё, вы всегда можете оптимизировать способ с обычными функциями - есть тема на форуме от DC. Кстати, может возникнуть ряд других проблем.



    К тому же, массив не отчищается. Символ нуля указывает на окончание строки.


    Функция SendMes в данном случае будет быстрее, чем ваш способ, ибо вы всегда будете вызывать один и тот же код несколько раз.
    Конечно же она будет инициализирована. На самом деле суть этой переменной в том, чтобы форматировать и подготавливать выражения.

    Можно ссылочку?

    Да, перепутал. Правильнее будет:
    PHP код:
    global_string[0] = 0
    Поэтому я предложил вариант с #define.
    Последний раз редактировалось Found; 18.05.2016 в 19:34.

  3. #13
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Цитата Сообщение от Losyash Посмотреть сообщение
    PHP код:
    new 
           
    global_string256 ]; 
    После этого, мы добавляем в тело функции, данный участок кода. (Иными словами, мы очищаем глобальную переменную)
    PHP код:
    global_string[0] = EOS
    Нельзя сказать, что это очищение массива. "Очищается" только первый элемент массива (в данном случае это global_string[0]). Конструктор кода устроен таким образом, что он будет "сканировать" строку до того времени, пока не найдёт нулевой символ. Остальной текст (начиная с первого индекса (global_string[1])) будет сохранён в памяти.

  4. #14
    Аватар для Found
    G

    Статус
    Оффлайн
    Регистрация
    18.05.2016
    Адрес
    041b0438043f04
    Сообщений
    35
    Репутация:
    9 ±
    Цитата Сообщение от Londlem Посмотреть сообщение
    Нельзя сказать, что это очищение массива. "Очищается" только первый элемент массива (в данном случае это global_string[0]). Конструктор кода устроен таким образом, что он будет "сканировать" строку до того времени, пока не найдёт нулевой символ. Остальной текст (начиная с первого индекса (global_string[1])) будет сохранён в памяти.
    Да, не спорю, ошибся. Выше уже исправил, если мне не изменяет память, то именно таким образом происходит очистка переменной.

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

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Цитата Сообщение от Losyash Посмотреть сообщение
    Да, не спорю, ошибся. Выше уже исправил, если мне не изменяет память, то именно таким образом происходит очистка переменной.
    Для понимания машины этого достаточно, но человек должен понимать, что он не освобождает весь массив от данных.

  6. Пользователь сказал cпасибо:
    Found (18.05.2016)
  7. #16
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Для тех кто был в танке и пытался что то мне подсунуть,
    я хотел гмошный SendMes перештопать в свой чтобы не лазеть не заменять все мессы,
    но тут ведь проблема вышла, аргумент с переменными может быть и не один и не три а по разному.
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  8. #17
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Функция SendMes (именно с передачей переменного числа параметров через #emit) действительно опасна в использовании под Linux.
    Я не проверя работу именно этой функции на версии сервера SA-MP для Linux, но ещё в прошлом году решил провести эксперимент: откомпилировал интерпретатор Pawn 3.2 под линью и скормил ему .amx с коллбэком, который передавал переменное количество параметров нативной функции; принцип передачи параметров был такой же, как и в SendMes. После каждой попытки вызова того коллбэка интерпретатор падал (segmentation fault). Откомпилировал интерпретатор под вендой и скормил ему тот же скрипт - всё работало. Ещё раз скомпилировал его в режиме отладки и дебажил в Visual Studio - никаких признаков неправильной работы. Видимо, это как-то было связано с особенностями реализации интерпретатора в его оптимизированной версии для GCC, которая использовалась под линуксом.

    Цитата Сообщение от vovandolg Посмотреть сообщение
    Для тех кто был в танке и пытался что то мне подсунуть,
    я хотел гмошный SendMes перештопать в свой чтобы не лазеть не заменять все мессы,
    но тут ведь проблема вышла, аргумент с переменными может быть и не один и не три а по разному.
    Вы это так говорите, как будто другие виноваты в том, что вы любите грызть кактус и в упор отказываетесь принимать нормальное решение.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 2 из 2 ПерваяПервая 1 2

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

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

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

Ваши права

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