programa de verificación
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 PresentationTRANSCRIPT
![Page 1: Programa de verificación](https://reader036.vdocument.in/reader036/viewer/2022082506/56813dea550346895da7c3ab/html5/thumbnails/1.jpg)
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](https://reader036.vdocument.in/reader036/viewer/2022082506/56813dea550346895da7c3ab/html5/thumbnails/2.jpg)
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](https://reader036.vdocument.in/reader036/viewer/2022082506/56813dea550346895da7c3ab/html5/thumbnails/3.jpg)
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](https://reader036.vdocument.in/reader036/viewer/2022082506/56813dea550346895da7c3ab/html5/thumbnails/4.jpg)
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](https://reader036.vdocument.in/reader036/viewer/2022082506/56813dea550346895da7c3ab/html5/thumbnails/5.jpg)
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](https://reader036.vdocument.in/reader036/viewer/2022082506/56813dea550346895da7c3ab/html5/thumbnails/6.jpg)
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](https://reader036.vdocument.in/reader036/viewer/2022082506/56813dea550346895da7c3ab/html5/thumbnails/7.jpg)
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](https://reader036.vdocument.in/reader036/viewer/2022082506/56813dea550346895da7c3ab/html5/thumbnails/8.jpg)
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](https://reader036.vdocument.in/reader036/viewer/2022082506/56813dea550346895da7c3ab/html5/thumbnails/9.jpg)
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