[問題] RARRAY_LEN取得錯誤長度

作者: AIGecko (師大貓耳控)   2012-12-22 12:53:08
環境: Ruby 1.9.3p194 MinGW32 4.7.1
狀況:
打算在C擴充中取得陣列的長度
底下是程式碼:
VALUE ary=rb_iv_get(self,"@ary");
int size=FIX2INT(RARRAY_LEN(ary));
那個ary裡面是[
[#<SDL::Surface:0x106e0d8>, 96, -96, 1],
[#<SDL::Surface:0x106e0a8>, 0, 0, 10]]
也就兩個陣列 裡面裝了圖片 還有xyz三個數字
不過得到的長度卻是 1
並不是2...
後來改成呼叫函式
rb_funcall(ary,rb_intern("size"),0)
得到的結果是正確的 2
照理說RARRAY_LEN應該和ary.length等價不是嗎?
另外有測:
VALUE ary=rb_ary_new();
rb_ary_push(ary,self);//其實放什麼都沒差別...
printf("test0 %d",FIX2INT(RARRAY_LEN(ary)));
rb_ary_push(ary,rb_ary_new());
printf("test1 %d",FIX2INT(RARRAY_LEN(ary)));
得到的結果是 test0 0test1 1
原因不明...
作者: godfat (godfat 真常)   2011-01-03 18:27:00
不是,是指 ruby 自己節省記憶體的手法,類似 union
作者: AIGecko (師大貓耳控)   2012-02-22 14:13:00
剛剛又有這問題... @buffer=Array.new(20)用RARRAY_LEN(buffer)得到10...用funcall沒問題...
作者: godfat (godfat 真常)   2012-02-22 22:32:00
亂猜:因為有一些特殊的最佳化手法,取得長度的方式比較複雜
作者: AIGecko (師大貓耳控)   2012-02-29 23:38:00
最佳化指的像是 gcc的 -O3選項嗎 剛剛去掉依舊無效...突然發現 對固定位子的陣列取大小是可以的(實體變數)但是只要對那個一維的某元素取陣列就會出問題

Links booklink

Contact Us: admin [ a t ] ucptt.com