全局变量在主 C++ 中不变

Global variable not changing in main C++

我是 C++ 的新手,我正在通过尝试编写一个 Monte Carlo 代码来学习它,该代码模拟粒子通过 LJ 势进行交互(对于那些不知道那是什么的人,我'我在写一个模拟粒子的科学程序)。

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

为了了解如何使用全局变量,我从一个主程序、一个读取文本文件的函数和一个用于我的变量的全局文件开始。在主程序中,我调用了读取变量(链接到全局文件)的函数,但变量在主程序中没有改变。输入文件给出的 T 为 10.

以下代码返回:

Read_control 表示 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; }

read_control.hh

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

using namespace std;

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;
}

global.hh

#ifndef GLOBAL
#define GLOBAL
#endif

extern double P, T;

如有任何帮助,我们将不胜感激。希望 post 不会太长。

你只使用局部变量。

创建一个 header(或重命名您的 "global.hh")"lennardjones.hpp" 并使用 extern double T;[=23] 声明全局变量 T(可怕的名称) =] 并定义(并初始化)变量 double T = 5; 在你的主函数之外 在源文件 "lennardjones.cc"

现在使用 #include "lennardjones.hpp" 在两个源文件中包含 header lennardjones.hpp。从函数 read_control() 和 main().

中删除变量 T 的定义

此外:
将你的 include guards 放在 header 中(一次性完成工作是 header 的目的),如果你不需要全局变量就停止使用它们。我很确定你不需要全局变量。我只能建议你读一本关于 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是这个函数的局部变量,作用域以函数结束,不是全局变量

这是你的做法

#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; }

注意 如果你使用了 T 这样的声明,T 是 main() 和之后定义的所有函数的全局变量,但不是read_control() 函数,如之前定义的那样。为此,只需将其包含在我们的全局声明之后

#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++ 中的作用域解析运算符。你在这里读到它:http://www.serc.iisc.ernet.in/facilities/ComputingFacilities/systems/cluster/vac-7.0/html/language/ref/clrc05cplr175.htm