読者です 読者をやめる 読者になる 読者になる

HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

最近作ったバグ

年度末の納期の山に追われて、年始以来更新してなかったこのブログですが、最近、我ながら間抜けなバグを2つほど作ってネタができたので、恥を晒しに来ました。

派生クラスのコンストラクタがもらった引数を基底クラスの引数付きコンストラクタに渡すには?


答えは簡単で、「初期化子リストで基底クラスのコンストラクタを呼べばOK」です。

そんなことは、ぐぐればすぐに分かる話なんですが、とあるサイトに書かれていた

derived(arg-list) : base(arg-list) {
statements...
}

っていう説明を見て、こんなコードを書いてました。

class derieved : public base{
public:
derieved(int hoge) : base(int hoge)
{
なんか
};
};

私が参考にしたページの作者さんの記述は、最初のarg-listが仮引数で2回目の(基底クラスのコンストラクタに渡してる方)のarg-listは実引数だったわけですが、同じ文字列だったから、何も考えずにコピペしちゃったわけですねorz



当然ながら、コンパイルが通らないんですが、g++のメッセージがまた意味不明で

error: expected primary-expression before ‘int’

とか言われるわけです。

しばらく悩んだけど、エラーメッセージをぐぐったらstack overflowのスレッドに(これとは全然違う内容で)

「このエラー何ぞ?」
「そりゃ実装部分に宣言用の書式で書いてるからだよ!」

みたいなやりとりを見つけてようやく気付きました・・・orz


vectorにpush_back

3要素の一時配列として、std::vectorを使おうとしたんですが、何を思ったのかこんなコードを書いてました。

std::vector hoge(3);
hoge.push_back(foo);

で、続けて

MPI_Reduce(&hoge[0], 3, Num, MPI_DOUBLE, MPI_MAX, 0, comm);

って感じで通信すると、なぜか0しかでてこなくて悩んでました。
正解はもちろん、push_backではなくて

hoge[0]=foo

だったんですが、こっちは1時間くらい悩んでました。

でもgdbで見てみたら一目瞭然

(gdb) print hoge
$10 = std::vector of length 6, capacity 6 = {0, 0, 0, 25.264120817184448, 7.1123518943786621, -0.99984097480773926}

vectorだと値以外の情報も出してくれるんですね。
こりゃ便利だなぁ


しかし、C++に慣れてくるとその後に来るF77*1*2の案件が辛い・・・orz

*1:77ならまだマシな方という意見も良く聞く

*2:とりあえずf90の書式で書いときながら廃止予定事項をフルに使うのは止めて・・・