見出し画像

プログラミング言語で変わる配列の書き方

 プログラミング言語によって配列の書き方は違います。ある言語で書いたプログラムを別の言語にコピーして動くようにすることをポーティングといいますが、このポーティングの際に記法が違うと文字列を一括で置換できないことが多く、この違いにたまにイラっとすることがあります。まあすぐに慣れるのでいいのですが。たとえば、CやC++の二次元配列は、

double temperature [47][12];

と書きます。doubleは小数を扱う変数という意味です。C# では

double[,] temperature = new double[47, 12];

VBAでは、

Dim temperature(47, 12) As Double

Pythonでは

temperature = [[0 for i in range(12)] for j in range(47)]

などと書きます。このように配列の範囲を決めたり決めなかったりしますが、指定した範囲をうっかり超えた場合はどうなるでしょうか。下記のint a[10]; では、aは0から9の10個の整数の配列を宣言していますが、a[10]に数値を代入したり、それを参照したりするのはエラーです。やってはいけません。怖いもの見たさでやってみると、プログラミング環境によっては、丁寧に「範囲超えとるやんけ」と怒ってくれるものもあれば、何事もなかったようにやり過ごすものもあります。

int a[10];
a[10] = 99;
print(a[10]);

この例をVisual Studioで試したところ、代入した通り99でした。コンピュータ(コンパイラ)側が、いろいろ安全策を取ってくれているのですが、宣言した領域を超えるのは危険です。バグはいつも境界や隅っこに潜んでいます。
 じゃあ余裕を持ってa[100000]とかにすればいいでしょうか? これは根本的な解決ではありません。また、そうしないように細心の注意を払えなどという精神論は無意味です。プログラマーに言ってはいけません。範囲を超えたら例外処理をするようなフェイルセーフを設けるようにしましょう。自分を含めて誰も信じてはいけません。

4. 隅にいるバグ


この記事が気に入ったらサポートをしてみませんか?