c++二维数组大小有限制吗?怎么解决?
c++二维数组大小有限制吗?怎么解决?悬赏分:0-离问题结束还有14天23小时本人刚自学c++,想赋值给八个二维数组的每个元素,并写入excel表格中,第一维是列,第二维...
c++二维数组大小有限制吗?怎么解决?
悬赏分:0 - 离问题结束还有 14 天 23 小时
本人刚自学c++,想赋值给八个二维数组的每个元素,并写入excel表格中,第一维是列,第二维是横。由于处理文件比较多,第二维要设置得比较大,但如果大于15的话,内存会报错:unkown software exception!我电脑内存2g,不会这么快用完吧??现在这个程序只能处理15*8=120个文件,远远不够!快要交任务了,这个是关键问题,解决了就完成了,希望大家帮我一把啊!听说有申请动态数组的方法,但在这里我不知道怎么用?以下是代码,在线等:
void CMainFrame::OnToExcel()
{ CFileDialog openPre(true,"*.ROH",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
"待处理文件(*.ROH)|*.ROH|所有文件(*.*)|*.*||");
DWORD MAXFILE = 256000; //设置缓冲区,因为c++默认的缓冲区比较少,所以要自己设置,但我不知道该设置多少
openPre.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE];
openPre.m_ofn.lpstrFile = pc;
openPre.m_ofn.lpstrFile[0]=NULL;
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,x=0;
if(openPre.DoModal()==IDOK)//按确定
{const int Num=15;//改为16或以上都会发生内存错误
float Masterbuf[2034][Num];//分别定义八个通道文件的数组,第一维是行数,第二维是列数
float Slaver1buf[2034][Num];
float Slaver2buf[2034][Num];
float Slaver3buf[2034][Num];
float Slaver4buf[2034][Num];
float Slaver5buf[2034][Num];
float Slaver6buf[2034][Num];
float Slaver7buf[2034][Num];
POSITION posi= openPre.GetStartPosition();
CString sPath="";
int count=0;//用来统计选中的文件数
while (posi!= NULL)
{
sPath=openPre.GetNextPathName(posi);//每次循环都得到下一个文件路径
count++;
FILE *fd=fopen(sPath,"rb");
float buf[2056];
fread(buf,sizeof(buf[0]),2056,fd);//读取二进制文件,放到buf数组中
float xbuf[2034];
float ybuf[2034];
for (int j=0;j<2034;j++)
{
xbuf[j]=buf[1]+buf[2]*j+buf[3]*j*j+buf[4]*j*j*j+buf[5]*j*j*j*j;//算出xbuf和ybuf
ybuf[j]=buf[j+19];
}
int pos;
pos=sPath.ReverseFind('.');
sPath=sPath.Left(pos); //获取打开的文件的路径和文件名前缀
CString td="";
if (xbuf[1]>170&&xbuf[1]<174)//若xbuf[1]落在170和174之间,在第一通道文件操作
{td="Master";
x=++a;
for (int i=0;i<2034;i++)
{ Masterbuf[i][0]=xbuf[i];
Masterbuf[i][x]=ybuf[i]; //赋值
}
fstream fout;
fout.open(td+".xls",ios::trunc);
for (int k=0;k<2034;k++)
{ for (int l=0;l<=x;l++)
{fout<<Masterbuf[k][l]<<"\t";}//逐行写入
fout<<"\n";
}
fout.close();
}
//接着还是判断xbuf[1]大小来决定打开哪个文件来操作,跟上面第一通道的操作一样的,都是打开,赋值,写入,关闭文件
}
CString strcount;
strcount.Format(_T("%d"),count);
strcount=strcount+" files converted to ASCII";
MessageBox(strcount,""); //显示打开了多少个文件
}
}
补充:还没弹出选择文件对话框就发生了错误,按理说,我是在按确定以后才开始定义八个二维数组的,应该是按确定以后才发生错误的啊?为什么呢? 展开
悬赏分:0 - 离问题结束还有 14 天 23 小时
本人刚自学c++,想赋值给八个二维数组的每个元素,并写入excel表格中,第一维是列,第二维是横。由于处理文件比较多,第二维要设置得比较大,但如果大于15的话,内存会报错:unkown software exception!我电脑内存2g,不会这么快用完吧??现在这个程序只能处理15*8=120个文件,远远不够!快要交任务了,这个是关键问题,解决了就完成了,希望大家帮我一把啊!听说有申请动态数组的方法,但在这里我不知道怎么用?以下是代码,在线等:
void CMainFrame::OnToExcel()
{ CFileDialog openPre(true,"*.ROH",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
"待处理文件(*.ROH)|*.ROH|所有文件(*.*)|*.*||");
DWORD MAXFILE = 256000; //设置缓冲区,因为c++默认的缓冲区比较少,所以要自己设置,但我不知道该设置多少
openPre.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE];
openPre.m_ofn.lpstrFile = pc;
openPre.m_ofn.lpstrFile[0]=NULL;
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,x=0;
if(openPre.DoModal()==IDOK)//按确定
{const int Num=15;//改为16或以上都会发生内存错误
float Masterbuf[2034][Num];//分别定义八个通道文件的数组,第一维是行数,第二维是列数
float Slaver1buf[2034][Num];
float Slaver2buf[2034][Num];
float Slaver3buf[2034][Num];
float Slaver4buf[2034][Num];
float Slaver5buf[2034][Num];
float Slaver6buf[2034][Num];
float Slaver7buf[2034][Num];
POSITION posi= openPre.GetStartPosition();
CString sPath="";
int count=0;//用来统计选中的文件数
while (posi!= NULL)
{
sPath=openPre.GetNextPathName(posi);//每次循环都得到下一个文件路径
count++;
FILE *fd=fopen(sPath,"rb");
float buf[2056];
fread(buf,sizeof(buf[0]),2056,fd);//读取二进制文件,放到buf数组中
float xbuf[2034];
float ybuf[2034];
for (int j=0;j<2034;j++)
{
xbuf[j]=buf[1]+buf[2]*j+buf[3]*j*j+buf[4]*j*j*j+buf[5]*j*j*j*j;//算出xbuf和ybuf
ybuf[j]=buf[j+19];
}
int pos;
pos=sPath.ReverseFind('.');
sPath=sPath.Left(pos); //获取打开的文件的路径和文件名前缀
CString td="";
if (xbuf[1]>170&&xbuf[1]<174)//若xbuf[1]落在170和174之间,在第一通道文件操作
{td="Master";
x=++a;
for (int i=0;i<2034;i++)
{ Masterbuf[i][0]=xbuf[i];
Masterbuf[i][x]=ybuf[i]; //赋值
}
fstream fout;
fout.open(td+".xls",ios::trunc);
for (int k=0;k<2034;k++)
{ for (int l=0;l<=x;l++)
{fout<<Masterbuf[k][l]<<"\t";}//逐行写入
fout<<"\n";
}
fout.close();
}
//接着还是判断xbuf[1]大小来决定打开哪个文件来操作,跟上面第一通道的操作一样的,都是打开,赋值,写入,关闭文件
}
CString strcount;
strcount.Format(_T("%d"),count);
strcount=strcount+" files converted to ASCII";
MessageBox(strcount,""); //显示打开了多少个文件
}
}
补充:还没弹出选择文件对话框就发生了错误,按理说,我是在按确定以后才开始定义八个二维数组的,应该是按确定以后才发生错误的啊?为什么呢? 展开
展开全部
float Slaver1buf[2034][Num];
c++这种定义是不允许的。数组的空间是在运行前分配的,而程序运行前Num大小未知,所以是不可以的。另外,数组太大也会溢出。
你可以使用指针数组然后用new来动态分配。
float *Slaver1buf[2034];
int i;
for(i = 0;i<2034;i++)
Slaver1buf[i] = new float[Num];
使用方法与你定义的Slaver1buf相同,用完记得delete.
c++这种定义是不允许的。数组的空间是在运行前分配的,而程序运行前Num大小未知,所以是不可以的。另外,数组太大也会溢出。
你可以使用指针数组然后用new来动态分配。
float *Slaver1buf[2034];
int i;
for(i = 0;i<2034;i++)
Slaver1buf[i] = new float[Num];
使用方法与你定义的Slaver1buf相同,用完记得delete.
展开全部
一、你定义数组的时候那个num是多少啊,c/c++中定义数组必须明确指明数组的大小。如int a[800][888];
即使开辟大了,浪费了也得定义时指明大小,
二、要不你就用动态数组
清华大学出版社的 “c++语言程序设计(第三版)”第293页有动态数组的源代码,我没时间给你抄代码,我想你应该有这本书的。
三、或用链表。
即使开辟大了,浪费了也得定义时指明大小,
二、要不你就用动态数组
清华大学出版社的 “c++语言程序设计(第三版)”第293页有动态数组的源代码,我没时间给你抄代码,我想你应该有这本书的。
三、或用链表。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
改用 Vector 吧,直接用 push_back(),一般只会出现Memory Overflow,
for (int i=0;i<2034;i++)
{ Masterbuf[i][0]=xbuf[i];
Masterbuf[i][x]=ybuf[i]; //赋值
}
这段的在x存入ybuf是什么意思?这样的话得用显式构造函数
explicit vector( size_type num, const TYPE& val = TYPE() );
#include <vector>
std::vector<float> MasterBuf[1023](Num);
MasterBuf[i].push_back();
for (int i=0;i<2034;i++)
{ Masterbuf[i][0]=xbuf[i];
Masterbuf[i][x]=ybuf[i]; //赋值
}
这段的在x存入ybuf是什么意思?这样的话得用显式构造函数
explicit vector( size_type num, const TYPE& val = TYPE() );
#include <vector>
std::vector<float> MasterBuf[1023](Num);
MasterBuf[i].push_back();
参考资料: http://www.cppreference.com/wiki/stl/vector/vector_constructors
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |