Просмотр полной версии : Помогите, пожалуйста, найти ошибку в коде.
goldlider
22.10.2010, 17:42
Имеется такая задача: даны два текстовых поля и две кнопки. Вводим в поле vvod какое-нибудь число. При нажатии на кнопку btn1 идет проверка есть ли данное число в массиве. Ответ записывается в поле otvet. Кнопка btn2 служит для очистки поля otvet.
Вот AS-код:
var massiv:Array = ["123000", "123456", "908070"];
btn1.addEventListener(MouseEvent.CLICK, proverka);
function proverka(event:MouseEvent):void
{
for (var i:int = 0; i < massiv.length; i++)
{
if (massiv[i] == vvod.text)
{
otvet.text = "Верный пароль";
}
else
{
otvet.text = "Неверный пароль"
}
}
}
btn2.addEventListener(MouseEvent.CLICK, cleaning);
function cleaning(event:MouseEvent):void
{
otvet.text = "";
}
Собственно проблема заключается в том, что при вводе в поле vvod верного числа, постоянно выводит ответ "Неверный пароль". Вроде бы, код верный.
А что в trace'е пишется?
function proverka(event:MouseEvent):void
{
for (var i:int = 0; i < massiv.length; i++)
{
if (massiv[i] == vvod.text)
{
otvet.text = "Верный пароль";
return;//зачем дальше искать?
}
else
{
trace("massiv:" + massiv[i] + " vvod:" + vvod.text);
otvet.text = "Неверный пароль"
}
}
}
goldlider
22.10.2010, 18:05
Bgg, мне не понятно, для чего здесь нужен return. У меня же функция ничего не возращает.
function proverka(event:MouseEvent):void
{
for each(var val in massiv)
{
if (val == vvod.text)
{
otvet.text = "Верный пароль";
return;
}
}
otvet.text = "Неверный пароль";
}
cleptoman
22.10.2010, 18:25
голдлидер, return прерывает цикл и возвращает undefined
goldlider
22.10.2010, 18:25
cleptoman, т.е. return останавливает цикл, если найдено верное число, не проверяя далее весь массив.
Psycho Tiger
22.10.2010, 18:32
голдлидер, return прерывает цикл и возвращает undefined
Не совсем.
private function myFunction():void
{
return undefined; //compile error :(
}
Если глянуть опкод для return; мы увидим returnvoid. Это не undefined, компилятор говоря "must be undefined" при попытке вернуть что то из void метода/функции не имеет ввиду ключевое слово undefined.
cleptoman
22.10.2010, 18:35
я к тому что, у bgg мысль правильная.
лучше вынесите проверку в отдельный метод и возвращайте булево
function proverka(event:MouseEvent):void
{
otvet.text = (_isRightPass()) ? "Верный пароль" : "Неверный пароль"
}
private function _isRightPass():Boolean{
for each(var val in massiv) {
if (val == vvod.text) {
return true;
}
return false;
}
}
эдаким макаром мы от лишних итераций цикла уходим
cleptoman, логическая ошибка
private function _isRightPass():Boolean{
for each(var val in massiv) {
if (val == vvod.text) {
return true;
}
// return false;
}
return false;
}
cleptoman
22.10.2010, 18:38
я вот к чему:
function getVoid():void{return };
trace(getVoid())
Добавлено через 1 минуту
leofit, да, конечно..с копипастами, не провирил )
goldlider
22.10.2010, 18:42
Ну вы намудрили. Ничего не понятно из выше описанного. Вроде бы у меня после вставки return все работает правильно. Никаких ошибок нет.
if (massiv[i] == vvod.text)
{
otvet.text = "Верный пароль";
return;
}
Добавлено через 6 минут
Я так понял, что return не проверяет весь массив, если найденно число. К примеру:
массив состоит из 100 элементов, введеный в поле элемент в массиве находиться на 50-ом месте. Тогда получается, что return найдя верное число, останавливает проверку, т.е. не проверяя остальные 50 чисел. Правилен ли ход моих мыслей ?
Psycho Tiger
22.10.2010, 18:50
@cleptomain: из хэлпа про undefined:
Специальное значение, применяемое к неинициализированным переменным без типа или неинициализированным свойствам динамического объекта. В ActionScript 3.0 значение undefined присваивается только переменным без типа
Значит мы вернули что-то неинициализированное, да ещё и без типа. По Вашей же логике return; и return undefined; равнозначны, а это не так. Проще говоря следуя такой логике можно предположить, что создавая массив все элементы содержат undefined, а не являются не созданными.
If a function definition includes a return type, the return statement must be followed by an expression. If no return type is specified and the return statement is used alone, it returns undefined.
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/statements.html#return
goldlider
22.10.2010, 19:00
АУ ответьте да на мой вопрос.
Правилен, смотрите пост №4, проверяется весь массив, если находит значение то происходит выход из функции, если нет то сообщает об ошибке
goldlider
22.10.2010, 19:06
всем thank you very much
cleptoman
22.10.2010, 19:10
The void data type contains only one value, undefined. In previous versions of ActionScript, undefined was the default value for instances of the Object class. In ActionScript 3.0, the default value for Object instances is null.
по моей логике void - такой же тип как и все остальные.
да, согласен, что return undefined - масло масленное, но , в общем верное. зачем тут эксепшн?
или я чего-то не понимаю?
Psycho Tiger
22.10.2010, 19:15
cleptoman, ну этой цитатой Вы свои же слова опровергнули. Поэтому трейся void Вы видите undefined, а я в ABC-коде вижу returnvoid.
If no return type is specified and the return statement is used alone, it returns undefined.
Мы спорим не о отсутствии return, а о return; =)
Psycho Tiger
22.10.2010, 19:21
О, загадочный return?)
Да нет, вполне определенный.
private function returnNothing():void {
return;
}
getlocal0
pushscope
returnvoid
private function returnVoid():void {
}
getlocal0
pushscope
returnvoid
private function returnUndefined():*{
return undefined;
}
getlocal0
pushscope
findpropstrict undefined
getproperty undefined
returnvalue
return; и отсутствие return - одно и тоже. return undefined возвращает именно undefined.
Всё равно не убедил?
function test():void {
return;
}
trace(test()); //undefined
Кого и в чем Вы пытаетесь убедить? Я до сих пор не уловил предмет спора
Psycho Tiger
22.10.2010, 19:27
Действительно!
var array:Array=[];
trace(array[5]); //черт, кто ж туда undefined положил
Ещё для размышлений:
trace(void); //undefined
cleptoman
22.10.2010, 19:31
ты мне не выкай )
я тебе не про то
у каждого метода есть тип возвращаемого значения
укажем Number - нам вернуться должно значение этого типа
укажем void - вернеца undefined, потому как других он не принимает значений
т.е. я к чему веду - по идее return в данном случае и return undefined равны по своей сути и не должны вызывать ошибку
function test() {
return;
}
trace(flash.utils.getQualifiedClassName (test())); //void
Добавлено через 1 минуту
function test():* {
return;
}
trace(flash.utils.getQualifiedClassName (test())); //void
var array:Array=[];
trace(array[5]); //черт, кто ж туда undefined положил
trace(flash.utils.getQualifiedClassName (array[5])); //void
По моему, это называется флуд )
Psycho Tiger
22.10.2010, 19:41
Здорово, возвращается void, но вы мне твердите что undefined.
Вообще говоря void === undefined и спор сугубо религиозный, я лишь чуть-чуть поправил cleptoman`а, не говорив при этом что он неправ. Мне непонятно, откуда такой резонанс.
Проще говоря, с точки зрения программиста void - это то, что функция/метод ничего не возвращает, или по ссылке не найти ничего вразумительного. undefined - что что-то неопределенно. Нельзя возвращать что-то, что неопределенно, однако если функция ничего не возвращает - она возвращает неопределенность. По сути, это одно и то же, но разные сущности. Это как function определяет и функции, и методы. Но при этом, по сути, они делают одно и тоже. Отсюда void === undefined.
Нини, не подумайте чего..
cleptoman
22.10.2010, 19:54
да я то же ничо, тока я все-таки останусь при своих))
void != undefined;
Number - тип
5 - значение
void - тип
undefined - значение
и то, что неопределено не все undefined )
Psycho Tiger
22.10.2010, 21:58
cleptoman: ээ..
trace(undefined === void); //true
trace(Number === 5.3); //Compile error
Компилятор не даст явно сравнить такую конструкцию. Поэтому Ваше предположение проверить я не могу.
Но рассуждая логически тип не может быть равен значению, это абсурд: флеш плеер же говорит что равен. В абс-коде используется опкод returnvoid, а не push smth, returnvalue. Не трудно догадаться что в случае с void`овым типом функции/метода, где используется returnvoid, а не returnvalue не возвращается значение как таковое.
void тип данных, единственным значением которого является undefined
* String(undefined) возвращает значение "undefined" (undefined преобразуется в строку).
* Number(undefined) возвращает значение NaN.
* int(undefined) и uint(undefined) возвращают 0.
* Object(undefined) возвращает значение в виде нового экземпляра Object.
* Если значение undefined присвоено переменной определенного типа, оно преобразуется в значение по умолчанию для этого типа данных.
Никаких предположений, офф документация, спор ни о чем
Psycho Tiger
23.10.2010, 01:34
Хм, хорошо. void тип, единственное его значение undefined, однако что-то здесь нечисто. Похоже void трансформируется в undefined по ходу действия, или что-то ещё. Надо подумать.
В доке по типу void: You can use void only as a return type annotation. Есть еще такой оператор.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.