write una programas matriz manejo leer escritura escribir ejemplos datos crear como avanzado archivos archivo operating-system fortran environment-variables path-separator

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.