看板 Ruby 關於我們 聯絡資訊
環境: 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)
AIGecko:剛剛又有這問題... @buffer=Array.new(20) 12/22 14:13
AIGecko:用RARRAY_LEN(buffer)得到10...用funcall沒問題... 12/22 14:14
godfat:亂猜:因為有一些特殊的最佳化手法,取得長度的方式比較複雜 12/22 22:32
AIGecko:最佳化指的像是 gcc的 -O3選項嗎 剛剛去掉依舊無效... 12/29 23:38
AIGecko:突然發現 對固定位子的陣列取大小是可以的(實體變數) 12/29 23:42
AIGecko:但是只要對那個一維的某元素取陣列就會出問題 12/29 23:42
godfat:不是,是指 ruby 自己節省記憶體的手法,類似 union 01/03 18:27