Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Куда делось 7 n? (Duff's device) (http://www.flasher.ru/forum/showthread.php?t=137312)

wvxvw 10.03.2010 15:53

Куда делось 7 n? (Duff's device)
 
Код AS3:

var n:int = 8;
var a:Array/*int*/ = [];
var from:int = 100;
 
trace(n);
 
switch (--n)
{
        case 7: a[n] = from++;
        case 6: a[n] = from++;
        case 5: a[n] = from++;
        case 4: a[n] = from++;
        case 3: a[n] = from++;
        case 2: a[n] = from++;
        case 1: a[n] = from++;
        case 0: a[n] = from++;
        default: break;
}
trace(a, n, from);

Объясните пожалуйста!

EDIT: Оказалось, что условие switch'a не проверяется в каждом кейсе...
Код AS3:

var n:int = 0;
var a:Array/*int*/ = [];
var from:int = 100;
 
trace(n);
 
switch (true)
{
        case 0: a[n++] = from++;
        case 1: a[n++] = from++;
        case 2: a[n++] = from++;
        case 3: a[n++] = from++;
        case 4: a[n++] = from++;
        case 5: a[n++] = from++;
        case 6: a[n++] = from++;
        case 7: a[n++] = from++;
        default: break;
}
trace(a, n, from);

Кстати, если сделать так - нас встретит VerifyError

switcher! 10.03.2010 16:50

в общем-то, так и должно быть, как вы привели в первой части поста.
Проверка в блоке switch идет до первого вхождения условия, а потом, если не встречается break -> выполняются команды все подряд.

Это позволяет, к примеру, обозначить команду "влево" для персонажа более коротко:
Код AS3:

switch (e.keyCode)
{
        ...
        case 37:
        case 65:
                trace("влево");
        break;
        ...
}

нежели:
Код AS3:

switch (e.keyCode)
{
        ...
        case 37:
                trace("влево");
        break;
 
        case 65:
                trace("влево");
        break;
        ...
}


Котяра 10.03.2010 17:10

wvxvw - у тебя украли аккаунт? уж больно вопросы нубские))))))

wvxvw 10.03.2010 17:36

А вы второй пример попробуйте, первый был неудачный просто.

Волгоградец 10.03.2010 18:17

Цитата:

%1 and %2 cannot be reconciled.
* Note: This error indicates that the ActionScript in the SWF is invalid. If you believe that the file has not been corrupted, please report the problem to Adobe.
Здесь int и * не могут "примириться". Что бы это значило?

udaaff 10.03.2010 18:56

Код AS3:

var n:int = 0;
var a:Array/*int*/ = [];
var from:int = 100;
 
trace(n);
 
switch (true)
{
        case 0: { a[n++] = from++ };
        case 1: { a[n++] = from++ };
        case 2: { a[n++] = from++ };
        case 3: { a[n++] = from++ };
        case 4: { a[n++] = from++ };
        case 5: { a[n++] = from++ };
        case 6: { a[n++] = from++ };
        case 7: { a[n++] = from++ };
        default: break;
}
trace(a, n, from);

Так без ошибки, хотя что происходит я не понимаю :)

aksios 10.03.2010 19:01

wvxvw, а Вы раньше уже использовали такую конструкцию: switch (true) ?
По моему скромному мнению это вызовет ошибку.
Если туда поставить нормальную переменную то все заработает.
Свитч без брейков - фи.

wvxvw 10.03.2010 19:22

Switch без брейков - это Duff's device! :D так что не надо. Это можно сказать старинный способ оптимизировать циклы.
А вообще, я на самом деле пытался сделать небезопасный поинтер силами AS но чет пока не получается :)
Последняя попытка выглядела вот так:
Код AS3:

var n:int = 0;
var a:Array/*int*/ = [];
 
trace(n);
 
switch (true)
{
        case true: a[++n] = n;
        case true: a[++n] = n;
        case true: a[++n] = n;
        case true: a[++n] = n;
        case true: a[++n] = n;
        case true: a[++n] = n;
        case true: a[++n] = n;
        case true: a[++n] = n;
        default: break;
}
trace(a, n);

Но она тоже не запускается :)

Котяра 11.03.2010 09:32

непонятно что ты хочешь сделать.
Код AS3:

var n:int = 0;
var a:Array/*int*/ = [];
 
trace(n);
 
switch (true)// выполнится один раз
{
        case true: a[++n] = n;//всегда
        case true: a[++n] = n;//всегда
        case true: a[++n] = n;//всегда
        case true: a[++n] = n;//всегда
        case true: a[++n] = n;//всегда
        case true: a[++n] = n;//всегда
        case true: a[++n] = n;//всегда
        case true: a[++n] = n;//всегда
        default: break;
}
trace(a, n);

если не считать, что флаги меток у кэйсов должны быть разные (по сути это метки GOTO(бэйсик/фортран) или jmp(асм))
аналогично:
Код AS3:

var n:int = 0;
var a:Array/*int*/ = [];
 
trace(n);
a[++n] = n;
a[++n] = n;
a[++n] = n;
a[++n] = n;
a[++n] = n;
a[++n] = n;
a[++n] = n;
a[++n] = n;
trace(a, n);


в этом коде при портировании вы забыли про while
Код AS3:

strcpy(to, from, count)
register char *to, *from;
register count;
{
    register n = (count + 7) / 8;
    switch (count % 8) {
    case 0: do { *to = *from++;
    case 7:      *to = *from++;
    case 6:      *to = *from++;
    case 5:      *to = *from++;
    case 4:      *to = *from++;
    case 3:      *to = *from++;
    case 2:      *to = *from++;
    case 1:      *to = *from++;
              } while (--n > 0); // вот тут то и делается возврат к свичу, вернее, к выбору метки
    }
}



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

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