assert文で配列要素の範囲外エラーを防ぐ

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

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文に差し掛かったところで、エラーを返し中断します。


日時: 2008年06月02日 21:03
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/184

この記事にトラックバックされる方は、参照先が分かるようにするために、「assert文で配列要素の範囲外エラーを防ぐ」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - C言語とC++勉強ルーム