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

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±

    Для чего в макросе isnull есть проверка "(((%1[0]) == '\1') && (!(%1[1])))"

    Всем привет. Уже достаточно давно пользуюсь макросом isnull, имеющимся в pawncmd и mdialog. Но вот возник такой вопрос: зачем там стоит проверка, не равна ли первая ячейка единице? Нельзя проверку производить так?

    #define isnull(%0) (!%0[0])

    И где вообще следует использовать данный выше вариант и тот, что присутствует в том же mdialog?

    Спасибо заранее.
    Последний раз редактировалось Elrmrnt-Kritik; 10.06.2018 в 13:40.

  2. #2
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Проверка на '\1' существует из-за проблемы с CallLocalFunction и CallRemoteFunction, поскольку при указании пустой строки сервер падает.

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

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    А почему именно '\1'? Не совсем понял...

  5. #4
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    А почему именно '\1'? Не совсем понял...
    Это не является символом и не является нулём, что соответственно подходит для проверки пустой строки.

  6. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (10.06.2018)
  7. #5
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    А что касается других символов? Например, '\2', '\3'...? Где-то вообще есть список их и значения?

  8. #6
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    А что касается других символов? Например, '\2', '\3'...? Где-то вообще есть список их и значения?
    Как я уже сказал выше, это специальные символ, который обычно не используется скриптерами. Он есть в таблице ASCII. Все символы до пробела (32) являются специальными символами.

  9. #7
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    А почему тогда проверяют лишь на первые два? Проверили бы на первые 32, до пробела как раз.

  10. #8
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    А почему тогда проверяют лишь на первые два? Проверили бы на первые 32, до пробела как раз.
    Когда мы передаём в функцию по средством CallLocalFunction или CallRemoteFunction пустую строку, то сервер из-за этого падает. Поэтому вместо нуля мы отправляет не пустую строку, а строку с двумя символами, чтобы сервер не падал. Далее, в вызываемой нами функции, то есть той, которая указана в CallLocalFunction или CallRemoteFunction в качестве аргумента, мы должны узнать пустая ли строка, либо нет. Чтобы сделать это максимально удобной и без вызова лишних native-функций мы используем данный макрос, который универсален как для обычных строк, так и для проверки пустой строки в CallLocalFunction или CallRemoteFunction.

    Тем не менее, если бы мы проверяли всю строку целиком, то мы бы на это потратили больше времени.

  11. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (10.06.2018)
  12. #9
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    А почему тогда проверяют лишь на первые два? Проверили бы на первые 32, до пробела как раз.
    Потому что нет причины, ибо для обхода бага используются только первые два. К тому же, остальные (2..31) могут использоваться в будущем для других костылей.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  13. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (10.06.2018)
  14. #10
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Хорошо, а можно пример, при котором сервер упадет, если я буду использовать этот макрос?
    Код HTML:
    #define isnull(%0) (!%0[0])

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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