全局变量不会,局部变量却内存溢出,是怎么回事?
请教大神
以下代码是从文件读数据用的
如果struct BEAM_FORCE_FILE这个结构体数组如果在全局变量里定义,如下,那MAX_BEAM取到10000都没问题
可是如果这里不定义,在main里面定义即
MAX_BEAM只能取72,这是为什么?
我设了断点(在程序里面插cout输出数字并用cin.get()暂停)看过了,如果在main里面定义这个结构数组,是一开始连
int beam_pcs; //梁单元数量
都不执行,直接报内存错误。
我用的是DEV C++ 4.9.9.2
这是怎么回事呢?求大神指教!
我要读的文件大概是这样的:

另外请教大神,我想我以后如果处理更大数据文件的话,内存溢出不可避免吧,所以我搜索了,貌似有分块处理数据的方法,我想在这方面得到些指点,请大神帮忙指条路,谢谢了!
以下代码是从文件读数据用的
#include <iostream>
#include <fstream>
#include <cstdlib> //exit()
#include <iomanip>
#include <cmath>
#include <string>
#include <ctime>
using namespace std;
const int MAX_SEC = 5; //杆件断面分段数最大取5段
const int MAX_LOAD = 100; //最大荷载数目
const int MAX_BEAM = 10000; //最大杆件数目
struct BEAM_ELEMENT
{
int beam_no;
int j1,j2;
int beamtype_no;
string steel;
double beta;
double length;
};
struct Q_STEEL
{
int thick1,thick2;
double r_tense; //抗拉
double r_press; //抗压抗弯
double r_shear; //抗剪
double r_phole; //孔壁承压
};
struct DATA
{
string Q1,Q2,Q3;
Q_STEEL QC[3];
double QY1,QY2,QY3; //Y=Yield屈服
}steel_data;
struct FORCE
{
double sec_dis; //断面距离(从杆件始端到末端)
double fx,fy,fz;
double mx,my,mz;
};
struct BEAM_FORCE
{
int load_number; //荷载编号
string load_name; //荷载名称
FORCE F[MAX_SEC];
};
struct BEAM_FORCE_FILE
{
int beam_number; //梁编号
BEAM_FORCE BF[MAX_LOAD];
}BFF[MAX_BEAM];
struct BEAM_PROPERTY
{
int beam_type_no;
int side;
int SD; //STRAT DIAMETER
int ED; //END DIAMETER
int THICKNESS;
string ST_TYPE; //STEEL TYPE
};
int COUNT_LINE_NUMBER(char * filename);
int main()
{
int beam_pcs; //梁单元数量
int load_pcs; //工况数量
int beam_sec; //每根杆件断面数
string ENTER; //吃掉换行符用
string NOTHING; //吃掉最上面中文用
ifstream fin;
fin.open("BEAM_FORCE.txt");
if(!fin.is_open())
{
cout << "Fail to open file!" << endl;
cin.get();
exit(EXIT_FAILURE);
}
fin >> beam_pcs;
fin >> load_pcs;
fin >> beam_sec;
getline(fin,ENTER);
getline(fin,NOTHING);
// BEAM_FORCE_FILE BFF[MAX_BEAM];
int i,j,k;
for(i=0;i<beam_pcs;i++)
{
fin >> BFF[i].beam_number;
for(j=0;j<load_pcs;j++)
{
fin >> BFF[i].BF[j].load_number;
fin >> BFF[i].BF[j].load_name;
for(k=0;k<beam_sec;k++)
{
fin >> BFF[i].BF[j].F[k].sec_dis;
fin >> BFF[i].BF[j].F[k].fx;
fin >> BFF[i].BF[j].F[k].fy;
fin >> BFF[i].BF[j].F[k].fz;
fin >> BFF[i].BF[j].F[k].mx;
fin >> BFF[i].BF[j].F[k].my;
fin >> BFF[i].BF[j].F[k].my;
}
}
}
fin.close();
ofstream fout;
fout.open("BEAM_FORCE_COMPARE.TXT");
fout << right << fixed;
for(i=0;i<beam_pcs;i++)
{
fout << setw(3) << BFF[i].beam_number;
for(j=0;j<load_pcs;j++)
{
fout << setw(6) << BFF[i].BF[j].load_number;
fout << setw(20)<< BFF[i].BF[j].load_name;
for(k=0;k<beam_sec;k++)
{
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].sec_dis;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].fx;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].fy;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].fz;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].mx;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].my;
fout << setw(6) << setprecision(3) << BFF[i].BF[j].F[k].my << endl;
fout << setw(29);
fout.fill(' ');
}
fout << endl;
}
fout << endl;
}
fout << endl;
fout.close();
return 0;
}
int COUNT_LINE_NUMBER(char * filename)
{
ifstream fin;
fin.open(filename);
int n=0;
string line_data;
if(!fin.is_open())
{
cout << "Fail to open " << filename << "." <<endl;
cin.get();
exit(EXIT_FAILURE);
}
while(getline(fin,line_data))
{
n++;
}
fin.close();
return n;
}
如果struct BEAM_FORCE_FILE这个结构体数组如果在全局变量里定义,如下,那MAX_BEAM取到10000都没问题
struct BEAM_FORCE_FILE
{
int beam_number; //梁编号
BEAM_FORCE BF[MAX_LOAD];
}BFF[MAX_BEAM];
可是如果这里不定义,在main里面定义即
// BEAM_FORCE_FILE BFF[MAX_BEAM];
MAX_BEAM只能取72,这是为什么?
我设了断点(在程序里面插cout输出数字并用cin.get()暂停)看过了,如果在main里面定义这个结构数组,是一开始连
int beam_pcs; //梁单元数量
都不执行,直接报内存错误。
我用的是DEV C++ 4.9.9.2
这是怎么回事呢?求大神指教!
我要读的文件大概是这样的:

另外请教大神,我想我以后如果处理更大数据文件的话,内存溢出不可避免吧,所以我搜索了,貌似有分块处理数据的方法,我想在这方面得到些指点,请大神帮忙指条路,谢谢了!
...全文
相关推荐
全局变量、局部变量、静态全局变量、静态局部变量的区别
与普通全局变量相比,静态全局变量的作用域仍然为全局,但是其可见性仅限于其所在的源文件。这意味着即使在其他源文件中使用了相同的变量名,也不会发生冲突。
浅谈java中的局部变量和全局变量
局部变量在使用前必须进行初始化,系统默认不会对局部变量进行初始化数据操作,如果局部变量在使用前没有进行初始化则会在编译器报错;如果局部变量进行了声明没有进行初始化,但是也一直没有被使用的话编译也是不会报错的
全局变量、静态全局变量、静态局部变量和局部变量的区别2.pdf
**全局变量**:在程序的整个执行过程中始终存在,即使在函数调用结束之后也不会被销毁。2. **静态全局变量**:具有全局变量的特点,但其作用范围仅限于定义它的源文件内部。3.
CC++中的静态全局变量,静态局部变量,全局变量,局部变量的区别
静态数据成员的生命周期与程序相同,初始化后不会被销毁,除非程序终止。#### 静态成员函数静态成员函数不依赖于类的任何实例,可以直接通过类名调用,无需创建类的对象。
Python 全局变量与局部变量
Python允许在函数内部定义同名的局部变量,这将创建一个新的局部变量,而不是修改全局变量。这意味着,即使函数内部有同名的变量,它也不会影响到全局变量。


