2015-05-16 38 views
5

Rozszerzenie GNU do kompilatora GNU Fortran zapewnia podprogram GETCWD(), który pobiera bieżący katalog roboczy. Jednak mój kod musi być przenośny także dla kompilatora ifort i nagfor i używam funkcji F2003.Czy istnieje alternatywa dla GETCWD() w Fortranie 2003-2008

Czy istnieje alternatywa dla GETCWD() dla F2003 i nowszych?

mam standard tutaj, ale jest to całkiem spora i Przyjeżdżam przez niego na chwilę teraz i nie znalazłem niczego użytecznego ...

Odpowiedz

4

Można również użyć ISO_C_Binding i wezwać odpowiednie C funkcje:

cwd.c:

#ifdef _WIN32 
/* Windows */ 
#include <direct.h> 
#define GETCWD _getcwd 

#else 
/* Unix */ 
#include <unistd.h> 
#define GETCWD getcwd 

#endif 

void getCurrentWorkDir(char *str, int *stat) 
{ 
    if (GETCWD(str, sizeof(str)) == str) { 
    *stat = 0; 
    } else { 
    *stat = 1; 
    } 
} 

test.F90:

program test 
use ISO_C_Binding, only: C_CHAR, C_INT 
interface 
    subroutine getCurrentWorkDir(str, stat) bind(C, name="getCurrentWorkDir") 
    use ISO_C_Binding, only: C_CHAR, C_INT 
    character(kind=C_CHAR),intent(out) :: str(*) 
    integer(C_INT),intent(out)   :: stat 
    end subroutine 
    end interface 
    character(len=30) :: str 
    integer(C_INT)  :: stat 

    str='' 
    call getCurrentWorkDir(str, stat) 
    print *, stat, trim(str) 

end program 

Kod ten jest ważny dla systemu Windows i Pochodne uniksowe (Linux, OSX, BSD itp.)

+0

Dziękujemy za wyczerpującą odpowiedź! :) Jestem niedoświadczony w kontaktowaniu się z C, ale spróbuję. Czy mam rację, jeśli powiem, że spowoduje to, że mój plik Makefile stanie się nieco bardziej skomplikowany, ponieważ muszę zdefiniować kompilator dla C? – LienM

+0

To zależy ... Aby skompilować ten przykład, użyłem po prostu 'gfortran -Wall -Wextra -g cwd.c test.F90'. –

5

Jak zauważył w komentarzach, można skorzystać z get_environment_variable, który jest standardowym Fortranem (np. F2008 13.7.67). Ten przykładowy program wysyła zapytanie do wartości $PWD, która powinna zawierać katalog, w którym znajduje się powłoka po wywołaniu pliku wykonywalnego.

program test 
implicit none 
character(len=128) :: pwd 
call get_environment_variable('PWD',pwd) 
print *, "The current working directory is: ",trim(pwd) 
end program 

a jego produkcja:

[email protected] code % pwd 
/home/casey/code 
[email protected] code % so/getpwd 
The current working directory is: /home/casey/code 

Jest to standardowa Fortran, ale jego przenośność będzie ograniczona do Unix i uniksopodobnych muszli, które wyróżniają tę zmienną.

Inną opcją w standardzie, ale brzydkim (moim zdaniem) byłoby użycie polecenia, które może wyprowadzić katalog roboczy do pliku tymczasowego (np. pwd > /tmp/mypwd), a następnie odczytanie tego pliku.

+0

'PWD' nie jest dostępny dla Windows, musisz zapytać 'CD'. –

+0

Dziękuję Casey! :) Ponieważ przenośność jest zdecydowanie problemem w tym przypadku, zaakceptowałem odpowiedź Aleksandra, ale twoja będzie z pewnością przydatna dla mnie i dla innych osób w przyszłości. – LienM