e$B$O$8$a$^$7$F!"$?$k$$$H$$$$$^$9!#e(B
e$B$$$D$be(BRubye$B$r;H$o$;$F$b$i$C$F$$$^$9!#$3$N$h$&$J%=%U%H%&%’%"$r@$$K=P$7$Fe(B
e$B$$$?$@$$$-!"$^$D$b$H;a$r;O$a!"3’MM$K46<U!#e(B
e$BFC$Ke(Bruby/dle$B$Oe(Bwindowse$B$Ne(BAPIe$B$r?($k$N$KM-8z3hMQ$5$;$F$b$i$C$F$$$^$9!#e(B
e$B:#2s$Oe(Bdle$B$r;H$C$F$$$F%a%b%j%j!<%/$G%"%W%j%1!<%7%g%s$,Mn$A$F$7$^$C$?0Y$Ke(B
e$BEj9F$7$^$9!#$^$?$=$N;~%=!<%9$r8+$F$$$Fe(BAligne$B$N<h$jJ}$K%P%0$,$"$j9=B$BNe(B
e$B$K$h$C$F$O%G!<%?$,@5$7$/07$($J$$$N$K5$$E$$$?$N$G$=$l$b!#e(B
e$BF0:n%A%’%C%/$r$7$?4D6-$O0J2<$K$J$j$^$9!#e(B
ruby 1.8.4 (2005-12-24) [i386-mswin32]
e$B$J$*!"$3$l$i$Oe(Bruby1.9.0e$B$Ne(Bdl2e$B$G$OLdBj$"$j$^$;$s$G$7$?!#e(B
1.e$B%a%b%j%j!<%/e(B
require ‘dl’
require ‘dl/import’
require ‘dl/struct’
extend DL::Importable
size=100000
S = struct [ “char i[#{size}]” ]
a=S.malloc
data=" " *(size-1)
loop { a.i = data }
e$B$G$+$J$jAa$$%?%$%_%s%0$G%a%b%j3NJ]$,=PMh$J$/$J$jMn$A$^$9!#e(B
ary2carye$B$N@h$Ge(Bxmalloce$B$G:n6HNN0h$r3NJ]$7$F3+J|$7$F$$$J$$$N$,860x$G$9!#e(B
e$B$H$j$"$($:!"0J2<$GLdBj$O$J$/$J$j$^$7$?!#e(B
(e$B$3$l$,@5$7$$:nK!$+$O$o$+$j$^$;$s$,e(B)
— ptr.c.orig 2003-10-22 23:29:20.000000000 +0900
+++ ptr.c 2006-05-22 23:00:19.000000000 +0900
@@ -912,4 +912,5 @@
memimg = ary2cary(data->stype[i], val, &memsize);
memcpy((char *)data->ptr + offset, memimg, memsize);
-
dlfree(memimg); return val; }
@@ -982,4 +983,5 @@
memimg = ary2cary(data->stype[i], val, NULL);
memcpy(data->ptr, memimg, memsize);
-
}dlfree(memimg); }
---------------------------------------------e$B$3$3$^$Ge(B
- align
require ‘dl’
require ‘dl/import’
require ‘dl/struct’
extend DL::Importable
S= struct [
“char c1”,
“int i1”,
“char c2”,
“int i2”,
]
a=S.malloc
puts a.to_ptr.to_s(a.size).unpack(“C*”).map{|c| “%02x” % c}.join(",")
a.i1=0x11121314
a.i2=0x21222324
puts a.to_ptr.to_s(a.size).unpack(“C*”).map{|c| “%02x” % c}.join(",")
a.c1=0xf1
a.c2=0xf2
puts a.to_ptr.to_s(a.size).unpack(“C*”).map{|c| “%02x” % c}.join(",")
e$B9=B$BN$KCM$r$$$l$J$,$i!"9=B$BN$N<B:]$N%G!<%?G[CV$r=PNO$7$F$$$^$9!#e(B
e$B4|BT=PNO$H$7$F$O!"e(B
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
00,00,00,00,14,13,12,11,00,00,00,00,24,23,22,21
f1,00,00,00,14,13,12,11,f2,00,00,00,24,23,22,21
e$B$G$9$,<B:]$Oe(B
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
00,00,00,00,14,13,12,11,24,23,22,21,00,00,00,00
f1,00,00,00,14,f2,12,11,24,23,22,21,00,00,00,00
e$B$H$J$j8m$C$?G[CV$I$3$m$+>e=q$-$7$F$7$^$C$F$$$^$9!#e(B
e$B%"%i%$%a%s%H$r<h$k%k!<%A%s$,9=B$BN$N%a%s%PL>H=Dj$NCf$KF~$C$F$7$^$C$F$e(B
e$B$j!"$^$H$b$K<B9T$5$l$F$$$J$$$N$,860x$G$9!#0J2<!">l=j$rF~$lBX$($Fe(BIndent
e$B$7$J$$7$?$@$1$G$9!#e(B
— ptr.c~ 2006-05-22 23:00:19.000000000 +0900
+++ ptr.c 2006-05-22 23:19:23.000000000 +0900
@@ -754,30 +754,30 @@
case DLPTR_CTYPE_STRUCT:
for (i=0; i < data->ids_num; i++) {
-
switch (data->stype[i]) {
-
case 'I':
-
DLALIGN(data->ptr,offset,INT_ALIGN);
-
break;
-
case 'L':
-
DLALIGN(data->ptr,offset,LONG_ALIGN);
-
break;
-
case 'P':
-
case 'S':
-
DLALIGN(data->ptr,offset,VOIDP_ALIGN);
-
break;
-
case 'F':
-
DLALIGN(data->ptr,offset,FLOAT_ALIGN);
-
break;
-
case 'D':
-
DLALIGN(data->ptr,offset,DOUBLE_ALIGN);
-
break;
-
case 'C':
-
break;
-
case 'H':
-
DLALIGN(data->ptr,offset,SHORT_ALIGN);
-
break;
-
default:
-
rb_raise(rb_eDLTypeError, "unsupported type '%c'",
data->stype[i]);
-
} if (data->ids[i] == id) {
-
switch (data->stype[i]) {
-
case 'I':
-
DLALIGN(data->ptr,offset,INT_ALIGN);
-
break;
-
case 'L':
-
DLALIGN(data->ptr,offset,LONG_ALIGN);
-
break;
-
case 'P':
-
case 'S':
-
DLALIGN(data->ptr,offset,VOIDP_ALIGN);
-
break;
-
case 'F':
-
DLALIGN(data->ptr,offset,FLOAT_ALIGN);
-
break;
-
case 'D':
-
DLALIGN(data->ptr,offset,DOUBLE_ALIGN);
-
break;
-
case 'C':
-
break;
-
case 'H':
-
DLALIGN(data->ptr,offset,SHORT_ALIGN);
-
break;
-
default:
-
rb_raise(rb_eDLTypeError, "unsupported type '%c'",
data->stype[i]);
-
} return cary2ary((char *)data->ptr + offset, data->stype[i],
data->ssize[i]);
}
@@ -884,30 +884,30 @@
offset = 0;
for (i=0; i < data->ids_num; i++) {
-
switch (data->stype[i]) {
-
case 'I':
-
DLALIGN(data->ptr,offset,INT_ALIGN);
-
break;
-
case 'L':
-
DLALIGN(data->ptr,offset,LONG_ALIGN);
-
break;
-
case 'P':
-
case 'S':
-
DLALIGN(data->ptr,offset,VOIDP_ALIGN);
-
break;
-
case 'D':
-
DLALIGN(data->ptr,offset,DOUBLE_ALIGN);
-
break;
-
case 'F':
-
DLALIGN(data->ptr,offset,FLOAT_ALIGN);
-
break;
-
case 'C':
-
break;
-
case 'H':
-
DLALIGN(data->ptr,offset,SHORT_ALIGN);
-
break;
-
default:
-
rb_raise(rb_eDLTypeError, "unsupported type '%c'",
data->stype[i]);
-
} if (data->ids[i] == id) {
-
switch (data->stype[i]) {
-
case 'I':
-
DLALIGN(data->ptr,offset,INT_ALIGN);
-
break;
-
case 'L':
-
DLALIGN(data->ptr,offset,LONG_ALIGN);
-
break;
-
case 'P':
-
case 'S':
-
DLALIGN(data->ptr,offset,VOIDP_ALIGN);
-
break;
-
case 'D':
-
DLALIGN(data->ptr,offset,DOUBLE_ALIGN);
-
break;
-
case 'F':
-
DLALIGN(data->ptr,offset,FLOAT_ALIGN);
-
break;
-
case 'C':
-
break;
-
case 'H':
-
DLALIGN(data->ptr,offset,SHORT_ALIGN);
-
break;
-
default:
-
rb_raise(rb_eDLTypeError, "unsupported type '%c'",
data->stype[i]);
-
} memimg = ary2cary(data->stype[i], val, &memsize); memcpy((char *)data->ptr + offset, memimg, memsize);
---------------------------------------------e$B$3$3$^$Ge(B
e$B0J>ee(B