[问题] 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