programa de verificación

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

Upload: mahlah

Post on 07-Jan-2016

30 views

Category:

Documents


0 download

DESCRIPTION

Pasaje por esquema de referencia. PROGRAM test REAL : : a, b(4) INTEGER : : next ….. Call sun1 (a, b, next ) …….. End test. Programa de verificación. SUBROUTINE sun1(x, y, i) REAL, INTENT(OUT) : : x REAL, INTENT(IN) : : y(4) INTEGER : : i …………….. END SUBROUTINE sun1. Subrutina. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Programa de verificación

memoria P. principal

subrutina

001 a x

002 b(1) y(1)

003 b(2) y(2)

004 b(3) y(3)

005 b(4) y(4)

006 next i

007

Programa de verificación

Subrutina

PROGRAM testREAL : : a, b(4)INTEGER : : next…..Call sun1 (a, b, next)……..End test

SUBROUTINE sun1(x, y, i)REAL, INTENT(OUT) : : xREAL, INTENT(IN) : : y(4)INTEGER : : i……………..END SUBROUTINE sun1

Cuando se llama a una subrutina el programa principal señala la posición en memoria de cada argumento actual de la lista de argumentos. La subrutina busca los argumentos ficticios en el lugar indicado.→ Pasaje por referencia

Pasaje por esquema de referenciaPasaje por esquema de referencia

Page 2: Programa de verificación

EJemplo de errorUna variable real tomada como entera

PROGRAM llamada_ equivocada! Propósito: ejemplificar un error frecuente!IMPLICIT NONEREAL : : x= 1.Call arg_erroneo(x) END llamada_ equivocada

SUBROUTINE arg_erroneo(i) IMPLICIT NONEINTEGER : : iWrite (*,*) “ i=“,iEND SUBROUTINE arg_erroneo

Al correr el programa el resultado es :i= 1065353216

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

Page 3: Programa de verificación

Pasaje de un arreglo a una subrutinaPasaje de un arreglo a una subrutina

La subrutina necesita conocer la localización y el tamaño del arregloHay 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 ficticiaEj:

SUBROUTINE proceso (dato1, dato2, n, nvalores)INTEGER, INTENT(IN) : : n, nvaloresREAL, INTENT((IN), DINENSION(n) : : dato1 ! forma explicita REAL, INTENT((OUT), DINENSION(n) : : dato2 ! forma explicita

!DO i= 1, nvalores dato2(i) = 3* dato1(i)END DOEND 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.

Page 4: Programa de verificación

Ej:SUBROUTINE proceso2 (dato1, dato2, n, nvalores)INTEGER, INTENT(IN) : : n, nvaloresREAL, INTENT((IN), DINENSION(n) : : dato1 ! forma explicitaREAL, INTENT((OUT), DINENSION(n) : : dato2 ! forma explicita

!dato2(1:nvalores) = 3. * dato1(1: nvalores)

END SUBROUTINE proceso2

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 proceso3(dato1, dato2, n, nvalores)INTEGER, INTENT(IN) : : n, nvaloresREAL, INTENT((IN), DINENSION(*) : : dato1 ! se asume el tamañoREAL, INTENT((OUT), DINENSION(*) : : dato2 ! se asume el tamaño

!DO i= 1, nvalores dato2(i) = 3* dato1(i)END DOEND SUBROUTINE proceso3

Page 5: Programa de verificación

Pasando variables “character “ a una subrutinaPasando 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) : : textoWRITE(*, *) “ la longitud de texto es: “, LEN(texto) END SUBROUTINE ejemplo

Page 6: Programa de verificación

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, bREAL , INTENT(OUT) : :resultado

REAL : : tem ! Auxiliar temporariatem= a-bIF(tem>=0).then result = SQRT(tem)ELSEWRITE(*, *) “La raiz no se puede calcular”STOPEND IF END SUBROUTINE proceso

Page 7: Programa de verificación

Si utilizamos banderas

SUBROUTINE proceso (a, b, resultado, error) IMPLICIT NONE! Diccionario y declaración de variables

REAL , INTENT(IN) : : a, bREAL , INTENT(OUT) : :resultadoINTEGER , INTENT(OUT) : : error ! Aviso de error =1

REAL : : tem ! Auxiliar temporariatem= a-bIF(tem>=0).then result = SQRT(tem)error= 0ELSEresult=0error=1END IF END SUBROUTINE proceso

Page 8: Programa de verificación

Compartiendo datos usando módulos

MODULE comparto!! Propósito: declarar datos compartidos entre subrutinas!IMPLICIT NONESAVEINTEGER, PARAMETER : : nvalores = 5REAL, DINENSION(nvalores) : : valoresEND 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.

Page 9: Programa de verificación

EjPROGRAM test_modulo!! Propósito: ver como se usa el módulo!USE compartoIMPLICIT NONEREAL, PARAMETER : : PI= 3.14159Valores = PI * (/1., 2., 3., 4., 5. /)CALL sub1END PROGRAM test_modulo

SUBROUTINE sub1! Propósito: ver como se usa el módulo!USE compartoIMPLICIT NONEWrite(*, *) valoresEND SUBROUTINE sub1