我不确定如何正确地表达这个问题,但这正是我想要做的。
可以使用cern ROOT使用以下命令
绘制单个直方图(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");
}
我做错了什么?
提前致谢。
答案 0 :(得分:3)
您还需要一个额外的步骤。正如@twalberg所说,你有一个字符串,而不是一个对象指针。对于root,你可以做的只是更改代码,以便我添加一行。
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时,这会在幕后神奇地发生。
答案 1 :(得分:2)
创建一个名为“electron0”的字符串,将指向字符串开头的char *
强制转换为TH1F *
,并将其解除引用,就像字符串实际上是struct TH1F *
一样(或class TH1F *
)很可能只会导致程序崩溃,与引用名为electron0
的变量不同。
可能你最好的选择是,而不是命名一堆变量electron0
,electron1
等......,在TH1F electron[NELECTRONS];
中创建一个数组,然后将它们引用为{ {1}},electron[0]
等(或者,如果对象是动态分配的,请使用electron[1]
并存储指针(具有适当的间接值以引用它们(TH1F *electron[NELECTRONS];
或{{ 1}})。