2016-10-11 59 views
1

如果您查看內部函數CEILING的定義,則它具有可選參數KIND,該參數可用於強制返回值的整數種類。返回類型取決於參數的Fortran函數

是否有任何方法可以在Fortran中實現我自己的函數,使函數的返回值的類型或更好取決於參數?我已經試過這樣的事情:

program test_kind 
    use iso_fortran_env 
    implicit none 
    integer(kind=int32) :: a 
    print*, kind(a) 
    print*, kind(kt(int16)) 
    print*, kind(kt(int32)) 
contains 
    function kt(kind) 
     implicit none 
     integer, intent(in) :: kind 
     integer(kind=kind) :: kt 
     kt = 100 
    end function kt 
end program test_kind 

但它失敗,錯誤:

test_kind.f90:12:21: 

     integer(kind=kind) :: kt 
        1 
Error: Parameter ‘kind’ at (1) has not been declared or is a variable, 
which does not reduce to a constant expression 

現在我知道我可以使用過程重載具有取決於類型不同的程序相關聯的同名的論據。但我在問,返回值的類型是否取決於參數的

+0

它必須是一個功能嗎?子程序的可選參數(每種)都可以工作嗎? – Ross

+0

@Ross我沒有一個特定的應用程序,我現在需要在這個時間點。 – chw21

回答

2

不可以使用標準語言,如F2015草案。內在程序在這方面是特殊的。

作爲數據對象的僞參數始終是非內在過程中的變量。

種類參數必須由常量表達式給出,變量不是常量。提名範圍內的對象類型的規則實際上更具限制性。

0

或...將您的功能打包到一個模塊中,並具有所有KT的風味。

MODULE KTM 
use iso_fortran_env 
implicit none 
PRIVATE 
INTERFACE Kinder 
    MODULE PROCEDURE kt_byte, kt_int !kt_long, kt_long_long 
END INTERFACE Kinder 
PUBLIC Kinder 
contains 
    function kt_byte(kind_In) 
     implicit none 
     integer(KIND=int8_t), intent(in) :: kind_In 
     integer(kind=int8_t)    :: kt_byte 
     kt_byte = 100 
    end function kt_byte 

    function kt_Int(kind_In) 
     implicit none 
     integer(KIND=int16_t), intent(in) :: kind_In 
     integer(kind=int16_t)    :: kt_Int 
     kt_Int = 200 
    end function kt_Int 

    function kt_long(kind_In) 
     implicit none 
     integer(KIND=int32_t), intent(in) :: kind_In 
     integer(kind=int32_t)    :: kt_long 
     kt_long = 400 
    end function kt_long 

    function kt_8B(kind_In) 
     implicit none 
     integer(KIND=c_long), intent(in) :: kind_In 
     integer(kind=c_long)    :: kt_8B 
     kt_8B = 800 
    end function kt_8B 
end MODULE KTM 

然後在您需要的KT功能的各種口味的使用模塊...

program test_kind 
use iso_fortran_env 
USE KTM !make sure it is in the -I<path> and/or some -L<path> -l<lib> 
implicit none 
integer(kind=int32) :: a 
integer(kind=int16_t) :: b 
integer(kind=int8_t) :: c 
integer(kind=int64) :: d 
integer(kind=c_long) :: e 
REAL :: f 
print*, kinder(a) 
print*, kinder(b) 
print*, kinder(c) 
print*, kinder(d) 
print*, kinder(e) 
!The following line will give a compile error 
!print*, Kinder(f) 
end program test_kind 

或者如果它是不常用的庫中,然後把模塊前面的程序並遵循它與程序...在一個單一的文件。

+1

*「現在我知道我可以使用過程重載來根據參數的類型使用相同的名稱與不同的過程相關聯,但是我想知道返回值的類型是否可以取決於參數「。* –

+0

我的意思是,如果你想展示它,保留你的例子,但至少試着回答被問到的問題。 –

相關問題