2008年3月11日火曜日

異なるサイズのvalarrayの代入

C++でプログラムを書いていたときに valarray にハマった. それは, サイズの異なる valarray を代入しようとした際に起こった. 始め, 下のソースの(1)みたいにただ単に代入しただけだったのだが, そうすると, GNU C++ 3.4で試したところ, 実行結果が代入前と後で変わらなかった.
01: #include <valarray>
02: #include <iostream>
03:
04: using namespace std;
05:
06: int main(void){
07: // 初期化
08: valarray<int> a(1), b(2);
09: cout << "before: " << a.size() << endl;
10:
11: // (1) 間違い
12: a = b;
13: cout << "after1: " << a.size() << endl;
14:
15: // (2) 正解
16: a.resize(b.size());
17: a = b;
18: cout << "after2: " << a.size() << endl;
19:
20: return 0;
21: }
インクルードファイルを見てみると, サイズの異なる valarray の代入は動作未定義とあって凹む. 今回の場合は(2)のように, 代入する前に valarray のサイズを揃える必要があるらしい. 思い込みとは恐ろしいものだ.

0 件のコメント: