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,""); //显示打开了多少个文件
}
}
补充:还没弹出选择文件对话框就发生了错误,按理说,我是在按确定以后才开始定义八个二维数组的,应该是按确定以后才发生错误的啊?为什么呢?
展开
 我来答
何处淬吴钩
推荐于2017-10-11 · TA获得超过5045个赞
知道大有可为答主
回答量:2947
采纳率:50%
帮助的人:2420万
展开全部
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.
故乡的叶
2009-12-20 · TA获得超过196个赞
知道答主
回答量:244
采纳率:0%
帮助的人:92.4万
展开全部
一、你定义数组的时候那个num是多少啊,c/c++中定义数组必须明确指明数组的大小。如int a[800][888];
即使开辟大了,浪费了也得定义时指明大小,

二、要不你就用动态数组
清华大学出版社的 “c++语言程序设计(第三版)”第293页有动态数组的源代码,我没时间给你抄代码,我想你应该有这本书的。

三、或用链表。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
auklet2k
2009-12-16 · TA获得超过114个赞
知道答主
回答量:51
采纳率:0%
帮助的人:0
展开全部
改用 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();

参考资料: http://www.cppreference.com/wiki/stl/vector/vector_constructors

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式