佐藤といいます. Windows でコンパイルという話ではなく, 申し訳ありませんが > RAAにある、あ伊藤氏作の多次元配列を実装する拡張ライブラリを > 利用したいのですが、Win環境でコンパイルする環境がありません。 先日, ruby 1.4.2 (1999-09-18) [i686-linux] な環境でコンパイル しようとしたのですが, うまくいきませんでした. どういうふうに 修正するのがいいのかよくわからなかったので, とりあえず添付の パッチのように修正して, $ gcc -c -I/usr/local/lib/ruby/1.4/i686-linux/ mdarray.c $ gcc -shared -L/usr/local/lib -o mdarray.so mdarray.o とコンパイルしたものを使ってます. 1.4 正式対応版みたいなのがありましたら, お教え下さい. -- さとうまさひろ / 佐藤正博 m / sa.to or msato / iis.u-tokyo.ac.jp --- mdarray.c.orig Fri Oct 15 16:09:36 1999 +++ mdarray.c Fri Oct 15 16:42:28 1999 @@ -34,7 +34,7 @@ { int i; for (i = 0; i < d->total; i++) - gc_mark(d->ptr[i]); + rb_gc_mark(d->ptr[i]); } static void @@ -61,7 +61,7 @@ ary->dimension = dim; ary->total = total_size; ary->ptr = ALLOC_N(VALUE,total_size); - memclear(ary->ptr,total_size); + rb_mem_clear(ary->ptr,total_size); return ary; } @@ -173,7 +173,7 @@ int dim,i; if (argc == 0) - Fail("argument mismatch"); + rb_raise(rb_eArgError, "argument mismatch"); if (TYPE(argv[0]) == T_ARRAY) { return mda_to_mdarray(argv[0]); } @@ -193,12 +193,12 @@ int pos = 0; int i; if (argc != self->dimension) { - Fail("dimension mismatch"); + rb_raise(rb_eArgError, "dimension mismatch"); } for (i = 0; i < argc; i++) { int idx = argv[i]; if (idx < 0 || self->size[i] <= idx) - Fail("Subsctipt out of range"); + rb_raise(rb_eArgError, "Subsctipt out of range"); pos = pos*self->size[i]+idx; } return pos; @@ -211,12 +211,12 @@ int pos = 0; int i; if (argc != self->dimension) { - Fail("dimension mismatch"); + rb_raise(rb_eArgError, "dimension mismatch"); } for (i = 0; i < argc; i++) { int idx = NUM2INT(argv[i]); if (idx < 0 || self->size[i] <= idx) - Fail("Subsctipt out of range"); + rb_raise(rb_eArgError, "Subsctipt out of range"); pos = pos*self->size[i]+idx; } return pos; @@ -258,7 +258,7 @@ sizes = ALLOCA_N(VALUE,myself->dimension); for (i = 0; i < myself->dimension; i++) sizes[i] = INT2FIX(myself->size[i]); - return ary_new4(myself->dimension,sizes); + return rb_ary_new4(myself->dimension,sizes); } /* method: dimension() -- returns the dimension of the array */ @@ -295,10 +295,10 @@ GetMDA(obj,myself); dim = myself->dimension; size = ALLOCA_N(int,dim); - vsize = RARRAY(ary_new2(dim)); + vsize = RARRAY(rb_ary_new2(dim)); for (i = 0; i < dim; i++) { size[i] = 0; - ary_store(vsize,i,INT2FIX(0)); + rb_ary_store(vsize,i,INT2FIX(0)); } while (size[0] < myself->size[0]) { rb_yield(vsize); @@ -308,12 +308,12 @@ size[i]++; if (size[i] >= myself->size[i] && i > 0) { loop = 1; - ary_store(vsize,i,INT2FIX(0)); + rb_ary_store(vsize,i,INT2FIX(0)); size[i] = 0; i--; } else { - ary_store(vsize,i,INT2FIX(size[i])); + rb_ary_store(vsize,i,INT2FIX(size[i])); } } while (loop); } @@ -344,12 +344,12 @@ dim2 = NUM2INT(argv[1]); if (dim1 < 0 || dim <= dim1 || dim2 < 0 || dim <= dim2) - Fail("MDArray#transpose: illegal dimension spec"); + rb_raise(rb_eArgError, "MDArray#transpose: illegal dimension spec"); if (dim1 == dim2) - Fail("MDArray#transpose: two dimensions are identical"); + rb_raise(rb_eArgError, "MDArray#transpose: two dimensions are identical"); } else - Fail("MDArray#transpose: argument number mismatch"); + rb_raise(rb_eArgError, "MDArray#transpose: argument number mismatch"); newsize = ALLOCA_N(int,dim); idx = ALLOCA_N(int,dim); @@ -395,7 +395,7 @@ int pos; struct RArray *ary; - ary = (struct RArray*)ary_new2(mda->size[thisdim]); + ary = (struct RArray*)rb_ary_new2(mda->size[thisdim]); ary->len = mda->size[thisdim]; if (thisdim == mda->dimension-1) { for (i = 0; i < mda->size[thisdim]; i++) { @@ -431,7 +431,7 @@ Init_mdarray() { /* define MDArray class */ - cMDArray = rb_define_class("MDArray",cObject); + cMDArray = rb_define_class("MDArray",rb_cObject); /* class methods */ rb_define_singleton_method(cMDArray,"new",mda_new,-1);