2014年12月06日

FreePascal の大きな配列

 オーツは、PASCAL でプログラムを書いています。
 そして、半年ほど前に、DOS 時代から愛用してきた Turbo Pascal を止めて、FreePascal に移行したのでした。
2014.6.9 http://o-tsu.seesaa.net/article/399031100.html
 さて、最近、ちょっと大きなデータを扱うために、大きな配列を使いたくなりました。
 FreePascal では、一体どれくらいまで大きい配列が使えるのでしょうか。

program test;
const mm=500000000;
var ar:array[1..mm] of integer;
begin
 writeln('mm=',mm); ar[mm]:=123; writeln('ar[mm]=',ar[mm]);
end.

 こんなプログラムを書いて、mm の値を変えながら、実験してみました。整数(integer)型の配列は、950,000,000 個まで確保できました。しかし、1,000,000,000 個確保しようとするとエラーになりました。990,000,000 個指定してみると、パソコンがフリーズしました。いやはや、怖いものです。
 次に、integer 型が本当に2バイトで確保されているのかという問題があります。(もしかして4バイトで確保されているのかも知れません。)そこで、上記の integer 型のところを char 型にしてみました。代入するところで 'A' を代入すればいいわけです。
 すると、1,500,000,000 個の配列は確保できましたが、2,000,000,000 個を指定するとエラーになりました。
 char 型は1バイトですので、integer 型は2バイトで確保されていることがわかります。
 同時に、数値としての「1,000,000,000」が配列の要素数の上限ではないことも確認できました。
 また、longint 型でも試してみました。450,000,000 個の配列は確保できましたが、500,000,000 個の配列ははエラーになりました。longint 型は4バイトを使うことが確認できました。
 オーツが使っているパソコンは、(デスクトップの「コンピュータ」を右クリックして)プロパティを見ると、実装メモリが 4GB で、そのうち 3.54GB が使用可能だそうです。メインメモリをもっと大きくすれば、たぶん、もっと大きな配列が確保できるのでしょう。しかし、今回のプログラムでは、そこまでして大きな配列は使いません。だいたい、現状で、メモリを2GBくらい使うようになると、プログラムが大きすぎることになるようです。このようなことがわかれば、十分実用的にプログラム作成ができます。
posted by オーツ at 04:08| Comment(0) | TrackBack(0) | パソコンとIT | このブログの読者になる | 更新情報をチェックする