Почему внутренняя функция exp не работает при передаче в качестве аргумента в Fortran? [Дубликат]

http://docs.python.org/2/library/json.html

JSON может решить эту проблему, хотя его декодер хочет получить двойные кавычки вокруг ключей и значений. Если вы не против замены hack ...

import json
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
json_acceptable_string = s.replace("'", "\"")
d = json.loads(json_acceptable_string)
# d = {u'muffin': u'lolz', u'foo': u'kitty'}

Учтите, что если у вас есть одинарные кавычки в качестве части ваших ключей или значений, это не будет выполнено из-за неправильной замены символа. Это решение рекомендуется только в том случае, если у вас есть сильное отвращение к eval-решению.

Подробнее о json single quote: jQuery одинарная кавычка в ответе JSON

8
задан milancurcic 22 September 2016 в 16:00
поделиться

2 ответа

Нет, это запрещено. На самом деле, вы даже не можете передавать общие функции INTRINSIC в качестве фиктивных аргументов.

Стандартный способ - это использовать прямые конкретные функции напрямую. С помощью функций INTRINSIC вы иногда должны писать оболочку для правильного типа, когда конкретный не имеет стандартного имени.

Например:

  call integrate(derf,0.,1.)

  contains
    function derf(x)
      real(dbl) :: derf
      real(dbl), intent(in) :: x
      derf = erf(x)
    end function
  end

необходимо, если вы хотите передать реальную (или любую другую) версию с двойной точностью erf(), поскольку нет никакой конкретной функции.

7
ответ дан Vladimir F 17 August 2018 в 23:53
поделиться
  • 1
    Всегда ясно и точно, спасибо. – milancurcic 22 September 2016 в 16:14
  • 2
    Я прокомментирую, что использование специальных функций станет нестандартным в Fortran 2015. В этот момент не будет возможности передать внутреннюю функцию в качестве аргумента процедуры и использовать метод обертки для обеспечения соответствия стандартам. (Я также отмечаю, что никаких новых конкретных имен для встроенных функций не было добавлено со времен Fortran 95.) – Steve Lionel 22 September 2016 в 17:07

Стандарт Fortran не позволяет передавать общие процедуры в качестве аргументов. Чтобы передать внутренние функции / подпрограммы, нужно прибегнуть к пользовательским процедурам обертки.

module mymod

    ! Explicit typing only
    implicit none

    ! Declare procedure interface
    interface
       function my_func(x, y) result (return_value)
         real, intent(in) :: x, y
         real             :: return_value
       end function my_func
    end interface

contains

    function func1(x) result (return_value)
       real,intent(in) :: x
       real            :: return_value

       return_value = 2*x

    end function func1

    function func2(x, y) result (return_value)
       real, intent(in) :: x, y
       real             :: return_value

       return_value = 2*x + 3*y

    end function func2

    function func3(user_defined_func, x, y) result (return_value)
       procedure(my_func)  :: user_defined_func
       real, intent(in)    :: x, y
       real                :: return_value

       return_value = user_defined_func(x,y)

    end function func3

end module mymod

program main

    use ISO_Fortran_env, only: &
       stdout => OUTPUT_UNIT, &
       compiler_version, &
       compiler_options

    use mymod

    ! Explicit typing only
    implicit none

    write (stdout, *) func3(func2, 2.0, 3.0)
    write (stdout, *) func3(foo, 2.0, 3.0)
    write (stdout, *) func3(my_atan2, 2.0, 3.0)

    print '(/4a/)', &
    ' This file was compiled using ', compiler_version(), &
    ' using the options ', compiler_options()

contains

    ! A user defined function
    function foo(x, y) result (return_value)
       real, intent(in) :: x, y
       real             :: return_value

       return_value = 42

    end function foo

    ! A wrapper function to invoke the intrinsic atan2
    function my_atan2(x, y) result (return_value)
       real, intent(in) :: x, y
       real             :: return_value

       return_value = atan2(x,y)

    end function my_atan2

end program main

дает

gfortran -std=f2008ts -o main.exe  mymod.f90 main.f90
./main.exe
   13.0000000    
   42.0000000    
  0.588002622    

 This file was compiled using GCC version 6.1.1 20160802 using the options -mtune=generic -march=x86-64 -std=f2008ts
2
ответ дан jlokimlin 17 August 2018 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: