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

Psycho Tiger 28.11.2008 17:24

Передача значений из функции, не ссылок
 
Добрый день.
Написал ф-цию:
Код AS3:

                public function sliceNumbers(str:String):Array {
                        var rArr:Array = [];
                        rArr[0] = "";
                        rArr[1] = "";
                        var l:int = str.length;
                        for (var i:int = 0; i < l; i += 2) {
                                rArr[0] += str.charAt(i);
                        }
                        for (i = 1; i <= l; i += 2) {
                                rArr[1] += str.charAt(i);
                        }
                        return rArr;
                }

Можно не вникать что он делает, да и неважно это - просто разбивает строку на 2 кучки и возвращает их. Массивом, конечно же.
Теперь по задаче нужно разбить их ещё раз, снова на 2 кучки и так пока не останеться по 1 символу. Ну, это к сути проблемы не относиться, когда я пытаюсь сделать вот это:
Код AS3:

var resultArray:Array=new Array();
var funcRes:Array = sliceNumbers("1234");
resultArray.push(funcRes[0], funcRes[1]);
resultArray.splice(0, 1);

Мне выдают Type Error. Скорее всего, это проблема того, что передаются не значения, а ссылки. Есть способ передать именно значения или выдрать их?

BoUnd 28.11.2008 18:19

Запуск вашего кода у меня не приводит к возникновению описанной ошибки. А по теме топика можно предложить передавать в функцию переменную в которую будет помещаться результат ее работы.

Psycho Tiger 29.11.2008 14:31

Гм, действительно. Но если обрабатывать это в другой ф-ции, то:
Код AS3:

package 
{
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.events.MouseEvent;
        public class Main extends MovieClip
        {
                private var inputText:TextField = new TextField();
                private var ok:Sprite = new Sprite();
                public function Main():void {
                        addChild(inputText);
                        inputText.x = 200;
                        inputText.y = 225;
                        inputText.text = "32017496";
                        addChild(ok);
                        ok.x = 200;
                        ok.y = 300;
                        ok.graphics.beginFill(0xFFFFFF * Math.random(), 1);
                        ok.graphics.drawRect(0, 0, 50, 50);
                        var okText:TextField = new TextField();
                        okText.x = 210;
                        okText.y = 315;
                        okText.text = "Ok! ;)";
                        okText.textColor = 0xFFFFFF * Math.random();
                        okText.selectable = false;
                        okText.mouseEnabled = false;
                        addChild(okText);
                        ok.addEventListener(MouseEvent.CLICK, clickHandler);
 
 
 
                }
 
                private function clickHandler(e:MouseEvent):void {
                        var funcRes:Array = sliceNumbers(inputText.text);
                        var iter:int = 0;
                        var resultArray:Array=new Array();
                        resultArray.push(funcRes[0], funcRes[1]);       
                        resultArray.splice(0, 1);
                        var temp:Array = new Array();
                        while (resultArray[0].length > 1){
                                if (iter++ > 15) {
                                        trace("Не судьба"); break; return; //мало ли, чтобы не ждать 15 сек
                                }
                                for (var i:int = 0; i < resultArray.length; i++) {
                                        funcRes = sliceNumbers(resultArray[i]);
                                        temp.push(funcRes[0], funcRes[1]);
                                }
 
                                resultArray.splice(0,1); //error!
                                if (temp.length>0) temp.splice(0, temp.length);
                        }
 
 
 
 
                }
 
                public function sliceNumbers(str:String):Array {
                        var rArr:Array = [];
                        rArr[0] = "";
                        rArr[1] = "";
                        var l:int = str.length;
                        for (var i:int = 0; i < l; i += 2) {
                                rArr[0] += str.charAt(i);
                        }
                        for (i = 1; i <= l; i += 2) {
                                rArr[1] += str.charAt(i);
                        }
                        return rArr;
                }
        }
 
}


ZlPredator 29.11.2008 14:51

У меня нету ошибки и в этом коде!

Psycho Tiger 29.11.2008 15:12

А на кнопку то нажать пробовал? ;)

iNils 29.11.2008 15:38

Код AS3:

...
var len:Number = resultArray[0].length;
while (len > 1){
...


Psycho Tiger 29.11.2008 16:35

2iNils: да, но если перед входом в цикл len>1 - то из цикла мы уже никогда не выйдем, т.к. перемнную len мы не обновляем. Или она будет работать как ссылка обновляясь? О_о
UPD: эээ... заработало... что то я без идей. Можешь обьяснить, что это было?

ZlPredator 29.11.2008 18:39

Цитата:

Сообщение от Psycho Tiger (Сообщение 780471)
А на кнопку то нажать пробовал? ;)

Я имел в виду что нету ошибки там где ты сказал. Exception валится на while.

Цитата:

2iNils: да, но если перед входом в цикл len>1 - то из цикла мы уже никогда не выйдем, т.к. перемнную len мы не обновляем. Или она будет работать как ссылка обновляясь? О_о
Естественно не будет. Твой break сработает =)

Цитата:

UPD: эээ... заработало... что то я без идей. Можешь обьяснить, что это было?
Ты же сам в конце цикла удаляешь единственный элемент массива с помощью splice (перевожу дословно: удалить 1 элемент начиная с индекса 0), второй ты удалил еще до цикла.

Psycho Tiger 29.11.2008 19:04

Цитата:

Сообщение от ZlPredator
Естественно не будет. Твой break сработает =)

Ну да, но в конечной программе то его не будет =) Там где я сомневаюсь во время написания частенько оставляю подобную конструкцию, ибо ждать 15 секунд мне влом)
Цитата:

Сообщение от ZlPredator
Ты же сам в конце цикла удаляешь единственный элемент массива с помощью splice (перевожу дословно: удалить 1 элемент начиная с индекса 0), второй ты удалил еще до цикла.

Ну, здесь да :) Этот момент уже набирал на форуме без компиляции, а попробуй вот так? Что здесь не то?
Код AS3:

resultArray=temp;
temp=[];


ZlPredator 29.11.2008 19:14

Да ничего... Цикл отработал. Что я должен был увидеть?


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

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