2017-10-04 2 views
1

Fortran 프로그램 내에서 export $VAR=3 명령을 실행하고 싶습니다. 불행하게도 서브 루틴 system은 처리 할 수 ​​없습니다. VAR의 초기화를 수행하는 방법을 알려주십시오. ifort 버전 11.1을 사용하고 있습니다.Fortran 프로그램에서 bash 명령 "export"를 실행하는 방법은 무엇입니까?

+0

어떤 포트란을 사용하고 계십니까? '90' 또는'95' 또는 인텔의 것? – SteveFest

+0

포트란 95를 사용하고 있습니다. – Roloka

+0

답변을 알고 있습니까? – Roloka

답변

0

인텔 포트란에서 비표준 확장자 SETNVQQ을 사용하거나 적절한 운영 체제 기능 (Win API 또는 POSIX)을 호출 할 수 있습니다.

포트란 표준 방법은 없습니다.

현재 프로세스와 하위 프로세스에만 영향을 미칩니다.

character(20) :: val 

    call setenvqq("x=5") 
    call get_environment_variable(name="x",value=val) 
    print *, val 
    call execute_command_line("echo $x") 
end 

> ifort setenvqq.f90 
> ./a.out 
5     
5 
+0

감사합니다, 당신은 남자입니다! – Roloka

+0

나는 전에 어떤 대답도 받아들이지 않았 음을 압니다. 나는 당신이 당신의 다른 질문에 대한 대답을 받아 들일 것을 제안합니다. 이 질문에 대해서는 더 많은 가능한 대답을 기다리는 것이 현명 할 것입니다. –

+0

내 프로그램이 종료 될 때까지 $ VAR이 유지됩니까? – Roloka

2

하나의 가능한 해결책은 iso_c_binding 내장 모듈 포트란에서 C 루틴을 사용하는 것이다. C를 통해 환경 변수를 설정할 수 있으며,이 변수는 Fortran 프로그램에 의해 시작된 모든 프로그램에 액세스 할 수 있습니다. 이것은 대부분의 플랫폼 및 컴파일러에서 작동합니다.

C 루틴

#include <stdio.h> 
#include <stdlib.h>  /* putenv, getenv */ 

void c_setgetenv() 
{ 
    char* p; 
    putenv("x=100"); 
    p = getenv("x"); 
    if (p!=NULL) 
     printf (" The variable is: %s\n",p); 
} 

포트란 프로그램이 예에서

program main 
    use, intrinsic :: iso_c_binding 
    implicit none 

    ! The interface for the C routine 
    interface 
     subroutine c_setgetenv() bind(c) 
      import ! use declarations from host (implicit none, iso_c_binding) 
     end subroutine c_setgetenv 
    end interface 

    character(len=20) :: val 

    !! begin 
    call c_setgetenv() 
    call get_environment_variable(name="x",value=val) 
    print *, "Fortran: ", val 
end program main 

, 나는 포트란에서 C 루틴에 대한 인수를 통과하지 않은,하지만 당신은 사용자 정의하고 처리 할 수 ​​있습니다 필요한 경우. C 오브젝트 코드를 컴파일하고 Fortran 프로그램에 링크해야합니다.

관련 문제