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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±

    Можно ли создать public-функции с ограниченной областью (static) видимости?

    Как я знаю, можно ограничить область видимости обычных функций с помощью "static". Можно ли как нибудь ограничить область видимости колбеков, чтобы они были доступны только в одном файле?
    У меня получилось ограничить таким способом:

    PHP код:
    static @SomeFunc();
    static @
    SomeFunc() { } 
    Но это не совсем то, что я хочу. То есть этот метод функционирует не так как обычные функции с ограниченной областью видимости. Конечно в этом случае тоже нельзя вызывать функцию из другого файла, но и нельзя создать функцию с анологичным называнием.

    Есть идеи? Можно ли как нибудь это реализовать?

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, ты создаёшь публичные (общедоступные) функции и хочешь ограничить их зону видимости? Не находишь противоречия в своих словах?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, ты создаёшь публичные (общедоступные) функции и хочешь ограничить их зону видимости? Не находишь противоречия в своих словах?
    Нет, противоречивости не нахожу, ибо у меня есть конкретная цель. Как по твоему устанавливать таймер для обычных функций? Или тот же мускул? Мне нужна функция, которую можно использовать в одном файле (точнее ограничить зону использование), но при этом можно было вызывать через таймер.
    Последний раз редактировалось Geebrox; 22.05.2018 в 15:27.

  4. #4
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Паблик функции на то и паблик, что их область видимости нельзя ограничить не только для одного файла, но даже для одного скрипта.

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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Паблик функции на то и паблик, что их область видимости нельзя ограничить не только для одного файла, но даже для одного скрипта.
    Ну я это понимаю. Но я объяснил, что мне нужно. Обычным функциям нельзя обращаться через название при вызове (компилятор генерирует адрес для них, как я понимаю). А паблик функциям можно обращаться через название (т.к. компилятор делает это возможным) насчёт чего их можно вызывать с помощью таких функций как Call(Local/Remote)Function | SetTimer(Ex) | mysql_(t/p)query | и т. д. и т. п.

    Короче говоря, нельзя реализовать то, что я хочу?

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

    Я уточнил, оказывается это не возможно, можно закрывать тему.
    Последний раз редактировалось Geebrox; 22.05.2018 в 16:49.

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

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Теоретически можно и обычную функцию с помощью таймера вызвать, но нужно ли это? Чтобы уменьшить вероятность совпадения названий функций - делайте их как можно больше.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    Конечно в этом случае тоже нельзя вызывать функцию из другого файла, но и нельзя создать функцию с анологичным называнием.
    Только что проверил - оказывается, можно.

    myinc.inc
    1. static @SomeFunc();
    2. static @SomeFunc()
    3. {
    4. emit const.pri 0;
    5. }

    main.p:
    1. #include "myinc.inc"
    2.  
    3. @SomeFunc();
    4. @SomeFunc()
    5. {
    6. emit const.pri 1;
    7. }
    8.  
    9. main()
    10. {
    11. @SomeFunc();
    12. }

    Вывод pawndisasm:
    1. 00000000 halt 00000000
    2.  
    3. 00000008 proc ; @SomeFunc
    4. 0000000c const.pri 00000000
    5. 00000014 zero.pri
    6. 00000018 retn
    7.  
    8. 0000001c proc ; @SomeFunc
    9. 00000020 const.pri 00000001
    10. 00000028 zero.pri
    11. 0000002c retn
    12.  
    13. 00000030 proc
    14. 00000034 push.c 00000000
    15. 0000003c call 0000001c ; @SomeFunc
    16. 00000044 zero.pri
    17. 00000048 retn

    Как видно из листинга, создаются две public-функции с одинаковым именем. В таблице экспортируемых (public-) функций название "@SomeFunc" тоже дублируется. Нужно будет сообщить об этом баге...

    Также интересно, что CallLocalFunction перед вызовом отыскивает нужную функцию по названию в таблице public-функций, причём использует не линейный, а бинарный поиск. Это означает, что из двух и более функций с одинаковым названием CallLocalFunction может вызвать любую из них. Например, сейчас она может вызывать вторую, а добавь или удали какую-нибудь ещё public-функцию, и вызываться будет первая.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Ну смотри: ты хочешь в разных файлах создавать паблики с одинаковыми именами. Далее представим, что ты решил вызвать один из пабликов при помощи CallRemoteFunction: каким образом сервер поймёт к какому именно ты обращаешься паблику?

    Чтоб такое реализовать, нужно, как я понимаю, модифицировать процесс регистрации паблик функций, добавляя отдельную "таблицу" со static пабликами. И уже для обращения к этим пабликам делать отдельные функции, которые уже не смогут обращаться к каким-то пабликам за пределами файла. Ну и решить ещё ряд подводных камней. В итоге, ты получишь обрубок обычных функций и не более того.

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

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

    Steve Pavlina

  9. #9
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    А можно ли обычную функцию вызвать через адрес? И как узнать адрес функций?

  10. #10
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Так а если сделать что-то вроде обёртки для конкретных функций, в которой будет объявляться паблик с таким же именем и из него будет вызываться эта функция? Вполне как вариант, если таких конкретных функций не очень много (т.к. объявлять каждую из них надо будет через этот дефайн-обёртку). Единственная проблема это область видимости, коя хоть и будет на все файлы и скрипты, но в большинстве случаев это не так критично (особенно если делаешь просто для себя).
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

 

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

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

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

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

Ваши права

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