猪猪虾 发表于 2023-9-4 23:38:39

c++ 数组作为全局变量的调用问题

下面有两个类,SteppingAction.c文件和RunAction.c,两个文件的头文件彼此都没有相互包含,
两个函数在软件里的调用是,先调用RunAction类里面的BeginOfRunAction函数,然后 执行N次的SteppingAction类之后,N次的SteppingAction类执行完毕之后 会调用 RunAction类里面的EndOfRunAction函数,

现在的问题是:
两个类的最开始都定义了 DepositArray全局变量数组,理论上是希望这是同一个数组,然后在SteppingAction类执行完毕之后,在RunAction类里面保存这个数组的内容,
我的问题是,这两个类,风马牛不相及,彼此没有相互包含,还各各自定义了各自的全局变量,最后是怎么实现数据传递的,。。。。。结果看上去是可靠的。。。。


//
using namespace std;
extern G4double DepositArray;


mutex step_lock1;
namespace B1
{
    SteppingAction::SteppingAction(EventAction *eventAction)
      : fEventAction(eventAction)
    {
      filename = "View_0.txt";
    }

    SteppingAction::~SteppingAction()
    {
    }

    void SteppingAction::UserSteppingAction(const G4Step *step)
    {
      // get volume of the current step
      G4String volumeName = step->GetPreStepPoint()->GetPhysicalVolume()->GetName();
      // ParticleName
      G4String ParticleName = step->GetTrack()->GetDynamicParticle()->GetParticleDefinition()->GetParticleName();

      if (volumeName == "DetectorArray")

      {
         
            G4int copyNo = step->GetPreStepPoint()->GetPhysicalVolume()->GetCopyNo();

   
            G4double edep = step->GetTotalEnergyDeposit();
            step_lock1.lock();
            DepositArray = DepositArray+ edep;
            step_lock1.unlock();

      }
    }

}

//

#include <fstream>

using namespace std;
G4double DepositArray = {0};

namespace B1
{
RunAction::RunAction()
{

}

RunAction::~RunAction()
{
}

void RunAction::BeginOfRunAction(const G4Run *)
{
}

void RunAction::EndOfRunAction(const G4Run *run)
{
      //if(IsMaster())语句用于判断当前程序是否为主节点,并根据结果执行相应的操作,以确保在文件存储过程中只有主节点进行相关操作。
    if (IsMaster())
    {
      ofstream DataOutPut;
      DataOutPut.open("./DataOutPut.txt",ios::trunc);
       for (int i = 0; i < sizeof(DepositArray) / sizeof(DepositArray); i++)
      {
      DataOutPut << i << "\t" << DepositArray << G4endl;
      }
      DataOutPut.close();
    }
}


}

isdkz 发表于 2023-9-4 23:39:02

这两个类之间的数据传递是通过全局变量来实现的。在SteppingAction类中,每次执行UserSteppingAction函数时,会更新DepositArray数组中的对应元素的值。而在RunAction类的EndOfRunAction函数中,会将DepositArray数组中的内容写入到文件中。

具体来说,当SteppingAction类的UserSteppingAction函数执行时,会根据条件判断是否在DetectorArray体积中,如果是的话,会获取当前步长的能量沉积值edep,并使用互斥锁step_lock1来保证多线程环境下的安全访问。然后,将这个能量沉积值累加到DepositArray数组的对应元素中。

在RunAction类的EndOfRunAction函数中,会判断当前程序是否为主节点,以确保只有主节点进行文件存储操作。然后,打开文件DataOutPut.txt,并将DepositArray数组中的内容写入文件中。最后,关闭文件。

由于DepositArray数组是全局变量,所以两个类都可以访问和修改这个数组的内容,从而实现了数据的传递。需要注意的是,在多线程环境下,使用互斥锁step_lock1来保证对DepositArray数组的安全访问。

猪猪虾 发表于 2023-9-4 23:48:53

isdkz 发表于 2023-9-4 23:39
这两个类之间的数据传递是通过全局变量来实现的。在SteppingAction类中,每次执行UserSteppingAction函数时 ...

这个程序是不是有bug啊,SteppingAction类里面用extern 修饰了 DepositArray,那在RunAction类里面是可以直接调用的对吧,就不需要再声明了
页: [1]
查看完整版本: c++ 数组作为全局变量的调用问题