鱼C论坛

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

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

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

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

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

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

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


  1. //
  2. using namespace std;
  3. extern G4double DepositArray[500];


  4. mutex step_lock1;
  5. namespace B1
  6. {
  7.     SteppingAction::SteppingAction(EventAction *eventAction)
  8.         : fEventAction(eventAction)
  9.     {
  10.         filename = "View_0.txt";
  11.     }

  12.     SteppingAction::~SteppingAction()
  13.     {
  14.     }

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

  21.         if (volumeName == "DetectorArray")

  22.         {
  23.          
  24.             G4int copyNo = step->GetPreStepPoint()->GetPhysicalVolume()->GetCopyNo();

  25.    
  26.             G4double edep = step->GetTotalEnergyDeposit();
  27.             step_lock1.lock();
  28.             DepositArray[copyNo] = DepositArray[copyNo]  + edep;
  29.             step_lock1.unlock();

  30.         }
  31.     }

  32. }
复制代码

  1. //

  2. #include <fstream>

  3. using namespace std;
  4. G4double DepositArray[500] = {0};

  5. namespace B1
  6. {
  7.   RunAction::RunAction()
  8.   {

  9.   }

  10.   RunAction::~RunAction()
  11.   {
  12.   }

  13.   void RunAction::BeginOfRunAction(const G4Run *)
  14.   {
  15.   }

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


  30. }
复制代码
小甲鱼最新课程 -> https://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数组的安全访问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个程序是不是有bug啊,SteppingAction类里面用extern 修饰了 DepositArray,那在RunAction类里面是可以直接调用的对吧,就不需要再声明了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 13:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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