Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Показано с 1 по 5 из 5
  1. #1
    Аватар для Blood
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.12.2013
    Сообщений
    65
    Репутация:
    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
    Сообщений
    607
    Репутация:
    289 ±
    Это не баг, а просто последовательность генерации кода (смотрел ассемблер).
    UPD: Все же это баг.
    Последний раз редактировалось VVWVV; 08.08.2016 в 16:52.

  3. #3
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,666
    Репутация:
    2145 ±
    Похоже на баг. Суть в том, что компилятор почему-то разрешает объявлять метки с одинаковыми именами (хотя в тех же 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.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

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

    Статус
    Оффлайн
    Регистрация
    24.09.2014
    Сообщений
    116
    Репутация:
    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
    new fuck_logic[0] = EOS;

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

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

 

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

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

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

Ваши права

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