佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1240|回复: 15

修正陣列復制的問題

[复制链接]
发表于 19-5-2007 11:50 AM | 显示全部楼层 |阅读模式
該帖已被刪除....

[ 本帖最后由 super-tomato 于 16-6-2007 07:20 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 19-5-2007 11:52 AM | 显示全部楼层
好主題,支持原創,超級番署多多貼好教學...

[ 本帖最后由 hahabin 于 19-5-2007 11:55 AM 编辑 ]
回复

使用道具 举报

发表于 19-5-2007 01:35 PM | 显示全部楼层
var myArray:Array = new Array([1,2]);
var temp:Array = myArray;
myArray[0][0] = 3;
trace(myArray); //3,2
trace(temp); //沒更動但卻輸出3,2


这个不是复制,这个是两个reference都point去同个memory
回复

使用道具 举报

 楼主| 发表于 20-5-2007 01:08 PM | 显示全部楼层
原帖由 tensaix2j 于 19-5-2007 01:35 PM 发表


这个不是复制,这个是两个reference都point去同个memory



對, 那麼為何就只有Array有出現這類問題呢?
var a:Number = 5;
var b:Number = a;
a = 10;
trace(b);  //可以用這個例子套用在其他類型上




如果我沒做出這個解決方法, 應該不了解的人應該會抓破腦袋始終無法解決吧 ^_^
回复

使用道具 举报

发表于 21-5-2007 02:59 PM | 显示全部楼层
var a:Number=5;
var b:Number=a;
a=10;
var b:Number=a;
//我加了这句,让b再次读取a的数值,这样就得到根a一样的答案了
trace(b);

是这样解决吗?
回复

使用道具 举报

 楼主| 发表于 21-5-2007 05:59 PM | 显示全部楼层
原帖由 LuffyRei 于 21-5-2007 02:59 PM 发表
var a:Number=5;
var b:Number=a;
a=10;
var b:Number=a;
//我加了这句,让b再次读取a的数值,这样就得到根a一样的答案了
trace(b);

是这样解决吗?



呵呵, 不是
你可以測試第一帖的例子, 然後再和之前的帖的例子比較看看
回复

使用道具 举报

Follow Us
发表于 22-5-2007 12:09 PM | 显示全部楼层
原帖由 super-tomato 于 19-5-2007 11:50 AM 发表
作者 : Super-Tomato

不知道可否有人試過復制多維陣列變數後,修改原來的陣列變數,而拷貝的變數值也一起更換呢?

如:

var myArray:Array = new Array();
var temp:Array = myArray;
myArr ...


刚刚测试了一下,使用同样的代码,得到了一下的结果。

myArray value
--------------
3,2
temp value
--------------
3,2

本人所使用的是flash pro 8。

根据,同样代码但是结果不同的情况,可知问题不在代码,而是在IDE版本、软件和环境设定方面。

所以,想请问你所使用的AS版本,IDE 版本。
回复

使用道具 举报

 楼主| 发表于 22-5-2007 02:34 PM | 显示全部楼层
原帖由 donynam 于 22-5-2007 12:09 PM 发表


刚刚测试了一下,使用同样的代码,得到了一下的结果。

myArray value
--------------
3,2
temp value
--------------
3,2

本人所使用的是flash pro 8。

根据,同样代码但是结果不同的情况 ...




沒錯, 那個Array例子要表達的就是 b = a 的時候, a 改變而 b 也會隨著改變(像C中的pointer).
因而在做某些looping的時候要把Array複製出來就會出現問題了.

而在其他類型上, 如String或Number卻不是這樣的結果...


本人也是使用Flash Pro 8 & AS2.0, 我所指的是一般Flash的環境下編寫
回复

使用道具 举报


ADVERTISEMENT

发表于 22-5-2007 04:08 PM | 显示全部楼层
原帖由 super-tomato 于 22-5-2007 02:34 PM 发表
沒錯, 那個Array例子要表達的就是 b = a 的時候, a 改變而 b 也會隨著改變(像C中的pointer).
因而在做某些looping的時候要把Array複製出來就會出現問題了.
而在其他類型上, 如String或Number卻不 ...


这是flash的设计。如果要复制其实非常简单,写一个array clone的function就可以了。对于object 好像有一个可以复制 object 的function。

为了解决此问题特别设计了一个clone function

   function clone(Obj) {
      var copy:Object = new Object;
      for (var p in Obj) {
         if (typeof(Obj[p])!='object'){
             copy[p]= Obj[p];              
         }
         else{
             copy[p] = clone(Obj[p]);
         }
      }
      return copy;
   }

var a:Object = new Array([5,7],[1,2]);
var b:Object = new Array();
b = clone(a);
a[0][0] = 3;

trace (a[0][0]);
trace (b[0][0]);

问题解决。

[ 本帖最后由 donynam 于 22-5-2007 06:28 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 22-5-2007 10:01 PM | 显示全部楼层
原帖由 donynam 于 22-5-2007 04:08 PM 发表


这是flash的设计。如果要复制其实非常简单,写一个array clone的function就可以了。对于object 好像有一个可以复制 object 的function。

为了解决此问题特别设计了一个clone function

   function cl ...




沒錯, 這就是我要說的, 看來也只有donynam了解問題點, 我就把我之前的貼出來吧 ^^
回复

使用道具 举报

发表于 25-5-2007 06:37 PM | 显示全部楼层
哈哈。。看来是因为这里很多人没有pointer 的基础了。。。
回复

使用道具 举报

发表于 28-5-2007 11:12 AM | 显示全部楼层
原帖由 tensaix2j 于 25-5-2007 06:37 PM 发表
哈哈。。看来是因为这里很多人没有pointer 的基础了。。。


新一代的语言都倾向于使用referece,例如java。其实actionscript 也是使用reference的概念。懂得pointer最好,不懂也无所谓。举个例子,以前某些语言常用的goto #,现在就算不能理解也无伤大雅。
回复

使用道具 举报

DUNFORGET 该用户已被删除
发表于 15-6-2007 11:04 PM | 显示全部楼层

回复 #4 super-tomato 的帖子

donynam is right.

the whole 'problem' is bcoz the tempArray is pointing to myArray. So by design it shall follows the value of myArray..
回复

使用道具 举报

 楼主| 发表于 16-6-2007 07:10 AM | 显示全部楼层
看來很多新手還不了解到真正的意義

1. 為何只有Array會出現pointer的情況, 而一般的data type卻不會?
2. 如果是遇到這類問題, 在沒解決答案下你該怎麼最有效的解決, 而不是大家都附議著說(完全看到大馬人學習的態度).
3. 然而也沒多少個新手在學習時學會怎麼思考, 只一味著教是這樣只要記得就好, 那麼這就不能算你了解, 而是你會用罷了.
回复

使用道具 举报

DUNFORGET 该用户已被删除
发表于 16-6-2007 03:05 PM | 显示全部楼层
原帖由 super-tomato 于 16-6-2007 07:10 AM 发表
看來很多新手還不了解到真正的意義

1. 為何只有Array會出現pointer的情況, 而一般的data type卻不會?
2. 如果是遇到這類問題, 在沒解決答案下你該怎麼最有效的解決, 而不是大家都附議著說(完全看到大馬人學 ...




新手是指我吗?

1. Array本身就是pointer的一种特别形式,当然要继承pointer的属性!一般的data type如int,double等假如没有defined成pointer的话当然不会有pointer的特性阿。

int a*, b*; //normal pointer
int x[10],y[10]; //array
a=&b;
x=y;
这里的等于都是把address抄过去。不是内容。


int m,n;
m=n;
这里的等于是把内容抄过去。
回复

使用道具 举报

发表于 16-6-2007 06:39 PM | 显示全部楼层
原帖由 DUNFORGET 于 15-6-2007 11:04 PM 发表
donynam is right.

the whole 'problem' is bcoz the tempArray is pointing to myArray. So by design it shall follows the value of myArray..




By The Way 請用中文發帖,謝謝。
回复

使用道具 举报


ADVERTISEMENT

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 26-9-2025 02:40 PM , Processed in 0.150964 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表