Форум 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=145900)

goldlider 22.10.2010 17:42

Помогите, пожалуйста, найти ошибку в коде.
 
Имеется такая задача: даны два текстовых поля и две кнопки. Вводим в поле vvod какое-нибудь число. При нажатии на кнопку btn1 идет проверка есть ли данное число в массиве. Ответ записывается в поле otvet. Кнопка btn2 служит для очистки поля otvet.
Вот AS-код:

Код AS3:

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 верного числа, постоянно выводит ответ "Неверный пароль". Вроде бы, код верный.

Bgg 22.10.2010 17:50

А что в trace'е пишется?
Код AS3:

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. У меня же функция ничего не возращает.

leofit 22.10.2010 18:08

Код AS3:

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

Цитата:

Сообщение от cleptoman (Сообщение 944662)
голдлидер, return прерывает цикл и возвращает undefined

Не совсем.
Код AS3:

                private function myFunction():void
                {
                        return undefined; //compile error :(
                }

Если глянуть опкод для return; мы увидим returnvoid. Это не undefined, компилятор говоря "must be undefined" при попытке вернуть что то из void метода/функции не имеет ввиду ключевое слово undefined.

cleptoman 22.10.2010 18:35

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

Код AS3:

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;
        }
 
}

эдаким макаром мы от лишних итераций цикла уходим

leofit 22.10.2010 18:37

cleptoman, логическая ошибка

Код AS3:

 
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

я вот к чему:
Код AS3:

function getVoid():void{return };
trace(getVoid())

Добавлено через 1 минуту
leofit, да, конечно..с копипастами, не провирил )

goldlider 22.10.2010 18:42

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

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, а не являются не созданными.

leofit 22.10.2010 18:56

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/...ts.html#return

goldlider 22.10.2010 19:00

АУ ответьте да на мой вопрос.

leofit 22.10.2010 19:02

Правилен, смотрите пост №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; =)

Bgg 22.10.2010 19:16

О, загадочный return?)

Psycho Tiger 22.10.2010 19:21

Цитата:

Сообщение от Bgg (Сообщение 944690)
О, загадочный return?)

Да нет, вполне определенный.
Код AS3:

private function returnNothing():void {
        return;
}

Код:

getlocal0
pushscope
returnvoid

Код AS3:

private function returnVoid():void {
 
}

Код:

getlocal0
pushscope
returnvoid

Код AS3:

private function returnUndefined():*{
        return undefined;
}

Код:

getlocal0
pushscope
findpropstrict undefined
getproperty undefined
returnvalue

return; и отсутствие return - одно и тоже. return undefined возвращает именно undefined.
Всё равно не убедил?

leofit 22.10.2010 19:25

Код AS3:

function test():void {
        return;
}
trace(test()); //undefined

Кого и в чем Вы пытаетесь убедить? Я до сих пор не уловил предмет спора

Psycho Tiger 22.10.2010 19:27

Действительно!
Код AS3:

var array:Array=[];
trace(array[5]); //черт, кто ж туда undefined положил

Ещё для размышлений:
Код AS3:

trace(void); //undefined


cleptoman 22.10.2010 19:31

ты мне не выкай )

я тебе не про то

у каждого метода есть тип возвращаемого значения
укажем Number - нам вернуться должно значение этого типа
укажем void - вернеца undefined, потому как других он не принимает значений

т.е. я к чему веду - по идее return в данном случае и return undefined равны по своей сути и не должны вызывать ошибку

leofit 22.10.2010 19:31

Код AS3:

function test() {
        return;
}
trace(flash.utils.getQualifiedClassName (test())); //void

Добавлено через 1 минуту
Код AS1/AS2:

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.

leofit 22.10.2010 19:45

Нини, не подумайте чего..

cleptoman 22.10.2010 19:54

да я то же ничо, тока я все-таки останусь при своих))
void != undefined;

Number - тип
5 - значение

void - тип
undefined - значение

и то, что неопределено не все undefined )

Psycho Tiger 22.10.2010 21:58

cleptoman: ээ..
Код AS3:

                        trace(undefined === void); //true
                        trace(Number === 5.3); //Compile error

Компилятор не даст явно сравнить такую конструкцию. Поэтому Ваше предположение проверить я не могу.

Но рассуждая логически тип не может быть равен значению, это абсурд: флеш плеер же говорит что равен. В абс-коде используется опкод returnvoid, а не push smth, returnvalue. Не трудно догадаться что в случае с void`овым типом функции/метода, где используется returnvoid, а не returnvalue не возвращается значение как таковое.

leofit 23.10.2010 00:52

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 по ходу действия, или что-то ещё. Надо подумать.

udaaff 23.10.2010 02:22

В доке по типу void: You can use void only as a return type annotation. Есть еще такой оператор.


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

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