fortran EQUIVALENCEをvbに移植するには?


でんでん  2002-11-23 11:55:17  No: 76456  IP: [192.*.*.*]

研究の中でfortranからvbのコンバートを手作業でしてたのですが,どうもEQUIVALENCEだけ良くわかりません。internet文献をみても
ポインタ的使いかたらしいのは分かるのですが,vbのポインタはできるだけ使いたくなく,困惑しております。
例:fortranでEQUIVALENCE (NT(1),J),(NT(2),K)と宣言した場合
    For I = 1 To 4
       J = NT(I)
    next
ではどないな風にコーディングすればいいのでしょうか?

編集 削除
魔界の仮面弁士  2002-11-23 18:08:12  No: 76457  IP: [192.*.*.*]

私自身はFortranを知らないのですが、EQUIVALENCEについて調べてみると、
「複数の変数に同一アドレスを共有させるための定義。FORTRANでは
  実数と整数の変数を共有させて、型変換なしに(ビットパターンの
  変更なしに)データを割りつけたい時などに使用される。」
という解説をしているページを見つけました。

う〜ん。この解説の通りだとすると、該当するようなVBの
命令はありませんね。(CならUNIONやポインタで置き換えられそうですが)


> vbのポインタはできるだけ使いたくなく,困惑しております。
まぁ基本的に、VBにはポインタという考え方はありませんし。


> EQUIVALENCE (NT(1),J),(NT(2),K)
えぇと。配列NT()の1番目の要素を変数Jと共有し、
2番目の要素をKと共有する、ということでしょうか?

単純にデータ型の変換だけが目的であれば、ユーザー定義型に
送ってからLSetステートメントで変換するとか、もしくはいったん
バイナリファイルとしてPut#してから、あらためて別の変数で
Get#するなどすれば変換できます。
(あるいは、RtlMoveMemory APIでメモリイメージを転写するか)

データを変換させるというよりも、変数を共有させるのが目的の場合……
たとえば、NT(1)を変更するとJも変更されるようにしたいとか……ならば、
変数部をプロシージャかオブジェクトとしてカプセル化するようにすれば
一応は実現できます。(頗るまわりくどいコードになりますけれどね)

>    For I = 1 To 4
>       J = NT(I)
>    next
これは単純に、「J=NT(4)」と同じ結果になってしまいますよ。
なぜなら上記を展開すると、
  J=NT(1)
  J=NT(2)
  J=NT(3)
  J=NT(4)
という意味になるからです。結局、最後の値しか得られないわけです。
たとえば、「NT(1)をJにいれて、NT(2)をKに入れる」なら、
Forループでは処理できませんから、
  J = NT(1)
  K = NT(2)
のように書く事になるでしょう。

編集 削除