作者AIGecko (壁虎貓耳控)
看板Ruby
標題[問題] RARRAY_LEN取得錯誤長度
時間Sat Dec 22 12:53:08 2012
環境: 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
原因不明...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.122.198.212
※ 編輯: AIGecko 來自: 140.122.198.212 (12/22 12:53)
1F:→ AIGecko:剛剛又有這問題... @buffer=Array.new(20) 12/22 14:13
2F:→ AIGecko:用RARRAY_LEN(buffer)得到10...用funcall沒問題... 12/22 14:14
3F:→ godfat:亂猜:因為有一些特殊的最佳化手法,取得長度的方式比較複雜 12/22 22:32
4F:→ AIGecko:最佳化指的像是 gcc的 -O3選項嗎 剛剛去掉依舊無效... 12/29 23:38
5F:→ AIGecko:突然發現 對固定位子的陣列取大小是可以的(實體變數) 12/29 23:42
6F:→ AIGecko:但是只要對那個一維的某元素取陣列就會出問題 12/29 23:42
7F:→ godfat:不是,是指 ruby 自己節省記憶體的手法,類似 union 01/03 18:27