新しく発言する  EXIT  インデックスへ

構造体、レコード型でのバイナリファイルへ...


  構造体、レコード型でのバイナリファイルへのアクセス 山中和義 2008/02/29 20:42:14  (修正1回)
  つづき 山中和義 2008/02/29 20:42:55  (修正1回)
   └つづき(構造体、レコード型サポート関連) 山中和義 2008/02/29 20:44:04  (修正2回)
Re: つづき  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/02/29 20:44:04 ** この記事は2回修正されてます
つづき(構造体、レコード型サポート関連)


!構造体、レコード型サポート関連

EXTERNAL FUNCTION CVI(s$,p,m) !文字列に埋め込まれたm*8ビット符号付き整数を取り出す
OPTION CHARACTER byte
LET n=0
FOR i=1 TO m
LET n=n+256^(i-1)*ORD(s$(p+i:p+i))
NEXT i
IF n<2^(m*8-1) THEN LET CVI=n ELSE LET CVI=n-2^(m*8)
END FUNCTION
EXTERNAL FUNCTION CVI2(s$,p,m) !文字列に埋め込まれたm*8ビット符号なし整数を取り出す
OPTION CHARACTER byte
LET n=0
FOR i=1 TO m
LET n=n+256^(i-1)*ORD(s$(p+i:p+i))
NEXT i
LET CVI2=n
END FUNCTION

EXTERNAL FUNCTION MKI$(n,m) !m*8ビット整数nを文字列変数に埋め込む
OPTION CHARACTER byte
LET r=MOD(n,256) !2^8
LET s$=CHR$(r)
FOR i=1 TO m-1
LET n=(n-r)/256
LET r=MOD(n,256)
LET s$=s$ & CHR$(r)
NEXT i
LET MKI$=s$
END FUNCTION


EXTERNAL FUNCTION StructDim$(strct$) !文字列を構造体として定義する
LET StructDim$=REPEAT$(CHR$(0),SizeOf(strct$,""))
END FUNCTION

EXTERNAL FUNCTION SizeOf(strct$,mem$) !メンバ変数の大きさを得る
SELECT CASE UCASE$(strct$)
CASE "BYTE" !数値型
LET SizeOf=1 !バイト数
CASE "INTEGER","WORD"
LET SizeOf=2
CASE "LONG","DWORD"
LET SizeOf=4

CASE ELSE
IF UCASE$(strct$(1:7))="STRING*" THEN !文字型 String*?
LET SizeOf=VAL(strct$(8:LEN(strct$)))

ELSE !構造体、レコード型
CALL StructDef(strct$,mem$, ofst,sz)
IF mem$="" THEN LET SizeOf=ofst ELSE LET SizeOf=sz !メンバ変数名がなければ構造体の大きさ

END IF
END SELECT
END FUNCTION

EXTERNAL FUNCTION OffsetOf(strct$,mem$) !メンバ変数の位置を得る
OPTION CHARACTER byte
CALL StructDef(strct$,mem$, ofst,sz)
LET OffsetOf=ofst
END FUNCTION

EXTERNAL FUNCTION GetValOf(s$,strct$,mem$) !メンバ変数の値を得る
OPTION CHARACTER byte
CALL StructDef(strct$,mem$, ofst,sz)
LET GetValOf=CVI(s$,ofst,sz)
END FUNCTION
EXTERNAL FUNCTION GetValOf2(s$,strct$,mem$)
OPTION CHARACTER byte
CALL StructDef(strct$,mem$, ofst,sz)
LET GetValOf2=CVI2(s$,ofst,sz)
END FUNCTION

EXTERNAL FUNCTION GetValOf$(s$,strct$,mem$) !メンバ変数の値を得る(文字型)
OPTION CHARACTER byte
CALL StructDef(strct$,mem$, ofst,sz)
LET GetValOf$=s$(ofst+1:ofst+sz)
END FUNCTION

EXTERNAL SUB SetValOf(s$,strct$,mem$, v) !メンバ変数の値を設定する
OPTION CHARACTER byte
CALL StructDef(strct$,mem$, ofst,sz)
LET s$(ofst+1:ofst+sz)=MKI$(v,sz)
END SUB

EXTERNAL SUB StructAdd(strct$,mem$, ofst) !親の構造体の位置を得る
CALL StructDef(strct$,mem$, ofst1,sz)
LET ofst=ofst+ofst1
END SUB
    └つづき(構造体定義部分) 山中和義 2008/02/29 20:46:12  (修正1回)
     └つづき 山中和義 2008/02/29 20:49:03  (修正1回)
      ├ネストする構造体の場合(親子関係) 山中和義 2008/03/03 13:19:43  (修正2回)
      └SUBStructDefの構造 山中和義 2008/03/04 10:48:06  (修正1回)

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。