正如Vladimir 指出的那样,你不能在 Fortran 中直接这样做,除非你使用函数指针。您可以在下面找到一个相应的示例。
我只使用整数运算使它变得简单。另请注意,我假设您的表达式中的操作是从左到右执行的(没有优先规则),否则算法会复杂得多。如果优先级很重要,您应该考虑为任务使用解释语言(除非执行速度至关重要)。
这是定义操作的模块和包含过程指针的类型:
module myfuncs
implicit none
abstract interface
function binary(i1, i2)
integer, intent(in) :: i1, i2
integer :: binary
end function binary
end interface
type :: procptr
procedure(binary), pointer, nopass :: ptr
end type procptr
contains
function add(i1, i2) result(res)
integer, intent(in) :: i1, i2
integer :: res
res = i1 + i2
end function add
function mul(i1, i2) result(res)
integer, intent(in) :: i1, i2
integer :: res
res = i1 * i2
end function mul
function sub(i1, i2) result(res)
integer, intent(in) :: i1, i2
integer :: res
res = i1 - i2
end function sub
function div(i1, i2) result(res)
integer, intent(in) :: i1, i2
integer :: res
res = i1 / i2
end function div
end module myfuncs
这是蛮力搜索的主程序:
program bruteforce
use myfuncs
type(procptr) :: ops(4)
character :: opnames(4)
integer :: val1, val2, val3, res, myres
val1 = 1
val2 = 2
val3 = 3
res = 7
ops(1)%ptr => add
ops(2)%ptr => sub
ops(3)%ptr => mul
ops(4)%ptr => div
opnames = [ "+", "-", "*", "/" ]
lpi: do ii = 1, 4
lpj: do jj = 1, 4
myres = ops(jj)%ptr(ops(ii)%ptr(val1, val2), val3)
write(*,"(3(I0,1X,A,1X),I0)") val1, opnames(ii), val2, &
&opnames(jj), val3, " = ", myres
if (myres == res) then
write(*,*) "Solution found."
exit lpi
end if
end do lpj
end do lpi
end program bruteforce