鱼C论坛

 找回密码
 立即注册
查看: 1258|回复: 2

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

[复制链接]
发表于 2023-9-4 23:38:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

//
using namespace std;
extern G4double DepositArray[500];


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[copyNo] = DepositArray[copyNo]  + edep;
            step_lock1.unlock();

        }
    }

}
//

#include <fstream>

using namespace std;
G4double DepositArray[500] = {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[0]); i++)
      {
        DataOutPut << i << "\t" << DepositArray[i] << G4endl;
      }
      DataOutPut.close();
    }
  }


}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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数组的安全访问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个程序是不是有bug啊,SteppingAction类里面用extern 修饰了 DepositArray,那在RunAction类里面是可以直接调用的对吧,就不需要再声明了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 06:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表