2010-08-19 70 views
2

就像前鋒一樣,在Fortran中,我是一個完整的初學者。我花了很長時間來看看其他問題,但我無法找到類似的問題,所以請原諒我,如果我的解決方案是明顯的,或已經被回答:)通過簡單的Fortran函數返回的奇數值

我是試圖學習如何在VB.net應用程序中正確實現一個自寫的Fortran DLL。我已經能夠讓VB識別DLL,並且沒有任何錯誤地執行該函數。與實際產出相比,錯誤來自預期產出。

我Fortran的DLL函數如下:

function ex(i) 
    integer*4 i 
    ex=i+1 
    return 
end 

一個非常簡單的函數,每次遞增傳遞的參數和返回值。 (我認爲)。 VB應用程序有以下代碼。

<DllImport("ex.dll")> _ 
Public Shared Function ex(ByRef val As Integer) As Integer 
End Function 


Private Sub btn_Fortran_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Fortran.Click 
    Console.WriteLine(ex(1)) 
End Sub 

所以,我通過ex函數的整數值1.所以我期望值2寫入控制檯。相反,我得到的值「1073741824」不完全相等。任何想法,我明顯不足?

+1

我只是猜測,所以這是一個評論。但是,似乎傳遞常量1可能不正確,因爲導入參數被定義爲ByRef。事實上,在我看來,它不應該建立。嘗試聲明一個整數並將其傳遞給'ex'。除此之外,如果它是一個param問題或返回值本身,我會試圖縮小範圍。改變你的函數'ex'來簡單地返回一個常量;這可能有助於確定傳入的參數是否錯誤或返回值是否無法正確恢復。 – 2010-08-19 23:06:41

回答

0

看來,我幾乎是在正確的軌道上,但是我聲明的方式「我」做了一些奇怪的事情發生了。當使用

integer*4 :: ex, i 

以下約定函數返回正確的值。所以,我的功能看起來像這樣

function ex(i) 
    integer*4 :: ex, i 
    ex=i+1 
    return 
end function 

謝謝你們的幫助。我提高了你們兩個人的看法,因爲我只是對我之前並不完全瞭解的語言的某些方面開放眼界。

+0

奇怪的東西不是來自「我」的聲明,而是缺少「ex」的類型聲明,默認情況下它變成了真實。所以返回值是實數值2的位模式,然後將其解釋爲一個整數。 – 2010-08-22 16:12:05

2

在混合語言內容中學習一門語言是「鋤頭難排」。請注意,您獲得的價值是2 ** 30。在fortran部分,你還應該聲明函數的返回值:「integer * 4 function ex(i)」是老式的方式。你可能通過隱式輸入而變得真實。在所有程序和程序中包含「隱式無」是一個非常好的主意,以防止隱式鍵入。許多編譯器都包含一個用於相同目的的選項。

延遲編輯: 下面是一個程序,演示了當位模式實數值2.0被解釋爲一個整數時,獲得什麼值時發生了什麼。首先,程序等同於一個實數和一個整數。在這種情況下,編譯器「知道」類型並轉換該值。在第二種情況下,原始位模式被傳送而不被轉換。

program test_tc 

    real :: my_real 
    integer :: my_int 

    my_real = 2.0 

    my_int = my_real 
    write (*, *) my_int 

    my_int = transfer (my_real, my_int) 
    write (*, *) my_int 

end program test_tc 

輸出是:

  2 
    1073741824