2015-05-16 15 views
5

Phần mở rộng GNU cho trình biên dịch GNU Fortran cung cấp chương trình con GETCWD() tốt, nhận được thư mục làm việc hiện tại. Tuy nhiên, mã của tôi cũng phải được chuyển sang trình biên dịch ifortnagfor và tôi sử dụng các tính năng của F2003.Có cách thay thế cho GETCWD() trong Fortran 2003-2008

Vì vậy, có cách thay thế cho GETCWD() cho F2003 trở lên không?

tôi có tiêu chuẩn ở đây nhưng nó khá đáng kể và tôi đã đi qua nó trong một thời gian bây giờ và đã không tìm thấy bất cứ điều gì hữu ích ...

Trả lời

4

Bạn cũng có thể sử dụng ISO_C_Binding và gọi C chức năng tương ứng:

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 

Mã này có hiệu lực trong Windows và Unix-derivates (Linux, OSX, BSD, v.v.)

+0

Cảm ơn bạn đã trả lời toàn diện! :) Tôi không có kinh nghiệm với interfacing với C nhưng sẽ cố gắng. Tôi có chính xác nếu tôi nói điều này sẽ làm cho makefile của tôi trở nên hơi phức tạp hơn, như tôi cần phải xác định một trình biên dịch cho C? – LienM

+0

Nó phụ thuộc ... Để biên dịch ví dụ này tôi đơn giản sử dụng 'gfortran -Wall -Wextra -g cwd.c test.F90'. –

5

Như đã đề cập trong các ý kiến, bạn có thể tận dụng get_environment_variable là tiêu chuẩn Fortran (ví dụ F2008 13.7.67). Chương trình ví dụ này truy vấn giá trị của $PWD, nên chứa thư mục mà trình bao của bạn ở trong khi bạn gọi tệp thực thi.

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

Và sản lượng của nó:

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

Đây là tiêu chuẩn Fortran, nhưng tính di động của nó sẽ được giới hạn trong Unix và vỏ Unix như thế đặt biến này.

Tùy chọn khác trong khi chuẩn nhưng xấu (theo ý kiến ​​của tôi) sẽ sử dụng execute_command_line để chạy lệnh có thể xuất thư mục hoạt động sang tệp tạm thời (ví dụ: pwd > /tmp/mypwd), sau đó đọc tệp đó.

+0

'PWD' không khả dụng cho cửa sổ, bạn sẽ cần phải truy vấn 'CD'. –

+0

Cảm ơn bạn Casey! :) Bởi vì tính di động chắc chắn là một vấn đề trong trường hợp này, tôi chấp nhận câu trả lời của Alexander nhưng bạn chắc chắn sẽ được sử dụng cho tôi và những người khác trong tương lai. – LienM