operating-system - una - programas en fortran ejemplos
Obtener separador de archivos en Fortran (4)
Siguiendo la sugerencia de IRO-bot, podrías hacer una nueva variable de entorno, por ej.
export DELIMITER=''/''
en Unix
Ahora crea una variable correspondiente en Windows, solo con ''/', y estás listo para continuar.
Si no desea establecer una variable global en Windows, o no tiene los derechos para hacerlo, coloque lo siguiente en un archivo .bat
set DELIMITER=/
Para obtener más información sobre el conjunto, consulte http://www.ss64.com/nt/set.html. Es posible que deba ejecutar el programa fortran desde CMD cuando use el conjunto.
Finalmente pon lo siguiente en tu archivo fortran
CHARACTER :: delimiter
CALL get_environment_variable(''DELIMITER'',delimiter)
¿Podría decirme cómo obtener el separador de archivos del sistema operativo actual, por ejemplo /
en Windows y /
en Unix, en Fortran en tiempo de ejecución?
Hasta donde yo sé, el estándar Fortran no dice nada sobre el separador de ruta del sistema de archivos. Lo mejor que puedo sugerir es definir una macro que defina el separador apropiado. Por ejemplo
#if __unix__
character(len=1), parameter :: path_sep=''/''
#elif _WIN32
character(len=1), parameter :: path_sep=''/'
#else
#error "path_sep not defined. Set this constant for your system."
#endif
Sin embargo, en Windows puede usar /
o /
como separador de ruta (¡pruébelo!), Por lo que en la mayoría de los sistemas no es necesario hacer nada especial con el separador de ruta.
Tenga en cuenta que no necesita determinar el separador de ruta en tiempo de ejecución . Como debe recompilar su fuente Fortran para cada nuevo sistema en el que desea ejecutarla, solo necesita asegurarse de que se especifique el separador de ruta correcto en tiempo de compilación para cada sistema nuevo ( el separador de ruta no cambiará entre las ejecuciones de su programa) en el mismo sistema ).
El uso de macros de preprocesador como los anteriores es la forma obvia de hacerlo: simplemente puede agregar una nueva cláusula #elif
para cada nuevo sistema al que le dé el código. Esto es mucho más fácil que la introducción de soluciones de picemeal que verifican variables de entorno particulares como sugieren las otras respuestas.
Además de especificar el separador de ruta, también puede necesitar establecer parámetros para otros aspectos del entorno del sistema operativo. Por ejemplo, los caracteres de directorio actuales y principales ( .
Y ..
respectivamente en sistemas Windows y POSIX).
Finalmente, tenga en cuenta que el preprocesador define __unix__
y _WIN32
son macros ampliamente utilizados que indican en qué sistema está usted y uno, según el sistema en el que se encuentre, que debe ser configurado por la mayoría de los compiladores. Si no están configurados, generalmente puede usar el indicador -D__unix__=1
o -D_WIN32=1
cuando compila su fuente para establecer una de estas macros. Para preprocesar su código usando las opciones de línea de comando -cpp
(gfortran) o -fpp
(ifort) o cambie sus extensiones de archivos de origen de .f
a .F
o de .f90
a .F90
.
Prefiero la solución del 4 anterior, pero con una modificación:
function delimiter_detect() result(delim)
character(LEN=1) :: delim
character(LEN=258) :: path
integer :: ii, stat_out
call GET_ENVIRONMENT_VARIABLE(''HOME'',path,status=stat_out)
if (stat_out/=0) go to 999
! xxx path=''xx/' ! alternate test
do ii=1, 258
delim=path(ii:ii)
if (delim==''/''.or.delim==''/') return
! ... Note: emacs does not recognize the second delimiter test
enddo
999 continue
write(*,''(1x,a/1x,a/1x,a)'') ''Could not obtain home directory path.'', &
''Restart program and manually insert path'', &
''to folder/directory containing input files.''
stop
end function delimiter_detect
Dicho esto, no he probado el concepto en Windows OS.
Puede usar el procedimiento intrínseco GET_ENVIRONMENT_VARIABLE
Fortran 2003 Standard para hacer algo como esto. Ejemplo:
CHARACTER(LEN=99999) :: path
CHARACTER(LEN=1) :: path_separator
CALL GET_ENVIRONMENT_VARIABLE(''PATH'',path)
path_separator=path(1:1)
WRITE(*,*)''Path separator is '',path_separator
END
Este programa generará "/" como separador de ruta en UNIX o Linux. Puede obtener esto de otras variables de entorno también. Tenga en cuenta que este ejemplo está cableado para UNIX / Linux. Necesitarías un poco de lógica diferente para extraer, por ejemplo, "/" para Windows, pero no estoy familiarizado con este sistema. Recuerdo vagamente de Win95 tener algo así como "c: / .....", por lo que es probable que en el caso de Windows busque "/" en la path(3:3)
.
Espero que esto ayude.