Passing scalars and array elements to a procedure expecting an array

后端 未结 1 1117
天涯浪人
天涯浪人 2021-01-22 04:45

I have some legacy Fortran 77 code which I\'m trying to at least compile without warnings (without disabling warnings). There are subroutine calls that pass a scalar where subro

相关标签:
1条回答
  • 2021-01-22 05:40

    In your attempted solution the type-kind-rank generic resolution will delegate all array elements to the scalar version of the subroutine and that will not do the intended work on the part of the array. So "The intended behaviour is that both should use readn_a." is not really possible with the approach you chose.

    Well, it is possible when you rewrite the code to pass array sections as you noted yourself. But we are again at the same problem as we were before, you example is simplified. We can be certain there there is no temporary array in the example you have shown, we definitely can't say that about your real code. If you use some 2D subsections starting at some random place, you will have temporary arrays for sure and it might be difficult to make the correct subsection at all.

    The original warning should be reasonably easy to avoid in your original legacy code. FORTRAN 77 has no non-contiguous arrays so if you keep your arguments to be integer :: a(*) instead of integer :: a and pass that further. If your original variable is scalar, that is a problem.


    The problem is that an integer scalar does not constitute an element sequence:

    F2008 12.5.2.11 1 An actual argument represents an element sequence if it is an array expression, an array element designator, a default character scalar, or a scalar of type character with the C character kind (15.2.2). ...

    An array element designator a(2) is an element sequence but the scalar n is not.

    So it is not allowed for sequence association which is used when an array element is passed:

    F2008 12.5.2.11 4 An actual argument that represents an element sequence and corresponds to a dummy argument that is an array is sequence associated with the dummy argument if the dummy argument is an explicit-shape or assumed-size array. ...

    Your code is not strictly standard Fortran conforming, but very likely to work as expected if you manage to compile it.


    Possible solutions:

    • You can pass the argument as an array expression, but the argument may not be modified inside the subroutine

      call readn_a([n],1)

    • You can just disable the warnings about interface matching

      ifort -warn nointerfaces

    • You can create separate subroutines which only work for scalars and call it under some different name.

    • You can also disable argument checking for that dummy argument by an Intel Compiler directive

      !DEC$ ATTRIBUTES NO_ARG_CHECK :: dummy-arg-name

    0 讨论(0)
提交回复
热议问题