Locked History Actions

ROOT/エラーと警告

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 でコンパイルして実行