Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   проблема с циклами (http://www.flasher.ru/forum/showthread.php?t=181677)

razerw 29.06.2012 14:34

проблема с циклами
 
Привет комрады.
Столкнулся с проблемой в циклах. Сейчас покажу код и коментариями опишу проблемку.


Код AS3:

                    // Создаем новый массив
                        _mapMask = [];
                        _mapMask.length = MAP_HEIGHT_MAX;               
                        _f = MAP_HALF;
 
                        for (var aw:int = 0; aw < 115; aw++)
                        { 
                                          trace(aw); //Вот на этом моменте итераторы показывают  синромные  данные      тоесть идут в такт 00, 11 , 22, 33.
                            trace(aq)//
                            f++
                                _mapMask[aw] = [];
                                _mapMask[aw].length = MAP_WIDTH_MAX;
                                _f -= MCELL_HALF;
 
                                for (var aq:int = 0; aq < f; aq++)
                                    {
 
                                            _mapMask[aw][aq] = STATE_CELL_FREE;
                                                                              //А вот уже тут показания расходятся aw = 57, aq=60 и тогдалее.
                                                trace(aw);
                                                trace(aq);
//Не понятно почему так происходит, в начале первого цикла все итераторы равны нулю а вот уже во втором цикле начинаются с другого значения :( Может кто знает почему так происходит? Спасибо!
 
                                    }


Wolsh 29.06.2012 14:41

А с чего они должны быть одинаковыми? О_О
Цикл aw идет от ноля до 115. На каждое изменение aw (итерацию на +1) проигрывается весь цикл aq от ноля до (!) f, которая к тому же изменяется в каждой итерации aw. О какой синхронности речь?

razerw 29.06.2012 14:57

все верно во втором цикле я слушаю aw и aq которые увеличиваются на 1 при каждой итерации. Так вот вся соль втом что самого первое значение которое мне выдает trace это 57 и 60, а по сути то должно быть 1,1 2,2 3,3 и тогдалее.
Ведь в самом начале первого цикла когда я слушал aw и aq команда trace мне показывала 1,1 2,2 3,3 и тогдалее.

Добавлено через 52 минуты
тоесть как я понимаю во второй цикл aw и aq не с 0 а с 57

Wolsh 29.06.2012 16:08

Один цикл ВЛОЖЕН в другой.
Когда aw==0, aq изменяется при каждой итерации вложенного цикла, так? То есть
aw=0, aq=0
aw=0, aq=1
aw=0, aq=2
и тд.
Затем цикл aq заканчивается и происходит итерация !внешнего" цикла aw, в котором цикл aq снова проходит от 0 до f:
aw=1, aq=0
aw=1, aq=1
aw=1, aq=2
Это понятно?
Но у Вас второй цикл ограничен переменной f, о которой в примере кода ничего не показано.
Эта переменная у Вас увеличивается с каждой итерацией цикла aw (f++). То есть длина цикла aq (количество его итераций) тоже все время увеличивается. Происходит ли потом обнуление f из кода не видно.
Цитата:

Ведь в самом начале первого цикла когда я слушал aw и aq команда trace мне показывала 1,1 2,2 3,3 и тогдалее.
Это потому, что f видимо изначально равна 0. И с каждым витком цикла aw она (f) увеличивается на 1, то есть тупо равна значению aw+1. Соответственно trace во внешнем цикле показывает aw и aq == f, так как f это последнее, максимальное значение aq после завершения цикла aq. Ведь f это и есть его граница, и она равна текущему aw+1. Когда будет следующая итерация aw (aw+1), f во время трейса еще не была увеличена (f++), и соответственно они равны. И aq равна f. И стало быть aq (старое) == aw (новое).
Но внутри цикла aq трейс естественно будет показывать текущее значение aw (оно одно на всем протяжении цикла aq) и разные значения aq, от ноля до f (которое равно aw+1) - 1.

razerw 29.06.2012 18:06

Я немного по иначе представляю себе сложившуюся картину.

Начинается цикл aw
aw=0 и увеличивается на 1
//в представленном коде видно переменную f++ которая находится сразу после тейсов в первомцикле aw
f++ тоже ровна 0 и тоже увеличивается на единицу.
//далее запускается цикл aq у которого условие f тоесть цикл отработает один рас, и после чего выйдит во внешний цикл aw. И картина будет повторяться и f будет увеличиваться тем самым задавая ритм внутренниму цикру aq.

Wolsh 29.06.2012 18:34

Чем пытаться придумать, как работает цикл, может проще прочитать или написать нормальных трейсов?
Цитата:

aw=0 и увеличивается на 1
С какой стати? В первом витке она так и останется нолем. А вот f да, увеличится на 1 и цикл aq в первом (нулевом, если хотите) витке aw будет выглядеть так:
Код AS3:

for (var aq:int = 0; aq < 1; aq++)
{
        //// здесь aw=0, f=1, aq=0
}
//// здесь aw=0, f=1, aq=1

Пропишите нормальные человекочитаемые трейсы, чтобы знать что происходит
Код AS3:

var f:uint = 0;
for (var aw:int = 0; aw < 5; aw++)
{ 
        trace("------------------------------------");
        trace("Новый виток aw");
        trace("aw="+aw, ", aq="+aq, ", f="+f);
        f++;
        for (var aq:int = 0; aq < f; aq++)
        {       
                trace("---------------");
                trace("aw="+aw, ", aq="+aq, ", f="+f);
        }
        trace("после цикла aq: aw="+aw, ", aq="+aq, ", f="+f);
}


razerw 01.07.2012 18:59

вот код

Код AS3:

                        for (var aw:int = 0; aw < 115; aw++)
                        { 
                            trace(aw); //вот здесь трейсы показывают 00, 10, 21, 32, 43, 54, 64.
                            trace(aq);
                            f++
                                _mapMask[aw] = [];
                                _mapMask[aw].length = MAP_WIDTH_MAX;
                                _f -= MCELL_HALF;
 
                                for (var aq:int = 0; aq < aw; aq++)
                                    {
                                            // Задаем ячеке свободное состояние
                                            _mapMask[aw][aq] = STATE_CELL_FREE;
                                                trace(aw);//а вот здесь трейсы показывают 12 56, 16 56, 17 56. // почему так? вочему трейсы не начинаются так же как и в первом цикле 00, 10, 21, 32, 43, 54, 64.
                                                trace(aq);
 
                                    }


Psycho Tiger 01.07.2012 23:51

По Вашему коду меня пугает, что трейсы идут 00, 10, 21, а не 0, 1, 2, 3, к примеру.

Wolsh 02.07.2012 02:24

А то, что условие цикла aq < aw, а трейс в этом цикле выводит aw=12, aq=56, тебя не смущает?)))
Я просто не знаю, как реагировать на эту... информацию от автора...

razerw 02.07.2012 10:31

я же и пишу чт отрейсы разное показывают ,
посмотрите на код ниже.

Код AS3:

                        for (var aw:int = 0; aw < 115; aw++)
                        { 
                            trace(aw); //вот здесь трейсы показывают [0] [0], [1] [0], [2] [1], [3] [2], [4] [3], [5] [4], [6] [4].
                            trace(aq);
                            f++
                                _mapMask[aw] = [];
                                _mapMask[aw].length = MAP_WIDTH_MAX;
                                _f -= MCELL_HALF;
 
                                for (var aq:int = 0; aq < aw; aq++)
                                    {
                                            // Задаем ячеке свободное состояние
                                            _mapMask[aw][aq] = STATE_CELL_FREE;
                                                trace(aw);//а вот здесь трейсы показывают [12] [56], [16] [56], [17] [56]. // почему так? вочему трейсы не начинаются так же как и в первом цикле [0] [0], [1] [0], [2] [1], [3] [2], [4] [3], [5] [4], [6] [4].
                                                trace(aq);
 
                                    }

в первом цикле трейся показывают правильную последовательность, а во втором начинают показывать "трейся" не с 0 и даже не с 1 а
aw=15, aq=56
aw=16, aq=56
aw=17, aq=56

вот почему так происходит? почему трейсы из внутреннего цикла начинают показывать не с 0


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

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