掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
配列変数の参照でエラーが出たり出なかったりするのはなぜか? (ID:40836)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
えーと、[0,10] がエラーにならなくて [10,0] はエラーということでいいんですよね? エラーというのは、Delphiが出す範囲チェックエラー(ERangeError)? それともメモリアクセス違反でしょうか? コンパイラの設定で「実行時エラー」の「範囲チェック」を有効にしておけば、どちらのケースでもERangeErrorが生成されるはずです。 範囲チェックしておらず、メモリアクセス違反が出るときと出ないときがあるとしたら「たまたま」でしょう。 範囲外の領域にアクセスした時、そこが運よく触っても大丈夫な場所だったか、そうでなかったかという違いです。 一般論としては、2次元の配列というのは多くの場合、メモリ上では一次元の連続した領域になっています。 (0,0)-(0,1)-(0,2)-(0,3)-...-(0,9)-(1,0)-(1,1)-...-(9,7)-(9,8)-(9,9) といった具合です。 仮に配列の要素がこのように配置されていた場合、(0,10)に対応するアドレスを計算すると一次元領域の11番目、つまり(1,0)と同じ場所になります。 たまたま有効なメモリアドレスなので、正常にアクセスできるわけです。 一方、(10,0)に対応するアドレスは101番目となり、有効なアドレスの範囲外になってしまいます。 実際、動的配列の場合に上の理屈が当てはまるかどうかはわかりませんが。(ちなみに私の環境ではどちらもメモリアクセス違反になりました)
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.