Function result has no implicit type

后端 未结 2 887
面向向阳花
面向向阳花 2021-01-22 11:04

Below is a sample code that addresses the problem I am having. The error message I am getting is

Function result \'sample\' at (1) has no IMPLICIT type.<

2条回答
  •  我在风中等你
    2021-01-22 11:15

    In Fortran every function has a result. If you like you can think of the result as a value returned by the function. Like every other value in a Fortran program a function result has a type, and a kind and a rank too.

    By default the function result has the same name as the function itself, and its declaration is prepended to the function declaration. For example, here

    integer function add(m,n)
        integer, intent(in) :: a,b
        add = a+b
    end function
    

    the function is called add and you can see (a) that the result is of type integer (and of default kind and scalar) and (b) that the result is formed by adding the two arguments together.

    For functions returning arrays this syntax is not available, so you couldn't write something like

     integer(1:4) add_vec(m1,m2)
    

    In such cases you have to explicitly define the name (and later type and kind) of the result variable. Sticking with the simple example, something like

       function add(m,n) result(addvec)
            integer, intent(in) :: a(4),b(4)
            integer, dimension(4) :: addvec
            ....
        end function
    

    Notice that you don't define the intent of the result.

    In OP's case sample is, I think, intended to return a rank-2 array of complex values. I think OP needs to replace

    function Sample(func)   !this is line (1)
    

    with

    function Sample(func)  result(LocalF)
    

    and see how that goes. Here, if it is not evident already, you learn that the result name doesn't have to be the same as the name of the function.

    Furthermore ... Adding Real or Complex in front of function works, but I don't really get why.

    It might work in the sense of compiling, but executing it will lead to tears. By telling the compiler that the function result is either a real or complex value you satisfy the syntactical requirements for a function definition. But without assigning a (real or complex as declared) value to the result variable (called Sample in OP's code) the function will, at best, return junk.

    To be as clear as I can ... in OP's original code there were two serious mistakes:

    1. The function (result) was not given an explicit type, which lead to the compiler message shown.
    2. The function did not include setting the value of the result variable, i.e. the variable with the same name as the function (in the absence of the result clause).

提交回复
热议问题