AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CAD作ろ! 静的配列と動的配列
作図した線等のデータはコンピュータのメモリ内に保管し、各種処理をされ、ディスクへの保存等をします。前章までのサンプルでは、普通の配列変数に入れました。しかし、普通の配列変数だと、
@配列の最大サイズが固定化される
例えば、○:array[1..100] of Integer; だと、最大サイズは100までと固定化され、プログラム実行中に変更する事は出来ない。
Aあまり大きいサイズの配列は作れない<旧バージョン>
以前のバージョンでは、余り大きいサイズの配列変数を作る事は出来ませんでした。
B最大サイズ分のメモリが確保される
Windowsシステムは、コンピュータに搭載されているメモリを一杯一杯使うと、ハードディスクを利用しようとします。すると速度は落ちてしまいます。Windowsを動かすのにメモリを消費し、いろんなアプリケーションプログラムや常駐プログラムを実行するとその分、メモリを使用します。メモリを効果的に使うには、必要な分だけを確保し、なるべくメモリを節約するようなプログラミングを行う必要があります。メモリを大量消費するようなプログラムは、特に Windows95/98/Meの場合、不安定な動作を起こすケースもあります。
 
CADデータは、とかくメモリを使用する場合が多いです。余り神経質になる必要もありませんが、なるべくメモリは節約したいです。例えば、開始点X,Y・終了点X,Yを持つ線1本で8バイト×4=32バイト必要だとして、線10,000本で 320000バイト(≒320KB)となりますが、必要もないのに 線1,000,000本分の領域を確保すると、32000000バイト(≒32000KB≒32MB)のメモリを必要とします。一見大した量でないように見えても、Windowsや常駐プログラム、他アプリケーションでもメモリは使用しています。この32MBによってメモリを使い切り、ハードディスクが動く事になってくると、CAD操作も重く感じるようになるやもしれません。
 
では、どうするかというと、配列変数を、必要な分だけメモリ確保して使いましょう、というのが、動的配列です。動的配列のメリットとしては、
@配列の「最大サイズ」が事実上、無い
プログラム実行中に配列の最大サイズを変更する事が出来ます。
Aメモリを有効活用出来る
必要な分のメモリを確保して、不要であればメモリを解放し、少ないメモリでも、うまく使う事によってメモリを有効活用する事が出来ます。
B以前の動的メモリ確保〜解放よりもプログラミングが容易
動的配列は Delphi4から利用出来ますが、それまでの Delphi3.1以前では、ポインタを経由した動的メモリ確保&解放をせねばなりませんでした。それに比較すると、動的配列の操作は、より簡単になっています。
 
がありますが、静的配列よりも多少、処理の手続きは必要となってきます。
 
では実際はどうするのか、といえば、静的配列の場合は、最初の変数宣言で、
var
 A : array[1..100] of Integer;
とすれば、A[1]〜A[100]が使えるようになりますが、動的配列の場合は、まず変数宣言で、
var
 A : array of Integer;
のように添え字の指定をしないようにして、利用する前に、
SetLength(A,100);
のようにして、使う分だけを確保します。これにより、A[0]〜A[99]が使えるようになります。添え字は「0」から「100個分確保」という意味になりますので注意して下さい。
そして、配列変数を使い終わった後は、必ず、
A := nil;
と行います。これで、動的配列 A の解放を行います。これをしないと、メモリ・リーク(メモリを解放しないままどんどん使用してコンピュータが不安定動作してしまうこと)の原因となりますので、絶対に、忘れないで下さい。
 
最大100として確保するのではなく、1つずつ増やしていく場合には、まず、配列変数の最大値を管理する変数を用意します。仮に、配列 A の最大なので、A_MAX とします。プログラムの最初の初期化で、「A_MAX := 0;」としておきます。
配列変数に値を入れる時に、
Inc(A_MAX);
SetLength(A,A_MAX);
のようにします。こうしておき、例えば、配列変数の全ての値を見たい時には、
for i:=0 to A_MAX-1 do begin
 // A[i] の操作
end;
等のようにします。
SetLengthは、SetLength(A,1)→SetLength(A,2)→SetLength(A,3)→・・・と1つずつ増やして行く操作が出来ます。これは、まるで、
A:array[0..0] of Integer;
    ↓  A[0]を使用
A:array[0..1] of Integer;
    ↓  A[0]の値はそのまま利用可 A[1]を使用
A:array[0..2] of Integer;
    ↓  A[0],A[1]の値はそのまま利用可 A[2]を使用
   ・・・
のような処理をしているかのような感じで、プログラミング出来る訳です。この間それぞれ、A[0]、A[1] の値は保証されます。
 
勿論、添え字を減らす事も出来ます。例えば、
Dec(A_MAX);
SetLength(A,A_MAX);
のように1つずつ減らしたり、
A_MAX := A_MAX - 5;
SetLength(A,A_MAX);
のように一気に5つ減らす等(A_MAXが5以上である事)も可能です。但し、0にする=配列Aを使わない という場合には、
A := nil;
として、配列A を解放して下さい。
 
 
それでは、動的配列に変更したプログラムです。
サンプルプログラムのソース
なお、データの配列変数の宣言やレコード定義は、別ユニットで行うようにしてみました。
 
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
 ▲PREV
 ▼NEXT
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.