[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:000145] Re: reading binary files
沼口です.
 > ちなみに, 今のパッケージでは電脳ライブラリのどこの辺りまで使えるんでしょ
 > うか?  grph1 だけ?
今のパッケージでは grph1 だけです.
dcl のソースにも mksrc.rb をかければ,
grph2 なども使えると思います.
% mksrc.rb $DCLDIR/src/grph2/*/*.f > grph2.c
など..
ただし,まだ ***get がうまくいっていないようです.
***get は
   lclip=nil   # 宣言代わりの初期化が必要
   Dcl.sglget('lclip', lclip)     
とするより,
   lclip = Dcl.sglget('lclip')
としたほうがいいでしょうね.
同様に,たとえば sgqwnd は,
  uxmin, uxmax, uymin, uymax = Dcl.sgqwnd()
でしょうか.
ところで,添付の例では簡単すぎて,FloatArray のインタフェースが
わからないと思います.sgpk03 の例をつけます.
      x = FloatArray.new(N) 
にご注目ください.これで,
      Dcl.sgplu(N, x, y)                  
などと使えますし,ruby から通常の Array のようにアクセスできます.
------------------------------------------------
#!/usr/local/bin/ruby 
require "mcarray"
require "mcdcl"
#     program sgpk03
      N=41
      x = FloatArray.new(N)
      y = FloatArray.new(N)
      dt = 4.0* 3.14159 / (N-1)
      for i in 0...N
        y[i] = Math.sin(dt*i)*0.15
        x[i] = 1.0*i/(N-1)
      end
      Dcl.sgopn(1)
#----------------------------- page 1 ---------------------------------
      Dcl.sgfrm
      Dcl.sgswnd( 0.0,  1.0, -0.8, 0.2)
      Dcl.sgsvpt( 0.15, 0.85, 0.1, 0.9)
      Dcl.sgstrn(1)
      Dcl.sgstrf
      Dcl.slpvpr(1)
      Dcl.sgplu(N, x, y)                   # <-- 1本目
      Dcl.sgswnd( 0.0,  1.0, -0.7, 0.3)
      Dcl.sgstrf
      Dcl.sgspli(2)                        # <-- line index 設定
      Dcl.sgplu(N, x, y)                   # <-- 2本目
      Dcl.sgswnd( 0.0,  1.0, -0.6, 0.4)
      Dcl.sgstrf
      Dcl.sgspli(3)                        # <-- line index 設定
      Dcl.sgplu(N, x, y)                   # <-- 3本目
      Dcl.sgswnd( 0.0,  1.0, -0.4, 0.6)
      Dcl.sgstrf
      Dcl.sgsplt(2)                        # <-- line type 設定 (破線)
      Dcl.sgplu(N, x, y)                   # <-- 4本目
      Dcl.sgswnd( 0.0,  1.0, -0.3, 0.7)
      Dcl.sgstrf
      Dcl.sgsplt(3)                        # <-- line type 設定 (点線)
      Dcl.sgplu(N, x, y)                   # <-- 5本目
      Dcl.sgswnd( 0.0,  1.0, -0.2, 0.8)
      Dcl.sgstrf
      Dcl.sgsplt(4)                        # <-- line type 設定 (一点鎖線)
      Dcl.sgplu(N, x, y)                   # <-- 6本目
#----------------------------- page 2 ---------------------------------
      Dcl.sgfrm
      Dcl.sgswnd( 0.0,  1.0, -0.8, 0.2)
      Dcl.sgsvpt( 0.15, 0.85, 0.1, 0.9)
      Dcl.sgstrn(1)
      Dcl.sgstrf
      Dcl.slpvpr(1)
      Dcl.sgrset('bitlen', 0.006)          # <-- サイクル長の変更
      Dcl.sgsplt(4)
      Dcl.sgplu(N, x, y)                   # <-- 1本目
      Dcl.sgswnd( 0.0,  1.0, -0.6, 0.4)
      Dcl.sgstrf
      Dcl.sgspli(2)
      itype, = ['1111111100100100'].pack("B*").unpack("s")
      Dcl.sgsplt(itype)                    # <-- パターン設定
      Dcl.sgplu(N, x, y)                   # <-- 2本目
      Dcl.sgswnd( 0.0,  1.0, -0.4, 0.6)
      Dcl.sgstrf
      Dcl.sgiset('nbits', 32)
      itype, = ['10010010011111000111110001111100'].pack("B*").unpack("i")
      Dcl.sgsplt(itype)
      Dcl.sgplu(N, x, y)
      Dcl.sgswnd( 0.0,  1.0, -0.2, 0.8)
      Dcl.sgstrf
      Dcl.sgspli(1)
      Dcl.sgsplt(1)
      n1=N/4-1
      y[n1-1] = 999.0                        # <-- 欠損値
      y[n1  ] = 999.0
      y[n1+1] = 999.0
      n2=(n1+1)*3-1
      y[n2-1] = 999.0
      y[n2+1] = 999.0
###   Dcl.gllset('lmiss',true)             # not implimented yet, sorry!!
      Dcl.sgplu(N, x, y)                   # <-- 4本目
      Dcl.sgcls