assertモジュールを使うことで、プログラムのクラッシュを回避できます。
配列の範囲外エラーは、致命的なものになる場合がありますので、以下のようにassert文を利用すれば、セルフチェックとして働きます。
#include <iostream>
#include <assert.h>
const int NUM = 5; // 配列の要素数
int datas[NUM] = {1, 2, 3, 4, 5};
int main() {
int index = 10;
// assert文でindexが配列サイズの範囲か確認
assert(index < static_cast<int>((sizeof(datas)/sizeof(datas[0]))));
assert(index >= 0);
std::cout << datas[index] << "\n";
return(0);
}
上記コードでは・・・
assert(index < NUM);
assert(index >= 0);
の部分で、index(指定したインデックス)がNUM(配列サイズ)の範囲内にあることを確認しています。
このプログラムの場合、indexが範囲外ですので、assert文がエラーメッセージを返し、プログラムは中断されます。
sizeof演算子は、変数のサイズをバイトで返します。
「sizeof(datas)/sizeof(datas[0])」とすることで、「配列全体のバイト÷配列要素一つのバイト」を計算し、配列の要素数を計算できます。
実行結果。
Assertion failed: index < static_cast((sizeof(datas)/sizeof(datas[0]))), file .\assert.cpp, line 8
プログラムは、assert文に差し掛かったところで、エラーを返し中断します。
■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/184