先日にTurboDelphi for Win32 Professional版を手に入れてちょっとあるソフトを開発している。
当サイトの構築が遅れているのもそれが原因ではあるが、なかなかはかどらなくて…
Delphiは結構前から無償配布されているバージョン6のPersonal版で弄ってはいるのだが、
以前はひたすらBASICばかりやっていた自分は構造化プログラミングの知識不足もあり、
まっとうなプログラムを書けるようになったのはつい最近のことだ。
今回は「配列の引数」についての考察がある。
型に非常に厳しいDelphiでは一般的に配列を関数の引数や戻り値に設定する場合は、
Cと違って「配列型」のようなものを作るのが一般的だ。
具体的には以下のように定義したりする。
type
TIntArray = array of Integer;
これは整数型の配列である「整数配列型」を定義している例。
こうすると配列であることを意識しないでやりとりが出来る。
戻り値に動的配列を使うには必要不可欠のテクニック。
しかし、大型の配列をそのままやり取りするのはナンセンス。
そこでCと同じくポインタも使えるのだが、これまた同様に「配列のポインタ型」を定義してやらねばならない。
上記で定義したTIntArray
のポインタを使いたいときは以下のように定義する。
type
PIntArray = ^TIntArray;
TIntArray = array of Integer;
これで自由な配列型のやりとりが出来るようになる。
ここで関数内で引数の配列を直接操作する場合だが、
Cでは参照という機能は搭載されていないので普通にポインタを渡してやるのが一般的。
DelphiではC++と同じく参照が使える。
procedure ExampleFunc(var IntArray: TIntArray);
var
をつけることで「値パラメータ」ではなく「変数パラメータ」となる。
なのだが、最近Cばかりに触っていたせいかすっかりこいつの存在を忘れていた。
おかげでこんなことバンバンやっていた…
function ExampleFunc(SrcInt: Integer): PIntArray;
とか、参照っぽく
procedure ExampleFunc(SrcInt: Integer; DstIntArray: PIntArray);
一個目はNew
手続きで領域を確保して、そのポインタを返してやるのだが、
当然放っておけばそれは解放されずに残ってしまう。
いちいちDispose
を利用しなければならない。
2個目は呼び出し元で宣言した変数のポインタを受け取って操作するCと似たやり方。
スコープを抜ければ自動で解放はされるが、らしくない。
やっぱりここは
procedure ExampleFunc(SrcInt: Integer; var DstIntArray: TIntArray);
とやるべき。
前者のやり方で書いてしまったソースがたくさんある。
一気に書き直すか…
コメント