[問題] RARRAY_LEN取得錯誤長度

看板Ruby作者 (壁虎貓耳控)時間12年前 (2012/12/22 12:53), 編輯推噓0(007)
留言7則, 2人參與, 最新討論串1/1
環境: 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)

12/22 14:13, , 1F
剛剛又有這問題... @buffer=Array.new(20)
12/22 14:13, 1F

12/22 14:14, , 2F
用RARRAY_LEN(buffer)得到10...用funcall沒問題...
12/22 14:14, 2F

12/22 22:32, , 3F
亂猜:因為有一些特殊的最佳化手法,取得長度的方式比較複雜
12/22 22:32, 3F

12/29 23:38, , 4F
最佳化指的像是 gcc的 -O3選項嗎 剛剛去掉依舊無效...
12/29 23:38, 4F

12/29 23:42, , 5F
突然發現 對固定位子的陣列取大小是可以的(實體變數)
12/29 23:42, 5F

12/29 23:42, , 6F
但是只要對那個一維的某元素取陣列就會出問題
12/29 23:42, 6F

01/03 18:27, , 7F
不是,是指 ruby 自己節省記憶體的手法,類似 union
01/03 18:27, 7F
文章代碼(AID): #1GrJos8n (Ruby)
文章代碼(AID): #1GrJos8n (Ruby)