Link Search Menu Expand Document

C++ 에서 Fortran으로 Project Path 보내기


C++에서 Fortran으로 Project Path보내는 방법에 대하여 설명합니다.

우선 아래 링크로 접속하여 샘플프로젝트를 다운 받습니다.

reference sample : ****https://github.com/EXPNUNI/enuSpace-Article/tree/maste**r**

위 링크로 접속하면 아래와 같은 화면이 나옵니다.위 화면에서 1번 2번 순서대로 마우스클릭하면 샐픔 프로젝트를 다운 받을 수 있습니다.

다운받은 압축 파일을 임의의 폴더에 풀어 주시고 sample_task폴더에 들어갑니다.

여기서 enuSpace 64비트 버전을 쓰고계신분은 ‘fortran_task_x64’를 그렇지 않은 분은 ‘fortran_task’폴더로 들어가시면 됩니다.(32비트, 64비트 버전의 설명은 동일합니다. enuSpace와 버전을 동일하게 맞춰야 task dll 이 정상 동작합니다.)

이후 task -> CoreTaskF 폴더로 들어가서 ‘CoreTask.sln’ 파일을 실행합니다.

※ CoreTask프로젝트는 2008 버전에서 생성된 프로젝트입니다.


C++) Project Path 보내는 함수 생성


CoreTask 프로젝트를 실행하고 ‘CoreTask.cpp’파일을 열어줍니다.

‘CoreTask.cpp’에서 extern “C” 부분을 찾아서 위 그림의 빨간 네모부분을 추가해 줍니다. ( void GetDllpath(char*pPath, int* strLength)

이후 소스파일 맨 아래에 위 그림과 같이 소스를 추가해 줍니다.

※ 소스

void GetDllpath(char* pPath, int* strLength)
{
char* pStr = new char[_tcslen(g_strDllPath) * 2 + 1];

WideCharToMultiByte\(CP\_ACP, 0, g\_strDllPath, \(int\)\_tcslen\(g\_strDllPath\) + 1, pStr, \(int\)\_tcslen\(g\_strDllPath\) \* 2 + 1, 0, 0\);

\*strLength = g\_strDllPath.GetLength\(\);

strncpy\(pPath, pStr, strlen\(pStr\)\);

delete\[\] pStr;

}


Fortran) Project Path 받는 서브루틴 생성


우선 Fortran 프로젝트에서 interface.f90 파일을 열어줍니다.

‘MODULE Interface_to_C_Func’ 부분으로 이동하여 위 그림의 빨간 네모와 같이 소스를 추가해줍니다.

※ 소스

     SUBROUTINE GetDllpath\(string,length\) BIND\(C, NAME="GetDllpath"\)

        USE, INTRINSIC :: ISO\_C\_BINDING, ONLY: C\_INT, C\_CHAR, C\_PTR, C\_DOUBLE

        !.. Argument list

        CHARACTER\(KIND=C\_CHAR\)     :: string\(\*\)

        INTEGER\(C\_INT\) :: length

     END SUBROUTINE GetDllpath

위 단계를 모두 수행하고, 서브루틴을 사용하고자 하는 Fortran 파일에 위 그림과 같이 Project Path를 받아올 변수를 생성합니다.

※ 변수 생성은 사용하고자하는 파일에 계속 생성해야합니다.

※ 소스

integer :: path_length

character(300) :: dll_path, file_name, full_path

common /path/ path_length,dll_path,file_name,full_path

변수 생성 후 서브루틴을 호출하려면 위 그림과 같이 호출한 후 ‘dll_path’문자열을 사용하면 됩니다.
(위 그림의 첫번째 줄에서 project path와 project path 길이를 가져옵니다. 이후 두번째 줄에서 project path 길이 만큼 문자열을 잘라서 사용할 수 있도록 하였습니다.)

※ 소스

call GetDllPath(dll_path, path_length)

dll_path = dll_path(1:path_length)