Fortran模块分段错误-GNUFOR

时间:2018-07-21 11:02:41

标签: fortran gnuplot

我需要一个用于Fortran的特殊库,以便我可以即时进行编码和可视化,而不是写入文本文件,然后使用Python或Matlab进行绘制。我遵循了这个:

https://people.sc.fsu.edu/~jburkardt/f_src/gnufor/gnufor.html

指令没有被清除,所以我没有使用它们的示例,所以我编写了自己的代码。有2个文件:网站上的 gnu.f90 和我写的 myplot.f90

program myplot


    !Declare data types
    implicit none
    integer, parameter :: N1 = 50
    real(kind=8)       :: x1(N1),x2(N1)
    real(kind=8)       :: y1(N1)
    real(kind=8)       :: y2(N1)
    integer            :: i

    !Generate 2D plot

    do i = 1,N1
        x1(i) = i
        x2(i) = i
    end do

    y1 = x1**2
    y2 = x2**3

    !print *, 'Plotting'
    !call plot(x1,y1,x2,y2)

    call write_xy_data(x1,y1)   

end program myplot

显然,从他们的 gnufor.f90 文件中,我只需要执行以下操作:

write_xy_data(X,Y),它应该可以工作。在他们的示例代码中,他们没有将gnufor.f90用作模块,所以我没有提出:在开始时使用gnufor。虽然,我尝试过,但效果也不佳。因此,在当前目录中,我有:

gnufor.90 myplot.f90

要编译它,我在Linux上:gfortran myplot.f90 -o test 错误是:

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

    Backtrace for this error:
    #0  0x7FB0B051DE08
    #1  0x7FB0B051CF90
    #2  0x7FB0AFF574AF
    #3  0x40302F in write_xy_data_
    #4  0x400D7E in MAIN__ at myplot.f90:?
    Segmentation fault (core dumped)

任何帮助将不胜感激。我希望问题出在我自己的代码中,尽管声明了所有数组大小。

1 个答案:

答案 0 :(得分:3)

所链接网站的 gnufor.f90 中的子例程write_xy_data具有签名

subroutine write_xy_data(data_filename, n, x, y, ierror)
    implicit none
    character ( len = * ) data_filename
    integer ( kind = 4 ) n
    real ( kind = 8 ) x(n)
    real ( kind = 8 ) y(n)
    integer(kind = 4) ierror

这意味着您不必将其仅传递x,y,而必须将其称为

call write_xy_data('myfile',N1,x1,y1,ierr)

将要写入的文件名(在示例中为'myfile'),要写入的点数(N1),数据(x1,y1)和整数,该整数承载有关写入成功的信息(ierror,也必须声明此值)

此外,由于没有模块gnufor,因此不需要use子句, gnufor.F90 中的所有功能都是全局的,这也是您需要此功能的原因将点的数量作为额外的参数传递,因为假定的形状需要一个显式的接口。