🗺️当前这篇博文地址:https://myoontyee.github.io/article/c86dac85.html
⚠️警告:博客文章禁止一切形式的非授权非法转载!
⚠️Attention: All forms of unauthorized illegal reposts are prohibited !
创建时间:2022年4月7日15:29:08
最新更新:2022年4月8日10:16:03
Problem Description:C++ defines global variables, how to define all parameters in the header file? How to use a file to store all the parameters in the project? How to pass global parameters? ——Take Geant4 passing ray exit coordinates as an example
核心思路:
- 通常操作
- 头文件
.h
里声明,源文件.cpp
里定义 - Geant4头文件是
.hh
,源文件是.cc
- 头文件
- Geant4里的操作
include/B5Constants.hh
声明变量(extern
,不赋值)- 对应头文件
public
内声明变量,如include/B5PrimaryGeneratorAction.hh
(extern
,不赋值) - 对应源文件
- 头部初始化变量(没有
extern
,只定义,如G4double
,初始化赋值) - 函数部分赋值(没有
extern
,没有定义,直接赋值)
- 头部初始化变量(没有
- 写到
.root
文件里src/B5RunAction.cc
初始化表格,记下Column Id
src/B5EventAction.cc
内直接使用上面定义的变量传递数据(没有extern
,没有定义,直接使用)
基本思路与概念
- 例子
- 头文件
state.h
- 源文件
state.cpp
- 其他源文件
t1.cpp
,t2.cpp
,t3.cpp
- 这些源文件都包含头文件
state.h
- 这些源文件都包含头文件
- 需要定义一个全局变量供这些源文件使用
- 头文件
- 方法如下
- 在
state.h
中声明全局变量extern int a;
- 在
state.cpp
中定义该全局变量int a = 10;
- 在
- 概念区别
- 声明
- 一个声明必须满足两个条件,否则就是定义
- 声明必须使用
extern
关键字 - 不能给变量赋初始值
- 声明必须使用
- 一个声明必须满足两个条件,否则就是定义
- 例子如下
1
2
3
4extern int a; // 声明
int a; // 定义
int a = 0; // 定义
extern int a = 0; 定义
- 声明
- 注意事项
- 头文件中应使用
extern
关键字声明全局变量(不定义) - 如果这个变量有多个文件用到,可以新建一个
.cpp
文件,在其中定义,并把该文件加入工程并调用 - 头文件尽量不要定义任何变量
- 一般只在头文件声明,用
extern
在.cpp
中定义,如果这个头文件被多个.cpp
引用,会造成重复定义的链接错误 - 头文件只能声明全局变量(
extern
),不可定义(不推荐使用) .cpp
里,在最外层定义即可(int gi
),并直接引用- 如果在
.cpp
里用static
定义,则该变量只在当前.cpp
文件中有效,在别的文件中无效 - 如果在
.h
里用static
定义,不会进行编译(.h
文件不编译),只会在其每个include
的.cpp
文件中包含编译,相当于在.cpp
里使用static
定义
- 头文件中应使用
魔改exampleB5实现射线位置传递
声明变量
- 用代码编辑器打开
include/B5Constants.hh
,添加以下内容
1 | extern G4double Primary_worldpos_x; |
- 用代码编辑器打开
include/B5PrimaryGeneratorAction.hh
,在#include
各种库下方,class B5PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction
上方添加以下内容
1 | // ============================================================================= |
定义变量
-
用代码编辑器打开
src/B5PrimaryGeneratorAction.cc
,添加修改以下内容- 别忘记该文件要
#include "Randomize.hh"
用于产生随机数
- 别忘记该文件要
-
在
#include
下方,B5PrimaryGeneratorAction::B5PrimaryGeneratorAction()
上方进行初始化
1 | G4double Primary_worldpos_x = 0.; // 初始化 |
- 在
void B5PrimaryGeneratorAction::GeneratePrimaries(G4Event* event)
内添加并修改对应内容如下
1 | // ============================================================================= |
void B5PrimaryGeneratorAction::GeneratePrimaries(G4Event* event)
对应部分修改前后对比如下
修改前 | 修改后 |
||||
|
|
初始化表格
- 用代码编辑器打开
src/B5RunAction.cc
,在B5RunAction::B5RunAction(B5EventAction* eventAction) : G4UserRunAction(), fEventAction(eventAction)
内添加以下内容- 我这3列对应的Id是26~28,具体到自己的代码里,要自己数一下对应的
column Id
- 我这3列对应的Id是26~28,具体到自己的代码里,要自己数一下对应的
1 | // 2022年4月7日 |
输出进.root
- 用代码编辑器打开
src/B5EventAction.cc
,在void B5EventAction::EndOfEventAction(const G4Event *event)
对应位置添加以下内容
1 | // columns 26-28 |
输出效果
结果
- 你就可以把这几个数据传递到输出的
.root
文件里了! - 读取
.root
文件见Python如何基于uproot库读取.root文件,如何查看其内部数据,如何将其转化为DataFrame