Geant4 不完全学习指南3(浅谈一些example.cc 中用到的头文件)

接着讨论example.cc中的一些头文件,这次由于并没有接触到有些头文件中的很多函数,就比较简单的读一读源代码,后续碰到了相应的方法会持续更新。

write by Jack  in hubei 2019.7.25  17:00

一 分析G4UImanager.hh 

 这是一个singlton类,它控制命令操作和用户界面。用户不能调用该类的构造函数

(1)public:
      static G4UImanager * GetUIpointer();
      static G4UImanager * GetMasterUIpointer();

     一个静态方法,用于获取指向该类唯一现有对象的指针。在exampleB1.cc中调用的函数有

   // Get the pointer to the User Interface manager
    G4UImanager* UImanager = G4UImanager::GetUIpointer();

G4UImanager.hh 中包含类 class G4UIcommand; class G4UIsession;的声明,因此可以直接定义相关类,现抽取一个main()函数中的相关代码:

//000ooo000ooo000oooo0000oooo000ooo0000oooo0000ooo000ooo

#include "G4UImanager.hh"
#include "G4UIterminal.hh" 

int main(int argc,char** argv)
{  

// 获取指向 UI manager 的指针
G4UImanager* UI = G4UImanager::GetUIpointer();

if(argc==1)
// 定义交互式(G)UI 终端
{
G4UIsession * session = new G4UIterminal;   
UI->ApplyCommand("/control/execute prerun.g4mac");
session->sessionStart();
delete session;
}
else
// 批处理模式
{
G4String command = "/control/execute ";
G4String fileName = argv[1];
UI->ApplyCommand(command+fileName);
}

//000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo

2   G4int ApplyCommand(const char * aCommand);
      G4int ApplyCommand(const G4String& aCommand);

使用别名变量多次执行宏文件,该变量接受候选列表中的值。方法参数给出的命令(和参数)将被应用。如果命令成功执行,则返回零。如果不能执行该命令,将返回正的非零值。这个非零值的含义如下别名变量多次执行宏文件,该变量接受候选列表中的值。

二 G4UIsession.hh 分析

这是所有(G)UI会话的基类,应该调用SessionStart()方法来启动会话,该类中的常见方法有

(1) virtual G4UIsession * SessionStart();

   这个方法将会被main()函数调用,也可以被其他会话调用

 

三 G4UIterminal.hh 分析

这个类继承于G4UIsession,这是使用字符终端sesion的类,用法:

 G4UIsession* terminalSession = new G4UIterminal; 

or  G4UIsession* terminalSession = new G4UIterminal(new your-shell);

实例化字符终端会话“terminalSession”。默认情况下,G4cout流被重定向到构造的实例

 terminalSession-> SessionStart(); // "terminalSession" is started.终端回话开始
delete terminalSession;           // "terminalSession"  is deleted.终端回话结束

四 G4UIExecutive.hh 

这个类帮助根据您的环境变量(如G4UI_USE_XXX)自动实例化用户会话,在mian()函数中的用法

 ...
//   #include "G4UIExecutive.hh"
//
//   int main(int argc, char** argv)
//   {
//     ...
//     G4UIExecutive* myapp = new G4UIExecutive(argc, argv);
//     if (session->IsGUI())     
//     myapp-> SessionStart();
//     ...
//     delete myapp;

(1) 内置布尔函数 inline G4bool G4UIExecutive::IsGUI() const
{
  return isGUI;
}

(2)枚举类函数  enum SessionType { kNone, kQt, kXm, kWin32, kWt, kGag, kTcsh, kCsh };

五 简单讨论 int main(int argc, char** argv) {}

main函数具有3种形参形式:

int main(int argc, char* argv[]);

int main(int argc, char** argv);    //前两个等价

int main(int argc,char* argv[], char** env);

①argc和argv参数应用在命令行编译程序中

②int argc:int型,argument count-传入main函数的参数个数

③char** agrv:字符串数组,argument vector-存放指向字符串参数的指针数组;每一个元素指向一个函数参数;共argc个元素argv[0]为编译后产生的exe路径…\xxx.exe;argv[1]为程序执行的第一个字符串参数;argv[2]为第二个字符串参数;argv[3]为第三个字符串参数;argv[argc]为字符串的null空字符

④char**env:字符串数组。env[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值

//000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo

int argc, char **argv 用于运行时,把命令行参数传入主程序。

argc -- 命令行参数 总个数,包括 可执行程序名。
argv[i] -- 第 i 个参数。
argv[0] -- 可执行程序名。

例如运行:
abc.exe
argc 等于 1, argv[0] 是 "abc.exe"

例如运行:
rec.exe 4 5.2
argc 等于 3, argv[0] 是 "rec.exe", argv[1] 是 "4", argv[2] 是 "5.2".
主函数里若有:
int x;
float y;
char s[80];
strcpy(s,argv[0]); // 程序名存入 了 s  strcpy 字符串复制函数
sscanf(argv[1],"%d",&x); // x 得到数值4
sscanf(argv[2],"%f",&y); // y 得到数值 5.2

//000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo000ooo

 

第三次的分析暂且讨论到这一步,结合不完全指南4可以更好的理解intercoms (用户接口管理类)

你可能感兴趣的:(G4)