Pasaje por esquema de referencia Programa de verificacin

  • Slides: 9
Download presentation
Pasaje por esquema de referencia Programa de verificación PROGRAM test REAL : : a,

Pasaje por esquema de referencia Programa de verificación PROGRAM test REAL : : a, b(4) INTEGER : : next …. . Call sun 1 (a, b, next) ……. . End test memori P. a principa l subruti na 001 a x 002 b(1) y(1) 003 b(2) y(2) SUBROUTINE 004 b(3) y(3) sun 1(x, y, i) Subrutina 005 b(4) y(4) REAL, INTENT(OUT) : : x 006 next i REAL, INTENT(IN) : : 007 y(4) INTEGER : : i ……………. . Cuando se llama END a una. SUBROUTINE subrutina el programa principal señala la posición en memoria de cada argumento actual de la lista de argumentos. La subrutina busca los sun 1 argumentos ficticios en el lugar indicado. → Pasaje por referencia

Los argumentos reales (programa principal) y ficticias ( subrutinas) tienen que coincidir en número,

Los argumentos reales (programa principal) y ficticias ( subrutinas) tienen que coincidir en número, tipo y orden EJemplo de error Una variable real tomada como entera PROGRAM llamada_ equivocada ! Propósito: ejemplificar un error frecuente ! IMPLICIT NONE REAL : : x= 1. Call arg_erroneo(x) END llamada_ equivocada SUBROUTINE arg_erroneo(i) IMPLICIT NONE INTEGER : : i Write (*, *) “ i=“, i END SUBROUTINE arg_erroneo Al correr el programa el resultado es : i= 1065353216

Pasaje de un arreglo a una subrutina La subrutina necesita conocer la localización y

Pasaje de un arreglo a una subrutina La subrutina necesita conocer la localización y el tamaño del arreglo Hay distintas maneras de especificar la longitud de una variable ficticia: Ø Pasar los limites de cada dimensión del arreglo a la subrutina como argumento en el llamado y declarar el arreglo ficticio a esta longitud → Forma explicita de la variable ficticia Ej: SUBROUTINE proceso (dato 1, dato 2, n, nvalores) INTEGER, INTENT(IN) : : n, nvalores REAL, INTENT((IN), DINENSION(n) : : dato 1 ! forma explicita REAL, INTENT((OUT), DINENSION(n) : : dato 2 ! forma explicita ! DO i= 1, nvalores dato 2(i) = 3* dato 1(i) END DO END SUBROUTINE proceso Como la dimensión de las variables es conocida por la expresión explicita se puede realizar operaciones entre arreglos o secciones de arreglos.

Ej: SUBROUTINE proceso 2 (dato 1, dato 2, n, nvalores) INTEGER, INTENT(IN) : :

Ej: SUBROUTINE proceso 2 (dato 1, dato 2, n, nvalores) INTEGER, INTENT(IN) : : n, nvalores REAL, INTENT((IN), DINENSION(n) : : dato 1 ! forma explicita REAL, INTENT((OUT), DINENSION(n) : : dato 2 ! forma explicita ! dato 2(1: nvalores) = 3. * dato 1(1: nvalores) END SUBROUTINE proceso 2 Otra forma es el asumir el tamaño del arreglo ficticio a través de un *. En este como el compilador no conoce el tamaño del arreglo no puede efectuar operaciones entre arreglos o secciones de los mismos Ej: SUBROUTINE proceso 3(dato 1, dato 2, n, nvalores) INTEGER, INTENT(IN) : : n, nvalores REAL, INTENT((IN), DINENSION(*) : : dato 1 ! se asume el tamaño REAL, INTENT((OUT), DINENSION(*) : : dato 2 ! se asume el tamaño ! DO i= 1, nvalores dato 2(i) = 3* dato 1(i) END DO END SUBROUTINE proceso 3

Pasando variables “character “ a una subrutina Cuando se utiliza una variable character como

Pasando variables “character “ a una subrutina Cuando se utiliza una variable character como argumento ficticio, su longitud es declarada con un *. Si queremos saber la longitud de texto usamos la función intrínseca LEN( ) Ej : SUBROUTINE ejemplo(texto) CHARACTER(len=*), INTENT(IN) : : texto WRITE(*, *) “ la longitud de texto es: “, LEN(texto) END SUBROUTINE ejemplo

Es conveniente usar banderas dentro de una subrutina para no parar el proceso de

Es conveniente usar banderas dentro de una subrutina para no parar el proceso de un programa: Ej: Si restamos 2 números y calculamos la raíz cuadrada. SUBROUTINE proceso (a, b, resultado) IMPLICIT NONE ! Diccionario y declaración de variables REAL , INTENT(IN) : : a, b REAL , INTENT(OUT) : : resultado REAL : : tem ! Auxiliar temporaria tem= a-b IF(tem>=0). then result = SQRT(tem) ELSE WRITE(*, *) “La raiz no se puede calcular” STOP END IF END SUBROUTINE proceso

Si utilizamos banderas SUBROUTINE proceso (a, b, resultado, error) IMPLICIT NONE ! Diccionario y

Si utilizamos banderas SUBROUTINE proceso (a, b, resultado, error) IMPLICIT NONE ! Diccionario y declaración de variables REAL , INTENT(IN) : : a, b REAL , INTENT(OUT) : : resultado INTEGER , INTENT(OUT) : : error ! Aviso de error =1 REAL : : tem ! Auxiliar temporaria tem= a-b IF(tem>=0). then result = SQRT(tem) error= 0 ELSE result=0 error=1 END IF END SUBROUTINE proceso

Compartiendo datos usando módulos MODULE comparto ! ! Propósito: declarar datos compartidos entre subrutinas

Compartiendo datos usando módulos MODULE comparto ! ! Propósito: declarar datos compartidos entre subrutinas ! IMPLICIT NONE SAVE INTEGER, PARAMETER : : nvalores = 5 REAL, DINENSION(nvalores) : : valores END MODULE comparto Un MÓDULO contiene las definiciones y valores iniciales que se quieren compartir entre programas unitario ØUn “MODULE” puede ser incluido en un programa a través de la sentencia “USE” ØCada programa que utilice el módulo tiene acceso a los mismos datos ØComienza con MODULE y continua con un nombre de hasta 31 caracteres. ØTermina con END MODULE nombre Ø SAVE garantiza que todos los valores de los datos en el módulo son preservados en distintos procedimientos.

Ej PROGRAM test_modulo ! ! Propósito: ver como se usa el módulo ! USE

Ej PROGRAM test_modulo ! ! Propósito: ver como se usa el módulo ! USE comparto IMPLICIT NONE REAL, PARAMETER : : PI= 3. 14159 Valores = PI * (/1. , 2. , 3. , 4. , 5. /) CALL sub 1 END PROGRAM test_modulo SUBROUTINE sub 1 ! Propósito: ver como se usa el módulo ! USE comparto IMPLICIT NONE Write(*, *) valores END SUBROUTINE sub 1