[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:000780] Re: NumArray とComplex



小塚です。

> nmkmf.rbに関しては完全にこちらのミスです。申し訳ありません。
> 修正したのを
> http://www.kurasc.kyoto-u.ac.jp/radar-group/members/kawanabe/numarray.html
> に置きました。最新版をダウンロードし用いて下さい。
ComplexとNumArray両方新しい物をダウンロードして試してみました。
インストール先については問題なくなりました。が、
DLDFLAGS = -Wl,-soname,$(.TARGET) -L$(exec_prefix)/lib

DESTDIR =
exec_prefix = $(DESTDIR)$(prefix)
のため、まだ-lrubyのリンク2失敗します。
Makefileのどこにもprefixの定義は見当たりませんでした。

とりあえず、-L/usr/local/libに書き換えてmake installしました。

> > 後、Complex絡みの話なのですが
> > %ruby -e ' require "complex"; require "numarray"; NumArray.new(Complex,8,6,4)'
> > -e:1:in `new': non supported class(first argument must be a class name)
(ArgumentError)
> >         from -e:1
> > となってしまいます。

> これは、神代さんがおっしゃっていた通り
>  %ruby -e ' require "num/complex"; require "num/numarray";
> として下さい
これは関係ないと思います。

説明が足りませんでした。
%ruby -e ' require "complex"; require "numarray"; '
にしていたのはextconf.rbを
require'nmkmf'からrequire 'mkmf'
に書き換えた結果、complex.so numarray.soがsite_ruby/1.6/i386-freebsd/以下に
インストールされてしまっていたため、そうしていたのです。

%ruby -e 'require "num/complex"; require "num/numarray"; \
NumArray.new(NumComplex,8,6,4)'
-e:1:in `new': non supported class(first argument must be a class name) (ArgumentError)

numarray.cのna_new_mainに

VALUE
na_new_main(int argc, VALUE *argv, VALUE mod)
{
.....
    else if(klass ==  cComplex) return na_comp_new(argc, argv);
.....
}
という部分がありますが、
このcComplexの値がcomplex.soをロードしても初期化されていないようなのです。
超古典的な方法で恐縮ですが、

printf("rb_cInteger:%x\ncComplex:%x\n", rb_cInteger, cComplex);

というコードをna_new_mainに入れて実行してみると
rb_cInteger:8077afc
cComplex:0
という値が出力されました。0じゃダメですよね?

前回のメールで書いたのと同様の修正をcomplex.hとcomplex.cにしたら
rb_cInteger:8077afc
cComplex:806f424
になって、エラーが出なくなりました。

でも他の環境では問題ないんですよね。うーん.....

あと、complexライブラリのクラス名がComplexからNumComplexに変わったんですね。
最初、
-e:1: uninitialized constant Complex (NameError)
となって少し戸惑いました。

京都大学 法学部 2回生 小塚真啓
KOZUKA Masahiro (j00y1210@xxxxxx)