dl$B$G%a%b%j%j!<%/$J$I(B

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

  1. 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

Masaya TARUI wrote:

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

e$B$4Js9p5Z$S=$@5$K46<U$7$^$9!#e(B
e$B$^$@=$@5J,$r$-$A$s$H8+$F$$$J$$$N$G!";d$N<j85$G$be(B
e$BF0:n$r3NG’$7$F?tF|Fb$K$O<h$j9~$_$?$$$H;W$$$^$9!#e(B

e$B$?$k$$$G$9!#e(B

e$B$4Js9p5Z$S=$@5$K46<U$7$^$9!#e(B
e$B$^$@=$@5J,$r$-$A$s$H8+$F$$$J$$$N$G!";d$N<j85$G$be(B
e$BF0:n$r3NG’$7$F?tF|Fb$K$O<h$j9~$_$?$$$H;W$$$^$9!#e(B

Takaaki T. [email protected]

e$B$h$m$7$/$*4j$$$$$?$7$^$9!#e(B

e$B8e$G%a!<%k$rFI$JV$7$F$$F2?$r$4j$$$7$?$$$N$+6qBNE$K=q$$$F$J$$;v$K5$e(B
e$B$E$$$F>/$7CQ$:$+$7$$;W$$$r$7$F$$$^$7$?$,!“$o$j$HCWL?E*$J%P%0$@$H;W$&$Ne(B
e$B$Ge(Bruby1.8e$B$KBP$7$F=$@5$r$7$FM_$7$$!#!u$3$A$i$G=$@5$7$F$_$?$N$G@^3Q$J$Ne(B
e$B$G;29M$K$J$l$P$H$$$&$3$H$Ge(BDiffe$B$rE:IU$7$^$9$H8@$&;v$G$7$?!#e(B
e$B0U$r5b$s$G$$$?$@$-$”$j$,$H$&$4$6$$$^$9!#e(B

e$B$G!"F0:n$N3NG’$H$$$&$3$H$G$3$A$i$G$be(Bdl2e$B$HHf3S$r$7$F$$$?$N$G$9$,!"e(B
dl2e$B$N$[$&$Ne(BStructe$B$Ne(BAligne$B$b>/$7$*$+$7$$$h$&$G$9!#e(B
VC++e$B$He(Bgcc3.4e$B$+$i$N7k2L$G;EMM$KEv$?$C$?$o$1$G$O$J$$$N$G$9$,!“0J2<$h$&$Je(B
e$B0c$$$,$”$j$^$7$?!#e(B

e$B%a%s%P$,G[Ns$N;~$Oe(BALIGN_MAP[TYPE_VOIDP]e$B$G%“%i%$%s$5$l$k$h$&$K$J$C$F$^e(B
e$B$9$,!”$3$l$OG[Ns$N%?%$%We(B(ty[0])e$B$G%"%i%$%a%s%H$r<h$k$N$,@5$7$$$+$H;W$$e(B
e$B$^$9!#$^$?!“e(BStructe$B$N%5%$%:$G:G8e$K$be(BALIGN_MAP[TYPE_VOIDP]e$B$r;H$C$Fe(B(void
*)e$B$Ne(BAligne$B$NG?t$K$J$k$h$&$K$7$F$$$^$9$,!”$3$l$Oe(BStruce$BFb$N%a%s%P$Ne(BAlign
e$B$N:GBgCM$r;H$&$N$,@5$7$$$h$&$G$9!#e(B

e$B0J>e!"$9$$^$;$s$,$3$A$i$b3NG’$7$F$$F$$$?$@$1$^$9$+!)e(B
e$B$h$m$7$/$*4j$$$$$?$7$^$9!#e(B