ページ 1 / 1
コンストラクタでのグローバル変数の書き換え
Posted: 2005年7月20日(水) 18:22
by 真紅
コード: 全て選択
Dim a As Long
Class test
Public
Sub test()
a = 1
End Sub
End Class
Dim obj[1] As *test
obj[a] = New test()
debug
オブジェクトポインタの配列で配列番号にaという変数を使用しています。
aの内容が0の状態で obj[a] = New test() などとして、testクラスのコンストラクタでaの内容を書き換えると、代入されるオブジェクトポインタの配列番号はコンストラクタで書き換えられた方が使われてしまいます。
これは仕様でしょうか?バグでしょうか?
Posted: 2005年7月20日(水) 20:42
by 山本
それは仕様です。大抵のプログラミング言語では、下記のような演算順序が採用されていることと思います。ABも、その順序に従う形になります。
右辺値を演算。結果をレジスタまたはスタックに保有
↓
左辺値である変数のアドレスを取得。このタイミングで配列要素の演算が行われる
↓
取得したアドレスに保有中の演算結果を書き込む
結局のところ、ここらへんの細かい仕様は、言語によって様々な場合があるので、絶妙なタイミングで変化するグローバル変数を参照するようなコードは避けることをお勧めします。
仕様ですか
Posted: 2005年7月20日(水) 22:39
by 真紅
わかりやすい説明有難うございます。
結構自分は長いこと勘違いしてました。
普通に関数で同じことをやってみても同じことになりますね。
オブジェクトを生成するたびに次の配列番号を変更していくようにしたかったのですが、コンストラクタでなくても普通に生成後に処理すればよかっただけなんですよね…。
とにかく有難うございました。