Подтвердить что ты не робот

Flash ActionScript 3 Ошибка? Использование int и отрицательных чисел в коммутаторе/случае

Запуск этого кода

var myValue1:int = 2;
switch (myValue1)
{
    case -3: trace(myValue1 + " == -3"); break;
    case -2: trace(myValue1 + " == -2"); break;
    case -1: trace(myValue1 + " == -1"); break;
    case 0:  trace(myValue1 + " == 0"); break;
    case 1:  trace(myValue1 + " == 1"); break;
    case 2:  trace(myValue1 + " == 2"); break;
    case 3:  trace(myValue1 + " == 3"); break;
    default: trace(myValue1 + " is unknown"); break;
}

var myValue2:int = -2;
switch (myValue2)
{
    case -3: trace(myValue2 + " == -3"); break;
    case -2: trace(myValue2 + " == -2"); break;
    case -1: trace(myValue2 + " == -1"); break;
    case 0:  trace(myValue2 + " == 0"); break;
    case 1:  trace(myValue2 + " == 1"); break;
    case 2:  trace(myValue2 + " == 2"); break;
    case 3:  trace(myValue2 + " == 3"); break;
    default: trace(myValue2 + " is unknown"); break;
}

дает этот результат:

2 == 0
-2 is unknown

(Скомпилирован в Flash Builder 4.7.0.349722, работающий на Flash 11.5.502.149. Запуск в Windows 7 с пакетом обновления 1 (SP1), Firefox 18.0.2)

Следующие изменения устраняют эту проблему, обеспечивая правильный вывод:

  • Изменение значения типа Number.
  • Удаление операторов отрицательного числа case.
  • Изменение операторов case для использования int - переменных, а не литералов... если только эти переменные не являются const, и в этом случае он остается сломаны!

Изменение myValue2 = -1 дает вывод -1 == -3, который равно равно wtf-ish.


Ясно, что это ошибка, но... что ее вызывает? Есть ли какой-то тонкий нюанс использования int или отрицательных чисел в case-утверждениях, которые я не понимаю? Мой код как-то не так? Или это просто проблема с байтовым компилятором в Flash Builder?

4b9b3361

Ответ 1

Я не думаю, что вы найдете конкретный ответ на этот вопрос. То, что я могу предложить, является подтверждением баггинга компилятора AS3. Я потратил довольно много времени на то, чтобы разрешить подобные "магические" ошибки и подошел пустой. Одним из таких примеров является цикл For и While, пропускающий первый или последний элемент в массиве без видимой причины, в то время как цикл Foreach работал просто отлично.

Для меня самая правдоподобная причина для этого - ошибка в управлении памятью. Это также может быть связано с оборудованием, поскольку частота таких событий происходит на некоторых машинах, над которыми я или мои коллеги работали. Я думаю, что некоторые "невидимые" условия удовлетворяются, например, порядок выполненных операций (вы могли бы попытаться помещать некоторый фиктивный код между объявлением var и коммутатором или, возможно, назначать пару значений var больше раз, просто чтобы "переиграть память" ), что в сочетании с компромиссом с ошибкой испортили память адресации, и ваш коммутатор думает, что он объединяет два целых числа, в то время как в действительности он получил другое значение из памяти.

Ответ 2

Возможно, вы можете заставить компилятор вручную преобразовать исходное значение в String и сделать ваши случаи в значениях String.

switch( String(value) )
{
   case "-3": /*do something*/; break;
   case "-2": /*do something*/; break;
   case "-1": /*do something*/; break;
   case  "0": /*do something*/; break;
   case  "1": /*do something*/; break;
   case  "2": /*do something*/; break;
   case  "3": /*do something*/; break;
   default: break;
}

Ответ 3

Это просто проблема с байтовым компилятором в Flash Builder.

Ясно, что ваш синтаксис прекрасен; существует буквально сотни известных проблем с компилятором, относящимся к 2005 году, которые все еще открыты или неразрешены.