回 帖 发 新 帖 刷新版面

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

主程序
------------------------------------------------
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个回复)

11 楼

刚看了下,fortran2003标准中的可分配数组可以通过直接的赋值语句进行分配,ivf可以编译应该与此有关。

12 楼

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

13 楼

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

14 楼

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

15 楼

[quote]刚看了下,fortran2003标准可以直接用赋值语句进行分配,ivf可以编译应该与此有关。[/quote]

不是赋值语句,是子程序的形参传址调用,至少从F90开始,就有楼主这样的用法。我有点怀疑是他所用的系统或vs与cvf不兼容,如果是Vista或者Win7总有或这或那的毛病,防不胜防,不知理由。

16 楼

[quote][quote]谢谢。我之前是用cvf编译出错的,现在我又用ivf试了一下,发现没错。看来这跟编译器也有关系。
我是新手,之前把彭国伦写的《fortran95程序设计》看了几遍。现在又听人说fortran95的标准落后了。请问能不能推荐一两本讲比较新的fortran标准的书?[/quote]


你可以在论坛上翻一翻我写的Fortran入门三部曲。其实,F95不落后,新标准的新特性反而用得不多,起码在我们学校,还有很多实验室停留在F77的层次呢……[/quote]
如果一套程序在涉及初期引入新版本功能对于将来扩展使用一定是一件好事。
fortran2003/2008标准里面的功能还是很好用的,譬如简单面向对象编程、再譬如针对并行计算的一些改进。
我在这方面做了不少尝试,感受颇深。

17 楼

现在f2003的最大的意义在于ISO_C_BINDING模块
未来的世界肯定是混合编程的天下

18 楼

[quote][quote][quote]谢谢。我之前是用cvf编译出错的,现在我又用ivf试了一下,发现没错。看来这跟编译器也有关系。
我是新手,之前把彭国伦写的《fortran95程序设计》看了几遍。现在又听人说fortran95的标准落后了。请问能不能推荐一两本讲比较新的fortran标准的书?[/quote]


你可以在论坛上翻一翻我写的Fortran入门三部曲。其实,F95不落后,新标准的新特性反而用得不多,起码在我们学校,还有很多实验室停留在F77的层次呢……[/quote]
如果一套程序在涉及初期引入新版本功能对于将来扩展使用一定是一件好事。
fortran2003/2008标准里面的功能还是很好用的,譬如简单面向对象编程、再譬如针对并行计算的一些改进。
我在这方面做了不少尝试,感受颇深。[/quote]


  那是,我自己就用操作封装这类OOP手段来写程序,阅读维护起来很方便。

19 楼

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

20 楼

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

实践很重要,但若是没有理论的指导,有如无头苍蝇,到处乱撞。理论从何而来,多看书,加强 Fortran 语法的修炼。仅此而已!

我来回复

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