# 本人は適当にやってても,表にだすと「使いたい」という人がいるのだなあ
# ということを実感する今日この頃 :-)


In message <19991115125507Z.takashi / oishi.info.waseda.ac.jp>
g96p0935 / mse.waseda.ac.jp writes:

>  #!/usr/bin/ruby
>  require 'qfloat'
>  a="0.1".to_qfloat.display

なんか,うちでは動いちゃいます.... と思ったけど,スクリプトにすると

    ruby in free(): warning: junk pointer, too high to make sense.

なんてメッセージが出ますね.... このメッセージ以外は問題なく動いてます
けど.....って,`require "qfloat"' の段階でもう出てるわこれ.なんだろ.
少なくともあんまり健全な状態ではないような気がする.require だけでも落
ちるのならきっとこの辺をつつくと良いのだろう....

どうも Data_Wrap_Struct の使い方か,rb_define_const に自動変数を渡して
いるのが悪いのか.... Data_Wrap_Struct らしい.もしかしてグローバル変数
をラップしてはいけない? ....とりあえずこちらの方は下のパッチで直るはず
です.

# テストを irb でやってたので気づかなかった.っていうか,なんで irb で
# はでない?


それ以外だとすると,to_s あたりが怪しいかと.Object#display は
IO#wrte(obj) に還元されて,IO#write は obj.to_s を出力する.... ように
見えるので.あまり根拠なく決めた MAXQLEN の値を,たとえば倍にしてみた
りしたらどうでしょうか? 本当は NDEC あたりでいいようにも見えるんです
が....

# うちの i386-freebsd3.1 なシステムで,WORDSIZE == 32,NQ == 14 な
# qfloat を使ってる分には多少怪しくも大丈夫のようなんです.


> あと、qfloat の入手先はちゃんと書いておくべきでしょう。
> 僕は
> http://www.netlib.org/cephes/qfloat.shar
> から入手しました。

ついめんどうくさがって,ちゃんと確かめるのをさぼってしまいました.どう
せすぐ見付かるしと思ってしまいまして.


-- 
柳川和久 @ 東大阪市 . 大阪府                              November 15, 1999
アリオッチ,アリオッチ,血と魂を御身に捧ぐ!

Index: ruby-qfloat.c =================================================================== RCS file: /home/kjana/CVS/qfloat-ruby/ruby-qfloat.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 ruby-qfloat.c --- ruby-qfloat.c 1999/11/05 17:28:52 1.1.1.1 +++ ruby-qfloat.c 1999/11/15 12:36:54 @@ -20,7 +20,7 @@ extern QELT qpi[]; extern QELT qeul[]; -QELT qinf[NQ], qninf[NQ]; +QELT *pi, *eul, *inf, *ninf; /* @@ -67,14 +67,14 @@ GetQval(self, q); - if (qcmp(q, qinf) == 0) + if (qcmp(q, inf) == 0) { strcpy(RSTRING(res)->ptr, "INF"); return res; } - if (qcmp(q, qninf) == 0) + if (qcmp(q, ninf) == 0) { strcpy(RSTRING(res)->ptr, "NINF"); @@ -958,18 +958,25 @@ rb_define_global_function("Qfloat", rb_f_qfloat, 1); /* class constants */ - PI = Data_Wrap_Struct(rb_cQfloat, 0, free, qpi); - E = Data_Wrap_Struct(rb_cQfloat, 0, free, qeul); + pi = ALLOC_N(QELT, NQ); + eul = ALLOC_N(QELT, NQ); + inf = ALLOC_N(QELT, NQ); + ninf = ALLOC_N(QELT, NQ); + + qmov(qpi, pi); + PI = Data_Wrap_Struct(rb_cQfloat, 0, free, pi); + qmov(qeul, eul); + E = Data_Wrap_Struct(rb_cQfloat, 0, free, eul); tmp = 1; - ltoq(&tmp, qinf); - qinfin(qinf); - INF = Data_Wrap_Struct(rb_cQfloat, 0, free, qinf); + ltoq(&tmp, inf); + qinfin(inf); + INF = Data_Wrap_Struct(rb_cQfloat, 0, free, inf); tmp = -1; - ltoq(&tmp, qninf); - qinfin(qninf); - NINF = Data_Wrap_Struct(rb_cQfloat, 0, free, qninf); + ltoq(&tmp, ninf); + qinfin(ninf); + NINF = Data_Wrap_Struct(rb_cQfloat, 0, free, ninf); rb_define_const(rb_cQfloat, "PI", PI); rb_define_const(rb_cQfloat, "E", E);