ROOT/エラーと警告
警告
- duplication definition?
$ root -l root [0] .x plot.C root [1] .x plot.C Warning: template pair duplicate definition /home/koba/cern/root_v5.32.04/lib/root/cint/cint/stl/_pair.h:31: Warning: template reverse_iterator duplicate definition /home/koba/cern/root_v5.32.04/lib/root/cint/cint/stl/_iterator.h:269: Warning: template vector duplicate definition /home/koba/cern/root_v5.32.04/lib/root/cint/cint/stl/_vector.h:44: root [2]
以下のマクロ (plot.C) をコンパイルしないで 2 回以上実行すると表示される警告。ROOT version 5.32/04 on Scientific Linux 6.4 (64 bit).
#include <vector> void plot(){ int i; }
- なんで?
segmentation violation
- ポインタのポインタを使ったとき
ポインタ配列をクラスのメンバー変数として宣言し、二重ポインタにポインタ配列のポインタを代入して [][] でアクセスすると segmentaion violation となる。ただし、ACLiC でコンパイルせずにインタープリターモード(?)で実行する場合に発生。例えば、以下のマクロは arr2[0][0] を評価するところで segmentation violation となる。
#include <iostream> class TestClass { public: TestClass(){ arr1[0] = new Double_t[66]; Double_t **arr2 = arr1; arr1[0][0]= 123.; std::cout << "arr1[0][0]: " << arr1[0][0] <<std::endl; std::cout << "arr2[0][0]: " << arr2[0][0] <<std::endl; } ~TestClass(){ delete[] arr1[0]; } private: Double_t* arr1[1]; }; void double_pointer_segv() { TestClass ts; }
- arr1 と arr1[0] の中身をプリントしてみると同じアドレスが入っている。本当ならば、arr1[0] の アドレスが arr1 に入っていなければならない。しかし、インタープリターモードで arr1 を評価すると、arr1[0] に代入されているアドレスを返すようだ?対処としては、以下のいずれかのような変更をする。
Double_t **arr2 = arr1; を Double_t **arr2 = &(arr1[0]); に変更
- arr1 をメンバ変数にしない(例えばコンストラクタ内で宣言)
- ACLiC でコンパイルして実行