avatar
请教大家c++ array# Computation - 科学计算
x*u
1
大家都用什么啊。自带的array太差,大一点就crash。特别是多维的,跟fortran没法比
啊。
请教大家都用些什么?盼复!
avatar
h*o
2
are you sure the crash is due to c++'s array?

【在 x*****u 的大作中提到】
: 大家都用什么啊。自带的array太差,大一点就crash。特别是多维的,跟fortran没法比
: 啊。
: 请教大家都用些什么?盼复!

avatar
a*i
3
从c++语言标准和fortran语言标准上来说,没有一个会crash。而且c++能提供的
数组功能比fortran要灵活得多,只是比较难以掌握,用得不好很容易出错。
如果你编程上没有错误,那就是你用的编译软件太差。但通常情况下,后者的可
能性比较小。用c++的人不知比fortran多多少,如果软件有问题,早就给人试出
来了。

【在 x*****u 的大作中提到】
: 大家都用什么啊。自带的array太差,大一点就crash。特别是多维的,跟fortran没法比
: 啊。
: 请教大家都用些什么?盼复!

avatar
Ag
4
you memory allocation must have problems.

【在 x*****u 的大作中提到】
: 大家都用什么啊。自带的array太差,大一点就crash。特别是多维的,跟fortran没法比
: 啊。
: 请教大家都用些什么?盼复!

avatar
x*u
5
这个,愿闻其详。谢谢先。
我是这样试的:
构造200×200的数组,如double A[200][200],当然有很多数组同时,程序运行下来,告
诉有SegmentationFault。这个很容易试,比如
int main()
{
double A[2000][2000];
for(int i=0; i<200; i++)
for(int j=0; j<200; j++){
A[

【在 Ag 的大作中提到】
: you memory allocation must have problems.
avatar
a*s
6
哈哈,fortran rocks!:)
用fortran写就没这个问题!

【在 x*****u 的大作中提到】
: 这个,愿闻其详。谢谢先。
: 我是这样试的:
: 构造200×200的数组,如double A[200][200],当然有很多数组同时,程序运行下来,告
: 诉有SegmentationFault。这个很容易试,比如
: int main()
: {
: double A[2000][2000];
: for(int i=0; i<200; i++)
: for(int j=0; j<200; j++){
: A[

avatar
x*u
7
能否详解一二?
比如,c++的数组功能,如何灵活得多呢?又怎样容易出错?谢谢!
纯粹搞计算的话,还是首推fortran,跟使用人数关系不大吧?当然是我一点愚陋的想法


法比

【在 a**i 的大作中提到】
: 从c++语言标准和fortran语言标准上来说,没有一个会crash。而且c++能提供的
: 数组功能比fortran要灵活得多,只是比较难以掌握,用得不好很容易出错。
: 如果你编程上没有错误,那就是你用的编译软件太差。但通常情况下,后者的可
: 能性比较小。用c++的人不知比fortran多多少,如果软件有问题,早就给人试出
: 来了。

avatar
a*s
8

~~~~~~~~~~你这儿不是笔误吧?

【在 x*****u 的大作中提到】
: 这个,愿闻其详。谢谢先。
: 我是这样试的:
: 构造200×200的数组,如double A[200][200],当然有很多数组同时,程序运行下来,告
: 诉有SegmentationFault。这个很容易试,比如
: int main()
: {
: double A[2000][2000];
: for(int i=0; i<200; i++)
: for(int j=0; j<200; j++){
: A[

avatar
x*u
9
是。当然只是我现在的认识程度的判断。程序错误可以排除(比如我前面贴的),当然也
有可能是编译器?天,前面编的那段,icc下没问题。然后回到自己原来的程序,icc还是
通不过。

法比

【在 h***o 的大作中提到】
: are you sure the crash is due to c++'s array?
avatar
x*u
10
没错,同样的程序,我编了一个fortran的,
program Array
REAL A(2000,2000)
INTEGER i, j
do 100 i = 1,2000
DO 100 j = 1,2000
A(i,j) = 1.
100 continue
end
用同样的机器,同样的编译器(gnu gcc's f77),没有一点问题。

,告







有答
有。

【在 a******s 的大作中提到】
:
: ~~~~~~~~~~你这儿不是笔误吧?

avatar
sc
11
把double A[2000][2000]挪到main外面去
最后,程序错了要自己动脑子,拿个计算器出来看看到底用掉多少内存,
有什么其他解决方法没有。竟然怪到C++不如fortran这种理由上去,
真是拉不出shi怪马桶没吸力。

【在 x*****u 的大作中提到】
: 这个,愿闻其详。谢谢先。
: 我是这样试的:
: 构造200×200的数组,如double A[200][200],当然有很多数组同时,程序运行下来,告
: 诉有SegmentationFault。这个很容易试,比如
: int main()
: {
: double A[2000][2000];
: for(int i=0; i<200; i++)
: for(int j=0; j<200; j++){
: A[

avatar
a*i
12
是编译器的问题,或者编译器的参数没设好。
2000*2000的double,需要32兆内存,可能超过编译器缺省的一个数据段的大小
上限了。

【在 x*****u 的大作中提到】
: 这个,愿闻其详。谢谢先。
: 我是这样试的:
: 构造200×200的数组,如double A[200][200],当然有很多数组同时,程序运行下来,告
: 诉有SegmentationFault。这个很容易试,比如
: int main()
: {
: double A[2000][2000];
: for(int i=0; i<200; i++)
: for(int j=0; j<200; j++){
: A[

avatar
a*i
13

c++的数组变量等效为指针变量。这样所有的数组操作都可以用指针操作代替。
在多数情况下,指针操作的执行效率比数组操作要高。但是使用指针很容易
出错,程序debug的时候也难找毛病。
如果不计较程序的执行效率,那是无所谓的。尤其是fortran有大量现成的科学
计算程序包,可以节省编程时间。但f77没有指针、不支持递归,在其他应用场
合用起来非常不爽;f95如何我不熟悉,但听说已经把f77改得面目全非了。

【在 x*****u 的大作中提到】
: 能否详解一二?
: 比如,c++的数组功能,如何灵活得多呢?又怎样容易出错?谢谢!
: 纯粹搞计算的话,还是首推fortran,跟使用人数关系不大吧?当然是我一点愚陋的想法
: 。
:
: 法比

avatar
Ag
14
allocate memory first, and it will be ok.
I don't know c++, only C. but same thing happened to me years ago.
use 'malloc()'

【在 x*****u 的大作中提到】
: 这个,愿闻其详。谢谢先。
: 我是这样试的:
: 构造200×200的数组,如double A[200][200],当然有很多数组同时,程序运行下来,告
: 诉有SegmentationFault。这个很容易试,比如
: int main()
: {
: double A[2000][2000];
: for(int i=0; i<200; i++)
: for(int j=0; j<200; j++){
: A[

avatar
f*r
15

Don't mislead others with totally wrong points.
Historically, C++ program is much slower than Fortran program. One major reason is
because of the usage of pointer. C/C++ compilers must assume that different
pointers might refer to the same data, thus preventing some compiler
optimizations.
Fortran is dominant in the scientific calculations not only because of those
old software packages, but also of its efficiency. At least for me. :)

【在 a**i 的大作中提到】
:
: c++的数组变量等效为指针变量。这样所有的数组操作都可以用指针操作代替。
: 在多数情况下,指针操作的执行效率比数组操作要高。但是使用指针很容易
: 出错,程序debug的时候也难找毛病。
: 如果不计较程序的执行效率,那是无所谓的。尤其是fortran有大量现成的科学
: 计算程序包,可以节省编程时间。但f77没有指针、不支持递归,在其他应用场
: 合用起来非常不爽;f95如何我不熟悉,但听说已经把f77改得面目全非了。

avatar
a*i
16

能说一下为什么会这样吗?是不是因为当时CPU的寄存器数量太少?
至少我看现在的编译器根本没这个问题啊。
至少象他刚才那个程序
for (i=0;i<2000;i++)
for (j=0;j<2000;j++)
{ ...
data[i][j]=xx
}
编译成汇编,循环体当中那句就是:
st [data+i+j], xx
其中data通常是个寄存器,i+j用另一个寄存器。地址计算需要2次加法。
而如果用指针,
pt=data[0];
for (i=0;i<2000;i++)
for (j=0;j<2000;j++)
{ ...
*(pt++)=xx;
}
那么循环体中的那句就是:
st [pt], xx
inc pt
其中pt也是一个寄存器。这样地址运算不需要加法,只需额外的一个增量运算。

【在 f****r 的大作中提到】
:
: Don't mislead others with totally wrong points.
: Historically, C++ program is much slower than Fortran program. One major reason is
: because of the usage of pointer. C/C++ compilers must assume that different
: pointers might refer to the same data, thus preventing some compiler
: optimizations.
: Fortran is dominant in the scientific calculations not only because of those
: old software packages, but also of its efficiency. At least for me. :)

avatar
f*r
17
As one example,
http://www.hlrs.de/organization/tsc/services/tools/docu/kcc/
UserGuide/chapter_4.html

【在 a**i 的大作中提到】
:
: 能说一下为什么会这样吗?是不是因为当时CPU的寄存器数量太少?
: 至少我看现在的编译器根本没这个问题啊。
: 至少象他刚才那个程序
: for (i=0;i<2000;i++)
: for (j=0;j<2000;j++)
: { ...
: data[i][j]=xx
: }
: 编译成汇编,循环体当中那句就是:

avatar
x*u
18
I think this would be a good idea. However, could you give me a simple
example, since I haven't used this function before. Thanks alot!

,告







有答
有。

【在 Ag 的大作中提到】
: allocate memory first, and it will be ok.
: I don't know c++, only C. but same thing happened to me years ago.
: use 'malloc()'

avatar
Ag
19
double **a;
a = (double **) malloc(200*sizeof(double *));
a[0] = (double *) malloc(200*sizeof(double));
for(i=0;i<200;i++){
a[i] = a[i-1]+200;
}
it's not elegant, but it should work.

【在 x*****u 的大作中提到】
: I think this would be a good idea. However, could you give me a simple
: example, since I haven't used this function before. Thanks alot!
:
: ,告
:
:
:
:
:
:

avatar
a*s
20
这正说明fortran比c适合科学计算,嘿嘿
不用担心那么多编程的问题,要是还要管那么多事情,为啥不用汇编呢?:)

【在 sc 的大作中提到】
: 把double A[2000][2000]挪到main外面去
: 最后,程序错了要自己动脑子,拿个计算器出来看看到底用掉多少内存,
: 有什么其他解决方法没有。竟然怪到C++不如fortran这种理由上去,
: 真是拉不出shi怪马桶没吸力。

avatar
h*o
21
fortran77里面连while loop都没有,害我每次
10 continue
...
...
if (blahblah) goto 10

【在 a******s 的大作中提到】
: 这正说明fortran比c适合科学计算,嘿嘿
: 不用担心那么多编程的问题,要是还要管那么多事情,为啥不用汇编呢?:)

avatar
s*i
22
stack size not enough.
try ulimit to increase it.
If you dynamically alloate the memory space, there won't be such a problem.
BTW, this problem also happens in fortran, if you don't use the heap.
The limit could be compiler dependent.

【在 x*****u 的大作中提到】
: 这个,愿闻其详。谢谢先。
: 我是这样试的:
: 构造200×200的数组,如double A[200][200],当然有很多数组同时,程序运行下来,告
: 诉有SegmentationFault。这个很容易试,比如
: int main()
: {
: double A[2000][2000];
: for(int i=0; i<200; i++)
: for(int j=0; j<200; j++){
: A[

avatar
x*u
23
great! Thanx!

,告







有答
有。

【在 s**i 的大作中提到】
: stack size not enough.
: try ulimit to increase it.
: If you dynamically alloate the memory space, there won't be such a problem.
: BTW, this problem also happens in fortran, if you don't use the heap.
: The limit could be compiler dependent.

avatar
b*s
24
use STL;
vector > A;

【在 x*****u 的大作中提到】
: 大家都用什么啊。自带的array太差,大一点就crash。特别是多维的,跟fortran没法比
: 啊。
: 请教大家都用些什么?盼复!

avatar
c*d
25
static stack 溢出所致,使用动态分配内存即可。编程语言各有所长,没有绝对的好坏
,自己觉得好就用哪个,没必要要求别人和你意见一致吧。

【在 x*****u 的大作中提到】
: 没错,同样的程序,我编了一个fortran的,
: program Array
: REAL A(2000,2000)
: INTEGER i, j
: do 100 i = 1,2000
: DO 100 j = 1,2000
: A(i,j) = 1.
: 100 continue
: end
: 用同样的机器,同样的编译器(gnu gcc's f77),没有一点问题。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。