查看: 1240|回复: 15
|
修正陣列復制的問題
[复制链接]
|
|
該帖已被刪除....
[ 本帖最后由 super-tomato 于 16-6-2007 07:20 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 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);
是这样解决吗?
呵呵, 不是
你可以測試第一帖的例子, 然後再和之前的帖的例子比較看看 |
|
|
|
|
|
|
|
发表于 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的環境下編寫 |
|
|
|
|
|
|
|
发表于 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 #,现在就算不能理解也无伤大雅。 |
|
|
|
|
|
|
|
发表于 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. 然而也沒多少個新手在學習時學會怎麼思考, 只一味著教是這樣只要記得就好, 那麼這就不能算你了解, 而是你會用罷了. |
|
|
|
|
|
|
|
发表于 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 請用中文發帖,謝謝。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|