Abfrage von Kommandozeilenparameter

In komplexeren Anwendungen ist es üblich Parameter dem Programm beim Start zu übermitteln. Dh. es muss nicht während des Programmlaufs gestoppt werden, um eine Nutzereingabe zu erhalten, sondern die Parameter können beim Programmstart als Kommandozeilenparameter angegeben werden, die dann während des Programmlaufs interpretiert werden.

Abfrage der Anzahl an Kommandozeilenparameter

Zur Abfrage der Anzahl (siehe in C: Variable argc) steht die Funktion COMMAND_ARGUMENT_COUNT ab dem Fortran-Standard 2003 zur Verfügung. Die Funktion nimmt keine Parameter und gibt die Anzahl der Parameter als Integer zurück, die nicht der Name des Programms sind.

Abfrage einzelner Parameter

Nun haben wir die Anzahl der Parameter, dann benötigen wir nurnoch die Parameter selbst. Dazu können wir die Subroutine GET_COMMAND_ARGUMENT verwenden:

GET_COMMAND_ARGUMENT (number, value[, length, status)

Parameter

  • number gibt an, welcher Parameter abgefragt werden soll
  • value ist ein String, welcher den Wert des Parameters aufnehmen soll
  • length gibt nach dem Unterprogrammruf die Länge des Parameters an
  • status falls etwas schief läuft, >0; falls value nicht den kompletten String aufnehmen konnte -1; ansonsten (bei Erfolg) 0

Hinweise

Ist number auf 0 gesetzt, erhalten Sie den Programmnamen zurück, ist number größer als die Anzahl der Argumente, wird value mit Leerzeichen gefüllt. Ist der Wert des Parameters länger als value, dann wird value soweit gefüllt, wie der Speicherplatz es zulässt (alles andere wird abgeschnitten).

Beispiel

cmd.f90
program main
  implicit none
  integer argc, n, m
  real p
  CHARACTER argv*32
 
  argc = COMMAND_ARGUMENT_COUNT()
  call GET_COMMAND_ARGUMENT ( 0, argv )
  if (argc<3) then
    write (*,*) "Benutzung: ", trim(argv), " n m p"
    stop
  endif
 
  call GET_COMMAND_ARGUMENT ( 1, argv )
  read (argv, *) n
 
  call GET_COMMAND_ARGUMENT ( 2, argv )
  read (argv, *) m
 
  call GET_COMMAND_ARGUMENT ( 3, argv )
  read (argv, *) p
 
  write (*,*) n,m,p
end program

Ausgaben:

$ gfortran cmd.f90 
$ ./a.out 
 Benutzung: ./a.out n m p
$ ./a.out 1 2 3
           1           2   3.0000000    

Abfrage von Umgebungsvariablen

Ähnlich wie GET_COMMAND_ARGUMENT steht die Subroutine GET_ENVIRONMENT_VARIABLE ab Fortran 2003 zur Verfügung:

GET_ENVIRONMENT_VARIABLE ( name, value [, length, status, trim_name] )

Die Verwendung ist analog zu GET_COMMAND_ARGUMENT mit der Ausnahme, dass Umgebungsvariablen Namen (Strings) haben, die mit dem ersten Parameter angegeben werden sollen. Außerdem gibt trim_name an, ob in dem Namen-Parameter die abschließenden Leerzeichen zum Namen gehören (trim_name=.FALSE.) oder ob sie keine Bedeutung gehören und damit abgeschnitten werden (trim_name=.TRUE.)