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


でんでん  2002-11-23 20:55:17  No: 76456

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


魔界の仮面弁士  2002-11-24 03:08:12  No: 76457

私自身は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)
のように書く事になるでしょう。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加