当您将对象作为参数传递给C+;中的函数时,是否可以从根对象访问方法+;? 原谅我的无知,但我对C++和root新手是陌生的,我不知道我到底做错了什么。< /P>
我想做的是编写一个函数,返回直方图中n个峰值的位置。以下是我的代码:当您将对象作为参数传递给C+;中的函数时,是否可以从根对象访问方法+;? 原谅我的无知,但我对C++和root新手是陌生的,我不知道我到底做错了什么。< /P>,c++,root-framework,C++,Root Framework,我想做的是编写一个函数,返回直方图中n个峰值的位置。以下是我的代码: #include <iostream> #include <algorithm> #include <iterator> #include "TROOT.h" #include "TCanvas.h" #include "TH1.h" #include "TF1.h" using namespace std; int *peak_counter1d(TH1F *histogram,in
#include <iostream>
#include <algorithm>
#include <iterator>
#include "TROOT.h"
#include "TCanvas.h"
#include "TH1.h"
#include "TF1.h"
using namespace std;
int *peak_counter1d(TH1F *histogram,int peak_num,int threshold = 5,int display = 0){
if(display == 1){
TCanvas *look = new TCanvas("look","look",500,400);
histogram->Draw();
}
int total_bins = histogram->GetNBinsX();
double peak_bins[peak_num];
peak_bins[0] = histogram->GetMaximumBin();
int counter = 1;
int *check_array; // to put previously found peak bins
while(counter < peak_num){
double peak = threshold;
double peak_loc = -500;
check_array = new int[counter];
for(int i=0; i<counter; i++){
check_array[i] = peak_bins[i]; // fills the array with previously found peak bins
}
for(int i=0; i<total_bins; i++){
if(peak < histogram->GetBinContent(i)){
bool exists = find(begin(check_array),end(checkarray),i); // makes sure this is a peak we haven't already found
if(!exists){
peak = histogram->GetBinContent(i);
peak_loc = i;
}
}
}
peak_bins[counter] = peak_loc;
counter ++;
}
delete[] check_array;
return peak_bins;
}
void testing(){
gROOT->Reset();
TH1F *histo = new TH1F("histo","try",100,0,10);
TF1 *f1 = new TF1("f1","exp(-x/10)*sin(x)*sin(x)",0,10);
double val;
for(int i=0; i<100; i++){
val = f1->Eval(i/10.0);
//cout << i << "\t" << i/100.0 << "\t" << val << endl;
histo->SetBinContent(i,val);
}
int *peak_bins;
peak_bins = peak_counter1d(histo,3,5,1);
for(int i=0; i<3; i++){
cout << i << "\t" << *(peak_bins+i) << endl;
}
}
我认为这是访问函数内部对象方法的问题,因为当我在testing()函数中调用histo->GetNBinsX()方法时,没有问题。但是我不知道
谢谢,如果我正在做其他灾难性的可怕的编码实践,请让我知道 您的代码存在各种问题 最引人注目的是:
int *peak_counter1d(TH1F *histogram,int peak_num,int threshold = 5,int display = 0)
{
//...
double peak_bins[peak_num];
//...
return peak_bins;
}
您正在返回指向局部变量的指针。返回指向局部变量的指针是未定义的行为
下一个问题是:
int *check_array; // to put previously found peak bins
while(counter < peak_num)
{
//...
check_array = new int[counter];
}
delete[] check_array;
int * peak_counter1d(...)
{
double peak_bins[peak_num];
//...
return peak_bins;
}
TCanvas *look = new TCanvas("look","look",500,400);
即使可以安全地返回指向局部变量的指针,函数也会返回int*,但返回的是double*
下一个问题是:
int *check_array; // to put previously found peak bins
while(counter < peak_num)
{
//...
check_array = new int[counter];
}
delete[] check_array;
int * peak_counter1d(...)
{
double peak_bins[peak_num];
//...
return peak_bins;
}
TCanvas *look = new TCanvas("look","look",500,400);
您正在分配外观
,但从未取消分配,甚至从未使用过
您也可以在main
中执行相同的操作:
TH1F *histo = new TH1F("histo","try",100,0,10);
TF1 *f1 = new TF1("f1","exp(-x/10)*sin(x)*sin(x)",0,10);
C++不是Java。您不必使用new
创建对象
TH1F histo("histo","try",100,0,10);
TF1 f1("f1","exp(-x/10)*sin(x)*sin(x)",0,10);
除上一个问题外,如果您使用std::vector
,而不使用new[]
创建动态数组,则总体上这些问题可以得到解决
应用这些更改,代码应该如下所示(未编译):
#包括
#包括
#包括
#包括
#包括“TROOT.h”
#包括“TCanvas.h”
#包括“TH1.h”
#包括“TF1.h”
使用名称空间std;
向量峰值计数器1D(TH1F*直方图,整数峰值,整数阈值=5,整数显示=0)
{
如果(显示==1)
{
//TCanvas*外观=新的TCanvas(“外观”、“外观”,500400);
直方图->绘制();
}
int total_bins=直方图->GetNBinsX();
向量峰值箱(峰值数量);
peak_bins[0]=直方图->获取最大值();
int计数器=1;
向量检查_数组;//用于放置以前找到的峰值存储单元
while(计数器<峰值数){
双峰=阈值;
双峰位置=-500;
选中数组。调整大小(计数器);
对于(int i=0;i已经指出,不能返回局部变量的地址,该地址将在函数结束时被销毁
你的另一个问题是:
histo->GetNbinsX()
不起作用。我尝试在脚本的主例程和子例程中调用它:它对我来说非常适合,使用当前的根版本。在问题中,您将拼写错误为GetNBinsX
(是的,这与驼峰案例策略更为一致)。也许
无论如何,我相信您会很高兴知道ROOT有一个非常智能的1D峰值搜索算法可供使用:查找。double peak\u bins[peak\u num];
您正在返回指向此本地数组的指针。返回指向本地变量的指针是未定义的行为。您在此处还可能存在内存泄漏:double peak_bins[peak_num]“使用<代码> STD::向量< /代码>这些问题,而不是原始指针。边注。我不知道C++解释程序存在。还有,返回指向局部变量的指针是坏的,MMKAY?谢谢。我没有意识到我正在返回指向局部变量的指针。我也没有意识到向量库是如此有用。我有两个问题。不过,总而言之,您将TH1F*histo=new TH1F(…)更改为TH1F histo(…)。但是,在上面的函数中,您将第一个参数作为指针保留。如果从peak_counter1d(TH1F*histogram,…)更改为peak_counter1d(TH1F直方图,…),则必须更改为peak_counter1d(TH1F直方图,…)。此外,获取GetNBinsX()仍然存在。请注意,在main
中,我传递了变量的地址,因此指针作为第一个参数仍然有效。