1

この質問を正しく表現する方法がわかりませんが、これが私がやろうとしていることです。

次のコマンドでcernROOTを使用して、単一のヒストグラムをプロットできます。

(TH1F*)electron->Draw();

しかし、electron1、elecron2、electron3など、シーケンスで名前が付けられた数十のヒストグラムがあり、それらすべてをプロットするための単純なループを作成したいと思います。sprintfと単純なforループを使用してみましたが、ROOTはそれを好みません。

char name[20];
(TH1F*)electron->Draw();
for(int j=0;j<5;j++){
            sprintf(name, "%s%d","electron",j);
            (TH1F*)name->Draw("same");
 }

私は何が間違っているのですか?

前もって感謝します。

4

2 に答える 2

3

追加の手順が 1 つ必要です。@twalberg が言うように、オブジェクト ポインタではなく、文字列があります。root でできることは、コードを変更して、1 行追加するだけです。

char name[20];
electron->Draw();
for(int j=0;j<5;j++){
   sprintf(name, "%s%d","electron",j);
   TH1F *h = (TH1F*)gDirectory->Get(name); // THIS IS THE MISSING LINE
   if ( h ) h->Draw("same"); // make sure the Get succeeded 
 }

余分な行は、ローカル TDirectory から名前で参照されるオブジェクトを取得します。gDirectory が適切な種類のオブジェクトにキャストされるように、キャストが必要です。

root をインタラクティブに使用すると、これは舞台裏で魔法のように起こります。

于 2012-10-19T20:52:27.853 に答える
2

「electron0」という文字列を作成し、文字列char *の先頭へのポインタを aにキャストしTH1F *、文字列が実際に a struct TH1F *(またはclass TH1F *) であるかのように逆参照すると、プログラムがクラッシュする可能性が高く、同じではありません。という名前の変数を参照するようにelectron0

electron0おそらく、変数の束にelectron1、 などの名前を付けるのではなく、 のように配列を作成し、 、 などTH1F electron[NELECTRONS];としてそれらを参照するのが最善の策です(または、オブジェクトが動的に割り当てられている場合は、 を使用してポインター (それらを参照するための適切な間接参照 (または) を使用)。electron[0]electron[1]TH1F *electron[NELECTRONS];*(electron[0]).Draw(...)electron[0]->Draw(...)

于 2012-10-04T19:17:56.973 に答える