2010-08-19 2 views
2

앞으로와 마찬가지로, 나는 Fortran과 관련하여 완전한 초보자입니다. 나는 잠시 동안 다른 질문을 보냈지 만 이와 비슷한 질문을 할 수 없었기 때문에 내 해결책이 확실하거나 이미 대답 한 경우 용서해주십시오.단순한 포트란 함수에 의해 반환 된 홀수 값

저는 VB.net 응용 프로그램에서 자체 작성된 Fortran DLL을 올바르게 구현하는 방법을 배우려고합니다. VB에서 DLL을 인식하고 오류없이 함수를 실행할 수있었습니다. 이 오류는 실제 출력과 비교하여 예상 출력과 같습니다. 다음과 같이

내 포트란 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

저는 그냥 추측입니다. 그래서 이것은 의견입니다. Import의 매개 변수가 ByRef로 정의되었으므로 상수 1을 전달하는 것이 올바르지 않을 수 있습니다. 사실, 그것은 지어서는 안된 것 같습니다. 정수를 선언하고이를 'ex'에 전달하십시오. 그 이상으로, 나는 그것이 param 문제이거나 반환 값 그 자체라면 범위를 좁히려 고 노력할 것이다. 단순히 상수를 반환하려면 함수 'ex'를 변경하십시오. 전달 된 매개 변수가 잘못되었거나 반환 값이 올바르게 반환되지 않는 경우 식별하는 데 도움이됩니다. –

답변

0

내가 바른 길에 거의 있었다, 그러나 나는 선언하는 방법은 '내가'이상한 일이 생긴다 만든 것으로 보인다.

integer*4 :: ex, i 

다음 규칙을 사용할 때이 함수는 올바른 값을 반환합니다. 그래서 내 기능은 다음과 같습니다.

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

두 분 모두 도와 주셔서 감사합니다. 나는 완전히 이해하지 못했던 언어의 일부 측면에 대해 내 눈을 열어 두 사람 모두를지지했다.

+0

이상한 일은 "i"선언에서 나온 것이 아니라 "ex"에 대한 유형 선언이 없기 때문에 기본적으로 실제가되었습니다.따라서 반환 값은 실제 값 2에 대한 비트 패턴이었으며 정수 값으로 해석되었습니다. –

2

혼합 된 언어로 된 언어를 배우는 것은 "험한 행"입니다. 얻은 가치는 2 ** 30입니다.

포트란 부분에서 함수의 반환 값도 선언해야합니다. "integer * 4 function ex (i)"는 구식 방식입니다. 아마도 암시 적 타이핑을 통해 실제적으로 전 (ex)을 얻고있을 것입니다. 암시 적 타이핑을 막기 위해 모든 프로그램과 절차에 "암시 적 없음"을 포함시키는 것이 좋습니다. 많은 컴파일러에는 같은 목적을위한 옵션이 포함되어 있습니다.

늦게 편집 : 비트 패턴 실수 값 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 
관련 문제