作者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