int a[100][200][60];
for(i=0;i<60;i++)
for(j=0;j<200;j++)
for(k=0;k<100;k++)
a[k][j][i]=0;
有问题吗?
55 个解决方案
#1
没有什么大问题,就是顺序有点不对啊
#2
缺少
main
其他没什么问题。
main
其他没什么问题。
#3
还有长度最好定义成宏或者常量吧
#4
除了顺序不符合习惯,没其他问题。
不过,很多时候,不符号习惯就是很大的问题了。
不过,很多时候,不符号习惯就是很大的问题了。
#5
这个应该不只是习惯的问题,还要考虑到执行效率的问题。
对于int a[100][200][60];来说,最好的办法就是从高阶向低阶循环,这样的话可以充分利用cache,因为在执行指令时,系统会自动复制内存中要操作的部分到cache中去,操作完了之后再复制回去。如果是从60->200->100,那么从C分配数组空间的方法考虑,每次最内层的循环都会跨越很大的内存地址,有可能造成cache不命中,从而需要重新刷新cache。而如果100->200->60,则对内存的访问是顺序进行的,cache的命中率会大大提高,从而造成效率上的不同。
对于int a[100][200][60];来说,最好的办法就是从高阶向低阶循环,这样的话可以充分利用cache,因为在执行指令时,系统会自动复制内存中要操作的部分到cache中去,操作完了之后再复制回去。如果是从60->200->100,那么从C分配数组空间的方法考虑,每次最内层的循环都会跨越很大的内存地址,有可能造成cache不命中,从而需要重新刷新cache。而如果100->200->60,则对内存的访问是顺序进行的,cache的命中率会大大提高,从而造成效率上的不同。
#6
#include <iostream.h>
void main()
{
int i,j,k;
int a[100][200][60];
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=0;
cout<<a[1][1][1];
}
调试一下,不通过啊!
void main()
{
int i,j,k;
int a[100][200][60];
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=0;
cout<<a[1][1][1];
}
调试一下,不通过啊!
#7
设置为空,可以考虑这样
int a[100][200][60];
memset(a,0,100*200*60);
int a[100][200][60];
memset(a,0,100*200*60);
#8
我的理解
没什么问题哦
没什么问题哦
#9
为什么不通过?
#10
对数组内存的分配是否有限制啊?
#11
有问提,不要这么使用,这个空间太大了有1M多。改成申请一个100*200*60的内存。原因自己想吧!
#12
刚才居然说错了。不是1M而是4M(通常int是32位)。
#13
谁能详细说明一下内存分配规则
如果分配给一个进程的内存分配完了
但是还需要分配,系统是如何处理的
我们在操作上有什么异同
如果分配给一个进程的内存分配完了
但是还需要分配,系统是如何处理的
我们在操作上有什么异同
#14
在栈上开辟的内存不是最大为2M么
#15
对于循环嵌套,应该把循环次数越多的放在越内层,可以减少cpu跨切循环层的次数。所以用60-100-200比较有效率,对不?
#16
栈的空间毕竟有限, 这是根本, 比内存泄露更厉害
ugg(逸学堂(exuetang.net)) ( ) 信誉:100 2006-05-10 11:11:00 得分: 0
设置为空,可以考虑这样
int a[100][200][60];
memset(a,0,100*200*60);
纠正一下:
memset(a, 0, 100 * 200 * 60 * sizeof(int));
ugg(逸学堂(exuetang.net)) ( ) 信誉:100 2006-05-10 11:11:00 得分: 0
设置为空,可以考虑这样
int a[100][200][60];
memset(a,0,100*200*60);
纠正一下:
memset(a, 0, 100 * 200 * 60 * sizeof(int));
#17
memset(a, 0, 100 * 200 * 60 * sizeof(int));
可以用
memset(a, 0, sizeof(a));
可以用
memset(a, 0, sizeof(a));
#18
数组的自动设置空间最大1M,降到1M下就没问题了,或者手动分配空间
#19
for(i=0;i<60;i++)
for(j=0;j<200;j++)
for(k=0;k<100;k++)
a[k][j][i]=0;
如果考虑到效率
那么
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
for(j=0;j<200;j++)
for(k=0;k<100;k++)
a[k][j][i]=0;
如果考虑到效率
那么
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
#20
为了效率,最好将最大的一维先做
#21
vc6+sp6 运行出错!
#22
VC 7下运行报错,应该是内存不够引起的吧
用 new 在堆上应该就没有问题了吧
用 new 在堆上应该就没有问题了吧
#23
使用一下动态分配内存出错:
#include <iostream>
using namespace std;
void main()
{
int *b;
int *a=new int(200*100*6);
b=a;
for(int i=0;i<200;++i)
for (int j=0;j<100;++j)
for (int k=0;i<6;++k)
{
*b=0;
b++;
}
}运行的时候出现以下错误:
Unhandled exception at 0x004143ef in csdn3.exe: 0xC0000005: Access violation writing location 0x00366000.
#include <iostream>
using namespace std;
void main()
{
int *b;
int *a=new int(200*100*6);
b=a;
for(int i=0;i<200;++i)
for (int j=0;j<100;++j)
for (int k=0;i<6;++k)
{
*b=0;
b++;
}
}运行的时候出现以下错误:
Unhandled exception at 0x004143ef in csdn3.exe: 0xC0000005: Access violation writing location 0x00366000.
#24
是new int[200*100*6]吧?
#25
改了,但是结果还是出现这种运行错误Unhandled exception at 0x00411d35 in csdn3.exe: 0xC0000005: Access violation writing location 0x00497000.
#26
大问题没有
循环顺序不对
循环顺序不对
#27
mark
#28
我在VC++中试了下,编译连接都没问题,结果执行时出错 ,拿来调试 :stack overflow!
看来还是执行效率的问题啊 我的内存是512M的,根本都执行不了,小了 呵呵
看来还是执行效率的问题啊 我的内存是512M的,根本都执行不了,小了 呵呵
#29
不要超过64K,除非改变!
#30
project -> setting -> link -> output : reserve可以修改栈的大小。
不过,还是不要用那么大的空间吧。
另外,我记得好像每个维数下标有最大值限制,但是int a[100][200][60];好像语法上是可以的。
不过,还是不要用那么大的空间吧。
另外,我记得好像每个维数下标有最大值限制,但是int a[100][200][60];好像语法上是可以的。
#31
乱..
#32
是占用内存太大 了
#33
这个问题不是很难啦,把a[100][200][60],设成全局变量,问题就解决了:)
#include<stdio.h>
int a[100][200][60];
int main()
{
int i,j,k;
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=0;
printf("%d\n", a[1][1][1]);
while(1) ;
}
#include<stdio.h>
int a[100][200][60];
int main()
{
int i,j,k;
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=0;
printf("%d\n", a[1][1][1]);
while(1) ;
}
#34
运行时会出错
#35
bbflyer的做法是正确的。
#include<stdio.h>
#include<iostream>
using namespace std;
int a[100][200][60];
int main()
{
int i,j,k,m,n,x;
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=k+j+i;
cout<<"enter i:";
cin>>m;
cout<<"enter j:";
cin>>n;
cout<<"enter k:";
cin>>x;
cout<<"answer is :"<<a[m][n][x];
while(1) ;
}
#include<stdio.h>
#include<iostream>
using namespace std;
int a[100][200][60];
int main()
{
int i,j,k,m,n,x;
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=k+j+i;
cout<<"enter i:";
cin>>m;
cout<<"enter j:";
cin>>n;
cout<<"enter k:";
cin>>x;
cout<<"answer is :"<<a[m][n][x];
while(1) ;
}
#36
栈上面空间不够,改成全局变量,该数组就放在了静态数据区,就没有大小限制了。
#37
设成全局就是把变量放到bss段里面而不是作为局部变量放在栈里面
原因上面许多人说过了。
原因上面许多人说过了。
#38
执行效率
#39
内存分配应该有问题,各向量的值该小,小到一定程度可运行VC6.0,可能内存分配不足
#40
代码段是没有问题的,没有什么文法错误。
问题在于考官想要考你什么;
由楼上诸位言语中总结一下
考官考究你的那几个方面(未想到写出的还请其它朋友补充)
1。数组在实际应用中用效率问题。 包含 遍历,查找,赋值 诸多操作的效率
2。数组的内存分配
3。数组定义与实际应用是否能够协调。你的程序中真的需要这么大的一个数组来存放如此多的东西么?如果真有这么多,应该是使用其它方式。想想100*200*60太恐怖了一个数组操作需要多久时间,诸如此类的问题是否应该使用其他方式处理,而不是定义一个庞大的数组
问题在于考官想要考你什么;
由楼上诸位言语中总结一下
考官考究你的那几个方面(未想到写出的还请其它朋友补充)
1。数组在实际应用中用效率问题。 包含 遍历,查找,赋值 诸多操作的效率
2。数组的内存分配
3。数组定义与实际应用是否能够协调。你的程序中真的需要这么大的一个数组来存放如此多的东西么?如果真有这么多,应该是使用其它方式。想想100*200*60太恐怖了一个数组操作需要多久时间,诸如此类的问题是否应该使用其他方式处理,而不是定义一个庞大的数组
#41
dev c++4.9 + xp
贬意通过,但程序不能运行
贬意通过,但程序不能运行
#42
int a[100][200][60];
的内存是大约5M
但栈的空间一般默认是1M,
修改编译选项,增加栈大小就可以了。
对于VC6.0,设置位置在:
Project Settings --> Links --> Output 的 Stack Allocations
单位是字节,如果指定为8M,设置: 8388608
设置后,可以在Link选项参数中看到: /stack:0x800000
的内存是大约5M
但栈的空间一般默认是1M,
修改编译选项,增加栈大小就可以了。
对于VC6.0,设置位置在:
Project Settings --> Links --> Output 的 Stack Allocations
单位是字节,如果指定为8M,设置: 8388608
设置后,可以在Link选项参数中看到: /stack:0x800000
#43
高手进来指点
#44
这个主要是存在效率的问题:
1.用memset(a,0,60*100*200),比较好!
2.不用memset的话,要把循环次数多的放在最内层,主要是为了减少循环层之间的切换次数,提高效率,如下:
int i,j,k;
int a[100][200][60];
for(i=0;i<60;i++)
for(j=0;j<200;j++)
for(k=0;k<100;k++)
a[k][j][i]=0;
改为:
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
1.用memset(a,0,60*100*200),比较好!
2.不用memset的话,要把循环次数多的放在最内层,主要是为了减少循环层之间的切换次数,提高效率,如下:
int i,j,k;
int a[100][200][60];
for(i=0;i<60;i++)
for(j=0;j<200;j++)
for(k=0;k<100;k++)
a[k][j][i]=0;
改为:
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
#45
改为:
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
同意。。。。
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
同意。。。。
#46
定义成 static 或者全局变量就应该OK,动态分配不知道有没有人试过
#47
Mark~
#48
数组变量都是放在栈里的,按默认的话栈溢出,就是这个问题
#49
vs2005中怎么找不到project settings 中的output选项?
#50
mark
#1
没有什么大问题,就是顺序有点不对啊
#2
缺少
main
其他没什么问题。
main
其他没什么问题。
#3
还有长度最好定义成宏或者常量吧
#4
除了顺序不符合习惯,没其他问题。
不过,很多时候,不符号习惯就是很大的问题了。
不过,很多时候,不符号习惯就是很大的问题了。
#5
这个应该不只是习惯的问题,还要考虑到执行效率的问题。
对于int a[100][200][60];来说,最好的办法就是从高阶向低阶循环,这样的话可以充分利用cache,因为在执行指令时,系统会自动复制内存中要操作的部分到cache中去,操作完了之后再复制回去。如果是从60->200->100,那么从C分配数组空间的方法考虑,每次最内层的循环都会跨越很大的内存地址,有可能造成cache不命中,从而需要重新刷新cache。而如果100->200->60,则对内存的访问是顺序进行的,cache的命中率会大大提高,从而造成效率上的不同。
对于int a[100][200][60];来说,最好的办法就是从高阶向低阶循环,这样的话可以充分利用cache,因为在执行指令时,系统会自动复制内存中要操作的部分到cache中去,操作完了之后再复制回去。如果是从60->200->100,那么从C分配数组空间的方法考虑,每次最内层的循环都会跨越很大的内存地址,有可能造成cache不命中,从而需要重新刷新cache。而如果100->200->60,则对内存的访问是顺序进行的,cache的命中率会大大提高,从而造成效率上的不同。
#6
#include <iostream.h>
void main()
{
int i,j,k;
int a[100][200][60];
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=0;
cout<<a[1][1][1];
}
调试一下,不通过啊!
void main()
{
int i,j,k;
int a[100][200][60];
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=0;
cout<<a[1][1][1];
}
调试一下,不通过啊!
#7
设置为空,可以考虑这样
int a[100][200][60];
memset(a,0,100*200*60);
int a[100][200][60];
memset(a,0,100*200*60);
#8
我的理解
没什么问题哦
没什么问题哦
#9
为什么不通过?
#10
对数组内存的分配是否有限制啊?
#11
有问提,不要这么使用,这个空间太大了有1M多。改成申请一个100*200*60的内存。原因自己想吧!
#12
刚才居然说错了。不是1M而是4M(通常int是32位)。
#13
谁能详细说明一下内存分配规则
如果分配给一个进程的内存分配完了
但是还需要分配,系统是如何处理的
我们在操作上有什么异同
如果分配给一个进程的内存分配完了
但是还需要分配,系统是如何处理的
我们在操作上有什么异同
#14
在栈上开辟的内存不是最大为2M么
#15
对于循环嵌套,应该把循环次数越多的放在越内层,可以减少cpu跨切循环层的次数。所以用60-100-200比较有效率,对不?
#16
栈的空间毕竟有限, 这是根本, 比内存泄露更厉害
ugg(逸学堂(exuetang.net)) ( ) 信誉:100 2006-05-10 11:11:00 得分: 0
设置为空,可以考虑这样
int a[100][200][60];
memset(a,0,100*200*60);
纠正一下:
memset(a, 0, 100 * 200 * 60 * sizeof(int));
ugg(逸学堂(exuetang.net)) ( ) 信誉:100 2006-05-10 11:11:00 得分: 0
设置为空,可以考虑这样
int a[100][200][60];
memset(a,0,100*200*60);
纠正一下:
memset(a, 0, 100 * 200 * 60 * sizeof(int));
#17
memset(a, 0, 100 * 200 * 60 * sizeof(int));
可以用
memset(a, 0, sizeof(a));
可以用
memset(a, 0, sizeof(a));
#18
数组的自动设置空间最大1M,降到1M下就没问题了,或者手动分配空间
#19
for(i=0;i<60;i++)
for(j=0;j<200;j++)
for(k=0;k<100;k++)
a[k][j][i]=0;
如果考虑到效率
那么
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
for(j=0;j<200;j++)
for(k=0;k<100;k++)
a[k][j][i]=0;
如果考虑到效率
那么
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
#20
为了效率,最好将最大的一维先做
#21
vc6+sp6 运行出错!
#22
VC 7下运行报错,应该是内存不够引起的吧
用 new 在堆上应该就没有问题了吧
用 new 在堆上应该就没有问题了吧
#23
使用一下动态分配内存出错:
#include <iostream>
using namespace std;
void main()
{
int *b;
int *a=new int(200*100*6);
b=a;
for(int i=0;i<200;++i)
for (int j=0;j<100;++j)
for (int k=0;i<6;++k)
{
*b=0;
b++;
}
}运行的时候出现以下错误:
Unhandled exception at 0x004143ef in csdn3.exe: 0xC0000005: Access violation writing location 0x00366000.
#include <iostream>
using namespace std;
void main()
{
int *b;
int *a=new int(200*100*6);
b=a;
for(int i=0;i<200;++i)
for (int j=0;j<100;++j)
for (int k=0;i<6;++k)
{
*b=0;
b++;
}
}运行的时候出现以下错误:
Unhandled exception at 0x004143ef in csdn3.exe: 0xC0000005: Access violation writing location 0x00366000.
#24
是new int[200*100*6]吧?
#25
改了,但是结果还是出现这种运行错误Unhandled exception at 0x00411d35 in csdn3.exe: 0xC0000005: Access violation writing location 0x00497000.
#26
大问题没有
循环顺序不对
循环顺序不对
#27
mark
#28
我在VC++中试了下,编译连接都没问题,结果执行时出错 ,拿来调试 :stack overflow!
看来还是执行效率的问题啊 我的内存是512M的,根本都执行不了,小了 呵呵
看来还是执行效率的问题啊 我的内存是512M的,根本都执行不了,小了 呵呵
#29
不要超过64K,除非改变!
#30
project -> setting -> link -> output : reserve可以修改栈的大小。
不过,还是不要用那么大的空间吧。
另外,我记得好像每个维数下标有最大值限制,但是int a[100][200][60];好像语法上是可以的。
不过,还是不要用那么大的空间吧。
另外,我记得好像每个维数下标有最大值限制,但是int a[100][200][60];好像语法上是可以的。
#31
乱..
#32
是占用内存太大 了
#33
这个问题不是很难啦,把a[100][200][60],设成全局变量,问题就解决了:)
#include<stdio.h>
int a[100][200][60];
int main()
{
int i,j,k;
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=0;
printf("%d\n", a[1][1][1]);
while(1) ;
}
#include<stdio.h>
int a[100][200][60];
int main()
{
int i,j,k;
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=0;
printf("%d\n", a[1][1][1]);
while(1) ;
}
#34
运行时会出错
#35
bbflyer的做法是正确的。
#include<stdio.h>
#include<iostream>
using namespace std;
int a[100][200][60];
int main()
{
int i,j,k,m,n,x;
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=k+j+i;
cout<<"enter i:";
cin>>m;
cout<<"enter j:";
cin>>n;
cout<<"enter k:";
cin>>x;
cout<<"answer is :"<<a[m][n][x];
while(1) ;
}
#include<stdio.h>
#include<iostream>
using namespace std;
int a[100][200][60];
int main()
{
int i,j,k,m,n,x;
for(k=0;k<100;k++)
for(j=0;j<200;j++)
for(i=0;i<60;i++)
a[k][j][i]=k+j+i;
cout<<"enter i:";
cin>>m;
cout<<"enter j:";
cin>>n;
cout<<"enter k:";
cin>>x;
cout<<"answer is :"<<a[m][n][x];
while(1) ;
}
#36
栈上面空间不够,改成全局变量,该数组就放在了静态数据区,就没有大小限制了。
#37
设成全局就是把变量放到bss段里面而不是作为局部变量放在栈里面
原因上面许多人说过了。
原因上面许多人说过了。
#38
执行效率
#39
内存分配应该有问题,各向量的值该小,小到一定程度可运行VC6.0,可能内存分配不足
#40
代码段是没有问题的,没有什么文法错误。
问题在于考官想要考你什么;
由楼上诸位言语中总结一下
考官考究你的那几个方面(未想到写出的还请其它朋友补充)
1。数组在实际应用中用效率问题。 包含 遍历,查找,赋值 诸多操作的效率
2。数组的内存分配
3。数组定义与实际应用是否能够协调。你的程序中真的需要这么大的一个数组来存放如此多的东西么?如果真有这么多,应该是使用其它方式。想想100*200*60太恐怖了一个数组操作需要多久时间,诸如此类的问题是否应该使用其他方式处理,而不是定义一个庞大的数组
问题在于考官想要考你什么;
由楼上诸位言语中总结一下
考官考究你的那几个方面(未想到写出的还请其它朋友补充)
1。数组在实际应用中用效率问题。 包含 遍历,查找,赋值 诸多操作的效率
2。数组的内存分配
3。数组定义与实际应用是否能够协调。你的程序中真的需要这么大的一个数组来存放如此多的东西么?如果真有这么多,应该是使用其它方式。想想100*200*60太恐怖了一个数组操作需要多久时间,诸如此类的问题是否应该使用其他方式处理,而不是定义一个庞大的数组
#41
dev c++4.9 + xp
贬意通过,但程序不能运行
贬意通过,但程序不能运行
#42
int a[100][200][60];
的内存是大约5M
但栈的空间一般默认是1M,
修改编译选项,增加栈大小就可以了。
对于VC6.0,设置位置在:
Project Settings --> Links --> Output 的 Stack Allocations
单位是字节,如果指定为8M,设置: 8388608
设置后,可以在Link选项参数中看到: /stack:0x800000
的内存是大约5M
但栈的空间一般默认是1M,
修改编译选项,增加栈大小就可以了。
对于VC6.0,设置位置在:
Project Settings --> Links --> Output 的 Stack Allocations
单位是字节,如果指定为8M,设置: 8388608
设置后,可以在Link选项参数中看到: /stack:0x800000
#43
高手进来指点
#44
这个主要是存在效率的问题:
1.用memset(a,0,60*100*200),比较好!
2.不用memset的话,要把循环次数多的放在最内层,主要是为了减少循环层之间的切换次数,提高效率,如下:
int i,j,k;
int a[100][200][60];
for(i=0;i<60;i++)
for(j=0;j<200;j++)
for(k=0;k<100;k++)
a[k][j][i]=0;
改为:
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
1.用memset(a,0,60*100*200),比较好!
2.不用memset的话,要把循环次数多的放在最内层,主要是为了减少循环层之间的切换次数,提高效率,如下:
int i,j,k;
int a[100][200][60];
for(i=0;i<60;i++)
for(j=0;j<200;j++)
for(k=0;k<100;k++)
a[k][j][i]=0;
改为:
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
#45
改为:
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
同意。。。。
for(i=0;i<60;i++)
for(k=0;k<100;k++)
for(j=0;j<200;j++)
a[k][j][i]=0;
同意。。。。
#46
定义成 static 或者全局变量就应该OK,动态分配不知道有没有人试过
#47
Mark~
#48
数组变量都是放在栈里的,按默认的话栈溢出,就是这个问题
#49
vs2005中怎么找不到project settings 中的output选项?
#50
mark