Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
主C++中不改变的全局变量 我是C++的新手,我正在尝试编写一个蒙特卡洛代码,模拟粒子通过LJ潜在的相互作用,对于那些不知道这是什么的人,我正在编写一个科学的程序来模拟粒子。_C++_Variables_Global - Fatal编程技术网

主C++中不改变的全局变量 我是C++的新手,我正在尝试编写一个蒙特卡洛代码,模拟粒子通过LJ潜在的相互作用,对于那些不知道这是什么的人,我正在编写一个科学的程序来模拟粒子。

主C++中不改变的全局变量 我是C++的新手,我正在尝试编写一个蒙特卡洛代码,模拟粒子通过LJ潜在的相互作用,对于那些不知道这是什么的人,我正在编写一个科学的程序来模拟粒子。,c++,variables,global,C++,Variables,Global,许多不同的函数和模块使用相同的变量,因此利用全局变量对我来说非常有用。然而,我很难找到足够详细的教程或问题。要么这样,要么我犯了一些简单的错误 为了理解如何使用全局变量,我从一个主程序、一个读取文本文件的函数和一个全局变量文件开始。在main中,我调用函数,该函数读取链接到全局文件的变量,但该变量在主程序中没有更改。输入文件将T设为10 以下代码返回: 读取控制显示T=10 LJ表示T=5 lennardjones.cc #include <iostream> #ifndef GL

许多不同的函数和模块使用相同的变量,因此利用全局变量对我来说非常有用。然而,我很难找到足够详细的教程或问题。要么这样,要么我犯了一些简单的错误

为了理解如何使用全局变量,我从一个主程序、一个读取文本文件的函数和一个全局变量文件开始。在main中,我调用函数,该函数读取链接到全局文件的变量,但该变量在主程序中没有更改。输入文件将T设为10

以下代码返回:

读取控制显示T=10

LJ表示T=5

lennardjones.cc

#include <iostream> 
#ifndef GLOBAL
#define GLOBAL
#include "global.hh"
#endif
#include "read_control.hh"

using namespace std;

int main() {

double T=5;

read_control();

cout << "LJ says T = " << T << endl;

return 0; }

任何帮助都将不胜感激。希望这篇文章不要太长。

你只使用局部变量

创建一个标题或重命名global.hh lennardjones.hpp,并用extern double T声明全局变量T;定义并初始化变量double T=5;在源文件lennardjones.cc中的主函数之外

#include <iostream> 
#ifndef GLOBAL
#define GLOBAL
#include "global.hh"
#endif
#include "read_control.hh"

using namespace std;

int main() {

double T=5;

read_control();

cout << "LJ says T = " << T << endl;

return 0; }
现在,使用include lennardjones.hpp将标题lennardjones.hpp包含在两个源文件中。从函数read_control和main中删除变量T的定义

此外: 将include-guard放在标题中,一次完成所有工作是标题的目的,如果不需要,请停止使用全局变量。我很确定你不需要全局变量。我只能建议你读一本关于C++的好书,当前代码看起来像是从普通到糟糕的半成品教程,从网络上。
void read_control() {

double P, T;

ifstream file;
string u = "useless data";

file.open("control.inp");

file>> u >> u >> P >> T;

file.close();

cout << "Read_control says T = " << T << endl;
}
注意,如果使用了这样的T声明,T是main和之后定义的所有函数的全局变量,但不是前面定义的read_控制函数的全局变量。要做到这一点,只需将其纳入我们的全球宣言

#include <iostream> 
#ifndef GLOBAL
#define GLOBAL
#include "global.hh"
#endif

using namespace std;
int T = 100 // T is now a Global variable
#include "read_control.hh"
int main() {

double T=5;  // T is also a Local variable for the function main()

read_control();
cout<<T; // will print 5 as it is what the Local var T is
cout<<::T ; // will print 100 , i.e the value of Global variable

cout << "LJ says T = " << T << endl;

return 0; }

<>:C++中的范围解析操作符。您在这里了解到:

p和T不是全局变量,而是几个函数局部变量。但是你不应该一开始就使用全局变量。你的问题是?1:我注意到就在发布这篇文章之后。我把外线移到了双P,T;在全球范围之外。。范围,它没有改变任何东西。2.我假设我可以陈述一个问题,而不需要明确地陈述一个问题。一个合适的问题是:我必须更改什么,以便代码打印LJ表示T=10。从global.hh中删除无效的全局{和}行,并移动双P,T;read_control.hh中文件范围外的行。另外,不要在头文件hh中定义函数。如果您至少将globals放在它们自己的名称空间中,或者更好地用访问器方法将globals封装在一个静态的单例类中,或者最好通过将它们移动到使用它们的特定类中来完全消除它们,这样会更好。但是这些都是面向对象设计的更高级的主题。我想就如何防止头文件的多次包含给出一点意见。如果你遵循业界广泛采用的《谷歌风格指南》中的惯例,那么你就不需要在任何你想包含GLOBAL的地方额外检查GLOBAL的定义。hh:你能详细解释一下为什么这个名字很糟糕吗?T代表温度。谢谢你的回复。读了另一个答案后,你的解释现在对我有意义了。它甚至不是一个名字,我只是一封毫无意义的信,对你代码的后续读者来说。此外,T大量用于模板中。在非常简单的代码块中,快速代码的常用变量名是i、j、k等等。建议使用“温度”而不是“温度”或“tmp”,这很容易与“临时”混淆。一个全局变量不是简单的块的局部,它对每个人都可见,所以一个好的名字是非常重要的。我在阅读前5-7章中加速C++,但是我认为对于我的应用来说,更高级的特征是不必要的。我现在意识到,我应该看一本更深入的书。互联网上的大多数教程/解释都不完整,或者至少对我来说不够清楚。我看到很多人不喜欢使用全局变量。然而,这是一个我纯粹为自己编写的程序,我在某种程度上是在我的主管的Fortran代码上对其进行建模,在该代码中,他将模块用于普遍使用的变量。我不确定反对全局变量的通常论点是否适用于这种特定情况。然而,如果我发现它们是一个问题,我会很高兴地寻找一个不同的解决方案。非常感谢。我想我不习惯把范围作为一个概念。这一切都很清楚。
#include <iostream> 
#ifndef GLOBAL
#define GLOBAL
#include "global.hh"
#endif
#include "read_control.hh"

using namespace std;
int T = 100 // T is now a Global variable

int main() {

double T=5;  // T is also a Local variable for the function main()

read_control();
cout<<T; // will print 5 as it is what the Local var T is
cout<<::T ; // will print 100 , i.e the value of Global variable

cout << "LJ says T = " << T << endl;

return 0; }
#include <iostream> 
#ifndef GLOBAL
#define GLOBAL
#include "global.hh"
#endif

using namespace std;
int T = 100 // T is now a Global variable
#include "read_control.hh"
int main() {

double T=5;  // T is also a Local variable for the function main()

read_control();
cout<<T; // will print 5 as it is what the Local var T is
cout<<::T ; // will print 100 , i.e the value of Global variable

cout << "LJ says T = " << T << endl;

return 0; }