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

    Статус
    Оффлайн
    Регистрация
    10.12.2013
    Сообщений
    69
    Репутация:
    2 ±

    Так задумано или это баг

    По-пробую объяснит
    PHP код:
    new hd 1;
        switch(
    hd)
        {
            case 
    0:
            {
                goto 
    test_1;
                
    test_1:
                {
                    print(
    "Сработал case 0");
                }
            }
            case 
    1:
            {
                goto 
    test_1;
                
    test_1:
                {
                    print(
    "Сработал case 1");
                }
            }
            case 
    2:
            {
                goto 
    test_1;
                
    test_1:
                {
                    print(
    "Сработал case 2");
                }
            }
        } 
    В этом коде срабатывает case 1 , но в консоль вводится "Сработал case 2" , а не должно ли быть "Сработал case 1" ??

    P.S Да можно ставит разные название метки , но просто хочу узнать для себя .

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

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Это не баг, а просто последовательность генерации кода (смотрел ассемблер).
    UPD: Все же это баг.
    Последний раз редактировалось VVWVV; 08.08.2016 в 16:52.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Похоже на баг. Суть в том, что компилятор почему-то разрешает объявлять метки с одинаковыми именами (хотя в тех же C и C++ такое запрещено), но учитывает только метку, объявленную самой последней.
    Ещё интересно то, что метки видны не только внутри одного блока, но и в пределах всей функции, т.е. если объявить метку внутри блока if/switch/for/while/do/{}, она будет доступна и за пределами этого блока.
    Следовательно, баг не специфичен конкретно для switch и пример из 1-го поста можно значительно упростить:
    PHP код:
    #include <a_samp>

    main()
    {
        goto 
    test_label;
    test_label:
        print(
    "test_label 1");
        return;
    test_label:
        print(
    "test_label 2");

    Обойти проблему можно довольно очевидным способом: просто не использовать метки с одинаковыми названиями.

    P.S.: Баг всё ещё присутствует в последней версии Pawn (4.0), поэтому я оставил багрепорт в репозитории Pawn на GitHub.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. 3 пользователя(ей) сказали cпасибо:
    Blood (08.08.2016) Nash_Brigers (10.08.2016) Unreal (08.08.2016)
  5. #4
    Аватар для Unreal
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.09.2014
    Сообщений
    133
    Репутация:
    4 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Похоже на баг. Суть в том, что компилятор почему-то разрешает объявлять метки с одинаковыми именами (хотя в тех же C и C++ такое запрещено), но учитывает только метку, объявленную самой последней.
    Ещё интересно то, что метки видны не только внутри одного блока, но и в пределах всей функции, т.е. если объявить метку внутри блока if/switch/for/while/do/{}, она будет доступна и за пределами этого блока.
    Следовательно, баг не специфичен конкретно для switch и пример из 1-го поста можно значительно упростить:
    PHP код:
    #include <a_samp>

    main()
    {
        goto 
    test_label;
    test_label:
        print(
    "test_label 1");
        return;
    test_label:
        print(
    "test_label 2");

    Обойти проблему можно довольно очевидным способом: просто не использовать метки с одинаковыми названиями.

    P.S.: Баг всё ещё присутствует в последней версии Pawn (4.0), поэтому я оставил багрепорт в репозитории Pawn на GitHub.
    сколько еще багрепортов собралось там? и будут ли они вообще обновлять Pawn?
    Pro-pawn.ru

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Unreal Посмотреть сообщение
    сколько еще багрепортов собралось там? и будут ли они вообще обновлять Pawn?
    Пока что все баги, которые я сообщал, фиксились.
    По поводу следующей версии не могу знать, это вопрос к Thiadmer Riemersma. В принципе последняя версия из git-репозитория уже готова к использованию - ИМХО, даже больше, чем последняя стабильная версия (4.0), в той ещё много багов осталось.
    Впрочем, вас это всё вряд ли должно интересовать по очень простой причине: в SA-MP никто обновлять Pawn не будет из-за держателей крупных серверов и обратной совместимости, чёрт бы её побрал. Давно пора признать: SA-MP открыт только для элиты, в самом грязном смысле этого слова. Лучшее, что здесь можно сделать - оставить тот же багрепорт или ссылку в репозитории с доработанным компилятором для Pawn 3.2 от Zeex.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. 2 пользователя(ей) сказали cпасибо:
    Blood (08.08.2016) Unreal (09.08.2016)
 

 

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

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

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

Ваши права

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