Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.09.2009, 08:35
filepark вне форума Посмотреть профиль Отправить личное сообщение для filepark Найти все сообщения от filepark
  № 1  
Ответить с цитированием
filepark

Регистрация: Jul 2009
Сообщений: 77
По умолчанию циклы: значение счетчика на выходе

Код AS1/AS2:
for (i=0; i<5; ++i) {
	butt.onRollOver = function() {
		trace(i);
	};
}
выдаёт 5, почему, ведь в последнем цикле i=4?

Старый 18.09.2009, 09:06
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 2  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Видимо, i все-таки 5 по окончании цикла. Ваш код эквивалентен следующему
Код:
for (i = 0; i < 5; ++i) {
	trace(i);
}
trace(i); // выводит 5.
Ваш ролловер просто выводит последнее значение переменной i, а оно равно 5.

Старый 18.09.2009, 09:28
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 3  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Видимо, сперва происходит приращение, затем формальный прогон вычислений внутри цикла, в конце тела - заход на новый виток проверка условия с новым значением счетчика.
Если условие выполняется, то происходит реальное выполнение (применение) уже формально выполненных вычислений тела цикла.
Если условие не выполняется, реальный результат последних вычислений НЕ принимается и происходит останов.
Но трейс-то уже произошел. Либо для примера автора - функция обработки на кнопку уже назначилась.
Трейс или назначение функции на событие, видимо, не считается вычислением и под отмену не подпадает, будучи уже свершившейся операцией.
Как происходит на деле - не знаю, вышеописанное - это я так понял. Программисты все правильно объяснят.

Автору - при использовании ссылки на функцию - тогда все в порядке:
Код AS1/AS2:
for (i=0; i<5; ++i) {
        butt.num = i;
	butt.onRollOver = btnOver;
}
 
function btnOver() {
  trace(this.num);
}


Последний раз редактировалось mooncar; 18.09.2009 в 10:26.
Старый 18.09.2009, 10:01
filepark вне форума Посмотреть профиль Отправить личное сообщение для filepark Найти все сообщения от filepark
  № 4  
Ответить с цитированием
filepark

Регистрация: Jul 2009
Сообщений: 77
2 alexcon314: да эквивалентен, но последний цикл заканчивается на i=4; почему становится i=5?
2 mooncar: но как вы объясните код alexcon314 выше?

Старый 18.09.2009, 10:26
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 5  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Ошибся - UPD:
Cперва происходит приращение, затем формальный прогон вычислений внутри цикла, в конце тела - заход на новый виток и проверка условия с новым значением счетчика.
То есть внутри интерпретатора - для вычислений цикл заканчивается на 5, но если условие при заходе по новой не выполняется, результаты вычислений не используются.
Но трейс при этом уже был.

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

Добавлено через 8 минут
Еще такая версия - язык "не понимает", что такое "<" - то есть меньше. Вычисление сравнения - сложная операция. Интерпретатор скорее всего проверяет равенство. Если числа равны, то результат последних вычислений не принимается.
Это мне кажется наиболее правильным объяснением.


Последний раз редактировалось mooncar; 18.09.2009 в 10:30.
Старый 18.09.2009, 10:38
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 6  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Цитата:
2 alexcon314: да эквивалентен, но последний цикл заканчивается на i=4; почему становится i=5?
Рискну предположить (только не бейте!), что цикл заканчивается на i=5.

Старый 18.09.2009, 10:41
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 7  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Последняя версия событий такова:

1. Начало цикла. i = 0
2. Проверка условия i = 5. (а не "i < 5" !)
Если дает НЕТ, то из оперативного хранилища результат предыдущих вычислений цикла (если они были) используется где-то в коде дальше (то есть у этих результатов механизм языка ставит отметку "разрешаю к использованию") и одновременно происходит переход к (3).
Если i = 5 дает ДА, то СТОП и стирание результатов предыдущего шага (если был).
3. Производятся вычисления.
4. Результат вычислений откладывается в оперативное хранилище.
5. Происходит приращение i = i + 1
6. Переход в (2)

Тогда будет именно такая картина, которую наблюдаем на практике.

1. Трейс.
Трейс происходит на этапе 3 и, вероятно, работа с окном вывода не связана с оперативным хранилищем и метка о разрешении использования результатов тут нигде не проверяется, а вывод в окно происходит сразу, вроде "стандартного вывода".

То же, видимо, и с описанием анонимной функции примера автора:

2. Назначение функции.
В процессе вычислений (этап 3) для кнопки создается функция обработки события и она становится атрибутом самой кнопки и с результатами вычислений становится никак не связана, то есть ее нельзя "отменить" или "не использовать" в зависимости от метки "разрешено к использованию"

И 5-ка будет последним значением i. Если на пальцах - то просто результат с 5-ой не используется в одних случаях (дальнейшие вычисления в коде) и используется в других (трейс и создание функций).


Последний раз редактировалось mooncar; 18.09.2009 в 11:02.
Старый 18.09.2009, 11:03
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 8  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Последняя версия событий такова:

1. Начало цикла. i = 0
2. Проверка условия i < 5.
- если дает true, то выполняется все, что в теле цикла, в моем примере это trace(i);.
- если дает false, то переходим на 4.
3. Происходит приращение i = i + 1 и переход на 2.
4. Выход из цикла (выполняется следующая после цикла строчка кода).
Тогда будет именно такая картина, которую наблюдаем на практике.

То, что в примере автора в теле цикла выполняется присвоение обработчика ролловер кнопки, никакого значения не имеет, т.е. после выхода из цикла i=5.

PS.
Обработчик ролловер, аж 5(!) раз назначенный в цикле, честно трейсит i. Назначение обработчика само по себе не что иное, как операция присваивания, т.е. можно было с тем же успехом написать
Код:
for (i = 0; i < 5; ++i) {
	a = "какая-то фигня";
}
И чему бы вы думали будет равно а на каждой итерации и после выхода из цикла?


Последний раз редактировалось alexcon314; 18.09.2009 в 11:22.
Старый 18.09.2009, 11:10
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 9  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Угу. То есть на кнопке обработчик просто выводит i - то есть то значение, что осталось в ячейке памяти с именем «i»?

Аминь. А я-то такую версию выстроил.
Все-таки только мне кажется что проверяется равенство, а не "меньшесть".
Больше-меньше - это языку вычислять нужно, а равенство механизм языка простой побитной эквивалентностью получить может.


Последний раз редактировалось mooncar; 18.09.2009 в 11:25.
Старый 18.09.2009, 11:20
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 10  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Ну да. Именно "что осталось" и выводит.

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:15.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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