喫茶XRAYトップページ

[スレッド全体
]

[12218] アクセス違反と配列の範囲外操作返信 削除
2018/8/31 (金) 20:36:37 Mr.XRAY
以下の記事を追加しました.

[ メモリアクセス違反の例外と配列の範囲外操作 ]
http://mrxray.on.coocan.jp/Delphi/Others/ArrayRangeCheck.htm


[12220] Re:アクセス違反と配列の範囲外操作返信 削除
2018/9/1 (土) 08:15:35 KONNOYA
▼ Mr.XRAYさん
お見事です。非常に判りやすい記事でした^^
やはりコード中に実値で書くのではなく、High(上限値)とLow(下限値)でループを回した方が確実ですね。

普通の配列でも定義文とループ文でそれぞれに実値を書いていて、
サイズの変更があった場合、それぞれの箇所を修正しなければならず、
複雑なプログラムだと必ずヒューマンエラーが発生します。

領域外をアクセスして今まで平気だったとか、そういうバグが一番たちが悪く、
つまり、自分が意図しない動作が発生してしまうのは誰もが避けたいですよね。

余談ですが、デスクトップコンパイラのString型のインデックスは1発進ですが、
モバイルコンパイラは0発進になっています。
この点からもMr.XRAY様の記事の様にHighとLowを使うべきかと。

・インデックスが 0 から始まる文字列(Delphi)
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%8C_0_%E3%81%8B%E3%82%89%E5%A7%8B%E3%81%BE%E3%82%8B%E6%96%87%E5%AD%97%E5%88%97%EF%BC%88Delphi%EF%BC%89

【検証用コード】
var
  Test : String;
begin
  Test := 'ABCDEF';
  Self.Caption := System.Low( Test ).ToString + ' - ' + System.High( Test ).ToString;
end;



[12221] Re2:アクセス違反と配列の範囲外操作返信 削除
2018/9/1 (土) 11:51:06 Mr.XRAY
▼ KONNOYAさん

> この点からもMr.XRAY様の記事の様にHighとLowを使うべきかと。

今回書いた記事で実際に必要なのはこの部分だけですね.ハッキリ言って.
私のような人間にとっては,
EXE の中身がどうであろうと,例外が発生する仕組みが何であろうと関係ないです.
「勝てば官軍,動けば正義」です.ハイ.

簡単に済む内容でも「難しく」理屈っぽい記事になってしまうのは,
私のどーもならん性格でしょうね (笑)


> ・インデックスが 0 から始まる文字列(Delphi)
> http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%8C_0_%E3%81%8B%E3%82%89%E5%A7%8B%E3%81%BE%E3%82%8B%E6%96%87%E5%AD%97%E5%88%97%EF%BC%88Delphi%EF%BC%89


そう言えばそんなのがありました.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82