【问题标题】:Segmentation fault - invalid memory reference in Fortran分段错误 - Fortran 中的内存引用无效
【发布时间】:2017-12-18 12:20:02
【问题描述】:

最近我在 Fortran 代码中收到以下错误

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x2AD9B0F8FE08
#1  0x2AD9B0F8EF90
#2  0x2AD9B12D44AF
#3  0x401A3E in MAIN__ at tstreadin.f90:?

我的代码如下

Program www

 implicit none
 integer ::i,j,rows,cols,row
 real(kind=8) ::x,y,z
 real(kind=8),allocatable::mat(:,:),xrange(:),yrange(:)
 real(kind=8),allocatable::pot_bar(:,:),acc_bar_x(:,:),acc_bar_y(:,:)
 real(kind=8),allocatable::pot_sph(:,:),acc_sph_x(:,:),acc_sph_y(:,:)
 rows=2250000
 cols=8
 row=1500
 allocate(mat(cols,rows))
 allocate(xrange(row),yrange(row),pot_bar(row,row))
 allocate(acc_bar_x(row,row),acc_bar_y(row,row))
 allocate(pot_sph(row,row),acc_sph_x(row,row),acc_sph_y(row,row))
 open(24,file='pot.txt',status='old',form='Formatted', access='SEQUENTIAL')
 do i=1,rows,1
    read(24,*)mat(:,i)
 enddo
 close(24)
 do i=1,rows,row
    xrange(i)=mat(1,i)
 enddo
 do i=1,row,1
    yrange(i)=mat(2,i)
 enddo
 do i=1,row,1
    do j=1,row,1
       pot_bar(j,i)=mat(3,j+(i-1)*1500)
       acc_bar_x(j,i)=mat(4,j+(i-1)*1500)
       acc_bar_y(j,i)=mat(5,j+(i-1)*1500)
       pot_sph(j,i)=mat(6,j+(i-1)*1500)
       acc_sph_x(j,i)=mat(7,j+(i-1)*1500)
       acc_sph_x(j,i)=mat(8,j+(i-1)*1500)
    enddo
 enddo
 print*,xrange
 print*,yrange
end Program www

我想将数据从 ASCII 配置文件输入到数组中,所以我编写了测试代码。这是我第一次使用 Fortran,我完全不明白为什么会出现错误。

【问题讨论】:

  • 欢迎您,请拨打tour。在您的编译器中启用调试检查以轻松识别错误。在 gfortran 手册中了解标志 -g -fbacktrace -Wall -fcheck=all。它们非常有用。显示错误消息时,应始终使用-g 标志。请注意,kind=8 是一种丑陋的坏习惯,并且使代码不可移植。 8 并不意味着所有编译器都具有双精度。见stackoverflow.com/questions/838310/fortran-90-kind-parameter

标签: arrays segmentation-fault fortran


【解决方案1】:

数组xrange 只分配了1500 个元素。但是在下面

do i=1,rows,row
   xrange(i)=mat(1,i)
enddo

您正试图访问索引远大于 1500(行数 >> 1500)的 xrange 元素。因此无效的内存引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2014-06-01
    • 2021-07-01
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多