2015-05-16 11 views
5

Die GNU Erweiterung des GNU-Fortran-Compiler das Unterprogramm GETCWD(), die gut liefert, das aktuelle Arbeitsverzeichnis wird. Allerdings muss mein Code auch auf den Compiler ifort und übertragbar sein, und ich verwende F2003 Funktionen.Gibt es eine Alternative zu getcwd() in Fortran 2003-2008

Gibt es also eine Alternative zu GETCWD() für F2003 und höher?

Ich habe den Standard hier, aber es ist recht groß und ich habe jetzt eine Zeit lang durchgegangen und haben nichts Brauchbares gefunden ...

Antwort

4

Sie können auch die ISO_C_Binding verwenden und die entsprechenden C Funktionen aufrufen:

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 

Dieser Code ist nur für Windows und Unix-Derivate (Linux, OSX, BSD usw.)

+0

Vielen Dank für Ihre umfassende Antwort! :) Ich bin unerfahren mit Schnittstelle zu C aber werde versuchen. Habe ich Recht, wenn ich sage, dass dies dazu führen wird, dass mein Makefile etwas komplizierter wird, da ich einen Compiler für das C definieren muss? – LienM

+0

Es kommt darauf an ... Um dieses Beispiel zu kompilieren, habe ich einfach 'gfortran -Wall -Wextra -g cwd.c test.F90' verwendet. –

5

Wie in den Kommentaren erwähnt, können Sie Gebrauch machen get_environment_variable das ist Standard Fortran (zB F2008 13.7.67). Dieses Beispielprogramm fragt den Wert $PWD ab, der das Verzeichnis enthalten sollte, in dem sich Ihre Shell befindet, als Sie die ausführbare Datei aufgerufen haben.

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

und seine Ausgabe:

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

Dies ist Standard Fortran, aber seine Portabilität wird auf Unix und Unix-ähnliche Schalen begrenzt werden, die diese Variable gesetzt.

Eine weitere Option, während Standard, aber hässlich (meiner Meinung nach) execute_command_line zu verwenden wäre, einen Befehl auszuführen, ausgeben kann das Arbeitsverzeichnis in eine temporäre Datei (z pwd > /tmp/mypwd), dann die Datei zu lesen.

+0

'PWD' ist nicht verfügbar für Windows, müssten Sie 'CD' abfragen. –

+0

Danke Casey! :) Da Portabilität in diesem Fall definitiv ein Problem ist, akzeptierte ich Alexanders Antwort, aber Ihre wird mir und anderen in Zukunft sicher von Nutzen sein. – LienM