Date : 12-06-29 10:32
Visual Basic-FORTRAN Mixed Programming
 Author : 07 (112.♡.115.149)
Views : 9,410   recommend : 0  
   http://yoonc.tistory.com/4 [2942]
Visual Basic-FORTRAN Mixed Programming
http://yoonc.tistory.com/4

1. DLL(Dynamic Linked Library) 프로그래밍

(1) 프로그래밍 언어에서의 라이브러리(Library)라 함은 함수(Function)의 집합을 의미한다.

프로그램을 작성할 때 다음의 과정을 거친다.

[프로그램 작성] --> [컴파일(Compile)단계] --> [링킹(Linking)단계] -- [바인딩(Binding)단계]

여기서 링킹단계는 사용한 라이브러리 함수, 참조하는 루틴을 서로 연결하고 실행에 필요한 정보를 덧붙여 실제로 실행가능한 코드를 생성한다.

 

(2) 정적링크(Static Link)와 동적링크(Dynamic Link)

- 정적링크 는 애플리케이션에서 사용한 라이브러리 루틴을 연결하는데 실제로 라이브러리 파일에서 필요한 루틴을 뽑아서 애플리케이션에 덧붙여 완전한 독립된 실행 파일을 만드는 것이다.

- 동적링크 는 링크 과정에서 라이브러리의 코드를 실제로 애플리케이션에 덧붙이는 것이 아니라 단지 라이브러리와 어떻게 연결되어야 한다는 정보만을 덧붙이게 된다. 실제로 링크는 애플리케이션이 실행되는 순간 이루어진다.

 

(3) DLL(Dynamic Linked Library)의 개념

DLL은 여러 개의 애플리케이션에서 동적으로, 즉 실행 과정 중에 연결하여 사용할 수 있는 라이브러리이다.

DLL 파일을 사용하는 애플리케이션(.EXE)과는 별도로 생성되며, 저장되는 일종의 이진(Binary) 파일이며, 애플리케이션과 동적으로 링크되어서 사용된다. 또한 이러한 DLL 파일에는 여러 개의 모듈과 함수 그리고 리소스들을 포함할 수 있다.

 

 

Fortran/Visual Basic Mixed-Language 프로그램

1. Passing Arguments in Mixed-Language Programming

By Value
By Reference
예1) 포트란(Fortran)/비주얼베이직(Visua Basic) 예제

--- 포트란(Fortran)에서 DLL 생성 (Testproc.dll) ---

SUBROUTINE Testproc (ValX, RefY)
    !DEC$ ATTRIBUTES VALUE :: ValX
    !DEC$ ATTRIBUTES REFERENCE :: RefY

    INTEGER ValX
    INTEGER RefY

    ......

END SUBROUTINE

--- 비주얼베이직에서 ---

' # 비주얼베이직 표준모듈에서 선언 #

 Declare Sub Testpoc Lib "Testproc" (ByVal ValX As Long, RefY As Long)


' # 비주얼베이직 폼모듈에서 호출 #

  Dim ValX, RefY As Long

  Call Testproc(ValX, RefY)

 

 

# Passing Arguments by Reference and Value

언어(Language)

참조에 의한 전달

값에 의한 전달

Fortran Default VALUE
Visual Basic Default ByVal
 

2. Mixed-Language 프로그램에서 데이터형의 조절

Fortran 데이터형

Visual Basic 데이터형

C 데이터형

 INTEGER(1) --- char
 INTEGER(2) Integer short
 INTEGER(4) Long int, long
 REAL(4) Single float
 REAL(8) Double double
 CHARACTER
 

 

디지털 비주얼 포트란(Digital Visual Fortran)을 이용한 동적연결라이브러리(DLL) 만들기

디지털 비주얼 포트란에서

(1) 새 프로젝트 생성

[File] --> [New] 를 클릭한다.
<Projects> 텝에서 [Fortran Dynamic Link Library]을 선택한 후,
 프로젝트가 생성되는 위치(location)를 조정하고 프로젝트명(Project Name) "Stat" 을 입력하고 [OK]를 클릭한다.
[An empty DLL application]을 선택하고 [Finish]를 클릭한 후 [OK]하면 빈 새프로젝트가 생성된다.
(2) 프로젝트에 Fortran 코드 추가

[Project] --> [Add to project] --> [New]를 클릭한다.
<Files> 텝에서 [Fortran Free Format Source File]를 선택한 후,
파일명(File) "Descriptive"를 입력하고 [OK]를 클릭한다.
다음의 서브루틴을 입력한다.(평균 구하기)
SUBROUTINE Average(Num, XData, Ave)
  !DEC$ ATTRIBUTES DLLEXPORT :: Average
  !DEC$ ATTRIBUTES ALIAS : 'Average' :: Average

  INTEGER, INTENT(IN) :: Num
  REAL, INTENT(IN) :: XData(Num)
  REAL, INTENT(OUT) :: Ave

  Ave=0.0
  DO i=1, Num
      Ave = Ave + XData(i)
  END DO
  Ave = Ave/Num

END SUBROUTINE
(3) DLL 생성

컴파일(Compile) : [Build] --> [Compile descriptive.f90]
DLL 생성(Build dll) : [Build] --> [Build stat.dll]
이 과정을 마치면 Fortran 프로젝트 폴더의 Debug 폴더에 "stat.dll" 파일이 생성되어있다.

비주얼 베이직에서 이 DLL 파일 "stat.dll"을 이용하면 된다.

비주얼베이직에서 DLL 이용하기

비주얼베이직에서

(1) 새 프로젝트 새성

폼에 버튼을 추가한다.
(2) DLL의 서브루틴 선언

새 모듈을 추가한다.
다음과 같이 서브루틴을 선언한다.
 Declare Sub Descriptive Lib "Stat" (Num As Long, XData as Single, Ave as Single)
주의1 : DLL에서 선언된 서브루틴명(Descriptive)과 데이터형이 동일해야 한다.
주의2 : DLL 파일(Stat.dll)이 있는 폴더명을 명확히 표시한다. 표시되어 있지 않으면 Windows의 System32 폴더에서 DLL 파일이 있어야 한다.
(3) 폼 모듈에서 서브루틴을 호출

'버튼 클릭 이벤트 프로시저

 Dim Num as Long
 Dim XData() as Single
 Dim Ave as Single

 .....

 Call Descriptive(Num, XData(1), Ave)

 MsgBox "평균 : " & Ave

 
 

Total 11
No Topic Author Date Views Recommend
11 Fortran-GUI- Xeffort library. 07 06-29 6334 0
10 High Performance Parallel Computing Training 07 06-29 5483 0
9 Visual Basic-FORTRAN Mixed Programming 07 06-29 9411 0
8 DIGITAL Fortran 90 User Manual for DIGITAL UNIX Systems 07 11-11 7432 0
7 google map api - 3d insert examples 07 09-13 5387 0
6    google map api - 3d insert examples 07 09-13 5564 0
5 android - developers code site 07 09-08 5295 0
4 Algorithm Cross Correlation, AutoCorrelationby Paul Bourke 07 09-07 22858 0
3 C / FORTRAN / John Burkardt CODES EXAMPLE......SITE LINK 07 09-07 6819 0
2 HTML HTTP / How to Prevent Your Site or Certain Subdirectori… 07 09-05 9404 0
1 Javascript, html, php : access though 07 09-05 5544 0

Warning: Unknown: open(../data/session/sess_e511a8eccb4b2ea2fe78a15c2fb5b21e, O_RDWR) failed: No such file or directory (2) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (../data/session) in Unknown on line 0