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