当您将对象作为参数传递给C+;中的函数时,是否可以从根对象访问方法+;? 原谅我的无知,但我对C++和root新手是陌生的,我不知道我到底做错了什么。< /P>

当您将对象作为参数传递给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

我想做的是编写一个函数,返回直方图中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,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
中,我传递了变量的地址,因此指针作为第一个参数仍然有效。