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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    особенно если делаешь просто для себя.
    Ну и проблема то в том, что не для себя. Если бы для себя, зачем себя ограничивать от вызова функций или название такой же функций (я же буду знать, что можно | что нельзя)

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

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

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Только что проверил - оказывается, можно.

    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-функцию, и вызываться будет первая.
    Хм, странно, что не работает проверка на совпадение одинаковых названий.

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

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

    Сообщение от Y_Less:
    That seems pretty clear and correct to me. It calls the one visible in the current scope (0000001c in the assembly).

     Но на практике всё не так:

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

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

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Если тебе не нужно вызывать функцию через таймер, то и публичной её делать не обязательно, раз тебе нужно вызывать её только внутри файла.
    Эммм, я вроде сказал, что нужно вызывать через таймер, только внутри файла. В первом посту (вроде)

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

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

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    А в чём проблема сделать уникальное имя? По-моему, ты опять пытаешься создать проблему на ровном месте :)

    ибо даже если бы была возможность создать функцию таймера с ограниченной зоной видимости, этим никто в SA-MP не пользовался до тебя.
    Мне просто инетересно. Есть много путей выхода из данной ситауции, но я хочу попробовать именно такую (если возможно).
    Велосипедом тоже не пользовались пока его не придумали.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    А можно ли обычную функцию вызвать через адрес? И как узнать адрес функций?
    1. emit const.pri SomeFunc;
    2. emit push.c 0;
    3. emit call.pri;
    4. emit stack ((cellbits / charbits) * 1);

    Как-то так. Доступно в последних версиях компилятора.

    Цитата Сообщение от Geebrox Посмотреть сообщение
    Y_Less утверждает, что вызывается та функция которая находится в области видимости:
    Ну вот кто просил? Наверняка вопрос поставил неверно и тебя не так поняли.
    Дай хоть ссылку, что ли, попробую объяснить там, в чём именно проблема (хоть теперь это и может оказаться сложнее).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    1. emit const.pri SomeFunc;
    2. emit push.c 0;
    3. emit call.pri;
    4. emit stack ((cellbits / charbits) * 1);

    Как-то так. Доступно в последних версиях компилятора.
    Кстати, данный код можно ещё использовать в макросах.

    Видимо, проблема была решена http://forum.sa-mp.com/showthread.php?t=654148

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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    1. emit const.pri SomeFunc;
    2. emit push.c 0;
    3. emit call.pri;
    4. emit stack ((cellbits / charbits) * 1);

    Как-то так. Доступно в последних версиях компилятора.


    Ну вот кто просил? Наверняка вопрос поставил неверно и тебя не так поняли.
    Дай хоть ссылку, что ли, попробую объяснить там, в чём именно проблема (хоть теперь это и может оказаться сложнее).
    http://forum.sa-mp.com/showthread.ph...74#post4022174

    Он был прав, вызывается тот который находится в зоне видимости

 

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

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

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

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

Ваши права

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