Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Совершенно не понятная ошибка switch (http://www.flasher.ru/forum/showthread.php?t=124175)

SunShadow 22.04.2009 22:07

Совершенно не понятная ошибка switch
 
Внутри класса использую свитч сдежующего типа
Код AS3:

switch(true) {
        case shift && n:                                                       
                break;
        case n:
                break;
        case cLock && shift:
                break;
        case cLock:
                break;
        case shift:
                break;
        default:
}

что там внутри выполняется не важно, но стоит одной из переменных shift, n или cLock стать отличным от Boolean(например var n:TextField) получаем ошибку с большим логом в output и полностью отсутстующим стеком при трассировке (без debug вообще весь Flash колом). Почему то приведение к нужному типу не срабатывает
Это что баг, или надо качать более свежий cs4?

VVall 22.04.2009 22:24

А это вообще должно работать? Ведь будут срабатывать сразу несколько case.

DarkLight 22.04.2009 23:27

case не предназначен для скармливания ему выражений разных типов, поэтому может происходить что угодно. По логике такое не должно компилироваться.

А вообще бывают проблемы: я недавно словил VerifyError на вложенном for-each цикле, пытаясь сделать break внешнего из внутреннего, используя метки.

BlooDHounD 22.04.2009 23:39

битовые операции дают на выходе число. switch работает как ===. поэтому true никогда не будет равно 1.

wvxvw 23.04.2009 00:01

Не, думаю, просто очередность выполнения - попробуйте обрамить скобками "()" выражения в кейсах.
Т.е.:
Код AS3:

switch (true)
{
    case (a && b):
            break;
    case (a || b):
            break;
}


BlooDHounD 23.04.2009 01:13

wvxvw, тьфу. неправильно взглянул. почему-то узрел, и увидел битовые операции :) всё равно смысл сообщения не меняется. 1 !== true.

etc 23.04.2009 07:52

Такими switch-ами вы сносите башню компилятору, потом verifier-у, потом и плееру.
Не выпендривайтесь, напишите, чтобы всем было понятно.

SunShadow 23.04.2009 08:40

Если прописывать варианты выбора как Boolean то все работает нормально. Лично я не вижу в этом ничего страшного. Данный подход часто применяю и в других средах. По мне так это гораздо компактнее и нагляднее чем условия
Код AS3:

if(a){} else if (b){} else if(c){} ... else{}

И компилятор, verifier и плеер если варинаты прописаны нормально ведут себя адекватно.

Добавлено через 2 минуты
Цитата:

Сообщение от VVall (Сообщение 814779)
А это вообще должно работать? Ведь будут срабатывать сразу несколько case.

Это обязательно будет работать) Если вы знаете что такое switch, то знаете, что после первого встреченного break выполнение кода внутри свитча прерывается и передается следующему за switch оператору.

VVall 23.04.2009 09:19

И к чему этот рассказ про break? У вас может одновременно выполниться несколько условий в разных case - какой код будет выполнен и в каком порядке?

SunShadow 23.04.2009 09:24

Строго в той последовательности в которой они расположены в коде
Код AS3:

switch(true) {
        case shift && n:                                                       
                break;
        case n:
                break;
        case cLock && shift:
                break;
        case cLock:
                break;
        case shift:
                break;
        default:
}

сначала проверяется shift && n, затем n, cLock && shift и т.д. Как только одно из условий выполняется исполняется блок с командами внутри case, который завершаются break и соответственно выход из switch. Таким образом если shift && n выполняется то никаким образом в варианты выбора 2, 3 и т.д. вы попросту не попадете.

Mtnt 23.04.2009 12:48

На сколько я знаю, AS - строго типизированный язык, поэтому вполне естественно, что при сравнении логического и строкового, например, типа, вылетит ошибка

SunShadow 23.04.2009 12:59

Он стал строго типизированным в AS3. А к базовым типам по умолчанию в большинстве случаев он сам приводит. Во всяком случае выражение
Код AS3:

if (text){}

будет работать нормально не зависимо каким типом является text (Boolean, TextField, String)

BlooDHounD 23.04.2009 13:06

так как if автоматически приводит к булевому значению. swtch же в вашем случаи конвертит код в вид if ( true === value ) и если value равно чему-то отличному от true у Вас всегда будет false.

SunShadow 23.04.2009 13:09

ну получается не совсем false) Получается как и написал __etc ошибка в verifier. Вешается он, и возможно плеер

BlooDHounD 23.04.2009 13:20

это не связанные вещи.

SunShadow 23.04.2009 13:27

Ну на деле получается что на этапе исполнения когда он пытается сконвертить к
Код AS3:

if ( true === value )

ему становиться плохо)

BlooDHounD 23.04.2009 13:32

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

SunShadow 23.04.2009 13:34

Спасибо за помощь)


Часовой пояс GMT +4, время: 12:21.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.