1-dimensional arrays/ja

From Free Pascal wiki
Jump to: navigation, search

English (en) français (fr) 日本語 (ja) 中文(中国大陆)‎ (zh_CN)

5C - 1次元配列 (著者: Tao Yue, 状態: 原文のまま変更なし)

5000個の整数を読み込み、何か処理をしたいと考えてみよう。それらの整数をどう保存しておけばよいだろうか?

次のように5000個の変数を使うかもしれない。

aa, ab, ac, ad, ... aaa, aab, ... aba, ...

しかし、これは煩雑になる(これらの変数を宣言した後で、変数それぞれに値を読み込まなくてはならない)。

配列は同じタイプの保存スペースを含んでいる。それぞれの保存スペースは添え字付きの配列名で参照できる。定義は次のようになる。

type
  typename = array [列挙型] of データ型;

データ型は何でもよく、別な配列でもよい。どんな列挙型も問題ない。カッコ内に列挙型、あるいは事前に定義した列挙型を指定できる。例えば、次のようになる。

type
  enum_type = 1..50;
  arraytype = array [enum_type] of integer;

上の例は以下の例と同じである。

type
  arraytype = array [1..50] of integer;

余談: これは実際、文字列が内部的に処理されているやり方、すなわち配列として処理されている方法である。現代の Pascal コンパイラが文字列のネイティブなサポートを加える前は、プログラマーは以下のように宣言し、さらに文字列の最後を示すある種の終端文字を用いて自ら文字列を処理しなくてはならなかった。

type
  String = packed array [0..255] of char;

大抵の場合、終端文字はヌル・キャラクター (序数 0, あるいは ord(0))であった。packed という指定子はその配列が、最小のメモリーを占めるよう圧縮されることを意味している。

文字列を表すキャラクターの配列はしばしばバッファと呼ばれ、C や C++ のプログラミング言語でそれらを扱う際のエラーはバッファー・オーバーランにつながることもある。バッファ・オーバーランは、たとえば200キャラクタの文字を150の長さの配列に入れようとするときに生じる。もし、バッファを超えたメモリが上書きされ、もし、そのメモリにもとは実行コードが含まれていたなら、攻撃者は任意のコードをシステムに挿入しようとするかもしれない。これはインターネット上で数日間猛威を振るった有名なスラマー・ウォーム(Slammer worm)の原因にもなった。Pascal でそれをやって、何が起きるか試してみよう。

配列はプログラムで後から利用するために大きなデータを保存しておきたい場合には有用である。特にループではうまく働く。なぜならインデックスが添え字として利用できるからである。50個の数を読むためには、以下の定義のようになる。

type
  arraytype = array[1..50] of integer;
 
var
  myarray : arraytype;

以下のようにすればよい。

for count := 1 to 50 do
  read (myarray[count]);

四角カッコの [ ] は配列の場合には添え字を囲む。

myarray[5] := 6;
previous contents next