回 帖 发 新 帖 刷新版面

主题:请高手帮忙看看这个程序为什么会数组越界?

主程序
------------------------------------------------
program main
use array
implicit none
  integer,allocatable::a(:)
  integer::num
  integer::i

  call arrayin(a,num)
  write(*,*) num
  do i=1,num
    write(*,*) a(i)
  end do
end program main
----------------------------
子程序
----------------------------
module array
  contains
    subroutine arrayin(a,num)
      implicit none
      integer::num
      integer,allocatable::a(:)
      integer::i

      write(*,*)"input the length of the array"
      read(*,*) num
      allocate(a(1:num))
      write(*,*)"input each element of the array"
      do i=1,num
        read(*,*) a(i)
      end do
    end subroutine
end module
--------------------------------------------------
这只是个示例。比如输入num=3,然后输入三个数,最后输出时确实数组越界,请问高手为什么会这样。

回复列表 (共46个回复)

21 楼

[quote]看来还是没有解决问题,我再轻飘飘的说一声:请按如下关键字查找答案 
Argument Association --> Allocatable Argument; 请用支持 Fortran 2003 语法标准的编译器。

实践很重要,但若是没有理论的指导,有如无头苍蝇,到处乱撞。理论从何而来,多看书,加强 Fortran 语法的修炼。仅此而已![/quote]
我就知道你说这个

22 楼

21 楼有何高见? 有什么问题吗?

我一直觉得,要想真正学习 Fortran 语法,标准化委员会成员出的、那本解释 Fortran 标准的书最重要,我看了很多遍,总能从中学到一些东西,有些是很容易忽视的,比如上次文件输入时,能否用 1.0_8 的问题,其实 The Fortran 2003 Handbook 中有一段提及。
另外,我觉得给人以鱼不如教人以渔。现代人,应该学会自己寻找答案,这也是一种能力。

23 楼

[quote]21 楼有何高见? 有什么问题吗?

我一直觉得,要想真正学习 Fortran 语法,标准化委员会成员出的、那本解释 Fortran 标准的书最重要,我看了很多遍,总能从中学到一些东西,有些是很容易忽视的,比如上次文件输入时,能否用 1.0_8 的问题,其实 The Fortran 2003 Handbook 中有一段提及。
另外,我觉得给人以鱼不如教人以渔。现代人,应该学会自己寻找答案,这也是一种能力。[/quote]
没问题啊,我看了你开篇的内容,就预知你大体上要回复神马了……

24 楼

[quote]21 楼有何高见? 有什么问题吗?

我一直觉得,要想真正学习 Fortran 语法,标准化委员会成员出的、那本解释 Fortran 标准的书最重要,我看了很多遍,总能从中学到一些东西,有些是很容易忽视的,比如上次文件输入时,能否用 1.0_8 的问题,其实 The Fortran 2003 Handbook 中有一段提及。
另外,我觉得给人以鱼不如教人以渔。现代人,应该学会自己寻找答案,这也是一种能力。[/quote]


  其实你说得很好,现代人就该学会自己寻找答案。我自己就很在意自行寻索,不到万不得已才发言求教。但每个人都有菜鸟的阶段,有的菜鸟(如我)就是眼界没到,硬是没能把问题实质看透,怎么自己找答案都找不着,或者找到的却是不贴切、甚至不恰当的答案却不自知,那也是非常常见的情况,人之常情,实应体谅。你如果周到一点,本来一句话就能帮他拨云见日;但偏偏只是反复叫他自己找答案、自己找答案,他后来哪怕真花了很长时间获得提高、找到答案了,也与你毫不相干了。菜鸟们都自学好了,要论坛何用?

  作为被你“教“的人,我本该感激,但实际上却一点自然萌生的谢意都没有。我不为争吵而来,只想借机把我的观感说出来,希望水平高如你,能更在意教人的方式和姿态。在我眼中:

  一,你不像为授鱼而来,而只是在获取高姿态俯视新人的快感。因为你一开始的回帖既没鱼,又没“渔“,只是单纯的教训口吻,于事无补;

  二,你不像真的善于授“渔“,或者你口头说着授渔授渔,却不愿花心力把渔授好。你所恃的姿态远远超出你愿意投入的心力,这样只会令人反感。如果是一般新人看到你再度轻飘飘的提示,能无视你那种貌似淡然实在令人难受的语气、回头主动搜索就很了不起了,但结果一上Google,清一色的冗余资讯。我好不容易才想起你说的可能是《The Fortran 2003 handbook》但其他人呢?——你宁愿说大段大段教训人的话,却不愿把新人最需要的、最关键的参考读物名字说出,教训来教训去却不能一语中的,将“渔“授好,试问这么“周到”的“渔“技,谁愿接受?

  三,你依然没能直指关窍。楼主的状况是仅支持到F95的CVF编译通过,运行却出错,换用支持F03的IVF才解决问题。你本应把两个编译器支持的Fortran标准点明,再指出可以对比参考95,03在“Allocatable Argument”语法上的有无和区别。因为这本不是什么新手级的问题,如果你足够周到的话,你可以直接把鱼授了,再给出进一步学习的建议。而实际上,你只给出了一个无关痛痒的答复,这完全不是授渔之道。

  我只是论坛上的新人,在Fortran上也仅是刚过了门槛,本没资格说三道四的。何况你愿意指点新人已经很难能可贵,没人能再苛求你什么。但既然已经走过了最初的那阶段,而且愿意给后来者做些帮助,更说下了“给人以鱼不如教人以渔”这样高难度、大功德的豪言,何不做得更好?

25 楼

LS莫怪。asymptotic使用的编译器是intel的,喜欢以标准论述问题……
当然这个喜欢是褒义词……

26 楼

[quote]LS莫怪。asymptotic使用的编译器是intel的,喜欢以标准论述问题……
当然这个喜欢是褒义词……[/quote]

  不是怪啦,只是建议。一直以来,我都从你们的回帖学到很多东西。上次在教材推荐那贴,我看了asymptotic的回复才对《F03 handbook》重视起来。

  但由于我自己就很在意“鱼渔之授“的方式,而出言“授渔”的asymptotic的风格却并不太有亲和力(在我看来)。所以中枪的俺就借机反馈了。料想某些新人也会有类似的观感。但网上很浮躁,别人脾气一上来,一不小心就吵起来了,这样就于是无补了。如果你们这些老鸟因此反而销声匿迹,更是莫大损失。那样还不如我来尝试坦诚的把话说白,哪怕最终没有形成建设性的效果,至少不会吵翻天。

  嗯,其实顺便发泄一下小小的不满也是个理由~

27 楼

行了,别总是引用我的话,又不是毛主席语录,有什么好接二连三的引用的呢?我不喜欢针对谁,对事不对人,既然你觉得我说你--需要修炼 Fortran 语法不对,那就当我说错了,我现在改为: 阁下水平很高了,无需再看语法基础了。

另外,我一直同意这么一个观点:不要把 BBS 当成幼儿园,对基础问题的自行学习胜过请教任何高手。

28 楼

哈哈,其实asymptotic兄是一个很严谨的人,回贴其实也很愿意有根有据的旁征博引。
当然,他确实不是很在意语气问题,之前我也曾误会过他:)

但如果福特恐龙兄看看以前asymptotic兄的回贴就不难发现,他的回帖是很有质量的(不像我这种鼠辈回的大部分是水)。不过近来确实很些新来的人(不仅仅是F区)提问题时似乎不愿意自己先想想,且问题确实很小很基础,大概这样的帖子看长了谁也没味口了,asymptotic兄只是苦口婆心的让他们多自己想想而已。

其实如果问问题的人说:我遇到了某某问题,我分析估计应该是怎么怎么回事儿,但却不得要领,望大家能帮分析分析。
这样的问题相信大家都愿意看见,因为这样问问题的同样可能是菜鸟,但他用脑子了!哪怕是作业贴,这样的帖子大家还是愿意回复的:)

29 楼

谢谢,我是楼主。我之前用cvf6.6编译能够通过,但是程序执行时会数组越界。现在我又用ivf编译试了一下,这次没问题。看来在子程序里使用动态分配数组能不能够成功,与编译器也有关系。 lv包
http://www.lvbao1688.com 
  

30 楼

asymptotic兄是比较严谨, 每一个程序都力求尽善尽美. 我觉得pfan这里用fortran的人方向不同, 侧重点也不同, 也没所谓那个更对一些.

我来回复

您尚未登录,请登录后再回复。点此登录或注册