全局变量在主 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
我是 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