Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Fortran中,是否可以将整数链接到过程(子程序或函数)?_Fortran_Fortran2003 - Fatal编程技术网

在Fortran中,是否可以将整数链接到过程(子程序或函数)?

在Fortran中,是否可以将整数链接到过程(子程序或函数)?,fortran,fortran2003,Fortran,Fortran2003,我正在写一个Fortran程序来解决Euler项目的问题。在我的实现中,每个问题都是一个函数,例如: character(len=20) function euler_problem_0001() use some_external_lib ... end function euler_problem_0001 如果我打印这个函数,我就会得到答案 print *, euler_problem_0001() 现在我已经完成了很多问题,我发现一遍又一遍地写print*,euler

我正在写一个Fortran程序来解决Euler项目的问题。在我的实现中,每个问题都是一个函数,例如:

character(len=20) function euler_problem_0001()
    use some_external_lib
    ...
end function euler_problem_0001
如果我打印这个函数,我就会得到答案

print *, euler_problem_0001()
现在我已经完成了很多问题,我发现一遍又一遍地写
print*,euler\u problem\u xxxx()
有点乏味。所以我的问题是:有没有一种方法可以构造一个派生类型,将一个整数(问题的数量)与实际过程联系起来?类似这样的方法

type, public :: int_to_proc
    character(len=:) :: proc_name 
    procedure(proc_x), pointer :: proc_p 
end type int_to_proc
如果我用一个整数初始化类型

call int_to_proc%init(2)
然后,类型绑定过程指针将指向函数
euler\u problem\u 0002()
。在这种情况下,我只需要写一个类似的循环

type(int_to_proc) :: prob

do i = 1, 500
    call prob%init(i)
    print *, prob%proc_p()
end do 

不是写500行的
print*,而是euler\u problem\u xxxx()
。此外,也欢迎进行任何变通。谢谢

您可以使用过程指针。想法:1。为不带参数且返回
字符(len=20)
结果的过程定义一个接口。2.使用这样的过程定义用户定义的类型。3.定义say类型的数组。4.用结果填充数组。现在,您可以在该数组上循环并调用包含的过程。@Pierredebyl嗨,谢谢您的回复!我试图实现您的想法,但我发现在步骤4中,我仍然必须使指针数组的每个元素指向相应的过程,例如
ptr\u-arr(1)%proc\u-ptr=>prob0001
ptr\u-arr(2)%proc\u-ptr=>prob0002
,等等。现在我必须编写500行指针赋值,而不是500行
print*,
,和一个循环。嗯……没有完美的解决方案:-)不过,您可以生成该代码以避免重复性。@Pierredebyl谢谢。我想解决办法是编写另一个Fortran程序,自动生成所有指针分配,将它们写入头文件,然后将头文件包含在程序中。在本例中,我仍然有这500行代码,但至少我不必自己编写它们。您甚至可以将代码复制粘贴到程序文件或模块子例程中。在某种程度上,会有一个对这500个例程的某种引用:-)