掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
SetLengthで不可解なエラー (ID:49303)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
動的配列にSetLengthをする場合、サイズにより成功する場合と失敗する場合があります。 Unit3, Unit4からなるプロジェクトです。 Unit3ではFormを作成しています。Unit4ではFormは用いていません。 配列は、自作Class内でRecord型の二次元配列を定義しています。 実行時、配列サイズを取得して定義するのですが、あるサイズ以上でSetLengthすると例外クラス$C0000005(Access Violation)のエラーになります。普通、配列でAccess Violationの場合、配列の範囲外を参照してしまった場合などが多いですが、今回は配列の作成時なので範囲外と言う以前の様に思います。 または、指定されたサイズを確保するはずのアドレスが不正な場所だった? 但し、同じプログラムの同じ動的配列で、正常にSetLength出来る場合があります。 動的配列は、Unit4で定義していて、Unit3内のプログラム中でサイズを設定しています。 Unit3で実装直後では、サイズに制限なくSetLength出来るのですが、Unit3で関数として呼び出した後に、Unit4内の関数実装部でSetLengthを実行すると二次元目のサイズを8より大きく設定すると、Access Violationになります。 Unit3 vvvvvvvvvvvvvvvvvvv implement uses Unit4; procedure TForm3.Button1Click(sender: TObject); begin mapmtx1 := TMAPMTX.Create(); SetLength( mapmtx1.MEM.MTX, 100, 100 ); // ここではサイズよらず成功 mapmtx1.create_mtx( 100, 100 ); // 代わりに関数内でSetLengthするとエラー end; ^^^^^^^^^^^^^^^^^^^ Unit4 vvvvvvvvvvvvvvvvvvv Interface type RMAP = Record den : Word; od : Single; disp : Byte; End; type RMTX = Record sizX: Word; sizY: Word; MTX : Array of Array of RMAP; End; type TMAPMTX : Class str : String; MEM : RMTX; private public procedure create_mtx(); End; var mapmtx1 : TMAPMTX; implement procedure TMAPMTX.create_mtx( x, y : Word ); begin SetLength( MEM.MTX, x, y ); // ここでサイズによりエラー end; ^^^^^^^^^^^^^^^^^^^ 抜粋の為、分かり難いかも知れません。 SetLengthするUnitによって配列サイズに制限がかかると思思えません。 配列の定義やSetLengthの使い方の様に思えますが、原因が分かりません。 以前はこの配列の定義やSetLengthの使い方で問題無かったと思うのですが、比べても違い或いは間違いを見つけられません。 よろしくお願い致します。 環境は、XE6でVCLプロジェクトです。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.