Você está na página 1de 149

Introduo ao Fortran 90/95 ca

Apostila preparada para a disciplina de Modelos Computacionais da F sica I, ministrada para o Curso de Licenciatura em F sica do Departamento de F sica, Instituto de F sica e Matemtica, Fundaao Universidade a c Federal de Pelotas, Pelotas - RS.

In cio: Janeiro de 2005.

Verso: 12 de maro de 2008 a c

Sumrio a
Referncias Bibliogrcas e a 1 Introduo ca 1.1 As origens da Linguagem Fortran 1.2 O padro Fortran 90 . . . . . . . a 1.3 Uma reviso menor: Fortran 95 . a 1.4 Comentrios sobre a bibliograa a 2 Formato do Cdigo-Fonte o 2.1 Formato do programa-fonte . . 2.2 Nomes em Fortran 90/95 . . . 2.3 Entrada e sa padres . . . . da o 2.4 Conjunto de caracteres aceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v 1 1 2 4 4 5 5 7 7 8 9 9 10 10 11 11 12 13 13 13 13 15 15 17 18 18 18 19 19 23 23 24 25 26 26 28 31 31 31 32 32

3 Tipos de Variveis a 3.1 Declaraao de tipo de varivel . . . . . . . . . . c a 3.2 Variveis do tipo INTEGER . . . . . . . . . . . . a 3.3 Variveis do tipo REAL . . . . . . . . . . . . . . a 3.4 Variveis do tipo COMPLEX . . . . . . . . . . . . a 3.5 Variveis do tipo CHARACTER . . . . . . . . . . . a 3.6 Variveis do tipo LOGICAL . . . . . . . . . . . . a 3.7 O conceito de espcie (kind) . . . . . . . . . . . e 3.7.1 Fortran 77 . . . . . . . . . . . . . . . . . 3.7.2 Fortran 90/95 . . . . . . . . . . . . . . . 3.7.2.1 Compilador Intel Fortran 3.7.2.2 Compilador gfortran . . . . . 3.7.2.3 Compilador F . . . . . . . . . . 3.7.2.4 Literais de diferentes espcies . e 3.7.3 Funoes intr c nsecas associadas ` espcie a e 3.7.3.1 KIND(X) . . . . . . . . . . . . 3.7.3.2 SELECTED_REAL_KIND(P,R) . . 3.7.3.3 SELECTED_INT_KIND(R) . . . . 3.8 Tipos derivados . . . . . . . . . . . . . . . . . . 4 Expresses e Atribuioes Escalares o c 4.1 Regras bsicas . . . . . . . . . . . . . . . . . . a 4.2 Expresses numricas escalares . . . . . . . . . o e 4.3 Atribuioes numricas escalares . . . . . . . . . c e 4.4 Operadores relacionais . . . . . . . . . . . . . . 4.5 Expresses e atribuioes lgicas escalares . . . . o c o 4.6 Expresses e atribuioes de caracteres escalares o c 5 Comandos e Construtos de Controle de Fluxo 5.1 Comandos obsoletos do Fortran 77 . . . . . . . 5.1.1 Rtulos (statement labels) . . . . . . . . o 5.1.2 Comando GO TO incondicional . . . . . . 5.1.3 Comando GO TO computado . . . . . . . i

ii

SUMARIO 5.1.4 Comando IF aritmtico . . . . . . . e 5.1.5 Comandos ASSIGN e GO TO atribu do 5.1.6 Laos DO rotulados . . . . . . . . . . c Comando e construto IF . . . . . . . . . . . 5.2.1 Comando IF . . . . . . . . . . . . . 5.2.2 Construto IF . . . . . . . . . . . . . Construto CASE . . . . . . . . . . . . . . . . Construto DO . . . . . . . . . . . . . . . . . 5.4.1 Construto DO ilimitado . . . . . . . . 5.4.2 Instruao EXIT . . . . . . . . . . . . c 5.4.3 Instruao CYCLE . . . . . . . . . . . c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 33 33 34 34 34 36 38 40 40 40 43 43 47 49 50 50 50 51 52 52 54 54 55 55 55 56 57 60 60 61 63 63 63 64 64 64 65 65 66 66 66 67 67 67 67 67 68 68 68 69 69 70 70 70 71

5.2

5.3 5.4

6 Processamento de Matrizes 6.1 Terminologia e especicaoes de matrizes . . . . . c 6.2 Expresses e atribuioes envolvendo matrizes . . . o c 6.3 Seoes de matrizes . . . . . . . . . . . . . . . . . . c 6.3.1 Subscritos simples . . . . . . . . . . . . . . 6.3.2 Tripleto de subscritos . . . . . . . . . . . . 6.3.3 Vetores de subscritos . . . . . . . . . . . . . 6.4 Atribuioes de matrizes e submatrizes . . . . . . . c 6.5 Matrizes de tamanho zero . . . . . . . . . . . . . . 6.6 Construtores de matrizes . . . . . . . . . . . . . . . 6.6.1 A funao intr c nseca RESHAPE. . . . . . . . . 6.6.2 A ordem dos elementos de matrizes . . . . . 6.7 Rotinas intr nsecas elementais aplicveis a matrizes a 6.8 Comando e construto WHERE . . . . . . . . . . . . . 6.8.1 Comando WHERE . . . . . . . . . . . . . . . 6.8.2 Construto WHERE . . . . . . . . . . . . . . . 6.9 Matrizes alocveis . . . . . . . . . . . . . . . . . . a 6.10 Comando e construto FORALL . . . . . . . . . . . . 6.10.1 Comando FORALL . . . . . . . . . . . . . . . 6.10.2 Construto FORALL . . . . . . . . . . . . . .

7 Rotinas Intr nsecas 7.1 Categorias de rotinas intr nsecas . . . . . . . . . . . . . . . . . 7.2 Declaraao e atributo INTRINSIC . . . . . . . . . . . . . . . . . c 7.3 Funoes inquisidoras de qualquer tipo . . . . . . . . . . . . . . c 7.4 Funoes elementais numricas . . . . . . . . . . . . . . . . . . . c e 7.4.1 Funoes elementais que podem converter . . . . . . . . . c 7.4.2 Funoes elementais que no convertem . . . . . . . . . . c a 7.5 Funoes elementais matemticas . . . . . . . . . . . . . . . . . c a 7.6 Funoes elementais lgicas e de caracteres . . . . . . . . . . . . c o 7.6.1 Converses caractere-inteiro . . . . . . . . . . . . . . . . o 7.6.2 Funoes de comparaao lxica . . . . . . . . . . . . . . . c c e 7.6.3 Funoes elementais para manipulaoes de strings . . . . c c 7.6.4 Converso lgica . . . . . . . . . . . . . . . . . . . . . . a o 7.7 Funoes no-elementais para manipulaao de strings . . . . . . c a c 7.7.1 Funao inquisidora para manipulaao de strings . . . . . c c 7.7.2 Funoes transformacionais para manipulaao de strings c c 7.8 Funoes inquisidoras e de manipulaoes numricas . . . . . . . c c e 7.8.1 Modelos para dados inteiros e reais . . . . . . . . . . . . 7.8.2 Funoes numricas inquisidoras . . . . . . . . . . . . . . c e 7.8.3 Funoes elementais que manipulam quantidades reais . . c 7.8.4 Funoes transformacionais para valores de espcie (kind) c e 7.9 Rotinas de manipulaao de bits . . . . . . . . . . . . . . . . . . c 7.9.1 Funao inquisidora . . . . . . . . . . . . . . . . . . . . . c 7.9.2 Funoes elementais . . . . . . . . . . . . . . . . . . . . . c 7.9.3 Subrotina elemental . . . . . . . . . . . . . . . . . . . .
Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

SUMARIO 7.10 Funao de transferncia . . . . . . . . . . . . . . . . . c e 7.11 Funoes de multiplicaao vetorial ou matricial . . . . . c c 7.12 Funoes transformacionais que reduzem matrizes . . . c 7.12.1 Caso de argumento unico . . . . . . . . . . . . 7.12.2 Argumento opcional DIM . . . . . . . . . . . . . 7.12.3 Argumento opcional MASK . . . . . . . . . . . . 7.13 Funoes inquisidoras de matrizes . . . . . . . . . . . . c 7.13.1 Status de alocaao . . . . . . . . . . . . . . . . c 7.13.2 Limites, forma e tamanho . . . . . . . . . . . . 7.14 Funoes de construao e manipulaao de matrizes . . . c c c 7.14.1 Funao elemental MERGE . . . . . . . . . . . . . c 7.14.2 Agrupando e desagrupando matrizes . . . . . . 7.14.3 Alterando a forma de uma matriz . . . . . . . 7.14.4 Funao transformacional para duplicaao . . . c c 7.14.5 Funoes de deslocamento matricial . . . . . . . c 7.14.6 Transposta de uma matriz . . . . . . . . . . . . 7.15 Funoes transformacionais para localizaao geomtrica c c e c c 7.16 Funao transformacional para dissociaao de ponteiro 7.17 Subrotinas intr nsecas no-elementais . . . . . . . . . . a 7.17.1 Relgio de tempo real . . . . . . . . . . . . . . o 7.17.2 Tempo da CPU . . . . . . . . . . . . . . . . . . 7.17.3 N meros aleatrios . . . . . . . . . . . . . . . . u o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

iii 71 71 72 72 72 72 72 72 73 73 73 73 73 74 74 74 74 75 75 75 75 76 77 77 77 79 79 79 79 81 81 82 82 84 84 86 89 90 90 90 92 95 96 99 101 102 104 105 106 109 111 112 115 116 116 116

8 Subprogramas e Mdulos o 8.1 Unidades de programa . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.1 Programa principal . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.2 Rotinas externas . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.3 Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 8.2 Subprogramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 Funoes e subrotinas . . . . . . . . . . . . . . . . . . . . . . . . c 8.2.2 Rotinas internas . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.3 Argumentos de subprogramas . . . . . . . . . . . . . . . . . . . 8.2.4 Comando RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.5 Atributo e declaraao INTENT . . . . . . . . . . . . . . . . . . . c 8.2.6 Rotinas externas e bibliotecas . . . . . . . . . . . . . . . . . . . 8.2.7 Interfaces impl citas e expl citas . . . . . . . . . . . . . . . . . . 8.2.8 Argumentos com palavras-chave . . . . . . . . . . . . . . . . . 8.2.9 Argumentos opcionais . . . . . . . . . . . . . . . . . . . . . . . 8.2.10 Tipos derivados como argumentos de rotinas . . . . . . . . . . 8.2.11 Matrizes como argumentos de rotinas . . . . . . . . . . . . . . 8.2.11.1 Matrizes como argumentos em Fortran77 . . . . . . . 8.2.11.2 Matrizes como argumentos em Fortran90/95 . . . . . 8.2.12 Subprogramas como argumentos de rotinas . . . . . . . . . . . 8.2.13 Funoes de valor matricial . . . . . . . . . . . . . . . . . . . . . c 8.2.14 Recurso e rotinas recursivas . . . . . . . . . . . . . . . . . . . a 8.2.15 Atributo e declaraao SAVE . . . . . . . . . . . . . . . . . . . . c 8.2.16 Funoes de efeito lateral e rotinas puras . . . . . . . . . . . . . c 8.2.17 Rotinas elementais . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 8.3.1 Dados globais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2 Rotinas de mdulos . . . . . . . . . . . . . . . . . . . . . . . . o 8.3.3 Atributos e declaraoes PUBLIC e PRIVATE . . . . . . . . . . . . c 8.3.4 Interfaces e rotinas genricas . . . . . . . . . . . . . . . . . . . e 8.3.5 Estendendo rotinas intr nsecas via blocos de interface genricos e 8.4 Ambito (Scope) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4.1 Ambito dos rtulos . . . . . . . . . . . . . . . . . . . . . . . . . o 8.4.2 Ambito dos nomes . . . . . . . . . . . . . . . . . . . . . . . . .
Autor: Rudi Gaelzer IFM/UFPel

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Impresso: 12 de mar o de 2008 c

iv

SUMARIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 119 120 121 121 122 124 125 127 127 128 128 132 137 138 139 141 141 141 142

9 Comandos de Entrada/Sa de Dados da 9.1 Comandos de Entrada/Sa da: introduao rpida . . . . c a 9.1.1 Tarefa 1. Sa formatada na tela do monitor . . da 9.1.2 Tarefa 2. Entrada formatada a partir do teclado 9.2 Unidades lgicas . . . . . . . . . . . . . . . . . . . . . . o 9.3 Comando OPEN . . . . . . . . . . . . . . . . . . . . . . . 9.4 Comando READ . . . . . . . . . . . . . . . . . . . . . . . 9.5 Comandos PRINT e WRITE . . . . . . . . . . . . . . . . . 9.6 Comando FORMAT e especicador FMT= . . . . . . . . . . 9.7 Descritores de ediao . . . . . . . . . . . . . . . . . . . . c 9.7.1 Contadores de repetiao . . . . . . . . . . . . . . c 9.7.2 Descritores de ediao de dados . . . . . . . . . . c 9.7.3 Descritores de controle de ediao . . . . . . . . . c 9.7.4 Descritores de ediao de strings . . . . . . . . . . c 9.8 Comando CLOSE . . . . . . . . . . . . . . . . . . . . . . 9.9 Comando INQUIRE . . . . . . . . . . . . . . . . . . . . . 9.10 Outros comandos de posicionamento . . . . . . . . . . . 9.10.1 Comando BACKSPACE . . . . . . . . . . . . . . . . 9.10.2 Comando REWIND . . . . . . . . . . . . . . . . . . 9.10.3 Comando ENDFILE . . . . . . . . . . . . . . . . .

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

Referncias Bibliogrcas e a
[1] Intel Fortran Compiler for Linux. http://www.intel.com/software/products/compilers/in/docs/manuals.htm. Acesso em: 01 jun. 2005. [2] MARSHALL, A. C. Fortran 90 Course Notes. Acesso em: 01 jun. 2005. http://www.liv.ac.uk/HPC/HTMLFrontPageF90.html.

[3] METCALF, MICHAEL, REID, JOHN. Fortran 90/95 Explained. New York : Oxford University Press, 1996, 345 + xv pp. [4] PAGE, CLIVE G. Professional Programers Guide to Fortran77. http://www.star.le.ac.uk/ cgp/prof77.pdf, Leicester, 2001. Acesso em: 01 jun. 2005. [5] RAMSDEN, S., LIN, F., PETTIPHER, M. A., NOLAND, G. S., BROOKE, J. M. Fortran 90. A Conversion Course for Fortran 77 Programmers. http://www.hpctec.mcc.ac.uk/hpctec/courses/Fortran90/F90course.html. Acesso em: 01 jun. 2005.

vi

REFERENCIAS BIBLIOGRAFICAS

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

Cap tulo 1

Introduo ca
Esta apostila destina-se ao aprendizado da Linguagem de Programao Fortran 95. ca

1.1

As origens da Linguagem Fortran

Programaao no per c odo inicial do uso de computadores para a soluao de problemas em f c sica, qu mica, engenharia, matemtica e outras reas da cincia era um processo complexo e tedioso ao extremo. Programaa a e dores necessitavam de um conhecimento detalhado das instruoes, registradores, endereos de memria e outros c c o constituintes da Unidade Central de Processamento (CPU1 ) do computador para o qual eles escreviam o cdigo. o O Cdigo-Fonte era escrito em um notaao numrica denominada cdigo octal. Com o tempo, cdigos mnemoo c e o o nicos foram introduzidos, uma forma de programaao conhecida como cdigo numrico ou cdigo Assembler. c o e o Estes cdigos eram traduzidos em instruoes para a CPU por programas conhecidos como Assemblers. Durante o c os anos 50 cou claro que esta forma de programaao era de todo inconveniente, no m c nimo, devido ao tempo necessrio para se escrever e testar um programa, embora esta forma de programaao possibilitasse um uso a c otimizado dos recursos da CPU. Estas diculdades motivaram que um time de programadores da IBM, liderados por John Backus, desenvolvessem uma das primeiras chamadas linguagem de alto-nvel, denominada FORTRAN (signicando FORmula TRANslation). Seu objetivo era produzir uma linguagem que fosse simples de ser entendida e usada, mas que gerasse um cdigo numrico quase to eciente quanto a linguagem Assembler. Desde o in o e a cio, o Fortran era to simples de ser usado que era poss programar frmulas matemticas quase como se estas fossem escritas a vel o a de forma simblica. Isto permitiu que programas fossem escritos mais rapidamente que antes, com somente o uma pequena perda de ecincia no processamento, uma vez que todo cuidado era dedicado na construao do e c compilador, isto , no programa que se encarrega de traduzir o cdigo-fonte em Fortran para cdigo Assembler e o o ou octal. Mas o Fortran foi um passo revolucionrio tambm porque o programadores foram aliviados da tarefa tediosa a e de usar Assembler, assim concentrando-se mais na soluao do problema em questo. Mais importante ainda, c a computadores se tornaram acess veis a qualquer cientista ou engenheiro disposto a devotar um pequeno esforo c na aquisiao de um conhecimento bsico em Fortran; a tarefa da programaao no estava mais restrita a um c a c a corpus pequeno de programadores especialistas. O Fortran disseminou-se rapidamente, principalmente nas areas da f sica, engenharia e matemtica, uma a vez que satisfazia uma necessidade premente dos cientistas. Inevitavelmente, dialetos da linguagem foram desenvolvidos, os quais levaram a problemas quando havia necessidade de se trocar programas entre diferentes computadores. O dialeto de Fortran otimizado para processadores fabricados pela IBM, por exemplo, geralmente gerava erro quando se tentava rodar o mesmo programa em um processador Burroughs, ou em outro qualquer. Assim, em 1966, aps quatro anos de trabalho, a Associaao Americana de Padres (American Standards o c o Association), posteriormente Instituto Americano Nacional de Padres (American National Standards Institute, o ou ANSI) originou o primeiro padro para uma linguagem de programaao, agora conhecido como Fortran a c 66. Essencialmente, era uma subconjunto comum de vrios dialetos, de tal forma que cada dialeto poderia a ser reconhecido como uma extenso do padro. Aqueles usurios que desejavam escrever programas portveis a a a a deveriam evitar as extenses e restringir-se ao padro. o a O Fortran trouxe consigo vrios outros avanos, alm de sua facilidade de aprendizagem combinada com a c e um enfoque em execuao eciente de cdigo. Era, por exemplo, uma linguagem que permanecia prxima (e c o o
1 Do

ingls: Central Processing Unit. e

1.2. O padro Fortran 90 a

explorava) o hardware dispon vel, ao invs de ser um conjunto de conceitos abstratos. Ela tambm introduziu, e e atravs das declaraoes COMMON e EQUIVALENCE, a possibilidade dos programadores controlarem a alocaao da e c c armazenagem de dados de uma forma simples, um recurso que era necessrio nos primrdios da computaao, a o c quando havia pouco espao de memria, mesmo que estas declaraoes sejam agora consideradas potencialmente c o c perigosas e o seu uso desencorajado. Finalmente, o cdigo fonte permitia espaos em branco na sua sintaxe, o c liberando o programador da tarefa de escrever cdigo em colunas rigidamente denidas e permitindo que o corpo o do programa fosse escrito da forma desejada e visualmente mais atrativa. A proliferaao de dialetos permaneceu um problema mesmo aps a publicaao do padro Fortran 66. A c o c a primeira diculdade foi que muitos compiladores no aderiram ao padro. A segunda foi a implementaao, em a a c diversos compiladores, de recursos que eram essenciais para programas de grande escala, mas que eram ignorados pelo padro. Diferentes compiladores implementavam estes recursos de formas distintas. a Esta situaao, combinada com a existncia de falhas evidentes na linguagem, tais como a falta de construoes c e c estruturadas de programaao, resultaram na introduao de um grande n mero de pr-processadores. Estes eram c c u e programas que eram capazes de ler o cdigo fonte de algum dialeto bem denido de Fortran e gerar um segundo o arquivo com o texto no padro, o qual ento era apresentado ao compilador nesta forma. Este recurso provia a a uma maneira de estender o Fortran, ao mesmo tempo retendo a sua portabilidade. O problema era que embora os programas gerados com o uso de um pr-processador fossem portveis, podendo ser compilados em diferentes e a computadores, o cdigo gerado era muitas vezes de uma diculdade proibitiva para a leitura direta. o Estas diculdades foram parcialmente removidas pela publicaao de um novo padro, em 1978, conhecido c a como Fortran 77. Ele inclu diversos novos recursos que eram baseados em extenses comerciais ou pra o e processadores e era, portanto, no um subconjunto comum de dialetos existentes, mas sim um novo dialeto por a si s. O per o odo de transiao entre o Fortran 66 e o Fortran 77 foi muito mais longo que deveria, devido aos c atrasos na elaboraao de novas verses dos compiladores e os dois padres coexistiram durante um intervalo de c o o tempo considervel, que se estendeu at meados da dcada de 80. Eventualmente, os fabricantes de compiladores a e e passaram a liber-los somente com o novo padro, o que no impediu o uso de programas escritos em Fortran a a a 66, uma vez que o Fortran 77 permitia este cdigo antigo por compatibilidade. Contudo, diversas extenses no o o a foram mais permitidas, uma vez que o padro no as incluiu na sua sintaxe. a a

1.2

O padro Fortran 90 a

Aps trinta anos de existncia, Fortran no mais era a unica linguagem de programaao dispon o e a c vel para os programadores. Ao longo do tempo, novas linguagens foram desenvolvidas e, onde elas se mostraram mais adequadas para um tipo particular de aplicaao, foram adotadas em seu lugar. A superioridade do Fortran c sempre esteve na rea de aplicaoes numricas, cient a c e cas, tcnicas e de engenharia. A comunidade de usurios e a do Fortran realizou um investimento gigantesco em cdigos, com muitos programas em uso freq ente, alguns o u com centenas de milhares ou milhes de linhas de cdigo. Isto no signicava, contudo, que a comunidade eso o a tivesse completamente satisfeita com a linguagem. Vrios programadores passaram a migrar seus cdigos para a o linguagens tais como Pascal, C e C++. Para levar a cabo mais uma modernizaao da linguagem, o comit tcc e e nico X3J3, aprovado pela ANSI, trabalhando como o corpo de desenvolvimento do comit da ISO (International e Standards Organization, Organizaao Internacional de Padres) ISO/IEC JTC1/SC22/WG5 (doravante conhec o cido como WG5), preparou um novo padro, inicialmente conhecido como Fortran 8x, e agora como Fortran a 90. Quais eram as justicativas para continuar com o processo de reviso do padro da linguagem Fortran? Alm a a e de padronizar extenses comerciais, havia a necessidade de modernizaao, em resposta aos desenvolvimentos nos o c conceitos de linguagens de programaao que eram explorados em outras linguagens tais como APL, Algol, Pascal, c Ada, C e C++. Com base nestas, o X3J3 podia usar os bvios benef o cios de conceitos tais como ocultamento de dados. Na mesma linha, havia a necessidade de fornecer uma alternativa ` perigosa associaao de armazenagem a c de dados, de abolir a rigidez agora desnecessri do formato xo de fonte, bem como de aumentar a segurana a c na programaao. Para proteger o investimento em Fortran 77, todo o padro anterior foi mantido como um c a subconjunto do Fortran 90. Contudo, de forma distinta dos padres prvios, os quais resultaram quase inteiramente de um esforo o e c de padronizar prticas existentes, o Fortran 90 muito mais um desenvolvimento da linguagem, na qual so a e a introduzidos recursos que so novos em Fortran, mas baseados em experincias em outras linguagens. Os recursos a e novos mais signicativos so a habilidade de manipular matrizes usando uma notaao concisa mais poderosa e a a c habilidade de denir e manipular tipos de dados denidos pelo programador. O primeiro destes recursos leva a uma simplicaao na escrita de muitos problemas matemticos e tambm torna o Fortran uma linguagem mais c a e eciente em supercomputadores. O segundo possibilita aos programadores a expresso de seus problemas em a termos de tipos de dados que reproduzem exatamente os conceitos utilizados nas sua elaboraoes. c
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 1. Introduo ca Um resumo dos novos recursos dado a seguir: e

1. O Fortran 90 possui uma maneira para rotular alguns recursos antigos como obsolecentes (isto , e tornando-se obsoletos). 2. Operaoes de matrizes. c 3. Ponteiros. 4. Recursos avanados para computaao numrica usando um conjunto de funoes inquisidoras numricas. c c e c e 5. Parametrizaao dos tipos intr c nsecos, permitindo o suporte a inteiros curtos, conjuntos de caracteres muito grandes, mais de duas precises para variveis reais e complexas e variveis lgicas agrupadas. o a a o 6. Tipos de dados derivados, denidos pelo programador, compostos por estruturas de dados arbitrrias e de a operaoes sobre estas estruturas. c 7. Facilidades na deniao de coletneas denominadas mdulos, uteis para denioes globais de dados e para c a o c bibliotecas de subprogramas. 8. Exigncia que o compilador detecte o uso de construoes que no se conformam com a linguagem ou que e c a sejam obsolecentes. 9. Um novo formato de fonte, adequado para usar em um terminal. 10. Novas estruturas de controle, tais como SELECT CASE e uma nova forma para os laos DO. c 11. A habilidade de escrever subprogramas internos e subprogramas recursivos e de chamar subprogramas com argumentos opcionais. 12. Alocaao dinmica de dados (matrizes automticas, matrizes alocveis e ponteiros). c a a a 13. Melhoramentos nos recursos de entrada/sa de dados. da 14. Vrios novos subprogramas intr a nsecos. Todos juntos, estes novos recursos contidos em Fortran 90 iro assegurar que o padro continue a ser bem a a sucedido e usado por um longo tempo. O Fortran 77 continua sendo suportado como um subconjunto durante um per odo de adaptaao. c Os procedimentos de trabalho adotados pelo comit X3J3 estabelecem um per e odo de aviso prvio antes que e qualquer recurso existente seja removido da linguagem. Isto implica, na prtica, um ciclo de reviso, que para a a o Fortran de cerca de cinco anos. A necessidade de remoao de alguns recursos evidente; se a unica aao e c e c adotada pelo X3J3 fosse de adicionar novos recusos, a linguagem se tornaria grotescamente ampla, com muitos itens redundantes e sobrepostos. A soluao nalmente adotada pelo comit foi de publicar como uma apndice c e e ao padro um conjunto de duas listas mostrando quais os itens que foram removidos e quais so os candidatos a a para uma eventual remoao. c A primeira lista contm os recursos removidos (deleted features). Uma vez que Fortran 90 contm o Fortran e e 77 como subconjunto, esta lista permaneceu vazia para o Fortran 90. A segunda lista contm os recursos e obsolecentes (obsolescent features), os quais so considerados obsoletos e redundantes, sendo assim candidatos a a ` remoao na prxima reviso da linguagem. Os recursos obsolecentes do Fortran 90 so: c o a a 1. IF aritmtico; e 2. desvio para uma declaraao END IF a partir de um ponto fora de seu bloco; c 3. variveis reais e de dupla preciso nas expresses de controle de um comando DO; a a o 4. nalizaao compatilhada de blocos DO, bem como nalizaao por uma declaraao ou comando distintos de c c c um CONTINUE ou de um END DO; 5. declaraao ASSIGN e GO TO atribu c do; 6. RETURN alternativo; 7. comando PAUSE e 8. especicadores FORMAT atribu dos.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

1.3. Uma reviso menor: Fortran 95 a

1.3

Uma reviso menor: Fortran 95 a

Seguindo a publicaao do padro Fortran 90 em 1991, dois signicativos desenvolvimentos posteriores refec a rentes ` linguagem Fortran ocorreram. O primeiro foi a continuidade na operaao dos dois comits de regulaa c e mentaao do padro da linguagem: o X3J3 e o WG5; o segundo desenvolvimento foi a criaao do Forum Fortran c a c de Alta Performance (High Performance Fortran Forum, ou HPFF). Logo no inicio de suas deliberaoes, os comits concordaram na estratgia de denir uma reviso menor no c e e a Fortran 90 para meados da dcada de 90, seguida por uma reviso de maior escala para o in dos anos 2000. e a cio Esta reviso menor passou a ser denominada Fortran 95. a O HPFF teve como objetivo a deniao de um conjunto de extenses ao Fortran tais que permitissem a c o construao de cdigos portveis quando se zesse uso de computadores paralelos para a soluao de problemas c o a c envolvendo grandes conjuntos de dados que podem ser representados por matrizes regulares. Esta verso do a Fortran cou conhecida como o Fortran de Alta Performance (High Performance Fortran, ou HPF), tendo como linguagem de base o Fortran 90, no o Fortran 77. A verso nal do HPF consiste em um conjunto de instruoes a a c que contm o Fortran 90 como subconjunto. As principais extenses esto na forma de diretivas, que so vistas e o a a pelo Fortran 90 como comentrios, mas que so reconhecidas por um compilador HPF. Contudo, tornou-se a a necessria tambm a incluso de elementos adicionais na sintaxe, uma vez que nem todos os recursos desejados a e a puderam ser acomodados simplesmente na forma de diretivas.

Seo em desenvolvimento! ca
1.4 Comentrios sobre a bibliograa a
Para escrever esta apostila, z uso de um n mero restrito de publicaoes, algumas das quais so de livre u c a acesso atravs da internet. e Para informaoes a respeito do padro existente na linguagem Fortran77, a qual foi substitu pelo c a da Fortran90/95, utilizei freq entemente o livro de Clive Page: Professional Programers Guide to Fortran77 u [4]. A principal fonte de informaao sobre o padro do Fortran90/95 foi o amplo livro de Michael Metcalf e c a John Reid: Fortran 90/95 Explained [3]. O curso virtual de Fortran 90 oferecido pela Universidade de Liverpool [2]. O curso virtual de Fortran 90 para programadores que j conhecem o Fortran 77, oferecido pela Universia dade de Manchester [5]. O manual de referncia ` Linguagem Fortran 90/95 que acompanha o compilador intel tambm foi freq ene a e u temente consultado [1].

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

Cap tulo 2

Formato do Cdigo-Fonte o
Neste cap tulo estuda-se, inicialmente, um formato bsico para o programa-fonte em Fortran 90/95 e os tipos a de variveis e suas caracter a sticas bsicas. a

2.1

Formato do programa-fonte

Em fortran h trs formatos bsicos de arquivos que so utilizados: a e a a Programa-Fonte. Trata-se do programa e/ou dos subprogramas escritos pelo programador, usando algum tipo de editor de texto, de acordo com as regras denidas pela linguagem de programaao de alto n c vel. Programa-Objeto. Trata-se do programa-fonte compilado pelo compilador. Esta a transcriao realizada e c pelo compilador do programa-fonte fornecido pelo programador para uma linguagem de baixo n vel, como Assembler ou outro cdigo diretamente interpretvel pela CPU. O programa-objeto no pode ainda ser o a a executado; necessria ainda passar-se pela fase do linking (traduao livre: linkagem). e a c Programa executvel. Aps a fase de compilaao, onde os programas objetos so criados, o agente de compia o c a laao aciona o linker, o qual consiste em um programa especial que agrupa os programas objetos de forma c a criar um arquivo nal, o programa executvel, o qual pode ser ento executado pelo programador. a a Nesta seao ser apresentada a estrutura bsica de um programa-fonte em Fortran 90/95. c a a O Fortran 90/95 suporta duas formas de cdigo-fonte: o formato antigo do Fortran 77, agora denominado o formato xo e o novo formato livre. Fortran 77: O formato xo foi utilizado pelo Fortran desde a primeira verso at o Fortran 77. Este formato a e foi determinado pelas restrioes impostas pelos cartes perfurados, que eram a unica opao para entrar com o c o c cdigo fonte. A estrutura do formato xo a seguinte: o e Colunas 1-5: rtulos (labels) para desvio de processamento do programa. o Coluna 6: caractere de continuaao de linha. c Colunas 7-72: cdigo fonte. o H, ainda, a possibilidade de incluir o caractere C ou c na coluna 1, o que instrui o compilador a ignorar a tudo que segue neste linha. Esta a forma encontrada para se colocar comentrios dentro do cdigo fonte. a a o Fortran 90/95: No formato livre no h uma coluna espec a a ca para iniciar o programa. Pode-se comear a c escrever o cdigo a partir da coluna 1 e a linha de cdigo pode se estender at a coluna 132. Alm disso, os o o e e caracteres em branco so irrelevantes em qualquer lugar do cdigo, exceto quanto estiverem sendo utilizados a o entre apstrofes. Neste caso cada caractere em branco ser avaliado na composiao nal do string. o a c Mais de uma instruao pode ser colocada na mesma linha. O separador de linhas padro o ponto-e-v c a e rgula ;. M ltiplos ; em uma linha, com ou sem brancos, so considerados como um separador simples. Desta u a forma, a seguinte linha de cdigo interpretada como 3 linhas em seqncia1 : o e ue
1 Este

recurso no aceito pelo compilador em uso. a e

2.1. Formato do programa-fonte A = 0; B = 0; C = 0

O caractere ampersand & a marca de continuaao, isto , ele indica que a linha com instruoes imedie c e c atamente posterior continuaao da linha onde o & foi digitado. Desta forma, so permitidas at 39 linhas e c a e adicionais de cdigo. Como exemplo, a seguinte linha de cdigo: o o X = (-Y + ROOT_OF_DISCRIMINANT)/(2.0*A) tambm pode ser escrita usando o &: e X = (-Y + ROOT_OF_DISCRIMINANT) /(2.0*A) & &

Para entrar com comentrios em qualquer ponto do cdigo-fonte, o usurio deve digitar o ponto de exclamaao a o a c ! em qualquer coluna de uma linha. Todo o restante da linha ser desprezado pelo compilador. Exemplo: a X = Y/A - B ! Soluciona a equa~o linear. ca O programa Al Mame. o a Como primeiro exemplo de programa em Fortran 90/95, considere o seguinte cdigo-fonte: o program primeiro implicit none print *, Al^ Mam~e o a end program primeiro A forma mais simples de um programa em Fortran 90/95 a seguinte: e PROGRAM <nome_do_programa> <declara~es de variveis> co a <comandos executveis> a END PROGRAM <nome_do_programa> Comparando com o exemplo do programa primeiro, a declaraao c PROGRAM primeiro sempre a primeira instruao de um programa. Ela serve para identicar o cdigo ao compilador. e c o Em seguida vm as declara~es de variveis. Neste ponto, so denidas as variveis a ser usadas pelo e co a a a programa. Caso no seja necessrio declarar variveis, como no programa primeiro, recomendvel2 incluir, a a a e a pelo menos, a instruao implicit none. Esta instrui o compilador a exigir que todas as variveis usadas pelo c a programa tenham o seu tipo explicitamente denido. Aps declaradas as variveis, vm os comandos executveis. No caso do programa primeiro, o unico o a e a comando executvel empregado foi a print *, Al^ Mam~e o a o qual tem como conseqncia a impresso do texto Al Mame na tela do monitor, o qual a chamada sada ue a o a e padro. a Finalmente, o programa encerrado com a instruao e c end program primeiro Os recursos utilizados no programa primeiro sero explicados com mais detalhes neste e nos prximos cap a o tulos da apostila.
2 Para

o compilador empregado neste curso, obrigatrio. e o

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

Cap tulo 2. Formato do Cdigo-Fonte o

2.2

Nomes em Fortran 90/95

Um programa em Fortran 90/95 faz referncia a muitas entidades distintas, tais como programas, subproe gramas, mdulos, variveis, etc. Os nomes destas entidades devem consistir em caracteres alfanumricos, de 1 o a e a 31 caracteres. Os caracteres alfanumricos vlidos so: e a a Letras (a - z; A - Z). Numerais (0 - 9). O caractere underscore . A unica restriao que o primeiro caractere seja uma letra. Os seguintes exemplos so vlidos: c e a a A A_COISA X1 MASSA Q123 TEMPO_DE_VOO j estes exemplos no so vlidos: a a a a 1A (comea com numeral) c A COISA (espao em branco) c $SINAL (contm caractere no alfanumrico). e a e

2.3

Entrada e sa padres da o

O Fortran 90 possui trs comandos de entrada/sa de dados. A maneira mais direta de denir valores de e da variveis ou de exibir os valores destas atravs dos dispositivos de entrada/sa padres. a e e da o O dispositivo padro de entrada de dados o teclado. O comando de leitura para o programa ler os valores a e das variveis : a e READ *, <lista de variveis> a READ(*,*) <lista de variveis> a onde lista de variveis so as variveis que devero receber seus valores via teclado. O usurio deve entrar a a a a a com os valores das variveis separando-as por v a rgulas. O dispositivo padro de sa de dados a tela do monitor. H dois comandos de sa padro de dados: a da e a da a PRINT *, [<mensagem>[,]][<lista de variveis>] a WRITE(*,*) [<mensagem>[,]][<lista de variveis>] a O programa a seguir instrui o computador a ler o valor de uma varivel real a partir do teclado e, ento, a a imprimir o valor desta na tela do monitor: program le_valor implicit none real :: a print *, Informe o valor de a: read *, a print *, Valor lido:,a end program le_valor No programa acima, foi declarada a varivel real a, cujo valor ser lido pelo computador, a partir do teclado, a a e ento impresso na tela do monitor. E importante salientar que a instruao implicit none deve ser sempre a c a segunda linha de um programa, subprograma ou mdulo, aparecendo antes do restante das declaraoes de o c variveis. a Esta seao apresentou somente um uso muito simples dos recursos de Entrada/Sa de dados. Uma descriao c da c mais completa destes recursos ser realizada no cap a tulo 9 na pgina 119. a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

2.4. Conjunto de caracteres aceitos


Tabela 2.1: Caracteres especiais do Fortran 90/95

Caractere = + * / ( ) , . $ :

Nome/Funo ca Igual Soma Subtraao c Multiplicaao c Diviso a Parnteses esquerdo e Parnteses direito e V rgula Ponto decimal Cifro a Dois pontos

Caractere ! % & ; ? ** < >

Nome/Funo ca Espao em branco c Exclamaao c Aspas Porcentagem E comercial (ampersand) Ponto e v rgula Ponto de interrogaao c Potncia e Apstrofe o Menor que Maior que

2.4

Conjunto de caracteres aceitos

No Fortran 90/95, os elementos bsicos, denominados de tokens, so os caracteres alfanumricos, os 10 d a a e gitos arbicos, o underscore e o conjunto de caracteres especiais apresentados na tabela 2.1. Dentro da sintaxe da a linguagem, no existem diferenas entre letras ma sculas e min sculas. a c u u

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

Cap tulo 3

Tipos de Variveis a
Em Fortran, h cinco tipos intr a nsecos de variveis: trs tipos numricos, inteiros, reais e complexos (em a e e ingls INTEGER, REAL e COMPLEX) e dois tipos no numricos, caracteres e lgicos (em ingls CHARACTER e e a e o e LOGICAL). O primeiro grupo de variveis utilizado em operaes matemticas e o mais utilizado. O segundo a e co a e grupo utilizado para operaes que envolvem manipulaes de texto ou operaes lgicas. e co co co o Em Fortran 90/95, cada um dos cinco tipos intr nsecos possui um valor inteiro no negativo denominado a parmetro de espcie do tipo (em ingls, kind type parameter ). A norma padro da linguagem determina que a e e a qualquer processador deve suportar pelo menos duas espcies para os tipos REAL e COMPLEX e pelo menos uma e espcie para os tipos INTEGER, CHARACTER e LOGICAL. e Um outro avano do Fortran 90 sobre o predecessor Fotran 77 consiste na habilidade em denir novos tipos de c variveis, baseados nos tipos intr a nsecos. Estas so os chamados tipos derivados ou estruturas, os quais consistem a em combinaes de partes compostas por tipos intr co nsecos e/ou por outros tipos derivados, permitindo gerar objetos de complexidade crescente. Neste cap tulo, vamos inicialmente denir o uso bsicos dos tipos intr a nsecos de variveis, seguindo pela a denio das espcies de variveis mais comuns, terminando por denir os tipos derivados. ca e a

3.1

Declarao de tipo de varivel ca a

Como j foi colocado anteriormente, uma boa praxe de programao1 iniciar o setor de declaraes de a e ca co variveis com a declarao a ca IMPLICIT NONE a qual impede a possibilidade de haver nomes de variveis no denidos, os quais possuem o seu tipo impl a a cito, uma prtica corriqueira em Fortran 77. a A forma geral de uma declarao de tipo de variveis : ca a e <tipo>[([KIND=]<par^metro de espcie>)][,<lista de atributos>] :: a e <lista de entidades>

onde <tipo> especica o tipo de varivel, <par^metro de espcie> especica a espcie da varivel, <lista de a a e e a atributos> um dos seguintes: e PARAMETER PUBLIC PRIVATE POINTER TARGET ALLOCATABLE e cada entidade e <nome do objeto> [(lista de extens~es)] [*char-len] [= express~o de inicializa~o] o a ca ou
1 Para

DIMENSION(<lista de extens~es>) o INTENT(<inout>) OPTIONAL SAVE EXTERNAL INTRINSIC

o compilador usado, obrigatrio. e o

10

3.2. Variveis do tipo INTEGER a <nome da fun~o> [*char-len] ca

onde <nome do objeto> o nome da varivel, seguindo a regra de nomes vlidos denida no cap e a a tulo 2. Os objetos restantes, em particular o <par^metro de espcie> e <lista de atributos> sero estudados ao longo a e a do desenvolvimento desta apostila.

3.2

Variveis do tipo INTEGER a

Este tipo de varivel armazena apenas a parte inteira de um nmero, exemplos de nmeros inteiros vlidos, a u u a tambm denominados literais so: e a 123, 89312, 5. As declaraoes bsicas de variveis de tipo inteiro so: c a a a Fortran 77: INTEGER <lista de variveis> a Fortran 90/95: INTEGER :: <lista de variveis> a O tipo de dados inteiro possui valores que pertencem ao conjunto dos nmeros inteiros. u Programa exemplo: program i n t e i r o i m p l i c i t none integer : : x ! O v a l o r d i g i t a d o n o pode c o n t e r ponto ( . ) Caso i s t o a ! acon te a , v a i g e r a r um e r r o de e x e c u o no programa , c ca ! a b o r t a n d o o mesmo . read , x print , Valor l i d o : , x end program i n t e i r o

3.3

Variveis do tipo REAL a

O tipo de varivel real composto de quatro partes, assim dispostas: a e 1. uma parte inteira, com ou sem sinal, 2. um ponto decimal, 3. uma parte fracionria e a 4. um expoente, tambm com ou sem sinal. e Um ou ambos das partes 1. e 3. devem estar presentes. A parte 4. ou est ausente ou consiste na letra E a seguida por um inteiro com ou sem sinal. Um ou ambos das partes 2. e 4. devem estar presentes. Exemplos de literais reais so: a -10.6E-11 (representando 10, 6 1011 ) 1. -0.1 1E-1 (representando 101 ou 0,1) 3.141592653 Os literais reais so representaoes do conjunto dos nmeros reais e o padro da linguagem no especica a c u a a o intervalo de valores aceitos para o tipo real e nem o nmero de d u gitos signicativos na parte fracionria (3.) a que o processador suporta, uma vez que estes valores dependem do tipo de processador em uso. Valores comuns so: intervalo de nmeros entre 1038 a 10+38 , com uma preciso de cerca de 7 (sete) d a u a gitos decimais. As declaraoes bsicas do tipo real so: c a a Fortran 77: REAL <lista de variveis> a Fortran 90/95: REAL :: <lista de variveis> a
Impresso: 18 de mar o de 2008 c

Autor: Rudi Gaelzer IFM/UFPel

Cap tulo 3. Tipos de Variveis a Programa exemplo: program v a r r e a l i m p l i c i t none r e a l : : a , b= 1 0 . 5 e2 ! V a r i v e l b i n i c i a l i z a d a a 1 0 . 5 e 2. a e print , Valor de a : read , a print , Valor de a : , a print , Valor de b : , b end program v a r r e a l

11

3.4

Variveis do tipo COMPLEX a

O Fortran, como uma linguagem destinada para clculos cient a cos ou em engenharia, tem a vantagem de possuir um terceiro tipo intr nseco: complexo. Este tipo concebido como um par de literais, os quais so ou e a inteiros ou reais, separados por v rgula , e contidos entre parnteses ( ). Os literais complexos representam e nmeros contidos no conjunto dos nmeros complexos, isto , nmeros do tipo z = x + iy, onde i = 1, x a u u e u e parte real e y a parte imaginria do nmero complexo z. Assim, um literal complexo deve ser escrito: e a u (<parte real>,<parte imaginria>) a Exemplos de literais complexos so: a (1.,3.2) (representando 1 + 3, 2i) (1.,.99E-2) (representando 1 + 0, 99 102 i) (1.0,-3.7) Uma outra grande vantagem do Fortran que toda a lgebra de nmeros complexos j est implementada e a u a a a n vel de compilador. Assim, se for realizado o produto de dois nmeros complexos (x1,y1) e (x2,y2), o u resultado ser o literal complexo dado por (x1*x2 - y1*y2,x1*y2 + x2*y1). O mesmo acontecendo com as a outras operaes algbricas. co e As declaraes bsicas do tipo complexo so: co a a Fortran 77: COMPLEX <lista de variveis> a Fortran 90/95: COMPLEX :: Programa exemplo: program va r c omp le xa i m p l i c i t none complex : : a= (5 , 5) , b , c ! V a r i v e l a i n i c i a l i z a d a a (5 , 5). a e print , Valor de b : ! O v a l o r de b d e v e s e r e n t r a d o como um l i t e r a l complexo . ! Exemplo : ( 1 . 5 , 2 . 5 ) read , b c= a b print , O v a l o r de c : , c ! V e r i f i q u e o r e s u l t a d o no p a p e l . end program va r com ple xa <lista de variveis> a

3.5

Variveis do tipo CHARACTER a

O tipo padro consiste em um conjunto de caracteres contidos em um par de apstrofes ou aspas. Os a o caracteres no esto restridos ao conjunto de caracteres padro denidos na seo 2.4. Qualquer caracteres a a a ca que possa ser representado pelo processador aceito, exceto os caracteres de controle tais como o return. Os e apstrofes ou aspas servem como delimitadores dos literais de caractere e no so considerados parte integrante o a a do conjunto. Ao contrrio das normas usuais, um espao em branco diferente de dois ou mais. a c e Exemplos de literais de caractere:
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

12

3.5. Variveis do tipo CHARACTER a bom Dia bomDia BRASIL Fortran 90 As declaraoes mais utilizadas para o tipo caractere so: c a

Fortran 77: character*<comprimento> <lista de variveis> a ou character <nome 1>*<comp. 1>, [<nome 2>*<comp. 2>, ...] Fortran 90/95: character(len=<comprimento>) :: <lista de variveis> a

onde <comprimento> indica a quantidade de caracteres contidos nas variveis. Todas as variveis denidas por a a esta declarao tm o mesmo nmero de caracteres. Se for informado um literal maior que <comprimento>, este ca e u ser truncado; se for informado um literal menor que o declarado, o processador ir preencher o espao restante a a c a ` direita com espaos em branco. c Programa exemplo: program l e c a r a c t e r e i m p l i c i t none character ( len =10) : : s t r r e a d print , Entre com t e x t o : read ( a ) , s t r r e a d print , Texto l i d o : , s t r r e a d end program l e c a r a c t e r e E importante mencionar aqui a regra particular para o formato de fonte dos literais de caractere que so a escritos em mais de uma linha: 1. Cada linha deve ser encerrada com o caractere & e no pode ser seguida por comentrio. a a 2. Cada linha de continuao deve ser precedida tambm pelo caractere &. ca e 3. Este par && no faz parte do literal. a 4. Quaisquer brancos seguindo um & em nal de linha ou precedendo o mesmo caractere em in de linha cio no so partes do literal. a a 5. Todo o restante, incluindo brancos, fazem parte do literal. Como exemplo temos: car_longo = O tempo que eu hei sonhado & Quantos anos foi de vida! & Ah, quanto do meu passado & Foi s a vida mentida o & De um futuro imaginado! & & Aqui ` beira do rio a & Sossego sem ter raz~o. a & Este seu correr vazio & Figura, an^nimo e frio, o & A vida, vivida em v~o. a
Autor: Rudi Gaelzer IFM/UFPel

& & & & & & & & & & &

Impresso: 18 de mar o de 2008 c

Cap tulo 3. Tipos de Variveis a

13

3.6

Variveis do tipo LOGICAL a

O tipo lgico dene variveis lgicas. Uma varivel lgica s pode assumir dois valores, verdadeiro e falso. o a o a o o A representao dos dois estado poss ca veis de uma varivel lgica so: a o a .TRUE. Verdadeiro .FALSE. Falso. As declaraoes do tipo lgico so: c o a Fortran 77: logical <lista de variveis> a Fortran 90/95: logical :: Programa exemplo: program l o g i c o i m p l i c i t none l o g i c a l : : a= . t r u e . i f ( a ) then print , A v a r i v e l v e r d a d e i r a . a e end i f end program l o g i c o <lista de variveis> a

3.7

O conceito de espcie (kind) e

Em Fortran, alm dos 5 tipos de variveis denidos nas sees 3.2 a 3.6, poss e a co e vel denir extenses a o um determinado tipo, cujas declaraes dependem da verso do Fortran utilizada e do processador no qual o co a programa ser executado. a

3.7.1

Fortran 77

Em Fortran 77 as extenses mais comuns e as correspondentes declaraes so: o co a variveis reais de preciso dupla: real*8 <lista de variveis> ou double precision <lista de vaa a a riveis>. a variveis reais de preciso estendida (ou qudrupla): real*16 <lista de variveis>. a a a a variveis complexas de preciso dupla: complex*16 <lista de variveis>. a a a As diferenas entre estas extenses e os correspondentes tipos originais sero ilustradas a seguir. c o a

3.7.2

Fortran 90/95

Em Fortran 90/95, cada um dos cinco tipos intr nsecos, INTEGER, REAL, COMPLEX, CHARACTER e LOGICAL possui associado um valor inteiro no negativo denominado parmetro de espcie do tipo (kind type parameter). a a e Por exigncia do padro, um processador deve suportar, no m e a nimo, duas espcies para os tipos REAL e COMPLEX e e uma espcie para os tipos INTEGER, CHARACTER e LOGICAL. e Os valores da espcie so dependentes do processador e/ou do compilador empregado. Contudo, h funes e a a co intr nsecas fornecidas pelo compilador que vericam as precises suportadas pelo processador e que podem o ser usadas para denir o valor do parmetro KIND, possibilitando assim a portabilidade do cdigo, isto , a a o e possibilidade deste rodar em diferentes arquiteturas usando uma preciso m a nima especicada pelo programador. Para demonstrar como diferentes compiladores implementam e usam o parmetro de espcie, sero considea e a rados os compiladores Intel R Fortran Compiler for linux (verso 9.1), gfortran e o compilador F, todos a gratuitos.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

14

3.7. O conceito de espcie (kind) e


Tabela 3.1: Tabela de armazenamento de variveis para o compilador Intel a
R

Fortran.

Tipo e Espcie e INTEGER(KIND=1) INTEGER(KIND=2) INTEGER(KIND=4) INTEGER(KIND=8) REAL(KIND=4) REAL(KIND=8) REAL(KIND=16) 3.7.2.1

Armazenamento (bytes) 1=8 bits 2 4 8 4 8 16 Fortran

Tipo e Espcie e LOGICAL(KIND=1) LOGICAL(KIND=2) LOGICAL(KIND=4) LOGICAL(KIND=8) COMPLEX(KIND=4) COMPLEX(KIND=8) COMPLEX(KIND=16)

Armazenamento (bytes) 1 2 4 8 8 16 32

Compilador Intel

O compilador Intel R Fortran oferece os seguintes tipos intr nsecos, juntamente com as respectivas declaraes de tipo e espcie: co e Tipo Inteiro. H 04 parmetros de espcie para o tipo inteiro. a a e Declarao: INTEGER([KIND=]<n>) [::] <lista de variveis> ca a Sendo <n> das espcies 1, 2, 4 ou 8. Se o parmetro de espcie explicitado, as variveis na <lista e a e e a de variveis> sero da espcie escolhida. Em caso contrrio, a espcie ser o inteiro padro: INTEa a e a e a a GER(KIND=4); ou seja, a declarao INTEGER :: <lista de variveis> equivale a INTEGER(KIND=4) ca a :: <lista de variveis>. a Tipo Real. H 03 parmetros de espcie para o tipo real. a a e Declarao: REAL([KIND=]<n>) [::] <lista de variveis> ca a Sendo <n> igual a 4, 8 ou 16. Caso o parmetro de espcie no seja especicado, a espcie ser o real a e a e a padro: REAL(KIND= 4). a Tipo Complexo. H 03 parmetros de espcie para o tipo complexo. a a e Declarao: COMPLEX([KIND=]<n>) [::] <lista de variveis> ca a Sendo <n> igual a 4, 8 ou 16. Caso o parmetro de espcie no seja explicitado, a espcie ser o complexo a e a e a padro: COMPLEX(KIND= 4). a Tipo Lgico. H 04 parmetros de espcie para o tipo lgico. o a a e o Declarao: LOGICAL([KIND=]<n>) [::] <lista de variveis> ca a Sendo <n> igual a 1, 2, 4 ou 8. Tipo Caractere. H somente uma espcie do tipo caractere. a e Declarao: CHARACTER([KIND=1],[LEN=]<comprimento>) [::] ca <lista de variveis> a

Cada espcie distinta ocupa um determinado espao de memria na CPU. Para o compilador Intel R Fortran, e c o o espao ocupado est descrito na tabela 3.1. c a O programa 3.1 a seguir ilustra do uso e as diferenas de algumas opes de espcies de tipos de variveis. O c co e a mesmo programa tambm indica o uso de alguns atributos na declarao de variveis, tais como na declarao e ca a ca INTEGER, PARAMETER :: DP= 2

O atributo PARAMETER indica que as variveis declaradas nesta sentena devem se comportar como constantes a c matemticas, isto , no podem ser alteradas no programa por nenhuma atribuio de variveis (ver cap a e a ca a tulo 4). Na mesma declarao, j foi denido que o valor do parmetro DP igual a 2. ca a a e O mesmo exemplo tambm ilustra o uso da funo impl e ca cita SQRT(X): R_SIMPLES= SQRT(2.0) a qual calculou a raiz quadrada da constante 2.0 e atribuiu o resultado ` varivel R_SIMPLES. a a 3.7.2.2 Compilador gfortran

Gfortran o compilador Fortran 95 da GNU,2 inicialmente desenvolvido como alternativa ao compilador e f95 distribu pelas verses comerciais do Unix. Atualmente, o gfortran parte integrante da plataforma de do o e
2 Fundao ca

Gnu is Not Unix.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 18 de mar o de 2008 c

Cap tulo 3. Tipos de Variveis a


Programa 3.1: Testa distintas espcies suportadas pelo compilador Intel R Fortran. e

15

program t e s t a k i n d i n t e l i m p l i c i t none integer , parameter : : dp= 8 , qp= 16 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a r e a l ( kind= qp ) : : r quad ! ! C a l c u l a a r a i z quadrada de 2 em d i v e r s a s p r e c i s e s . o r s i m p l e s= s q r t ( 2 . 0 ) ! Preciso simples a r d u p l a= s q r t ( 2 . 0 dp ) ! P r e c i s o d u p l a a r quad= s q r t ( 2 . 0 qp ) ! P r e c i s o q u d r u p l a ou e s t e n d i d a . a a ! ! Imprime r e s u l t a d o s na t e l a . print , r s i m p l e s print , r d u p l a print , r quad ! end program t e s t a k i n d i n t e l

Tabela 3.2: Tabela de armazenamento de variveis para o compilador gfortran da fundaao GNU. a c

Tipo e Espcie e INTEGER(KIND=1) INTEGER(KIND=2) INTEGER(KIND=4) INTEGER(KIND=8) INTEGER(KIND=16)3 REAL(KIND=4) REAL(KIND=8) REAL(KIND=10)

Armazenamento (bytes) 1=8 bits 2 4 8 16 4 8 10

Tipo e Espcie e LOGICAL(KIND=1) LOGICAL(KIND=2) LOGICAL(KIND=4) LOGICAL(KIND=8) LOGICAL(KIND=16) COMPLEX(KIND=4) COMPLEX(KIND=8) COMPLEX(KIND=10)

Armazenamento (bytes) 1 2 4 8 16 8 16 20

desenvolvimento de software GCC (GNU Compiler Collection), que composta por compiladores de diversas e linguagens distintas, tais como Fortran 95, C/C++, Java, Ada, entre outros. O comando gfortran consiste simplesmente em um script que invoca o programa f951, o qual traduz o cdigo-fonte para assembler, invocando o em seguida o linkador e as bibliotecas comuns do pacote GCC. No gfortran, os parmetros de espcie so determinados de forma semelhante ao compilador Intel R a e a Fortran, discutido na seo 3.7.2.1, ou seja, o parmetro indica o nmero de bytes necessrios para armazenar ca a u a cada varivel da respectiva espcie de tipo. As espcies suportadas pelo gfortran so descritas na tabela 3.2. a e e a O programa testa_kind_gfortran a seguir (programa 3.2) ilustra o uso e as diferenas entre as diversas c espcies de tipos de dados no compilador gfortran. e 3.7.2.3 Compilador F

Como exemplo do uso do parmetro de espcie, a tabela 3.3 ilustra os valores suportados pelo compilador a e F, conforme fornecidos pelo guia do usurio4 . H duas possibilidades para os nmeros da espcie: a a u e 1. o modo padro de operao, tambm denominado seqencial, o qual pode, porm, ser especicado explia ca e u e citamente no momento da compilao com a chave -kind=sequential; ca 2. o esquema de numerao bytes, o qual deve ser especicado no momento da compilao com a chave ca ca -kind=byte: alunos|fulano>F -kind=byte <nome programa>.f90 -o <nome programa>
3 Em

4 The

plataformas de 64 bits, tais como a fam de processadores Intel R CoreTM 2. lia F Compiler and Tools http://www.fortran.com/imagine1/ftools.pdf.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 18 de mar o de 2008 c

16

3.7. O conceito de espcie (kind) e

Programa 3.2: Testa distintas espcies suportadas pelo compilador gfortran . e

program t e s t a k i n d g f o r t r a n i m p l i c i t none integer , parameter : : i 1= 1 , i 2= 2 , i 4= 4 , i 8= 8 , i 1 6= 16 integer , parameter : : dp= 8 , qp= 10 integer ( kind= i 1 ) : : v i 1 integer ( kind= i 2 ) : : v i 2 integer ( kind= i 4 ) : : v i 4 integer ( kind= i 8 ) : : v i 8 integer ( kind= i 1 6 ) : : v i 1 6 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a r e a l ( kind= qp ) : : r quad complex : : c s i m p l e s complex ( kind= dp ) : : c d u p l a complex ( kind= qp ) : : c quad ! ! Mostra maiores numeros r e p r e s e n t a v e i s do t i p o i n t e i r o . v i 1= huge ( 1 i 1 ) v i 2= huge ( 1 i 2 ) v i 4= huge ( 1 i 4 ) v i 8= huge ( 1 i 8 ) v i 1 6= huge ( 1 i 1 6 ) print , E s p e c i e s I n t e i r a s : print , vi1 , vi2 , v i 4 print , v i 8 print , v i 1 6 ! Mostra maiores numeros r e p r e s e n t a v e i s do t i p o r e a l . r s i m p l e s= huge ( 1 . 0 ) ! Precisao simples r d u p l a= huge ( 1 . 0 dp ) ! P r e c i s a o d u p l a r quad= huge ( 1 . 0 qp ) ! P r e c i s a o e s t e n d i d a ! ! C a l c u l a a r a i z quadrada de ( 2 , 2 ) em d i v e r s a s p r e c i s o e s . c s i m p l e s= s q r t ( ( 2 . 0 , 2 . 0 ) ) c d u p l a= s q r t ( ( 2 . 0 dp , 2 . 0 dp ) ) c quad= s q r t ( ( 2 . 0 qp , 2 . 0 qp ) ) ! print , print , E s p e c i e s R e a i s e Complexas : print , r s i m p l e s print , r d u p l a print , r quad print , c s i m p l e s print , c d u p l a print , c quad ! end program t e s t a k i n d g f o r t r a n

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 18 de mar o de 2008 c

Cap tulo 3. Tipos de Variveis a


Tabela 3.3: Valores de espcies (kind) de tipos de variveis suportados pelo compilador F. e a

17

Tipo Real Real Real5 Complex Complex Complex Logical Logical Logical Logical Integer Integer Integer Integer Character

N mero do Kind u (Sequencial) 1 2 3 1 2 3 1 2 3 4 1 2 3 4 1

N mero do Kind u (Byte) 4 8 16 4 8 16 1 2 4 8 1 2 4 8 1

Descrio ca Real preciso simples (padro) a a Real preciso dupla a Real preciso qudrupla a a Complexo preciso simples (padro) a a Complexo preciso dupla a Complexo preciso qudrupla a a Lgico 1 byte o Lgico 2 bytes o Lgico 4 bytes (padro) o a Lgico 8 bytes o Inteiro 1 byte Inteiro 2 bytes Inteiro 4 bytes (padro) a Inteiro 8 bytes Caractere, 1 byte por caractere

O exemplo a seguir, programa testa_kind_F, ilustra do uso e as diferenas de algumas opes de espcies de c co e tipos de variveis. a program t e s t a k i n d F i m p l i c i t none integer , parameter : : dp= 2 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a complex : : c s i m p l e s complex ( kind= dp ) : : c d u p l a ! ! C a l c u l a a r a i z quadrada de 2 em d i v e r s a s p r e c i s e s . o r s i m p l e s= s q r t ( 2 . 0 ) ! Preciso simples a r d u p l a= s q r t ( 2 . 0 ) ! Preciso dupla a ! ! N meros co mp l ex o s : p a r t e r e a l : r a i z de 2 . P arte i m a g i n r i a : r a i z de 3 . u a c s i m p l e s= cmplx ( s q r t ( 2 . 0 ) , s q r t ( 3 . 0 ) ) c d u p l a= cmplx ( s q r t ( 2 . 0 ) , s q r t ( 3 . 0 ) ) ! ! Imprime r e s u l t a d o s na t e l a . print , r s i m p l e s print , r d u p l a print , c s i m p l e s print , c d u p l a ! end program t e s t a k i n d F

3.7.2.4

Literais de diferentes espcies e

Para distingir as espcies dos literais (ou constantes) dentre diferentes nmeros fornecidos ao compilador, u e u utiliza-se o suxo _<k>, sendo <k> o parmetro da espcie do tipo: a e Literais inteiros. Constante inteiras, incluindo a espcie, so especicadas por: e a [<s>]<nnn...>[_<k>] onde: <s> um sinal (+ ou ); obrigatrio se negativo, opcional se positivo. <nnn...> um conjunto de e o e d gitos (0 a 9); quaisquer zeros no in so ignorados. _<k> um dos parmetros de espcie do tipo: 1, cio a e a e 2, 4 ou 8; esta opo explicita a espcie do tipo ` qual o literal pertence. ca e a
5 Variveis a

reais e complexas de preciso qudrupla no so suportadas por todas as verses do compilador F. a a a a o

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 18 de mar o de 2008 c

18

3.7. O conceito de espcie (kind) e

Literais reais. Constantes reais so especicadas de diferentes maneiras, dependendo se possuem ou no parte a a exponencial. A regra bsica para a especicao de um literal real j foi denida na seo 3.3. Para a ca a ca explicitar a espcie do tipo real ` qual o literal pertence, deve-se incluir o suxo _<k>, onde <k> um dos e a e parmetros de espcie do tipo: 4, 8 ou 16. Por exemplo: a e 2.0_8: para indicar tipo real, espcie 8. e Literais complexos. A regra bsica para a especicao de um literal complexo j foi denida na seo 3.4. a ca a ca Para explicitar a espcie do tipo ` qual o literal pertence, deve-se incluir o suxo _<k>, onde <k> um dos e a e parmetros de espcie do tipo: 4, 8 ou 16, em cada uma das partes real e imaginria do literal complexo. a e a Por exemplo: (1.0_8,3.5345_8): para indicar tipo complexo, espcie 8. e Literais lgicos. Uma constante lgica pode tomar uma das seguintes formas: o o .TRUE.[_<k>] .FALSE.[_<k>] onde <k> um dos parmetros de espcie do tipo: 1, 2, 4 ou 8. e a e

3.7.3

Funoes intr c nsecas associadas ` espcie a e

Embora as declaraes de espcie do tipo possam variar para diferentes compiladores, o padro da linguagem co e a estabelece um conjunto de funes intr co nsecas que facilitam a determinao e a declarao destas espcies de ca ca e uma forma totalmente portvel, isto , independente de compilador e/ou arquitetura. a e 3.7.3.1 KIND(X)

A funo intr ca nseca KIND(X), a qual tem como argumento uma varivel ou constante de qualquer tipo a intr nseco, retorna o valor inteiro que identica a espcie da varivel X. Por exemplo, e a program t e s f u n k i n d i m p l i c i t none integer : : i , j integer , parameter : : dp= 2 real : : y r e a l ( kind= dp ) : : x ! i= kind ( x ) ! i= 2 j= kind ( y ) ! Depende do s i s t e m a ( j =1 para c o m p i l a d o r F ) . print , i print , j end program t e s f u n k i n d Outros exemplos: KIND(0) KIND(0.0) KIND(.FALSE.) KIND(A) KIND(0.0D0) ! ! ! ! ! ! ! ! ! ! Retorna a espcie padr~o do tipo inteiro. e a (Dependente do processador). Retorna a espcie padr~o do tipo real. e a (Depende do processador). Retorna a espcie padr~o do tipo lgico. e a o (Depende do processador). Fornece a espcie padr~o de caractere. e a (Sempre igual a 1). Usualmente retorna a espcie do tipo real de precis~o dupla. e a (Pode n~o ser aceito por todos compiladores). a

3.7.3.2

SELECTED_REAL_KIND(P,R)

A funo intr ca nseca SELECTED_REAL_KIND(P,R) tem dois argumentos opcionais: P e R. A varivel P especica a a preciso m a nima (nmero de d u gitos decimais) requerida e R especica o intervalo de vario m ca nimo da parte exponencial da varivel. a A funo SELECTED_REAL_KIND(P,R) retorna o valor da espcie que satisfaz, ou excede minimamente, os ca e requerimentos especicados por P e R. Se mais de uma espcie satisfaz estes requerimentos, o valor retornado e e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

Cap tulo 3. Tipos de Variveis a

19

aquele com a menor preciso decimal. Se a preciso requerida no for dispon a a a vel, a funo retorna o valor -1; se ca o intervalo da exponencial no for dispon a vel, a funo retorna -2 e se nenhum dos requerimentos for dispon ca vel, o valor -3 retornado. e Esta funao, usada em conjunto com a declarao de espcie, garante uma completa portabilidade ao proc ca e grama, desde que o processador tenha dispon veis os recursos solicitados. O exemplo a seguir ilustra o uso desta funo intr ca nseca e outros recursos. program t e s s e l e c t e d integer , parameter : : i 1 0= s e l e c t e d r e a l k i n d ( 1 0 , 2 0 0 ) integer , parameter : : dp= 16 r e a l ( kind= i 1 0 ) : : a , b , c r e a l ( kind= dp ) : : d print , i 1 0 a= 2 . 0 i 1 0 b= s q r t ( 5 . 0 i 1 0 ) c= 3 . 0 e 1 0 i 1 0 d= 1 . 0 e201 dp print , a print , b print , c print , d end program t e s s e l e c t e d Pode-se ver que a preciso requerida na varivel I10 dispon na espcie correspondente ` preciso dupla de a a e vel e a a uma varivel real (ver tabela 3.3). Um outro recurso dispon a possibilidade de especicar constantes de a vel e uma determinada espcie, como na atribuio e ca A= 2.0_I10 A constante A foi explicitamente especicada como pertencente ` espcie I10 seguindo-se o valor numrico com a e e um underscore e com o parmetro de espcie do tipo (I10). Alm disso, deve-se notar que a denio da espcie a e e ca e I10 e a declarao das variveis A, B e C como sendo desta espcie limita o intervalo de variao da parte ca a e ca exponencial. Por exemplo, se a varivel D tivesse sido declarada tambm da espcie I10, a atribuio a e e ca D= 1.0E201_I10 iria gerar uma mensagem de erro no momento da compilao, porque a parte exponencial excedeu o intervalo ca denido (200). 3.7.3.3 SELECTED_INT_KIND(R)

A funo intr ca nseca SELECTED_INT_KIND(R) usada de maneira similar ` funo SELECTED_REAL_KIND. e a ca Agora, a funao tem um unico argumento R, o qual especica o intervalo de nmeros inteiros requerido. Assim, c u SELECTED_INT_KIND(r) retorna o valor da espcie que representa, no m e nimo, valores inteiros no intervalo 10r r a +10 . Se mais de uma espcie satisfaz o requerimento, o valor retornado aquele com o menor intervalo no e e expoente r. Se o intervalo no for dispon a vel, o valor -1 retornado. e O exemplo a seguir mostra a declarao de um inteiro de uma maneira independente do sistema: ca INTEGER, PARAMETER :: I8= SELECTED_INT_KIND(8) INTEGER(KIND= I8) :: IA, IB, IC As variveis inteiras IA, IB e IC podem ter valores entre 108 a +108 no m a nimo, se dispon pelo processador. vel

3.8

Tipos derivados

Uma das maiores vantagens do Fortran 90/95 sobre seus antecessores est na disponibilidade ao programador a de denir seus prprios tipos de variveis. Estas so os chamados tipos derivados, tambm freqentemente o a a e u denominados de estruturas. A forma geral da declarao de um tipo derivado : ca e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

20

3.8. Tipos derivados TYPE [[,<acesso> ] ::] <nome do tipo > [PRIVATE] <declara~es de componentes > co END TYPE [<nome do tipo >]

onde cada <declarao de componentes> tem a forma ca <tipo >[[, <atributos >] ::] <lista de componentes > onde aqui o <tipo> pode ser um tipo de varivel intr a nseca ou outro tipo derivado. A declarao de uma lista ca de variveis do tipo derivado <nome do tipo> feita atravs da linha: a e e TYPE (<nome do tipo >) [::] <lista de nomes> Para tentar-se entender o uso de uma varivel de tipo derivado, vamos denir um novo tipo: PONTO, o qual ser a a constru a partir de trs valores reais, representando os valores das coordenadas x, y e z do ponto no espao do e c cartesiano: program d e f t i p o d e r i m p l i c i t none type : : ponto real : : x , y , z end type ponto ! type ( ponto ) : : c e n t r o , a p i c e ! a p i c e%x= 0 . 0 a p i c e%y= 1 . 0 a p i c e%z= 0 . 0 c e n t r o = ponto ( 0 . 0 , 0 . 0 , 0 . 0 ) ! print , a p i c e print , c e n t r o ! end program d e f t i p o d e r No exemplo acima, deniu-se o tipo derivado PONTO, composto por trs componentes reais x, y e z. Em seguida, e declarou-se duas variveis como sendo do tipo PONTO: CENTRO e APICE. A seguir, atribuiu-se os valores para a estas variveis. Finalmente, mandou-se imprimir na tela o valor das variveis. a a Como foi mostrado na atribuio APICE%X= 0.0, cada componente da varivel de tipo derivado pode ser ca a referenciada individualmente por meio do caractere seletor de componente, %. J a varivel CENTRO teve os a a valores de suas componentes denidos pelo construtor de estrutura: CENTRO= PONTO(0.0,0.0,0.0) ou seja, CENTRO%X= 0.0, CENTRO%Y= 0.0 e CENTRO%Z= 0.0. Estruturas denidas desta forma podem ser interessantes quando o programador quer classicar determinados objetos caracterizados por parmetros e/ou qualicadores representados por variveis de diferentes tipos. E a a poss vel construirem-se estruturas progressivamente mais complicadas denindo-se novos tipos derivados que englobam aqueles previamente denidos. Por exemplo, TYPE :: RETA TYPE (PONTO) :: P1,P2 END TYPE RETA TYPE (RETA) :: DIAGONAL_PRINCIPAL ! DIAGONAL_PRINCIPAL%P1%X= 0.0 DIAGONAL_PRINCIPAL%P1%Y= 0.0 DIAGONAL_PRINCIPAL%P1%Z= 0.0 ! DIAGONAL_PRINCIPAL%P2= PONTO(1.0,1.0,1.0)
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

Cap tulo 3. Tipos de Variveis a

21

Aqui foi denido o tipo RETA no espao cartesiano, a qual totalmente caracterizada por dois pontos, P1 e P2, c e os quais, por sua vez so ternas de nmeros do tipo (x, y, z). Deniu-se ento a varivel DIAGONAL_PRINCIPAL a u a a como sendo do tipo RETA e deniu-se os valores dos dois pontos no espao P1 e P2 que caracterizam a diagonal c principal. Note o uso de dois seletores de componente para denir o valor da coordenada x do ponto P1 da DIAGONAL_PRINCIPAL. Note, por outro lado, o uso do construtor de estrutura para denir a posio do ponto ca P2, como componente da diagonal principal. O exemplo a seguir, dene o tipo ALUNO, caracterizado por NOME, CODIGO de matr cula, notas parciais N1, N2 e N3 e mdia nal MF. O programa l as notas e calcula e imprime a mdia nal do aluno. e e e ! Dados a c e r c a de a l u n o s usando t i p o d e r i v a d o . program a l u n o s i m p l i c i t none type : : a l u n o character ( len= 2 0 ) : : nome integer : : c o d i g o r e a l : : n1 , n2 , n3 , mf end type a l u n o type ( a l u n o ) : : d i s c e n t e ! print , Nome : read ( a ) , d i s c e n t e%nome i f ( d i s c e n t e%nome == ) e xi t print , c o d i g o : read , d i s c e n t e%c o d i g o print , Notas : N1 , N2 , N3 : read , d i s c e n t e%n1 , d i s c e n t e%n2 , d i s c e n t e%n3 d i s c e n t e%mf= ( d i s c e n t e%n1 + d i s c e n t e%n2 + d i s c e n t e%n3 ) / 3 . 0 print , print,> , d i s c e n t e%nome , ( , d i s c e n t e%c o d i g o , ) < print , Media f i n a l : , d i s c e n t e%mf end program a l u n o s

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 18 de mar o de 2008 c

22

3.8. Tipos derivados

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 18 de mar o de 2008 c

Cap tulo 4

Expresses e Atribuies Escalares o co


Em uma expresso, o programa descreve as operaoes que devem ser executadas pelo computador. O a c resultado desta expresso pode ento ser atribu a uma varivel. H diferentes conjuntos de regras para a a do a a expresses e atribuioes, dependendo se as variveis em questo so numricas, lgicas, caracteres ou de tipo o c a a a e o derivado; e tambm se as expresses so escalares ou matriciais. e o a Cada um dos conjunto de regras para expresses escalares ser agora discutido. o a

4.1

Regras bsicas a

Uma expresso em Fortran 90/95 formada de operandos e operadores, combinados de tal forma que estes a e seguem as regras de sintaxe. Os operandos podem ser constantes, variveis ou funoes e uma expresso, por si a c a mesma, tambm pode ser usada como operando. e Uma expresso simples envolvendo um operador unitrio ou mondico tem a seguinte forma: a a a operador operando um exemplo sendo -Y J uma expresso simpes emvolvendo um operador binrio (ou didico) tem a forma: a a a a operando operador operando um exemplo sendo X + Y Uma expresso mais complicada seria a operando operador operando operador operando onde operando consecutivos so separados por um unico operador. Cada operando deve ter valor denido e o a resultados da expresso deve ser matematicamente denido; por exemplo, diviso por zero no permitido. a a a e A sintaxe do Fortran estabelece que as partes de expresses sem parnteses sejam desenvolvidas da esquerda o e para a direita para operadores de igual precedncia, com a exceao do operador ** (ver seao 4.2). Caso seja e c c necessrio desenvolver parte de uma expresso, ou subexpresso, antes de outra, parnteses podem ser usados a a a e para indicar qual subexpresso deve ser desenvolvida primeiramente. Na expresso a a operando operador (operando operador operando) a subexpresso entre parnteses ser desenvolvida primeiro e o resultado usado como um operando para o a e a primeiro operador, quando ento a expresso completa ser desenvolvida usando a norma padro, ou seja, da a a a a esquerda para a direita. Se uma expresso ou subexpresso no contida em parnteses, permitido ao processador desenvolver uma a a a e e e expresso equivalente, a qual uma expresso que resultar no mesmo valor, exceto por erros de arredondamento a e a a numrico. As duas operaoes a seguir so, em princ e c a pio, equivalentes: 23

24

4.2. Expresses numricas escalares o e


Tabela 4.1: Operadores numricos escalares e

Operador ** * / + -

Operao ca Potenciaao c Multiplicaao c Diviso a Adiao c Subtraao c

A/B/C ou A/(B*C) Poss veis diferenas nos resultados das operaoes acima consistem em diferentes erros de arredondamento e/ou c c tempo de processamento, caso o processador consiga multiplicar mais rapidamente que dividir. Se dois operadores seguem-se imediatamente, como em operando operador operador operando a unica interpretaao poss que o segundo operador mondico. Portanto, a sintaxe pro que um operador c vel e e a be binrio siga outro operador, somente um operador unitrio. a a

4.2

Expresses numricas escalares o e

Uma expresso numrica aquela cujos operandos so um dos trs tipos numricos: inteiro, real e complexo. a e e a e e A tabela 4.1 apresenta os operadores, em ordem de precedncia, e o seu respectivo signicado. Estes operadores e so conhecidos como operadores numricos intrnsicos. a e Na tabela 4.1, as linhas horizontais connam os operadores de igual precedncia e a ordem de precedncia e e dada de cima para baixo. O operador de potenciaao ** o de maior precedncia; os operadores de e c e e multiplicaao * e diviso / tm a mesma precedncia entre si e possuem precedncia sobre os operadores de c a e e e adiao + e subtraao -, os quais tm a mesma precedncia entre si. c c e e Na ausncia de parnteses ou dentro destes, no caso de subexpresses, a operaao com a maior precedncia e e o c e o clculo das funoes, seguidos das exponenciaoes que sero realizadas antes de multiplicaoes ou divises e e a c c a c o estas, por sua vez, antes de adioes ou subtraoes. c c Uma expresso numrica especica uma computaao usando constantes, variveis ou funoes, seguindo o a e c a c seguinte conjunto de regras: Os operadores de subtraao - e de adiao + podem ser usados como operadores unitrios, como em c c a -VELOCIDADE Uma vez que no permitido na notaao matemtica ordinria, uma subtraao ou adiao unitria no a e c a a c c a a pode seguir imediatamente aps outro operador. Quando isto necessrio, deve-se fazer uso de parnteses. o e a e Por exemplo, as operaoes matemticas a seguir: c a xy deve ser digitada: X**(-Y); x(y) deve ser digitada : X*(-Y). Como j foi mencionado na seao 4.1, um operador binrio tambm no pode seguir outro operador. a c a e a Os parnteses devem indicar os agrupamentos, como se escreve em uma expresso matemtica. Os parne a a e teses indicam que as operaoes dentro deles devem ser executadas prioritariamente: c 3 (a+b) (x + y)2 + w2 deve ser digitada: (A+B)*((X+Y)**2 + W**2)**3 ou (A+B)*(((X+Y)**2 + W**2)**3) Os parnteses no podem ser usados para indicar multiplicaao, sendo sempre necessrio o uso do operador e a c a *. Qualquer expresso pode ser envolvida por parnteses exteriores, que no a afetam: a e a X + Y equivalente a ((X) + Y) ou equivalente a ((X + Y)) e Contudo, o n mero de parnteses ` esquerda deve sempre ser igual ao n mero de parnteses ` direita. u e a u e a Nenhum operador pode ser deixado impl cito: 5*T ou T*5: correto 5T, 5(T) ou T5: incorreto. De acordo com a tabela 4.1, a qual fornece o ordenamento dos operadores, a operaao matemtica 2x2 + y c a pode ser expressa de, no m nimo, duas maneiras equivalentes: 2*X**2 + Y ou 2*(X**2) + Y ou ainda (2*(x**2)) + Y.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 4. Expresses e Atribuioes Escalares o c


Tabela 4.2: Tipos de resultados de A .op. B, onde .op. +, -, * ou /. e

25

Tipo de A I I I R R R C C C

Tipo de B I R C I R C I R C

Valor de A usado na .op. A REAL(A,KIND(B)) CMPLX(A,0,KIND(B)) A A CMPLX(A,0,KIND(B) A A A

Valor de B usado na .op. B B B REAL(B,KIND(A) B B CMPLX(B,0,KIND(A) CMPLX(B,0,KIND(A) B

Tipo de resultado I R C R R C C C C

Tabela 4.3: Tipos de resultados de A**B.

Tipo de A I I I R R R C C C

Tipo de B I R C I R C I R C

Valor de A usado na .op. A REAL(A,KIND(B)) CMPLX(A,0,KIND(B)) A A CMPLX(A,0,KIND(B) A A A

Valor de B usado na .op. B B B B B B B CMPLX(B,0,KIND(A) B

Tipo de resultado I R C R R C C C C

A exceao ` regra esquerda-para-direita para operadores de igual precedncia ocorre para a potenciaao c a e c **. A expresso a A**B**C vlida e desenvolvida da direita para a esquerda como e a e A**(B**C). Para dados inteiros, o resultado de qualquer diviso ser truncado para zero, isto , para o valor inteiro a a e cuja magnitude igual o logo inferior que a magnitude do valor exato. Assim, o resultado de e 6/3 2 e 8/3 2 e -8/3 -2. e Este fato deve sempre ser levado em conta quando divises de inteiros esto sendo realizadas. Por isto, o o a valor de 2**3 8, enquanto que o valor de 2**(-3) 0. e e A regra padro do Fortran 90 tambm permite que uma expresso numrica contenha operandos numricos a e a e e de diferentes tipos ou espcies. Esta uma expresso de modo misto. Exceto quando elevando um valor e e a real ou complexo a uma potncia inteira, o objeto do tipo mais fraco (ou mais simples) de varivel dos e a dois tipos envolvidos em uma expresso ser convertido, ou coagido, para o tipo mais forte. O resultado a a ser tambm do tipo mais forte. Por exemplo, se A real e I inteiro, a expresso A*I tem, inicialmente a e e e a I sendo convertido a real antes que a multiplicaao seja efetuada e o resultado da mesma do tipo real. c e As tabelas 4.2 e 4.3 ilustram os resultados de diferentes operaoes numricas escalares. c e Com relaao ` ultima operaao mencionada na tabela 4.3, no case de um valor complexo ser elevado a c a c uma potncia tambm complexa, o resultado corresponder ao valor principal, isto , ab = exp(b(log |a| + e e a e i arg a)), com < arg a < .

4.3

Atribuies numricas escalares co e


<varivel> = <express~o> a a

A forma geral de uma atribuiao numrica escalar c e e

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

26

4.4. Operadores relacionais

onde <varivel> uma varivel numrica escalar e <express~o> uma expresso numrica. Se <express~o> a e a e a e a e a no do mesmo tipo ou espcie da <varivel>, a primeira ser convertida ao tipo e espcie da ultima antes a e e a a e que a atribuiao seja realizada, de acordo com as regras dadas na tabela 4.4. c Deve-se notar que se o tipo da <varivel> for inteiro mas a <express~o> no, ento a atribuiao ir resultar a a a a c a em perda de preciso, exceto se o resultado for exatamente inteiro. Da mesma forma, atribuindo uma expresso a a real a uma varivel real de uma espcie com preciso menor tambm causar perda de preciso. Similarmente, a e a e a a a atribuiao de uma expresso complexa a uma varivel no complexa resultar, no m c a a a a nimo, na perda da parte imaginria. Por exemplo, os valores de I e A aps as atribuioes a o c I= 7.3 A= (4.01935, 2.12372) ! I do tipo inteiro. ! A do tipo real.

so, respectivamente, 7 e 4.01935. a

4.4

Operadores relacionais

A tabela 4.5 apresenta os operadores relacionais escalares, utilizados em operaoes que envolvem a compac raao entre duas variveis ou expresses. Na coluna 1 da tabela, apresentado o signicado do operador, na c a o e coluna 2 a sua forma escrita com caracteres alfanumricos e, na coluna 3, a sua forma escrita com caracteres e especiais. Fortran 77: somente a forma apresentada na coluna 2 vlida. e a Fortran 90/95: qualquer uma das duas formas vlida; porm, a forma apresentada na coluna 3 a mais e a e e moderna e recomendvel, sendo a outra considerada obsoleta. a Se uma ou ambas as expresses forem complexas, somente os operadores == e /= (ou .EQ. e .NE.) so o a dispon veis. O resultado de uma comparaao deste tipo tem como resultado um dos dois valores lgicos poss c o veis em um algebra booleana: .TRUE. e .FALSE. e este tipo de teste de crucial importncia no controle do uxo do e a programa. Exemplos de expresses relacionais so dadas abaixo, sendo I e J do tipo inteiro, A e B do tipo real o a e CHAR1 do tipo caractere padro: a I .LT. 0 A < B A + B > I - J CHAR1 == Z ! ! ! ! express~o a express~o a express~o a express~o a relacional relacional relacional relacional inteira real de modo misto de caractere

Os operadores numricos tm precedncia sobre os operadores relacionais. Assim, as expresses numricas, caso e e e o e existam, so desenvolvidas antes da comparaao com os operadores relacionais. No terceiro exemplo acima, a c como as expresses envolvem dois tipos distintos, cada expresso desenvolvida separadamente e ento ambas o a e a so convertidas ao tipo e espcie da soma dos resultados de cada expresso, de acordo com a tabela 4.2, antes a e a que a comparaao seja feita. Portanto, no exemplo, o resultado de (I - J) ser convertido a real. c a Para comparaoes de caracteres, as espcies devem ser as mesmas e as as letras (ou n meros ou caracteres c e u especiais) so comparados da esquerda para a direita at que uma diferena seja encontrada ou ambos os a e c caracteres sejam idnticos. Se os comprimentos diferem, a varivel mais curta suposta preenchida por brancos e a e a ` direita.

4.5

Expresses e atribuies lgicas escalares o co o

Constantes, variveis e funoes lgicas podem aparecer como operandos em expresses lgicas. Os operadores a c o o o lgicos, em ordem decrescente de precedncia, so: o e a

Tabela 4.4: Converso numrica para o comando de atribuio <varivel> = <express~o>. a e ca a a

Tipo de <varivel> a I R C
Autor: Rudi Gaelzer IFM/UFPel

Valor atribuido INT(<express~o>,KIND(<varivel>) a a REAL(<express~o, KIND(<varivel>) a a CMPLX(<express~o>,KIND(<varivel>) a a


Impresso: 12 de mar o de 2008 c

Cap tulo 4. Expresses e Atribuioes Escalares o c


Tabela 4.5: Operadores relacionais em Fortran 90/95

27

Signicado Maior que Menor que Igual a Maior ou igual Menor ou igual Diferente de

Forma obsoleta .GT. .LT. .EQ. .GE. .LE. .NE.

Forma moderna > < == >= <= /=

Operador unitrio: a .NOT. (negaao lgica) c o Operadores binrios: a .AND. (intersecao lgica, E lgico) c o o .OR. (unio lgica, OU lgico) a o o .EQV. (equivalncia lgica) e o .NEQV. (no-equivalncia lgica). a e o Dada ento uma declaraao de variveis lgicas do tipo a c a o LOGICAL :: I,J,K,L ento as seguintes expresses lgicas so vlidas: a o o a a .NOT. J J .AND. K I .OR. L .AND. .NOT. J (.NOT. K .AND. J .NEQV. .NOT. L) .OR. I Na primeira expresso o .NOT. usado como operador unitrio. Na terceira expresso, as regras de precedncia a e a a e implicam em que a subexpresso L .AND. .NOT. J seja desenvolvida primeiro, e o resultado combinado com a I. Na ultima expresso, as duas subexpresses .NOT. K .AND. J e .NOT. L sero desenvolvidas e comparadas a o a para testar no-equivalncia; o resultado da comparaao ser combinado com I. a e c a O resultado de qualquer expresso lgica .TRUE. ou .FALSE., e este valor pode ento ser atribu a uma a o e a do varivel lgica, tal como no exemplo abaixo: a o FLAG= (.NOT. K .EQV. L) .OR. J O resultado de uma expresso lgica envolvendo duas variveis lgicas A e B, por exemplo, pode ser inferido a o a o facilmente atravs da consulta `s Tabelas-Verdade 4.6 4.8. e a Uma varivel lgica pode ter um valor pr-determinado por uma atribuiao no corpo de comandos do a o e c programa: FLAG= .TRUE. ou no corpo de declaraoes de variveis: c a LOGICAL :: FLAG= .FALSE., BANNER= .TRUE., POLE

Tabela 4.6: Tabela-Verdade .NOT.

Tabela 4.7: Tabela-Verdade .AND.

Tabela 4.8: Tabela-Verdade .OR.

A T F

.NOT. A F T

A T T F F

B T F T F

A .AND. B T F F F

A T T F F

B T F T F

A .OR. B T T T F

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

28

4.6. Expresses e atribuioes de caracteres escalares o c

Nos exemplos acima, todos os operando e resultados foram do tipo lgico. Nenhum outro tipo de varivel pode o a participar de uma operaao lgica intr c o nseca, ou atribuiao. c Os resultados de diversas expresses relacionais podem ser combinados em uma expresso lgica, seguida de o a o atribuiao, como no caso: c REAL :: A, B, X, Y LOGICAL :: COND . . . COND= A > B .OR. X < 0.0 .AND. Y > 1.0 onde os operadores relacionais tm precedncia sobre os operadores lgicos. Contudo, o uso mais freq ente de e e o u expresses que envolvem operadores numricos, relacionais e lgicos ocorre em testes destinados a determinar o o e o uxo do programa, como no caso do comando IF, exemplicado abaixo e que ser discutido em mais detalhes a no cap tulo 5: REAL :: A= 0.0, B= 1.0, X= 2.5, Y= 5.0 . . . IF((A < B) .AND. (X - Y > 0.0))THEN . . . IF((B**2 < 10.0) .OR. (A > 0.0))THEN . . . No primeiro teste IF acima, o resultado, levando em conta a hierarquia das precedncias nas diferentes operaoes, e c .FALSE. e os comandos contidos aps a clusula THEN no sero executados. J no segundo exemplo, o resultado e o a a a a .TRUE. e os comandos aps o THEN sero executados. e o a

4.6

Expresses e atribuies de caracteres escalares o co

O unico operador intr nseco para expresses de caracteres o operador de concatenaao //, o qual tem o o e c efeito de combinar dois operandos de caracteres em um unico caractere resultante, de extenso igual ` soma das a a extenses dos operandos originais. Por exemplo, o resultado da concatenaao das constantes de caractere AB o c e CD, escrita como AB//CD a constante ABCD. e Uma outra operaao poss com variveis de caracteres a extraao de pedaos (substrings) das variveis, c vel a e c c a os quais consistem em um determinado grupo de caracteres contidos na varivel. a

Substrings de caracteres.
Consideremos a seguinte declaraao da varivel de caractere HINO, a qual tem o comprimento igual a 236 c a caracteres e cujo valor atribu no momento da declaraao: e do c

CHARACTER(LEN=236):: HINO = Qual aurora precursora, do farol da divindade, &Foi o 20 de setembro, o precursor da liberdade. &Mostremos valor, const^ncia, nesta mpia, injusta guerra. a &Sirvam nossas faanhas, de modelo ` toda Terra (...) c a Pode-se isolar qualquer parte da varivel HINO usando-se a notaao de substring a c HINO(I:J)

& & &

onde I e J so variveis inteiras, as quais localizam explicitamente os caracteres de I a J em HINO. Os dois a a pontos : so usados para separar os dois a ndices da substring e so sempre obrigatrios, mesmo que se queira a o isolar somente um caractere da varivel. Alguns exemplos de substrings da varivel HINO so: a a a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 4. Expresses e Atribuioes Escalares o c HINO(6:11) HINO(60:79) HINO(140:140) !Correspondente a aurora !Correspondente a Foi o 20 de setembro !Correspondente a ^ a

29

As constantes de caracteres resultantes das substrings podem ser ento atribu a das a outras variveis de caraca teres. H valores padro para os a a ndices das substrings. Se o ndice inferior omitido, o valor 1 assumido; se e e o valor superior omitido, um valor correspondente ao comprimento da varivel assumido. Assim, e a e HINO(:50) equivalente a HINO(1:50) e HINO(100:) equivalente a HINO(100:236). e Pode-se tambm fazer concatenaoes com substrings: e c HINO(6:11)//HINO(69:79) gera a constante aurora de setembro TROCADILHO= HINO(153:157)//s//HINO(191:199) atribui ` TROCADILHO o valor mpias faanhas. a c Se o resultado da expresso no lado direito for menor que o tamanho da varivel, o valor atribu ` varivel a a e do a a comeando-se pela esquerda e o espao restante preenchido por brancos: c c e CHARACTER(LEN= 10) :: PARTE1, PARTE2 PARTE1= HINO(178:183) ! Resulta em PARTE1= Sirvam

Ao passo que se o resultado da expresso foi maior que o tamanho da varivel, esta ser preenchida completaa a a mente e o restante do valor ser truncado: a PARTE2= HINO(:22) ! Resulta em PARTE2= Qual auror

Finalmente, poss substituir parte de uma varivel de caractere atravs usando-se uma substring da mesma e vel a e em uma atribuiao: c HINO(50:113)= AAAAAAAAAAARRRRRRRRRRRRRGGGGGGGGGGGGGHHHHHHHHHHHH!!!!!$%#$%%&%#%$# de tal forma que resulta, HINO = Qual aurora precursora, do farol da divindade, AAAAAAAAAAA& &RRRRRRRRRRRRRGGGGGGGGGGGGGHHHHHHHHHHHH!!!!!$%#$%%&%#%$# & &Mostremos valor, const^ncia, nesta mpia, injusta guerra. & a &Sirvam nossas faanhas, de modelo ` toda Terra (...) c a Os lados esquerdo e direito de uma atribuiao podem ser sobrepor. Neste caso, sero sempre os valores antigos c a os usados no lado direito da expresso. Por exemplo, a PARTE2(3:5) = PARTE2(1:3) resulta em PARTE2= QuQuaauror.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

30

4.6. Expresses e atribuioes de caracteres escalares o c

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

Cap tulo 5

Comandos e Construtos de Controle de Fluxo


Nos cap tulos anteriores foi descrito como comandos de atribuio devem ser escritos e como estes podem ca ser ordenados um aps o outro para formar uma seqncia de cdigo, a qual executada passo-a-passo. Na o ue o e maior parte das computaes, contudo, esta seqncia simples de comandos , por si s, inadequada para a co ue e o formulaao do problema. Por exemplo, podemos desejar seguir um de dois poss c veis caminhos em uma seo de ca cdigo, dependendo se um valor calculado positivo ou negativo. Como outro exemplo, podemos querer somar o e 1000 elementos de uma matriz; escrever 1000 adies e atribuies uma tarefa claramente tediosa e no muito co co e a eciente. Ao invs, a habilidade de realizar uma iterao sobre uma unica adio necessria. Podemos querer e ca ca e a passar o controle de uma parte do programa a outra ou ainda parar completamente o processamento. Para este propsito, recursos so dispon o a veis em Fortran que possibilitam o controle do uxo lgico atravs o e dos comandos no programa. Os recursos contidos em Fortran 90 correspondem aos que agora so geralmente a reconhecidos como os mais apropriados para uma linguagem de programao moderna. Sua forma geral a ca e de um construto de bloco (do ingls block construct), o qual um construto (uma construo ou estrutura) e e ca que comea com uma palavra-chave inicial, pode ter palavrass-chave intermedirias e que termina com uma c a palavra-chave nal que identique a palavra inicial. Cada seqncia de comandos entre as palavras-chave ue e chamada de um bloco. Um bloco pode ser vazio, embora tais casos sejam raros. Construtos executveis podem ser encadeados (em ingls, nested ), isto , um bloco pode conter um outro a e e construto executvel. Neste caso, o bloco deve conter o construto interno por inteiro. Execuo de um bloco a ca sempre inicia com o seu primeiro comando executvel. a Os primeiros comandos de controle de uxo a ser mencionados sero aqueles que foram denidos no Fortran a 77 quanto no Fortran 90/95, seguidos daqueles que somente existem no Fortran 90/95.

5.1

Comandos obsoletos do Fortran 77

Os comandos descritos nesta seo fazem parte do padro do Fortran 77 mas que so considerados obsoletos ca a a no Fortran 90/95. O seu uso em um programa escrito nas ultimas verses da linguagem fortemente desen o e corajado e, para alguns compiladores, proibido. A razo para este status de obsoleto porque estes comandos a e facilmente geram diculdades e do margem a confuso durante a leitura do programa. a a

5.1.1

Rtulos (statement labels) o

Um rtulo consiste em um nmero inteiro, de 1 a 99999, inserido entre as colunas 1 e 5 de um programa ou o u subprograma em Fortran 77 escrito, portanto, no formato xo. Este rtulo enfatiza o ponto do cdigo onde ele o o se encontra. H trs razes para se usar um rtulo: a e o o 1. O nal de um lao DO especicado por um rtulo determinado no in do mesmo lao. c e o cio c 2. Todo comando FORMAT deve possuir um rtulo, pois esta a maneira como os comandos READ e WRITE o e fazem referncia ao mesmo. e 3. Qualquer comando executvel pode possuir um rtulo axado, de tal forma que o uxo do cdigo pode a o o ser transferido ao mesmo. Isto realizado, por exemplo, pelo comando GO TO. e 31

32 Exemplo:

5.1. Comandos obsoletos do Fortran 77

c (F77) L^ nmeros de um arquivo de entrada at que ele termine, ent~o os soma. e u e a SUMA= 0.0 100 READ(UNIT= IN, FMT= 200, END= 9999) VALOR 200 FORMAT(F20.0) SOMA= SOMA + VALOR GO TO 100 9999 CONTINUE WRITE(UNIT= *, FMT=*)SOMA dos valores :, SOMA e O comando CONTINUE signica, literalmente, continue, isto , ele apenas instrui o programa a continuar a e partir daquele ponto.

5.1.2

Comando GO TO incondicional

O comando GO TO incondicional simplesmente transfere o uxo do cdigo para um comando rotulado em o algum outro ponto do programa. Sua forma geral : e GO TO <rtulo> o Um exemplo de aplicao deste comando pode ser visto acima. A unica exceo para seu uso a proibio ca ca e ca de transferir o uxo para dentro de um bloco IF ou lao DO; entretanto, permitido transferir o uxo com o c e comando GO TO, ou outro, para fora de um bloco IF ou lao DO. c O uso do GO TO incondicional torna poss escrever-se programas com uma estrutura bastante indisciplivel nada. Tais programas so usualmente dif a ceis de ser compreendidos e corrigidos. Bons programadores usam este comando raras vezes ou nunca. Contudo, no Fortran 77 em algumas situaes no era poss evit-lo, devido co a vel a a falta de alternativas de estruturas de controle.

5.1.3

Comando GO TO computado

O comando GO TO computado uma alternativa para um bloco IF para as situaes em que um nmero e co u grande de opoes devem ser consideradas e elas podem ser selecionadas por uma expresso de valores inteiros. c a A forma geral do comando : e GO TO (<rtulo 1>, <rtulo 2>, ..., <rtulo N>)[,] <express~o inteira> o o o a A <express~o inteira> desenvolvida; se o seu resultado 1 (um), o controle transferido ao comando a e e e axado ao <rtulo 1>; se o resultado 2 (dois), o controle transferido ao comando axado ao <rtulo 2> e o e e o assim por diante. Se o resultado da expresso menor que um ou maior que N (havendo N rtulos na lista), a e o o comando no tem efeito e o uxo do programa continua com o prximo comando em seqncia. O mesmo a o ue rtulo pode estar presente mais de uma vez na lista. o O GO TO computado sofre das mesmas desvantagens que o GO TO incondicional, uma vez que se suas ramicaes forem usadas sem cuidado, o programa se torna ileg de to complexo. co vel a

5.1.4

Comando IF aritmtico e

A forma geral do comando IF aritmtico : e e IF (<express~o aritmtica>) <rtulo 1>,<rtulo 2>,<rtulo 3> a e o o o Este comando geralmente fornece uma ramicao com trs possibilidades, embora dois dos rtulos possam ser ca e o iguais, o que o torna uma ramicao de duas possibilidades. A <express~o aritmtica> pode ser inteira, ca a e real ou real de preciso dupla. O controle do uxo transferido ao comando axado ao <rtulo 1> se o valor a e o for negativo, ao <rtulo 2> se for zero e ao <rtulo 3> se for positivo. o o
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

Cap tulo 5. Comandos e Construtos de Controle de Fluxo

33

5.1.5

Comandos ASSIGN e GO TO atribu do

Estes dois comandos so normalmente usados juntos. O ocomando ASSIGN atribui o valor de um rtulo a uma a o varivel inteira. Quando isto realizado, a varivel no mais possui um valor aritmtico, mas se torna o prprio a e a a e o rtulo. Se o rtulo axado a um comando executvel, a varivel somente pode ser usada em um comando GO o o e a a TO atribu do; se axado a um comando FORMAT, a varivel somente pode ser usada em um comando READ ou e a WRITE. As formas gerais destes comandos so: a ASSIGN <rtulo> TO <varivel inteira> o a GO TO <varivel inteira> [,] [(<rtulo>,<rtulo>,...,<rtulo>)] a o o o Um GO TO atribu pode ser usado para fornecer uma ligao para e a partir de uma seo de um programa do ca ca ou subprograma, atuando assim como um subrotina interna.

5.1.6

Laos DO rotulados c

O comando DO controla um bloco de comandos os quais so executados repetidas vezes, uma vez para cada a valor de uma varivel denominada varivel de controle do lao (loop-control variable). O nmero de iteraes a a c u co depende dos parmetros do comando DO no cabealho do lao. a c c A primeira verso de um bloco ou lao DO contm um rtulo que indica o ultimo comando do lao. A forma a c e o c geral do cabealho de um lao DO rotulado pode ter uma das duas formas seguintes: c c DO <rtulo> [,] <varivel> = <incio>, <limite>, <passo> o a DO <rtulo> [,] <varivel> = <incio>, <limite> o a Na segunda forma, o tamanho do passo implicitamente igual a um. O <rtulo> marca o ultimo comando do e o lao. Ele deve estar axado a um comando executvel em alguma linha posterior do programa ou subprograma. c a A regra permite que este comando seja qualquer comando executvel, exceto outro comando de controle (como a o IF, por exemplo), mas recomendvel que se use o comando CONTINUE, cuja funo foi exemplicada na seo e a ca ca 5.1.1. A <varivel> a varivel de controle do lao ou a e a c ndice do lao; ela deve ser uma varivel escalar (no um c a a elemento de matriz) e pode ser dos tipos inteiro, real ou dupla preciso. a Os valores de <incio>, <limite> e <passo> podem ser expresses tambm dos tipos inteiro, real ou o e preciso dupla. Se o valor do <passo> estiver presente, este no pode ser zero; se for omitido, o seu valor a a e assumido igual a um. O nmero de iteraes a ser realizadas calculado antes do in da primeira iterao e u co e cio ca dado pela frmula: e o itera~es = MAX(0,INT((limite - incio + passo)/passo)) co onde a funo impl ca cita INT toma a parte inteira do argumento por truncagem e a funo MAX toma o maior ca valor dos seus dois argumentos. Nota-se que se o valor de limite menor que incio, o nmero de iteraes e u co e zero, exceto no case de passo ser negativo. Um nmero nulo de iteraes permitido, mas isto signica que o u co e contedo do lao no ser executado e o controle do uxo transferido ao primeiro comando aps o rtulo. A u c a a e o o varivel de controle do lao no necessariamente assume o valor limite, especialmente se o tamanho do passo a c a for maior que um e/ou do tipo real com valor fracionrio. a Comandos dentro do lao podem alterar o valor das expresses usadas para o incio, limite ou passo, c o mas o nmero de iteraes no alterado, uma vez que este determinado antes do in da primeira iterao. u co a e e cio ca A varivel de controle do lao pode ser usada em expresses mas um novo valor no pode ser atribu a ela a c o a do dentro do lao. c Dois exemplos de aplicaes de laos DO rotulados: co c c Soma dos quadrados dos N primeiros elementos da matriz X. SOMA= 0.0 DO 15, I= 1,N SOMA= SOMA + X(I)**2 15 CONTINUE ------------------------------C Inicializa as componentes da matriz FIELD iguais a zero. c Exemplo de laos DO encadeados. c REAL FIELD(NX, NY)
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

34

5.2. Comando e construto IF DO 50, IY= 1,NY DO 40, IX= 1,NX FIELD(IX, IY)= 0.0 CONTINUE CONTINUE

40 50

5.2

Comando e construto IF

O comando IF fornece um mecanismo para controle de desvio de uxo, dependendo de uma condio. H ca a duas formas: o comando IF e o construto IF, sendo o ultimo uma forma geral do primeiro.

5.2.1

Comando IF

No comando IF, o valor de uma expresso lgica escalar testado e um unico comando executado se e a o e e somente se o seu valor for verdadeiro. A forma geral : e IF (<express~o relacional e/ou lgica>) <comando executvel> a o a O <comando executvel> qualquer, exceto aqueles que marcam o in a e cio ou o nal de um bloco, como por exemplo IF, ELSE IF, ELSE, END IF, outro comando IF ou uma declarao END. Temos os seguintes exemca plos: IF (FLAG) GO TO 6 IF(X-Y > 0.0) X= 0.0 IF(COND .OR. P < Q .AND. R <= 1.0) S(I,J)= T(J,I)

5.2.2

Construto IF

Um construto IF permite que a execuo de uma seqncia de comandos (ou seja, um bloco) seja realizada, ca ue dependendo de uma condio ou de um outro bloco, dependendo de outra condio. H trs formas usuais para ca ca a e um construto IF. A forma mais simples tem a seguinte estrutura geral: [<nome>:] IF (<express~o relacional e/ou lgica>) THEN a o <bloco> END IF [<nome>] onde <bloco> denota uma seqncia de linhas de comandos executveis. O bloco executado somente se o ue a e resultado da <express~o relacional e/ou lgica> for verdadeiro. O construto IF pode ter um <nome>, o a o qual deve ser um nome vlido em Fortran 90/95. O <nome> opcional, mas se for denido no cabealho do a e c construto, ele deve ser tambm empregado no nal, denotado pela declarao END IF <nome>. Como exemplo, e ca temos: SWAP: IF (X < Y) THEN TEMP= X X= Y Y= TEMP END IF SWAP As trs linhas de texto entre SWAP: IF ... e END IF SWAP sero executadas somente se X < Y. Pode-se e a incluir outro construto IF ou outra estrutura de controle de uxo no bloco de um construto IF. A segunda forma usada para o construto IF a seguinte: e [<nome>:] IF (<express~o relacional e/ou lgica>) THEN a o <bloco 1> ELSE [<nome>] <bloco 2> END IF [<nome>] Na qual o <bloco 1> executado se o resultado da <express~o relacional e/ou lgica> for verdadeira; e a o caso contrrio, o <bloco 2> ser executado. Este construto permite que dois conjuntos distintos de instrues a a co sejam executados, dependendo de um teste lgico. Um exemplo de aplicao desta forma intermediria seria: o ca a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

Cap tulo 5. Comandos e Construtos de Controle de Fluxo IF (X < Y) THEN X= -Y ELSE Y= -Y END IF

35

Neste exemplo, se o resultado de X < Y for verdadeiro, ento X= -Y, seno (ou seja, X >= Y) a ao ser Y= -Y. a a ca a A terceira e nal verso usa a instruo ELSE IF para realizar uma srie de testes independentes, cada um a ca e dos quais possui um bloco de comandos associado. Os testes so realizados um aps o outro at que um deles a o e seja satisfeito, em cujo caso o bloco associado executado, enquanto que os outros so solenemente ignorados. e a Aps, o controle do uxo transferido para a instruo END IF. Caso nenhuma condio seja satisfeita, nenhum o e ca ca bloco executado, exceto se houver uma instruo ELSE nal, que abarca quaiquer possibilidades no satisfeitas e ca a nos testes realizados no construto. A forma geral : e [<nome>:] IF (<express~o relacional e/ou lgica>) THEN a o <bloco> [ELSE IF (<express~o relacional e/ou lgica>) THEN [<nome>] a o <bloco>] ... [ELSE [<nome>] <bloco>] END IF [<nome>] Pode haver qualquer nmero (inclusive zero) de instrues ELSE IF e zero ou uma instruo ELSE. Novamente, u co ca o <nome> opcional, mas se for adotado no cabealho do construto, ento deve ser mencionado em todas as e c a circunstncias ilustradas acima. O exemplo a seguir ilustra o encadeamento de construtos IF. Estruturas ainda a mais complicadas so poss a veis, mas neste caso recomendvel adotar nomes para os construtos, como forma e a de facilitar a leitura e compreenso do programa. a IF (I < 0) THEN IF (J < 0) THEN X= 0.0 Y= 0.0 ELSE Z= 0.0 END IF ELSE IF (K < 0) THEN Z= 1.0 ELSE X= 1.0 Y= 1.0 END IF O programa-exemplo a seguir (programa 5.1) faz uso de construtos IF para implementar o clculo do fatorial a de um nmero natural, j utilizando o construto DO, abordado na seo 5.4. u a ca

5.3

Construto CASE

Fortran 90/95 fornece uma outra alternativa para selecionar uma de diversas opes: trata-se do construto co CASE. A principal diferena entre este construto e um bloco IF est no fato de somente uma expresso ser c a a calculada para decidir o uxo e esta pode ter uma srie de resultados pr-denidos. A forma geral do construto e e CASE : e [<nome>:] SELECT CASE (<express~o>) a [CASE (<seletor>) [<nome>] <bloco>] ... [CASE DEFAULT <bloco>] END SELECT [<nome>]
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

36

5.3. Construto CASE


Programa 5.1: Programa que utiliza os construtos IF e DO.

program i f f a t ! C a l c u l a o f a t o r i a l de um n mero n a t u r a l . u i m p l i c i t none integer : : i , f a t , j ! print , Entre com v a l o r : read , i i f ( i < 0 ) then print , No p o s s v e l c a l c u l a r o f a t o r i a l . a e e l s e i f ( i == 0 ) then print , f a t ( , i , )= , 1 else f a t= 1 do j= 1 , i f a t= f a t j end do print , f a t ( , i , )= , f a t end i f end program i f f a t

A <express~o> deve ser escalar e pode ser dos tipos inteiro, lgico ou de caractere e o valor especicado por a o cada <seletor> deve ser do mesmo tipo. No caso de variveis de caracteres, os comprimentos podem diferir, a mas no a espcie. Nos casos de variveis inteiras ou lgicas, a espcie pode diferir. A forma mais simples do a e a o e <seletor> uma constante entre parnteses, como na declarao e e ca CASE (1) Para expresses inteiras ou de caracteres, um intervalo pode ser especicado separando os limites inferior e o superior por dois pontos : CASE (<inf> : <sup>) Um dos limites pode estar ausente, mas no ambos. Caso um deles esteja ausente, signica que o bloco de a comandos pertencente a esta declarao CASE selecionado cada vez que a <express~o> calcula um valor que ca e a menor ou igual a <sup>, ou maior ou igual a <inf>, respectivamente. Um exemplo mostrado abaixo: e e SELECT CASE CASE (:-1) N_SINAL= CASE (0) N_SINAL= CASE (1:) N_SINAL= END SELECT (NUMERO) -1 ! Somente NUMERO= 0. 0 ! Todos os valores de NUMERO > 0. 1 ! NUMERO do tipo inteiro. e ! Todos os valores de NUMERO menores que 0.

A forma geral do <seletor> uma lista de valores e de intervalos no sobrepostos, todos do mesmo tipo que e a <express~o>, entre parnteses, tal como a e CASE (1, 2, 7, 10:17, 23) Caso o valor calculado pela <express~o> no pertencer a nenhuma lista dos seletores, nenhum dos blocos a a e executado e o controle do uxo passa ao primeiro comando aps a declarao END SELECT. J a declarao o ca a ca CASE DEFAULT equivalente a uma lista de todos os valores poss e veis de <express~o> que no foram inclu a a dos nos outros seletores do construto. Portanto, somente pode haver um CASE DEFAULT em um dado construto CASE. O exemplo a seguir ilustra o uso desta declarao: ca
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

Cap tulo 5. Comandos e Construtos de Controle de Fluxo SELECT CASE (CH) ! CH do tipo de caractere. e CASE (C, D, R:) CH_TYPE= .TRUE. CASE (I:N) INT_TYPE= .TRUE. CASE DEFAULT REAL_TYPE= .TRUE. END SELECT

37

No exemplo acima, os caracteres C, D, R e todos os caracteres aps o ultimo indicam nomes de variveis o a do tipo de caractere. Os caracteres I e N indicam variveis do tipo inteiro, e todos os outros caracteres a alfabticos indicam variveis reais. e a O programa-exemplo abaixo mostra o uso deste construto. Note que os seletores de caso somente testam o primeiro caractere da varivel NOME, embora esta tenha um comprimento igual a 5. a program c a s e s t r i n g i m p l i c i t none character ( len= 5 ) : : nome print , Entre com o nome ( 5 c a r a c t e r e s ) : read ( a5 ) , nome s e l e c t case ( nome ) case ( a : z ) ! S e l e c i o n a nome que come a com l e t r a s m i n u s c u l a s . c print , L e t r a s m i n u s c u l a s case ( A : Z ) ! S e l e c i o n a nome que come a com l e t r a s m a i u s c u l a s . c print , L e t r a s m a i u s c u l a s case ( 0 : 9 ) ! S e l e c i o n a n meros . u print , N meros ! ! ! u case default ! Outros t i p o s de c a r a c t e r e s . print , C a r a c t e r e s e s p e c i a i s ! ! ! end s e l e c t end program c a s e s t r i n g J o programa abaixo, testa o sinal de nmeros inteiros: a u program t e s t a c a s e i m p l i c i t none integer : : a print , Entre com a ( i n t e i r o ) : read , a s e l e c t case ( a ) case (: 1) print , Menor que z e r o . case ( 0 ) print , I g u a l a z e r o . case ( 1 : ) print , Maior que z e r o . end s e l e c t end program t e s t a c a s e

5.4

Construto DO

Um lao DO usado quando for necessrio calcular uma srie de operaes semelhantes, dependendo ou no c e a e co a de algum parmetro que atualizado em cada in da srie. Por exemplo, para somar o valor de um polinmio a e cio e o de grau N em um dado ponto x:
N

P (x) = a0 + a1 x + a2 x2 + + aN xN =
i=0

ai xi .
Impresso: 18 de mar o de 2008 c

Autor: Rudi Gaelzer IFM/UFPel

38

5.4. Construto DO

Outro tipo de operaes freqentemente necessrias so aquelas que envolvem operaes matriciais, como o co u a a co produto de matrizes, triangularizao, etc. Para este tipo de operaes repetidas, conveniente usar-se um lao ca co e c DO para implement-las, ao invs de escrever o mesmo bloco de operaes N vezes, como aconteceria se fosse a e co tentado implementar a soma do polinmio atravs das seguintes expresses: o e o REAL POL= POL= POL= ... POL= :: POL,A0,A1,A2,...,AN A0 POL + A1*X POL + A2*X**2 POL + AN*X**N

Esta forma do lao DO no usa rtulos, como a forma denida na seo 5.1.6. A forma geral de um construto c a o ca DO a seguinte: e [<nome>:] DO [<varivel> = <express~o 1>, <express~o 2> [, <express~o 3>]] a a a a <bloco> END DO [<nome>] onde <varivel> uma varivel inteira e as trs expresses contidas no cabealho do construto devem ser do a e a e o c mesmo tipo. No cabealho acima, cada uma das expresses indica: c o <express~o 1>: o valor inicial da <varivel>; a a <express~o 2>: o valor mximo, ou limite, da <varivel> (no necessariamente deve ser o ultimo valor a a a a assumido pela varivel); a <express~o 3>: o passo, ou incremento, da varivel em cada nova iterao. a a ca Este construto tambm aceito no Fortran 77, exceto pela possibilidade de se denir um <nome>. Como no caso e e de um lao DO rotulado, o nmero de iteraes denido antes de se executar o primeiro comando do <bloco> c u co e e dado pelo retultado da conta e MAX((<express~o 2> - <express~o 1> + <express~o 3>)/<express~o 3>,0). a a a a Novamente, se o resultado do primeiro argumento da funo MAX acima for negativo, o lao no ser executado. ca c a a Isto pode acontecer, por exemplo, se <express~o 2> for menor que <express~o 1> e o passo <express~o 3> a a a for positivo. Novamente, se o passo <express~o 3> for omitido, este ser igual a 1. O exemplo abaixo ilustra a a o uso de expresses no cabealho do construto: o c DO I= J + 4, M, -K**2 ... END DO Como pode-se ver, o incremento pode ser negativo, o que signica, na prtica, que os comandos do bloco somente a sero executados se M <= J + 4. O exemplo a seguir ilustra um bloco DO onde a varivel I somente assume a a valores mpares: DO I= 1, 11, 2 ... END DO Como no caso do DO rotulado, caso alguma das expresses envolvam o uso de variveis, estas podem ser moo a dicadas no bloco do lao, inclusive o passo das iteraes. Entretanto, o nmero de iteraes e o passo a ser c co u co realmente tomado no so modicados, uma vez que foram pr-determinados antes do in das iteraes. O a a e cio co programa abaixo (programa 5.2) exemplica este fato: Abaixo, temos um outro exemplo que ilustra o funcionamento do lao DO: c FAT= 1 DO I= 2, N FAT= FAT*I END DO
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

Cap tulo 5. Comandos e Construtos de Controle de Fluxo


Programa 5.2: Exemplo de uso do construto DO.

39

! M o d i f i c a o p a s s o de um l a o DO d e n t r o do b l o c o . c program mod passo i m p l i c i t none integer : : i , j ! Bloco sem m o d i f i c a o de p a s s o . ca do i= 1 , 10 print , i end do ! Bloco com m o d i f i c a o do p a s s o . ca j= 1 do i= 1 , 1 0 , j i f ( i > 5 ) j= 3 print , i , j end do end program mod passo

Neste exemplo, o nmero de iteraes ser u co a MAX(N-2+1,0) = MAX(N-1,0). Caso N < 2, o lao no ser executado, e o resultado ser FAT= 1. Caso N >= 2, o valor inicial da varivel inteira c a a a a I 2, esta usada para calcular um novo valor para a varivel FAT, em seguida a varivel I ser incrementada e e a a a por 1 e o novo valor I= 3 ser usado novamente para calcular o novo valor da varivel FAT. Desta forma, a a a varivel I ser incrementada e o bloco executado at que I= N + 1, sendo este o ultimo valor de I e o controle a a e transferido para o prximo comando aps a declarao END DO. O exemplo ilustrado acima retornar, na e o o ca a varivel FAT, o valor do fatorial de N. a Temos os seguintes casos particulares e instrues poss co veis para um construto DO.

5.4.1

Construto DO ilimitado

Como caso particular de um construto DO, a seguinte instruo poss ca e vel: [<nome>:] DO <bloco> END DO [<nome>] Neste caso, o conjunto de comandos contidos no <bloco> sero realizados sem limite de nmero de iteraes, a u co exceto se algum teste inclu dentro do bloco o que possibilita um desvio de uxo para a primeira instruo e do ca aps o END DO. Uma instruo que realiza este tipo de desvio a instruo EXIT, descrita a seguir. o ca e ca

5.4.2

Instruo EXIT ca

Esta instruo permite a sa ca da, por exemplo, de um lao sem limite, mas o seu uso no est restrito a este c a a caso particular, podendo ser usada em um construto DO geral. A forma geral desta instruo : ca e EXIT [<nome>] onde o <nome> opcional, mas deve ser usado caso ele exista e, neste caso, ele serve para denotar de qual e construto a sa deve ser feita. Isto ocorre, por exemplo, no caso de construtos encadeados. Execuo de um da ca EXIT transfere controle ao primeiro comando executvel aps o END DO [<nome>] correspondente. a o Como exemplo, temos: DO ... I= I + 1 IF(I == J) EXIT ... END DO
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

40

5.4. Construto DO

5.4.3

Instruo CYCLE ca

A forma geral desta instruo : ca e CYCLE [<nome>] a qual transfere controle ` declarao END DO do construto correspondente sem haver a execuo dos comandos a ca ca posteriores ` instruo. Assim, se outras iteraes deve ser realizadas, estas so continuadas, incrementando-se a ca co a o valor de <varivel> (caso exista) pelo passo dado pela <express~o 3>. O programa a seguir ilustra o uso a a desta instruo. ca program d o c y c l e i m p l i c i t none integer : : i n d e x= 1 do i n d e x= i n d e x + 1 i f ( i n d e x == 2 0 ) cycle i f ( i n d e x == 3 0 ) e xi t print , Valor do n d i c e : , i n d e x end do end program d o c y c l e O programa abaixo ilustra o uso de alguns dos construtos discutidos neste cap tulo. ! Imprime uma t a b e l a de c o n v e r s o das e s c a l a s C e l s i u s e F a h r e n h e i t a ! e n t r e l i m i t e s de t e m p e r a t u r a e s p e c i f i c a d o s . program conv temp i m p l i c i t none character ( len= 1 ) : : s c a l e integer : : low temp , high temp , temp real : : c e l s i u s , f a r e n h e i t ! r e a d l o o p : do ! L e s c a l a e l i m i t e s . e print , E s c a l a de t e m p e r a t u r a s (C/F ) : read ( a ) , s c a l e ! Confere v a l i d a d e dos dados . i f ( s c a l e /= C . and . s c a l e /= F) then print , E s c a l a n o v l i d a ! a a e xit r e a d l o o p end i f print , L i m i t e s ( temp . i n f e r i o r , temp . s u p e r i o r ) : read , low temp , high temp ! ! La o s o b r e os l i m i t e s de t e m p e r a t u r a . c do temp= low temp , high temp ! E s c o l h e f r m u l a de c o n v e r s o o a s e l e c t case ( s c a l e ) case ( C) c e l s i u s= temp f a r e n h e i t= 9 c e l s i u s / 5 . 0 + 3 2 . 0 case ( F) f a r e n h e i t= temp c e l s i u s= 5 ( f a r e n h e i t 3 2 ) / 9 . 0 end s e l e c t ! Imprime t a b e l a print , c e l s i u s , g r a u s C correspondem a , f a r e n h e i t , g r a u s F . end do end do r e a d l o o p !
Autor: Rudi Gaelzer IFM/UFPel Impresso: 18 de mar o de 2008 c

Cap tulo 5. Comandos e Construtos de Controle de Fluxo ! Finalizao . ca print , F i n a l dos dados v l i d o s . a end program conv temp

41

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 18 de mar o de 2008 c

Cap tulo 6

Processamento de Matrizes
A denio e o processamento de matrizes e vetores sempre foi um recurso presente em todas as linguagens de ca programaao, inclusive no Fortran 77. Uma novidade importante introduzida no Fortran 90/95 a capacidade c e estendida de processamento das mesmas. Agora poss e vel trabalhar diretamente com a matriz completa, ou com sees da mesma, sem ser necessrio o uso de laos DO. Novas funes intr co a c co nsecas agora atuam de forma fundamental (ou elemental ) em matrizes e funes podem retornar valores na forma de matrizes. Tambm esto co e a dispon veis as possibilidades de matrizes alocveis, matrizes de forma assumida e matrizes dinmicas. a a Estes e outros recursos sero abordados neste e nos prximos cap a o tulos.

6.1

Terminologia e especicaes de matrizes co

Uma matriz ou vetor 1 um outro tipo de objeto composto suportado pelo Fortran 77/90/95. Uma matriz e consiste de um conjunto retangular de elementos, todos do mesmo tipo, espcie e parmetros do tipo. Uma e a outra denio equivalente seria: uma matriz um grupo de posies na memria do computador as quais so ca e co o a acessadas por intermdio de um unico nome, fazendo-se uso dos subscritos da matriz. Este tipo de objeto util e e quando for necessrio se fazer referncia a um nmero grande, porm a princ a e u e pio desconhecido, de variveis do a tipo intr nseco ou outras estruturas, sem que seja necessrio denir um nome para cada varivel. a a O Fortran 77/90/95 permite que uma matriz tenha at sete subscritos, coda um relacionado com uma e dimenso da matriz. As dimenses de uma matriz podem ser especicadas usando-se tanto o atributo DIMENSION a o quanto a declarao DIMENSION. ca Os ndices de cada subscrito da matriz so constantes ou variveis inteiras e, por conveno, eles comeam em a a ca c 1, exceto quando um intervalo distinto de valores especicado, atravs do fornecimento de um limite inferior e e e um limite superior. A declaraao de matrizes difere ligeiramente entre o Fortran 77 e o Fortran 90/95. c Fortran 77. Uma matriz pode ser declarada tanto na declarao de tipo intr ca nseco ou com o uso da declarao ca DIMENSION: INTEGER NMAX INTEGER POINTS(NMAX),MAT_I(50) REAL R_POINTS(0:50),A DIMENSION A(NMAX,50) CHARACTER COLUMN(5)*25, ROW(10)*30 No ultimo exemplo acima, o vetor COLUMN possui 5 componentes, COLUMN(1), COLUMN(2), ..., COLUMN(5), cada um destes sendo uma varivel de caractere de comprimento 25. J o vetor ROW possui 10 componentes, a a cada um sendo uma varivel de caractere de comprimento 30. A matriz real A possui 2 dimenses, sendo NMAX a o linhas e 50 colunas. Todas as matrizes neste exemplo tm seus e ndices iniciando em 1, exceto pela matriz R_POINTS, a qual inicia em 0: R_POINTS(0), R_POINTS(1), ..., R_POINTS(50). Ou seja, este vetor possui 51 componentes. Fortran 90/95. A forma das declaraes de matrizes em Fortran 77 so aceitas no Fortran 90/95, porm, co a e e recomendvel2 que estas sejam declaradas na forma de atributos de tipos de variveis. Por exemplo, a a
1 Nome 2 E,

usualmente para uma matriz de uma dimenso. a no caso do compilador F, obrigatrio. o

43

44

6.1. Terminologia e especicaes de matrizes co REAL, DIMENSION(50) :: W REAL, DIMENSION(5:54) :: X CHARACTER(LEN= 25), DIMENSION(5) :: COLUMN CHARACTER(LEN= 30), DIMENSION(10) :: ROW

Antes de prosseguir, ser introduzida a terminologia usada com relao a matrizes. a ca Posto. O posto (rank ) de uma matriz o nmero de dimenses da mesma. Assim, um escalar tem posto 0, um e u o vetor tem posto 1 e uma matriz tem posto maior ou igual a 2. Extenso. A extenso (extent) de uma matriz se refere a uma dimenso em particular e o nmero de a a a e u componentes naquela dimenso. a Forma. A forma (shape) de uma matriz um vetor cujos componentes so a extenso de cada dimenso da e a a a matriz. Tamanho. O tamanho (size) de um matriz o nmero total de elementos que compe a matriz. Este nmero e u o u pode ser zero, em cujo caso denomina-se matriz nula. Duas matrizes so ditas serem conformveis se elas tm a mesma forma. Todas as matrizes so conformveis a a e a a com um escalar, uma vez que o escalar expandido em uma matriz com a mesma forma. e Por exemplo, as seguintes matrizes: REAL, DIMENSION(-3:4,7) :: A REAL, DIMENSION(8,2:8) :: B REAL, DIMENSION(8,0:8) :: D INTEGER :: C A matriz A possui:
posto 2; extenses 8 e 7; o forma (/8,7/), onde os s mbolos (/ e /) so os construtures de matrizes, isto , eles denem ou a e inicializam os valores de um vetor ou matriz. Estes construtures de matrizes sero descritos com mais a detalhes na seao 6.6. c Tamanho 56.

Alm disso, A conformvel com B e C, uma vez que a forma de B tambm (/8,7/) e C um escalar. Contudo, e e a e e e A no conformvel com D, uma vez que esta ultima tem forma (/8,9/). a e a A forma geral da declarao de uma ou mais matrizes com se segue: ca e <tipo>[[, DIMENSION(<lista de extens~es>)] [, < outros atributos>] ::] o <lista de nomes>

Entretanto, a forma recomendvel da declarao (e exigida por certos compiladores, como o F e o ELF90) a ca e a seguinte: <tipo>, DIMENSION(<lista de extens~es>) [, <outros atributos>] :: <lista de nomes> o Onde <tipo> pode ser um tipo intr nseco de varivel ou de tipo derivado (desde que a denio do tipo derivado a ca esteja acess vel). A <lista de extens~es> fornece as dimenses da matriz atravs de: o o e
constantes inteiras; expresses inteiras usando variveis mudas (dummy) ou constantes; o a somente o caractere : para indicar que a matriz alocvel ou de forma assumida. e a

Os <outros atributos> podem ser quaisquer da seguinte lista:


Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

Cap tulo 6. Processamento de Matrizes PARAMETER ALLOCATABLE INTENT(INOUT) OPTIONAL SAVE EXTERNAL INTRINSIC PUBLIC PRIVATE POINTER TARGET

45

Os atributos contidos na lista acima sero abordados ao longo deste e dos prximos cap a o tulos. Os atributos em vermelho: POINTER e TARGET consistem em recursos avanados do Fortran 90/95 que sero discutidos em c a separado. Finalmente, segue a <lista de nomes> vlidos no Fortran, onde os nomes so atribu a a dos `s matrizes. Os a seguintes exemplos mostram a forma da declarao de diversos tipos diferentes de matrizes, alguns dos quais ca so novos no Fortran 90/95 e sero abordados adiante. a a 1. Inicializaao de vetores contendo 3 elementos: c INTEGER :: I INTEGER, DIMENSION(3) :: IA= (/1,2,3/), IB= (/(I, I=1,3)/) 2. Declaraao da matriz automtica LOGB. Aqui, LOGA uma matriz qualquer (muda ou dummy) e SIZE c a e e uma funo intr ca nseca que retorna um escalar inteiro correspondente ao tamanho do seu argumento: LOGICAL, DIMENSION(SIZE(LOGA)) :: LOGB 3. Declaraao das matrizes dinmicas, ou alocveis, de duas dimenses A e B. A forma das matrizes ser denida c a a o a a posteriori por um comando ALLOCATE: REAL, DIMENSION(:,:), ALLOCATABLE :: A,B 4. Declaraao das matrizes de forma assumida de trs dimenses A e B. A forma das matrizes ser assumida a c e o a partir das informaes transferidas pela rotina que aciona o subprograma onde esta declarao feita. co ca e REAL, DIMENSION(:,:,:) :: A,B Matrizes de tipos derivados. A capacidade de se misturar matrizes com denies de tipos derivados co possibilita a construo de objetos de complexidade crescente. Alguns exemplos ilustram estas possibilidades. ca Um tipo derivado pode conter um ou mais componentes que so matrizes: a TYPE :: TRIPLETO REAL :: U REAL, DIMENSION(3) :: DU REAL, DIMENSION(3,3) :: D2U END TYPE TRIPLETO TYPE(TRIPLETO) :: T Este exemplo serve para declarar, em uma unica estrutura, um tipo de varivel denominado TRIPLETO, cujos a componentes correspondem ao valor de uma funo de 3 variveis, suas 3 derivadas parciais de primeira ordem ca a e suas 9 derivadas parciais de segunda ordem. Se a varivel T do tipo TRIPLETO, T%U um escalar real, mas a e e T%DU e T%D2U so matrizes do tipo real. a E poss vel agora realizar-se combinaes entre matrizes e o tipo derivado TRIPLETO para obter-se objetos co mais complexos. No exemplo abaixo, declara-se um vetor cujos elementos so TRIPLETOs de diversas funes a co distintas: TYPE(TRIPLETO), DIMENSION(10) :: V
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

46

6.1. Terminologia e especicaes de matrizes co

Assim, a referncia ao objeto V(2)%U fornece o valor da funo correspondente ao segundo elemento do vetor e ca V; j a referncia V(5)%D2U(1,1) fornece o valor da derivada segunda em relao ` primeira varivel da funo a e ca a a ca correspondente ao elemento 5 do vetor V, e assim por diante. O primeiro programa a seguir exemplica um uso simples de matrizes: ! D e c l a r a um v e t o r , d e f i n e v a l o r e s aos e l e m e n t o s do mesmo e imprime ! e s t e s v a l o r e s na t e l a . program e x 1 a r r a y i m p l i c i t none integer , parameter : : dp= 2 integer : : i real , dimension ( 1 0 ) : : vr r e a l ( kind= dp ) , dimension ( 1 0 ) : : vd ! do i= 1 , 1 0 vr ( i )= s q r t ( r e a l ( i ) ) vd ( i )= s q r t ( r e a l ( i ) ) end do print * , Raiz quadrada dos 10 p r i m e i r o s i n t e i r o s , em p r e c i s o s i m p l e s : a print * , vr ! Imprime t o d o s os componentes do v e t o r . print * , print * , Raiz quadrada dos 10 p r i m e i r o s i n t e i r o s , em p r e c i s o dupla : a print * , vd end program e x 1 a r r a y O segundo programa-exemplo, a seguir, est baseado no programa alunos, descrito na seo 3.8. Agora, ser a ca a criado um vetor para armazenar os dados de um nmero xo de alunos e os resultados somente sero impressos u a aps a aquisio de todos os dados. o ca ! Dados a c e r c a de a l u n o s usando t i p o d e r i v a d o . program a l u n o s v e t i m p l i c i t none integer : : i , n d i s c= 5 ! Mude e s t e v a l o r , c a s o s e j a maior . type : : a l u n o character ( len= 2 0 ) : : nome integer : : c o d i g o r e a l : : n1 , n2 , n3 , mf end type a l u n o type ( a l u n o ) , dimension ( 5 ) : : d i s c ! do i= 1 , n d i s c print * , Nome : read ( a ) , d i s c ( i )%nome print * , c d i g o : o read * , d i s c ( i )% c o d i g o print * , Notas : N1 , N2 , N3 : read * , d i s c ( i )%n1 , d i s c ( i )%n2 , d i s c ( i )%n3 d i s c ( i )%mf= ( d i s c ( i )%n1 + d i s c ( i )%n2 + d i s c ( i )%n3 ) / 3 . 0 end do do i= 1 , n d i s c print * , print * , > , d i s c ( i )%nome , ( , d i s c ( i )%c o d i g o , ) < print * , Mdia f i n a l : , d i s c ( i )%mf e end do end program a l u n o s v e t

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 27 de mar o de 2008 c

Cap tulo 6. Processamento de Matrizes

47

6.2

Expresses e atribuies envolvendo matrizes o co

Com o Fortran 77 no poss desenvolver expresses envolvendo o conjunto de todos os elemento de uma a e vel o matriz simultaneamente. Ao invs, cada elemento da matriz deveria ser envolvido na expresso separadamente, e a em um processo que freqentemente envolvia o uso de diversos laos DO encadeados. Quando a operao envolvia u c ca matrizes grandes, com 100 100 elementos ou mais, tais processos podiam ser extremamente dispendiosos do ponto de vista do tempo necessrio para a realizao de todas as operaes desejadas, pois os elementos da(s) a ca co matriz(es) deveriam ser manipulado de forma seqencial. Alm disso, o cdigo tornava-se gradualmente mais u e o complexo para ser lido e interpretado, h medida que o nmero de operaes envolvidas aumentava. a u co Um desenvolvimento novo, introduzido no Fortran 90, a sua habilidade de realizar operaes envolvendo e co a matriz na sua totalidade, possibilitando o tratamento de uma matriz como um objeto unico, o que, no m nimo, facilita enormemente a construo, leitura e interpretao do cdigo. Uma outra vantagem, ainda mais ca ca o importante, resulta deste novo modo de encarar matrizes. Com o desenvolvimento dos processadores e das arquiteturas de computadores, entraram em linha, recentemente, sistemas compostos por mais de um processador, os quais fazem uso da idia de processamento distribu ou, em outras palavras, processamento paralelo. As e do normas denidas pelo comit X3J3 para o padro da linguagem Fortran 90/95 supe que compiladores usados e a o em sistemas distribu dos devem se encarregar de distribuir automaticamente os processos numricos envolvidos e nas expresses com matrizes de forma equilibrada entre os diversos processadores que compe a arquitetura. A o o evidente vantagem nesta estratgia consiste no fato de que as mesmas operaes numricas so realizadas de e co e a forma simultnea em diversos componentes distintos das matrizes, acelerando substancialmente a ecincia do a e processamento. Com a losoa das operaes sobre matrizes inteiras, a tarefa de implantar a paralelizao do co ca cdigo numrico ca, essencialmente, a cargo do compilador e no do programador. Uma outra vantagem deste o e a enfoque consiste na manuteno da portabilidade dos cdigos numricos. ca o e Para que as operaes envolvendo matrizes inteiras sejam poss co veis, necessrio que as matrizes consideradas e a sejam conformveis, ou seja, elas devem todas ter a mesma forma. Operaes entre duas matrizes conformveis a co a so realizadas na base do elemento por elemento (distribuindo as operaes entre os diversos processadores, se a co existirem) e todos os operadores numricos denidos para operaes entre escalares tambm so denidos para e co e a operaes entre matrizes. co Por exemplo, sejam A e B duas matrizes 2 3: A= o resultado da adio de A por B : ca e A+B= o resultado da multiplicao : ca e A*B = e o resultado da diviso : a e A/B = 15 8 8 15 18 6 3/5 2 8 5/3 2 6 . 869 897 , 348 566 , B= 521 331 ,

Se um dos operando um escalar, ento este distribu em uma matriz conformvel com o outro operando. e a e do a Assim, o resultado de adicionar 5 a A : e A+5= 348 566 + 555 555 = 8 9 13 10 11 11 .

Esta distribuio de um escalar em uma matriz conformvel util no momento da inicializao dos elementos ca a e ca de uma matriz. Da mesma forma como acontece com expresses e atribuies escalares, em uma linha de programao como o co ca a seguir, A= A + B sendo A e B matrizes, a expresso do lado direito desenvolvida antes da atribuio do resultado da expresso a e ca a a ` matriz A. Este ordenamento importante quando uma matriz aparece em ambos os lados de uma atribuio, e ca como no caso do exemplo acima.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

48

6.2. Expresses e atribuies envolvendo matrizes o co

As vantagens do processamento de matrizes inteiras, presente no Fortran 90/95 mas ausente no Fortran 77, podem ser contempladas atravs da comparao de alguns exemplos de cdigos em Fortran 77 e Fortran e ca o 90/95. Nestes cdigos sero tambm apresentadas algumas funes intr o a e co nsecas do Fortran 90/95 que operam em matrizes, elemento a elemento. 1. Considere trs vetores, A, B e C, todos do mesmo comprimento. Inicialize todos os elementos de A a zero e e realize as atribuies A(I)= A(I)/3.1 + B(I)*SQRT(C(I)) para todos os valores de I co Soluo Fortran 77. ca REAL A(20), B(20), C(20) ... DO 10 I= 1, 20 A(I)= 0.0 CONTINUE DO 20 I= 1, 20 A(I)= A(I)/3.1 + B(I)*SQRT(C(I)) CONTINUE

10 ...

20

Soluo Fortran 90/95. ca REAL, DIMENSION(20) :: A= 0.0, B, C ... A= A/3.1 + B*SQRT(C) Note como o cdigo cou mais reduzido e fcil de ser lido. Alm disso, a funo intr o a e ca nseca SQRT opera sobre cada elemento do vetor C. 2. Considere trs matrizes bi-dimensionais com a mesma forma. Multiplique duas matrizes entre si, elemento e a elemento, e atribua o resultado a uma terceira matriz. Soluo Fortran 77. ca REAL A(5,5), B(5,5), C(5,5) ... DO 20 I= 1, 5 DO 10 J= 1, 5 C(J,I)= A(J,I) + B(J,I) CONTINUE CONTINUE

10 20

Soluo Fortran 90/95. ca REAL, DIMENSION(5,5) :: A, B, C ... C= A + B 3. Considere uma matriz tri-dimensional. Encontre o maior valor menor que 1000 nesta matriz. Soluo Fortran 77. ca REAL A(5,5,5) REAL VAL_MAX ... 0.0 1, 5 J= 1, 5 10 I= 1, 5 IF((A(I,J,K) .GT. VAL_MAX) .AND. & (A(I,J,K) .LT. 1000.0))VAL_MAX= A(I,J,K) CONTINUE CONTINUE CONTINUE
Impresso: 27 de mar o de 2008 c

VAL_MAX= DO 30 K= DO 20 DO

10 20 30

Autor: Rudi Gaelzer IFM/UFPel

Cap tulo 6. Processamento de Matrizes Soluo Fortran 90/95. ca REAL, DIMENSION(5,5,5) :: A REAL :: VAL_MAX ... VAL_MAX= MAXVAL(A, MASK=(A<1000.0))

49

Note que no Fortran 90, conseguiu-se fazer em uma linha o que necessitou de 8 linhas no Fortran 77. A funo intr ca nseca MAXVAL devolve o valor mximo entre os elementos de uma matriz. O argumento a opcional MASK=(...) estabelece uma mscara, isto , uma expresso lgica envolvendo a(s) matriz(es). a e a o Em MASK=(A<1000.0), somente aqueles elementos de A que satisfazem a condio de ser menores que 1000 ca so levados em considerao. a ca 4. Encontre o valor mdio maior que 3000 na matriz A do exemplo anterior. e Soluo Fortran 77. ca REAL A(5,5,5) REAL MEDIA,ACUM INTEGER CONTA ... ACUM= 0.0 DO 30 K= 1, 5 DO 20 J= 1, 5 DO 10 I= 1, 5 IF(A(I,J,K) .GT. 3000.0)THEN ACUM= ACUM + A(I,J,K) CONTA= CONTA + 1 END IF CONTINUE CONTINUE CONTINUE MEDIA= ACUM/REAL(CONTA)

10 20 30

Soluo Fortran 90/95. ca REAL, DIMENSION(5,5,5) :: A REAL :: MEDIA ... MEDIA= SUM(A,MASK=(A>3000.0))/COUNT(MASK=(A>3000.0)) Agora, conseguiu-se realizar em uma linha de cdigo em Fortran 90 o que necessitou de 12 linhas em o Fortran 77. Os ultimos dois exemplos zeram uso das seguintes funes intr co nsecas: MAXVAL - retorna o valor mximo de uma matriz. a SUM - retorna a soma de todos os elementos de uma matriz. COUNT - retorna o nmero de elementos da matriz que satisfazem a mscara. u a

6.3

Seoes de matrizes c

Uma submatriz, tambm chamada seo de matriz, pode ser acessada atravs da especicao de um intervalo e ca e ca de valores de subscritos da matriz. Uma seo de matriz pode ser acessada e operada da mesma forma que a ca matriz completa, mas no poss fazer-se referncia direta a elementos individuais ou a subsees da seo. a e vel e co ca Sees de matrizes podem ser extra co das usando-se um dos seguintes artif cios:
Um subscrito simples. Um tripleto de subscritos. Um vetor de subscritos.

Estes recursos sero descritos a seguir. a


Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

50

6.3. Sees de matrizes co

6.3.1

Subscritos simples

Um subscrito simples seleciona um unico elemento da matriz. Considere a seguinte matriz 5 5, denominada RA. Ento o elemento X pode ser selecionado atravs de RA(2,2): a e 00000 0 X 0 0 0 RA = 0 0 0 0 0 = RA(2, 2) = X. 0 0 0 0 0 00000

6.3.2

Tripleto de subscritos

A forma de um tripleto de subscritos a seguinte, sendo esta forma geral vlida para todas as dimenses e a o denidas para a matriz: [<limite inferior>] : [<limite superior>] : [<passo>] Se um dos limites, inferior ou superior (ou ambos) for omitido, ento o limite ausente assumido como o limite a e inferior da correspondente dimenso da matriz da qual a seo est sendo extra a ca a da; se o <passo> for omitido, ento assume-se <passo>=1. a Os exemplos a seguir ilustram vrias sees de matrizes usando-se tripletos. Os elementos das matrizes a co marcados por X denotam a seo a ser extra ca da. Novamente, no exemplo ser utilizada a matriz 55 denominada a RA. 00000 0 X 0 0 0 RA = 0 0 0 0 0 =RA(2:2,2:2) = X; Elemento simples, escalar, forma: (/1/). 0 0 0 0 0 00000 00000 0 0 0 0 0 RA = 0 0 X X X =RA(3,3:5); seo de linha da matriz, forma: (/3/). ca 0 0 0 0 0 00000 00X00 0 0 X 0 0 RA = 0 0 X 0 0 =RA(:,3); coluna inteira, forma: (/5/). 0 0 X 0 0 00X00 0XXX0 0 0 0 0 0 RA = 0 X X X 0 =RA(1::2,2:4); sees de linhas com passo 2, forma: (/3,3/). co 0 0 0 0 0 0XXX0

6.3.3

Vetores de subscritos

Um vetor de subscritos uma expresso inteira de posto 1, isto , um vetor. Cada elemento desta expresso e a e a deve ser denido com valores que se encontrem dentro dos limites dos subscritos da matriz-me. Os elementos a de um vetor de subscritos podem estar em qualquer ordem. Um exemplo ilustrando o uso de um vetor de subscritos, denominado IV, dado a seguir: e REAL, DIMENSION(6) :: RA= (/ 1.2, 3.4, 3.0, 11.2, 1.0, 3.7 /) REAL, DIMENSION(3) :: RB INTEGER, DIMENSION(3) :: IV= (/ 1, 3, 5 /) ! Express~o inteira de posto 1. a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

Cap tulo 6. Processamento de Matrizes RB= RA(IV) ! IV o vetor de subscritos. e ! Resulta: !RB= (/ RA(1), RA(3), RA(5) /), ou !RB= (/ 1.2, 3.0, 1.0 /). Um vetor de subscritos pode tambm estar do lado esquerdo de uma atribuio: e ca IV= (/ 1, 3, 5 /) RA(IV)= (/ 1.2, 3.4, 5.6 /) !Atribui~es dos elementos 1, 3 e 5 de RA. co ! Resulta: ! RA(1)= 1.2; RA(3)= 3.4; RA(5)= 5.6 ! Os elementos 2, 4 e 6 de RA n~o foram definidos. a

51

6.4

Atribuies de matrizes e submatrizes co

Tanto matrizes inteiras quanto sees de matrizes podem ser usadas como operandos (isto , podem esco e tar tanto no lado esquerdo quanto do lado direito de uma atribuio) desde que todos os operandos sejam ca conformveis (pgina 44). Por exemplo, a a REAL, DIMENSION(5,5) :: RA, RB, RC INTEGER :: ID ... RA= RB + RC*ID !Forma (/5,5/). ... RA(3:5,3:4)= RB(1::2,3:5:2) + RC(1:3,1:2) !Forma (/3,2/): !RA(3,3)= RB(1,3) + RC(1,1) !RA(4,3)= RB(3,3) + RC(2,1) !RA(5,3)= RB(5,3) + RC(3,1) !RA(3,4)= RB(1,5) + RC(1,2) !etc. ... RA(:,1)= RB(:,1) + RB(:,2) + RC(:3) !Forma (/5/). Um outro exemplo, acompanhado de gura, torna a operao com submatrizes conformveis mais clara. ca a REAL, DIMENSION(10,20) :: A,B REAL, DIMENSION(8,6) :: C ... C= A(2:9,5:10) + B(1:8,15:20) !Forma (/8,6/). ... A gura 6.1 ilustra como as duas submatrizes so conformveis neste caso e o resultado da soma das duas sees a a co ser atribu ` matriz C, a qual possui a mesma forma. a do a O programa-exemplo 6.1 mostra algumas operaes e atribuies bsicas de matrizes: co co a

6.5

Matrizes de tamanho zero

Matrizes de tamanho zero, ou matrizes nulas tambm so permitidas em Fortran 90/95. A noo de uma e a ca matriz nula util quando se quer contar com a possibilidade de existncia de uma matriz sem nenhum elemento, e e o que pode simplicar a programao do cdigo em certas situaes. Uma matriz nula quando o limite inferior ca o co e de uma ou mais de suas dimenses maior que o limite superior. o e Por exemplo, o cdigo abaixo resolve um sistema linear de equaes que j esto na forma triangular: o co a a DO I= 1, N X(I)= B(I)/A(I,I) B(I+1:N)= B(I+1, N) - A(I+1:N,I)*X(I) END DO
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

52
A(1,1) A(2,5)

6.5. Matrizes de tamanho zero


A(1,20) A(2,10)

A(9,5)

A(9,10) A(20,20) + = B(1,15) B(1,20)

Resultado 8x6

A(10,1) B(1,1)

B(8,15)

B(10,1)

B(20,20)

Figura 6.1: A soma de duas seoes de matrizes conformveis. c a

Quando I assume o valor N, as submatrizes B(N+1:N) e A(N+1:N,N) se tornam nulas. Se esta possibilidade no a existisse, seria necessria a incluso de linhas adicionais de programao. a a ca As matrizes nulas seguem as mesmas regras de operao e atribuio que as matrizes usuais, porm elas ainda ca ca e devem ser conformveis com as matrizes restantes. Por exemplo, duas matrizes nulas podem ter o mesmo posto a mas formas distintas; as formas podem ser (/2,0/) e (/0,2/). Neste caso, estas matrizes no so conformveis. a a a Contudo, uma matriz sempre conformvel com um escalar, assim a atribuio e a ca

Programa 6.1: Expresses e atribuioes envolvendo matrizes. o c

program t e s t a a t r m a t r i m p l i c i t none real , dimension ( 3 , 3 ) : : a real , dimension ( 2 , 2 ) : : b integer : : i , j ! do i= 1 , 3 do j= 1 , 3 a ( i , j )= s i n ( r e a l ( i ) ) + c o s ( r e a l ( j ) ) end do end do b= a ( 1 : 2 , 1 : 3 : 2 ) print * , Matriz A: print ( 3 ( f 1 2 . 5 ) ) , ( ( a ( i , j ) , j= 1 , 3 ) , i= 1 , 3 ) Print * , Matriz B : print ( 2 ( f 1 2 . 5 ) ) , ( ( b ( i , j ) , j= 1 , 2 ) , i= 1 , 2 ) end program t e s t a a t r m a t r

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 27 de mar o de 2008 c

Cap tulo 6. Processamento de Matrizes <matriz nula>= <escalar> sempre vlida. e a

53

6.6

Construtores de matrizes

Um construtor de matrizes cria um vetor (matriz de posto 1) contendo valores constantes. Estes construtores servem, por exemplo, para inicializar os elementos de um vetor, como foi exemplicado na pgina 45. Outro a exemplo de uso dos construtores de matrizes est na denio de um vetor de subscritos, como foi abordado na a ca seo 6.3.3. ca A forma geral de um construtor de matrizes a seguinte: e (/ <lista de valores do construtor> /) onde <lista de valores do construtor> pode ser tanto uma lista de constantes, como no exemplo IV= (/ 1, 3, 5 /) como pode ser um conjunto de expresses numricas: o e A= (/ I+J, 2*I, 2*J, I**2, J**2, SIN(REAL(I)), COS(REAL(J)) /) ou ainda um comando DO impl cito no construtor, cuja forma geral a seguinte: e (<lista de valores do construtor>, <varivel>= <exp1>, <exp2>, [<exp3>]) a onde <varivvel> uma varivel escalar inteira e <exp1>, <exp2> e <exp3> so expresses escalares inteiras. a e a a o A interpretao dada a este DO impl ca cito que a <lista de valores dos construtor> escrita um nmero e e u de vezes igual a MAX((<exp2> - <exp1> + <exp3>)/<exp3>, 0) sendo a <varivel> substitu por <exp1>, <exp1> + <exp3>, ..., <exp2>, como acontece no construto DO a da (seo 5.4). Tambm poss encadear-se DOs impl ca e e vel citos. A seguir, alguns exemplos so apresentados: a (/ (i, i= 1,6) /) ! Resulta: (/ 1, 2, 3, 4, 5, 6 /)

(/ 7, (i, i= 1,4), 9 /) ! Resulta: (/ 7, 1, 2, 3, 4, 9 /)

(/ (1.0/REAL(I), I= 1,6) /) ! Resulta: (/ 1.0/1.0, 1.0/2.0, 1.0/3.0, 1.0/4.0, 1.0/5.0, 1.0/6.0 /)

! DOs implcitos encadeados: (/ ((I, I= 1,3), J= 1,3) /) ! Resulta: (/ 1, 2, 3, 1, 2, 3, 1, 2, 3 /)

(/ ((I+J, I= 1,3), J= 1,2) /) ! = (/ ((1+J, 2+J, 3+J), J= 1,2) /) ! Resulta: (/ 2, 3, 4, 3, 4, 5 /) Um construtor de matrizes pode tambm ser criado usando-se tripletos de subscritos: e (/ A(I,2:4), A(1:5:2,I+3) /) ! Resulta: (/ A(I,2), A(I,3), A(I,4), A(1,I+3), A(3,I+3), A(5,I+3) /)
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

54

6.6. Construtores de matrizes

B(1,1) B(2,1) B(3,1) B(4,1) B(5,1)

B(1,1) B(2,2) B(3,2) B(4,2) B(5,2)

B(1,3) B(2,3) B(3,3) B(4,3) B(5,3)

B(1,4) B(2,4) B(3,4) B(4,4) B(5,4)

Figura 6.2: O ordenamento dos elementos da matriz B(5,4).

6.6.1

A funo intr ca nseca RESHAPE.

Uma matriz de posto maior que um pode ser constru a partir de um construtor de matrizes atravs do da e uso da funo intr ca nseca RESHAPE. Por exemplo, RESHAPE( SOURCE= (/ 1, 2, 3, 4, 5, 6 /), SHAPE= (/ 2, 3 /) ) gera a matriz de posto 2: 135 246 a qual uma matriz de forma (/ 2, 3 /), isto , 2 linhas e 3 colunas. Um outro exemplo seria: e e REAL, DIMENSION(3,2) :: RA RA= RESHAPE( SOURCE= (/ ((I+J, I= 1,3), J= 1,2) /), SHAPE= (/ 3,2 /) ) de onde resulta 23 RA = 3 4 45

Usando a funo RESHAPE, o programa-exemplo da pgina 51 apresenta uma forma mais concisa: ca a program t e s t a a t r m a t r i m p l i c i t none real , dimension ( 3 , 3 ) : : a real , dimension ( 2 , 2 ) : : b integer : : i , j ! a= r e s h a p e ( s o u r c e= ( / ( ( s i n ( r e a l ( i ))+ c o s ( r e a l ( j ) ) , i= 1 , 3 ) , j= 1 , 3 ) / ) , & shape= ( / 3 , 3 / ) ) b= a ( 1 : 2 , 1 : 3 : 2 ) print * , Matriz A: print ( 3 ( f 1 2 . 5 ) ) , ( ( a ( i , j ) , j= 1 , 3 ) , i= 1 , 3 ) Print * , Matriz B : print ( 2 ( f 1 2 . 5 ) ) , ( ( b ( i , j ) , j= 1 , 2 ) , i= 1 , 2 ) end program t e s t a a t r m a t r

6.6.2

A ordem dos elementos de matrizes

A maneira como a funo RESHAPE organizou os elementos das matrizes na seo 6.6.1 seguiu a denominada ca ca ordem dos elementos de matriz, a qual a maneira como a maioria dos compiladores de Fortran armazena os e elementos de matrizes em espaos cont c guos de memria. Este ordenamento obtido variando-se primeiramente o e as dimenses iniciais de uma matriz; em uma matriz com 2 dimenses isto obtido variando-se inicialmente as o o e linhas e depois as colunas. A gura 6.2 ilustra este procedimento com a matriz B(5,4). Em uma matriz com mais de 2 dimenses, o ordenamento realizado da mesma maneira. Assim, dada a o e matriz
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

Cap tulo 6. Processamento de Matrizes REAL, DIMENSION(-10:5, -20:1, 0:1, -1:0, 2, 2, 2) :: G o ordenamento segue a ordem: G(-10,-20,0,-1,1,1,1) G(-10,-19,0,-1,1,1,1) G(-10,-18,0,-1,1,1,1) G(-10,1,1,0,2,2,2) G(-9,-20,0,-1,1,1,1) G(-9,-19,0,-1,1,1,1) ... G(-9,1,1,0,2,2,2) G(-8,-20,0,-1,1,1,1) G(-8,-19,0,-1,1,1,1) G(-8,-15,0,-1,1,1,1) ... ... G(5,-20,0,-1,1,1,1) ... G(5,-19,0,-1,1,1,1) ... G(5,1,1,0,2,2,1) ... G(5,1,1,0,2,2,2)

55

Em muitas situaes, mais rpido escrever-se um cdigo que processa matrizes seguindo o ordenamento co e a o dos elementos. As funes intr co nsecas do Fortran 90/95 que manipulam matrizes inteiras foram concebidas de forma a levar em conta este fato.

6.7

Rotinas intr nsecas elementais aplicveis a matrizes a

O Fortran 90/95 permite a existncia de rotinas (funes ou subrotinas) intr e co nsecas elementais, isto , rotinas e que se aplicam a cada elemento de uma matriz. Matrizes podem, ento, ser usadas como argumentos de rotinas a intr nsecas, da mesma forma que escalares. Este tipo de recurso no existem no Fortran 77. As operaes a co denidas na rotina intr nseca sero aplicadas a cada elemento da matriz separadamente. Contudo, novamente, a caso mais de uma matriz aparea no argumento da rotina, estas devem ser conformveis. c a A seguir, alguns exemplos de rot nas intr nsecas elementais. A lista completa destas rotinas pode ser obtida no cap tulo 7. 1. Calcule as ra zes quadradas de todos os elementos da matriz A. O resultado ser atribu ` matriz B, a a do a qual conformvel com A. e a REAL, DIMENSION(10,10) :: A, B ... B= SQRT(A) 2. Calcule a exponencial de todos os argumentos da matriz A. Novamente, o resultado ser atribu a B. a do COMPLEX, DIMENSION(5,-5:15, 25:125) :: A, B ... B= EXP(A) 3. Encontre o comprimento da string (varivel de caractere) excluindo brancos no nal da varivel para todos a a os elementos da matriz LC. CHARACTER(LEN= 80), DIMENSION(10) :: CH INTEGER :: COMP ... COMP= LEN_TRIM(CH)

6.8

Comando e construto WHERE

Em muitas situaes, desejvel realizar-se operaes somente para alguns elementos de uma matriz; por co e a co exemplo, somente para aqueles elementos que so positivos. a

6.8.1

Comando WHERE

O comando WHERE fornece esta possibilidade. Um exemplo simples : e REAL, DIMENSION(10,10) :: A ... WHERE (A > 0.0) A= 1.0/A o qual fornece a rec proca (inversa) de todos os elementos positivos de A, deixando os demais inalterados. A forma geral do comando e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

56

6.8. Comando e construto WHERE WHERE (<express~o lgica matriz>) <varivel matriz>= <express~o matriz> a o a a

A <express~o lgica matriz> deve ter a mesma forma que a <varivel matriz>. A expresso lgica a o a a o e desenvolvida inicialmente e ento somente aqueles elementos da <varivel matriz> que satisfazem o teste a a lgico so operados pela <express~o matriz>. Os restantes permanecem inalterados. o a a

6.8.2

Construto WHERE

Uma unica expresso lgica de matriz pode ser usada para determinar uma seqncia de operaes e atri a o ue co buies em matrizes, todas com a mesma forma. A sintaxe deste construto : co e WHERE (<express~o lgica matriz>) a o <opera~es atribui~es matrizes> co co END WHERE Inicialmente, a <express~o lgica matriz> desenvolvida e ento cada atribuio de matriz executada sob a o e a ca e o controle da mscara, isto , do teste lgico determinado no cabealho do construto, que aplicado a cada a e o c e elemento das matrizes envolvidas nas operaes. Se o teste lgico aplicada a um determinado elemento da matriz co o resulta verdadeiro, ento a atribuiao denida no corpo do construto realizada. a c e Existe tambm uma forma mais geral do construto WHERE que permite a execuo de atribuies a elementos e ca co de matrizes que no satisfazem o teste lgico no cabealho: a o c WHERE (<express~o lgica matriz>) a o <opera~es atribui~es matrizes 1> co co ELSEWHERE <opera~es atribui~es matrizes 2> co co END WHERE O bloco <opera~es atribui~es matrizes 1> executado novamente sob o controle da mscara denida co co e a na <express~o lgica matriz> e somente elementos que satisfazem esta mscara so afetados. Em seguida, a o a a as <opera~es atribui~es matrizes 2> so executadas sob o controle da mscara denida por .NOT. <exco co a a press~o lgica matriz>, isto , novas atribuies so realizadas sobre elementos que no satisfazem o teste a o e co a a lgico denido no cabealho. o c Um exemplo simples do construto WHERE : e WHERE (PRESSURE <= 1.0) PRESSURE= PRESSURE + INC_PRESSURE TEMP= TEMP + 5.0 ELSEWHERE RAINING= .TRUE. END WHERE Neste exemplo, PRESSURE, INC_PRESSURE, TEMP e RAINING so todas matrizes com a mesma forma, embora no a a do mesmo tipo. O programa-exemplo 6.2 mostra outra aplicao do construto WHERE. ca Um recurso ausente no Fortran90 mas incorporado no Fortran95 o mascaramento na instruo ELSEWHERE, e ca juntamente com a possibilidade de conter qualquer nmero de instrues ELSEWHERE mascaradas mas, no mu co a ximo, uma instruo ELSEWHERE sem mscara, a qual deve ser a ultima. Todas as expresses lgicas que denem ca a o o as mscaras devem ter a mesma forma. Adicionalmente, os construtos WHERE podem ser encadeados e nomeados; a neste caso, as condioes lgicas de todas as mscaras devem ter a mesma forma. O seguinte exemplo ilustra c o a este recurso: ATRIB1: WHERE (<cond 1>) <corpo 1> !Mascarado por <cond 1> ELSEWHERE (<cond 2>) ATRIB1 <corpo 2> !Masc. por <cond 2> .AND. .NOT. <cond 1> ATRIB2: WHERE (<cond 4>) <corpo 4> !Masc. por <cond 2> .AND. .NOT. <cond 1> .AND. <cond 4> ELSEWHERE ATRIB2
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

Cap tulo 6. Processamento de Matrizes


Programa 6.2: Exemplo do construto WHERE.

57

program t e s t a w h e r e i m p l i c i t none real , dimension ( 3 , 3 ) : : a integer : : i , j ! a= r e s h a p e ( s o u r c e= ( / ( ( s i n ( r e a l ( i+j ) ) , i= 1 , 3 ) , j= 1 , 3 ) / ) , shape= ( / 3 , 3 / ) ) print * , Matriz A o r i g i n a l : print * , a ( 1 , : ) print * , a ( 2 , : ) print * , a ( 3 , : ) ! where ( a >= 0 . 0 ) a= s q r t ( a ) elsewhere a= a ** 2 end where print * , Matriz A m o d i f i c a d a : print * , a ( 1 , : ) print * , a ( 2 , : ) print * , a ( 3 , : ) end program t e s t a w h e r e

<corpo 5> !Masc. por ... ! .AND. END WHERE ATRIB2 ... ELSEWHERE (<cond 3>) ATRIB1 <corpo 3> !Masc. por ... ! .AND. ELSEWHERE ATRIB1 <corpo 6> !Masc. por ... ! .AND. END WHERE ATRIB1

<cond 2> .AND. .NOT. <cond 1> .NOT. <cond 4>

<cond 3> .AND. .NOT. <cond 1> .NOT. <cond 2> .NOT. <cond 1> .AND. .NOT. <cond 2> .NOT. <cond 3>

6.9

Matrizes alocveis a

Uma novidade importante introduzida no Fortran 90/95 a habilidade de se declarar variveis dinmicas; e a a em particular, matrizes dinmicas. Fortran 90 fornece tanto matrizes alocveis quanto matrizes automticas, a a a ambos os tipos sendo matrizes dinmicas. Usando matrizes alocveis, poss a a e vel alocar e de-alocar espao de c memria conforme necessrio. O recurso de matrizes automticas permite que matrizes locais em uma funo o a a ca ou subrotina tenham forma e tamanho diferentes cada vez que a rotina invocada. Matrizes automticas so e a a discutidas no cap tulo 8. Matrizes alocveis permitem que grandes fraes da memria do computador sejam usadas somente quando a co o requerido e, posteriormente, liberadas, quando no mais necessrias. Este recurso oferece um uso de memria a a o muito mais eciente que o Fortran 77, o qual oferecia somente alocao esttica (xa) de memria. Alm disso, ca a o e o cdigo torna-se muito mais robusto, pois a forma e o tamanho das matrizes podem ser decididos durante o o processamento do cdigo. o Uma matriz alocvel declarada na linha de declarao de tipo de varivel com o atributo ALLOCATABLE. a e ca a O posto da matriz deve tambm ser declarado com a incluso dos s e a mbolos de dois pontos :, um para cada dimenso da matriz. Por exemplo, a matriz de duas dimenses A declarada como alocvel atravs da declarao: a o e a e ca REAL, DIMENSION(:,:), ALLOCATABLE :: A Esta forma de declarao no aloca espao de memria imediatamente ` matriz, como acontece com as declaraca a c o a es usuais de matrizes. O status da matriz nesta situao not currently allocated, isto , correntemente no co ca e e a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

58

6.9. Matrizes alocveis a

alocada. Espao de memria dinamicamente alocado durante a execuo do programa, logo antes da matriz c o e ca ser utilizada, usando-se o comando ALLOCATE. Este comando especica os limites da matriz, seguindo as mesmas regras denidas na seo 6.1. A seguir so dados dois exemplos de uso deste comando: ca a ALLOCATE (A(0:N,M)) ou usando expresses inteiras: o ALLOCATE (A(0:N+1,M)) Como se pode ver, esta estratgia confere uma exibilidade grande na denio de matrizes ao programador. e ca O espao alocado ` matriz com o comando ALLOCATE pode, mais tarde, ser liberado com o comando DEc a ALLOCATE. Este comando requer somente nome da matriz previamente alocada. Por exemplo, para liberar o espao na memria reservado para a matriz A, o comando ca c o DEALLOCATE (A) Tanto os comandos ALLOCATE e DEALLOCATE possuem o especicador opcional STAT, o qual retorna o status do comando de alocaao ou de-alocao. Neste caso, a forma geral do comando : c ca e ALLOCATE (<lista de objetos alocados> [, STAT= <status>]) DEALLOCATE (<lista de objetos alocados> [, STAT= <status>]) onde <status> uma varivel inteira escalar. Se STAT= est presente no comando, <status> recebe o valor e a a zero se o procedimento do comando ALLOCATE/DEALLOCATE foi bem sucedido ou um valor positivo se houve um erro no processo. Se o especicador STAT= no estiver presente e ocorra um erro no processo, o programa a e abortado. Finalmente, poss alocar-se ou de-alocar-se mais de uma matriz simultaneamente, como indica a e vel <lista de objetos alocados>. Um breve exemplo do uso destes comandos seria: REAL, DIMENSION(:), ALLOCATABLE :: A, B REAL, DIMENSION(:,:), ALLOCATABLE :: C INTEGER :: N ... ALLOCATE (A(N), B(2*N), C(N,2*N)) B(:N)= A B(N+1:)= SQRT(A) DO I= 1,N C(I,:)= B END DO DEALLOCATE (A, B, C) Matrizes alocveis tornam poss o requerimento freqnte de declarar uma matriz tendo um nmero varivel a vel ue u a de elementos. Por exemplo, pode ser necessrio ler variveis, digamos tam1 e tam2 e ento declarar uma matriz a a a com tam1 tam2 elementos: INTEGER :: TAM1, TAM2 REAL, DIMENSION (:,:), ALLOCATABLE :: A INTEGER :: STATUS ... READ*, TAM1, TAM2 ALLOCATE (A(TAM1,TAM2), STAT= STATUS) IF (STATUS > 0)THEN ... ! Comandos de processamento de erro. END IF ... ! Uso da matriz A. DEALLOCATE (A) ...
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

Cap tulo 6. Processamento de Matrizes

59

No exemplo acima, o uso do especicador STAT= permite se tome providncias caso no seja poss alocar a e a vel matriz, por alguma razo. a Como foi mencionado anteriormente, uma matriz alocvel possui um status de alocao. Quando a matriz a ca declarada, mas ainda no alocada, o seu status unallocated ou not currently allocated. Quando a matriz e a e aparece no comando ALLOCATE, o seu status passa a allocated ; uma vez que ela de-alocada, o seu status retorna e a not currently allocated. Assim, o comando ALLOCATE somente pode ser usado em matrizes no correntemente a alocadas, ao passo que o comando DEALLOCATE somente pode ser usado em matrizes alocadas; caso contrrio, a ocorre um erro. E poss vericar se uma matriz est ou no correntemente alocada usando-se a funo intr vel a a ca nseca ALLOCATED. Esta uma funo lgica com um argumento, o qual deve ser o nome de uma matriz alocvel. Usando-se e ca o a esta funao, comandos como os seguintes so poss c a veis: IF (ALLOCATED(A)) DEALLOCATE (A) ou IF (.NOT. ALLOCATED(A)) ALLOCATE (A(5,20)) Um terceiro status de alocao, poss ca vel no Fortran 90 mas no no Fortran 95, o undened, o qual ocorria a e quando uma matriz era alocada dentro de uma rotina e no era de-alocada antes de retornar ao programa a que chamou a rotina. O que ocorria era que em subseqentes chamadas desta rotina a matriz com o status u undened no mais podia ser utilizada. No Fortran 95, todas as matrizes alocveis denidas em rotinas so a a a automaticamente colocadas no status unallocated quando da sa da rotina. Contudo, um boa prtica de da a programao consiste em sempre de-alocar todas as matrizes alocadas dentro de uma rotina. ca Finalmente, h trs restries no uso de matrizes alocveis: a e co a 1. Matrizes alocveis no podem ser argumentos mudos de uma rotina e devem, portanto, ser alocadas e a a de-alocadas dentro da mesma unidade de programa (ver cap tulo 8). 2. O resultado de uma funo no pode ser uma matriz alocvel (embora possa ser uma matriz). ca a a 3. Matrizes alocveis no podem ser usadas na denio de um tipo derivado (esta restrio foi retirada no a a ca ca Fortran2003. O programa-exemplo a seguir ilustra o uso de matrizes alocveis. a program t e s t a a l o c i m p l i c i t none integer , dimension ( : , : ) , a l l o c a t a b l e : : b integer : : i , j , n= 2 ! print * , Valor i n i c i a l de n : , n allocate (b(n , n )) b= n print * , Valor i n i c i a l de B : print ( 2 ( i 2 ) ) , ( ( b ( i , j ) , j= 1 , n ) , i= 1 , n ) deallocate ( b ) n= n + 1 print * , Segundo v a l o r de n : , n allocate (b(n , n )) b= n print * , Segundo v a l o r de B : print ( 3 ( i 2 ) ) , ( ( b ( i , j ) , j= 1 , n ) , i= 1 , n ) deallocate ( b ) n= n + 1 print * , T e r c e i r o v a l o r de n : , n a l l o c a t e ( b ( n+1,n+1)) b= n + 1 print * , T e r c e i r o v a l o r de B : print ( 5 ( i 2 ) ) , ( ( b ( i , j ) , j= 1 , n+1) , i= 1 , n+1) end program t e s t a a l o c

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 27 de mar o de 2008 c

60

6.10. Comando e construto FORALL

6.10

Comando e construto FORALL

Quando um construto DO como o seguinte: DO I= 1, N A(I,I)= X(I) END DO !A tem posto 2 e X tem posto 1.

executado, o processador deve realizar cada iterao sucessiva em ordem, com uma atribuio aps a outra. e ca ca o Isto representa um impedimento severo na otimizao do cdigo em uma plataforma paralelizada. Este problema ca o foi enfocado com a construo do HPF (High Performance Fortran), o qual consiste em uma verso do Fortran90 ca a destinada a sistemas de computao paralela. Posteriormente, alguns avanos realizados pelo HPF, em relao ca c ca ao Fortran90, foram incorporados do padro do Fortran95; entre eles, a instruo FORALL. A idia oferecer a ca e e ao programador uma estrutura que possibilite os mesmos recursos obtidos com laos DO, porm que sejam c e automaticamente paralelizveis, quando o programa estiver rodando em uma plataforma paralela. a

6.10.1

Comando FORALL

As instrues do exemplo acima so implementadas atravs de um comando FORALL da seguinte maneira: co a e FORALL (I= 1:N) A(I,I)= X(I) a qual especica que as atribuies individuais sejam realizadas em qualquer ordem, inclusive simultaneamente, co caso o programa rode em uma plataforma paralela. O comando FORALL pode ser visto como uma atribuio de ca matrizes expressa com a ajuda de ndices. Neste exemplo em particular, deve-se notar que as atribuies no co a poderiam ser representadas de maneira simples atravs de uma atribuio de matrizes inteiras, tal como A= X, e ca porque as matrizes A e X no tm a mesma forma. Outros exemplos do comando so: a e a FORALL (I= 1:N, J= 1:M) A(I,J)= I + J FORALL (I= 1:N, J= 1:N, Y(I,J) /= 0.0) X(J,I)= 1.0/Y(I,J) O primeiro exemplo poderia ser implementado com o uso da funo intr ca nseca RESHAPE, mas o uso do FORALL possibilita a paralelizao do programa executvel. J o segundo exemplo no poderia ser implementado com ca a a a operao de matriz inteira (tal como X= 1.0/Y) porque, em primeiro lugar, a matriz X tm elementos transpostos ca e em relao ` matriz Y. Em segundo lugar, a mscara Y(I,J) /= 0.0 no est presente na operao de matriz ca a a a a ca inteira; somente poss introduzir esta mscara com o uso do FORALL. e vel a A forma geral do comando FORALL a seguinte: e FORALL (<ndice>= <menor>:<maior>[:<passo>] [,<ndice>= <me nor>:<maior>[:<passo>]] & [...] [, <express~o escalar lgica>]) <opera~es atribui~es matrizes> a o co co as condies impostas a <ndice>, <menor>, <maior>, <passo> e <express~o escalar lgica> so as mesmas co a o a impostas ao construto FORALL e sero explicadas na descrio da forma geral do mesmo. a ca

6.10.2

Construto FORALL

O construto FORALL tambm existe. Ele permite que diversas atribuies sejam executadas em ordem. Por e co exemplo, dadas as seguintes operaes com submatrizes: co A(2:N-1, 2:N-1)= A(2:N-1, 1:N-2) + A(2:N-1, 3:N) & + A(1:N-2, 2:N-1) + A(3:N, 2:N-1) B(2:N-1, 2:N-1)= A(2:N-1, 2:N-1) tambm podem ser implementadas com o uso do construto FORALL: e FORALL (I= 2:N-1, J= 2:N-1) A(I,J)= A(I,J-1) + A(I, J+1) + A(I-1, J) + A(I+1, J) B(I,J)= A(I,J) END FORALL
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de mar o de 2008 c

Cap tulo 6. Processamento de Matrizes

61

Neste exemplo, cada elemento de A igualado ` soma dos quatro vizinhos mais prximos e feita ento uma e a o e a cpia em B. A verso com o FORALL melhor leg o a e vel e pode ser executado em qualquer ordem, inclusive simultaneamente. No ocorre erro na atribuio, porque inicialmente as expresses so desenvolvidas, em a ca o a qualquer ordem, seus resultados guardados em local de armazenagem temporria na memria e s no nal as a o o atribuies so feitas, tambm em qualquer ordem. co a e Construtos FORALL podem ser encadeados. A seqncia ue FORALL (I= 1:N-1) FORALL (J= I+1:N) A(I,J)= A(J,I) END FORALL END FORALL atribui a transposta do tringulo inferior de A ao tringulo superior de A. a a Um construto FORALL pode conter um comando ou construto WHERE. Cada comando no corpo de um construto WHERE executado em seqncia. Por exemplo, e ue FORALL (I= 1:N) WHERE (A(I,:) == 0) A(I,:)= I B(I,:)= I/A(I,:) END FORALL Aqui, cada elemento nulo de A substitu pelo valor do e do ndice das linhas e, seguindo a operao completa, ca os elementos das linhas de B so denidos como as rec a procas dos correspondentes elementos de A multiplicados pelo respectivo ndice. A sintaxe mais geral do construto FORALL : e [<nome>:] FORALL (<ndice>= <menor>:<maior>[:<passo>], & [, <ndice>= <menor>:<maior>[:<passo>]] [...] & [, <express~o lgica escalar>]) a o <corpo> END FORALL [<nome>] onde <ndice> uma varivel inteira escalar, a qual permanece vlida somente dentro do <corpo> do construto, e a a ou seja, outras variveis podem ter o mesmo nome do <ndice> mas esto separadas e no so acess a a a a veis de dentro do FORALL.3 O <ndice> no pode ser redenido dentro do construto. As expresses <menor>, <maior> a o e <passo> devem ser expresses escalares inteiras e formar uma seqncia de valores como para uma seo de o ue ca matriz (seo 6.3); eles no podem fazer referncia a um ca a e ndice no mesmo cabealho, mas podem fazer referncia c e a um ndice de um FORALL mais externo. Uma vez tendo as expresses inteiras sido desenvolvidas, a <express~o o a lgica escalar>, se presente, desenvolvida para cada combinao dos valores dos o e ca ndices. Aqueles para os quais o resultado .TRUE. so ativados em cada comando no <corpo> do construto. e a O <corpo> consiste em um ou mais dos seguintes: expresses e atribuies de elementos de matrizes, coo co mandos ou construtos WHERE e outros comandos ou construtos FORALL. Usualmente, o subobjeto (submatriz, por exemplo) no lado esquerdo de uma atribuio no <corpo> far referncia a cada <ndice> dos construtos ca a e nos quais ele est imerso, como parte da identicao do subobjeto. Nenhum dos comandos no <corpo> pode a ca conter uma ramicao ou ser acess atravs de algum comando de desvio de uxo, tal como o GO TO. Rotinas ca vel e externas podem ser acessadas de dentro do <corpo> ou de dentro do cabealho do construto (na mscara, por c a exemplo). Todas as rotinas invocadas dentro desta estrutura devem ser puras (seo 8.2.16). ca O programa-exemplo 6.3 (programa tesforall) ilustra uma aplicao simples do construto FORALL, enquanto ca que o programa 6.4 (programa tesforall2) calcula a transposta de uma matriz. Pode-se notar aqui que o comando FORALL no acarreta em erro, uma vez que as atribuies so inicialmente armazenadas em espao a co a c temporrio e somente no nal so transferidas aos componentes da matriz A. a a

3O

que denominado de mbito (scope). e a

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 27 de mar o de 2008 c

62

6.10. Comando e construto FORALL

Programa 6.3: Exemplo simples do construto FORALL.

program t e s f o r a l l i m p l i c i t none integer , dimension ( 3 0 ) : : a , b integer : : n ! f o r a l l ( n =1:30) a ( n)= n b ( n)= a(30n+1) end f o r a l l print * , Vetor a : print * , a print * , print * , Vetor b : print * , b end program t e s f o r a l l

Programa 6.4: Calcula a transposta de uma matriz utilizando o comando FORALL.

program t e s f o r a l l 2 i m p l i c i t none integer , dimension ( 3 , 3 ) : : a integer : : i , j a= r e s h a p e ( s o u r c e= ( / ( i , i= 1 , 9 ) / ) , shape= ( / 3 , 3 / ) ) print * , Matriz A: print * , a ( 1 , : ) print * , a ( 2 , : ) print * , a ( 3 , : ) f o r a l l ( i= 1 : 3 , j= 1 : 3 ) a ( i , j )= a ( j , i ) print * , Tr a ns p ost a de A: print * , a ( 1 , : ) print * , a ( 2 , : ) print * , a ( 3 , : ) end program t e s f o r a l l 2

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 27 de mar o de 2008 c

Cap tulo 7

Rotinas Intr nsecas


Em uma linguagem de programaao destinada a aplicaoes cient c c cas h uma exigncia bvia para que as a e o funoes matemticas mais requisitadas sejam oferecidas como parte da prpria linguagem, ao invs de terem c a o e de ser todas implementadas pelo programador. Alm disso, ao serem fornecidas como parte do compilador, e espera-se que estas funoes tenham sido altamente otimizadas e testadas. c A ecincia das rotinas intr e nsecas quando estas manipulam matrizes em computadores vetoriais ou paralelos deve ser particularmente marcante, porque uma unica chamada ` rotina deve causar um n mero grande de a u operaoes individuais sendo feitas simultaneamente, sendo o cdigo que as implementa otimizado para levar em c o conta todos os recursos de hardware dispon veis. No padro do Fortran90/95 h mais de cem rotinas intr a a nsecas ao todo. Elas se dividem em grupos distintos, os quais sero descritos em certo detalhe. Certos compiladores em particular podero oferecer ainda mais rotinas, a a alm das oferecidas pelo padro da linguagem; contudo, o preo a pagar a falta de portabilidade de programas e a c e que usam rotinas fora do grupo-padro. Alm disso, rotinas extras somente podero ser oferecidas ao usurio a e a a atravs de mdulos (cap e o tulo 8). Ao longo deste cap tulo, as rotinas intr nsecas sero naturalmente divididas em funoes e subrotinas. A a c distinao entre estas duas classes de rotinas ser discutida com mais detalhes no cap c a tulo 8.

7.1

Categorias de rotinas intr nsecas

H quatro categorias de rotinas intr a nsecas: Rotinas elementais. So especicadas para argumentos escalares, mas podem tambm ser aplicadas a maa e trizes conformveis. No caso de uma funao elemental, cada elemento da matriz resultante, caso exista, a c ser obtido como se a funao tivesse sido aplicada a cada elemento individual da matriz que foi usada a c como argumento desta funao. No caso de uma subrotina elemental com um argumento matricial, cada c argumento com intento IN ou INOUT deve ser uma matriz e cada elemento resultante ser obtido como se a a subrotina tivesse sido aplicada a cada elemento da matriz que passada como argumento ` subrotina. e a Funoes inquisidoras. Retornam propriedades dos seus argumentos principais que no dependem dos seus c a valores, somento do seu tipo e/ou espcie. e Funoes transformacionais. So funoes que no so nem elementais nem inquisidoras. Elas usualmente tm c a c a a e argumentos matriciais e o resultado tambm uma matriz cujos elementos dependem dos elementos dos e e argumentos. Rotinas no-elementais. Rotinas que no se enquadram em nenhum dos tipos acima. a a As rotinas intr nsecas sero descritas posteriormente com base nesta categorizaao. a c

7.2

Declarao e atributo INTRINSIC ca

Um nome pode ser especicado como o nome de uma rotina intr nseca com a declaraao INTRINSIC, o qual c possui a forma geral: INTRINSIC <lista de nomes intrnsecos> 63

64

7.3. Funoes inquisidoras de qualquer tipo c

onde <lista de nomes intrnsecos> uma lista de nomes de rotinas intr e nsecas. O uso desta declaraao c e recomendado quando se quer enfatizar ao compilador que certos nomes so destinados a rotinas intr a nsecas. Isto pode ser util quando o programador est estendendo a deniao de uma rotina intr a c nseca, em um procedimento denominado sobrecarga de operador (operator overloading), o qual faz uso de interfaces genricas (generic e c interfaces). Para mais detalhes nestes recursos avanados, ver Metcalf & Reid (1996) [3]. Alternativamente, uma ou mais funoes intr c nsecas podem ser declaradas com o atributo INTRINSIC, no lugar da declaraao. c O atributo ou declaraao INTRINSIC so excludentes em relaao ao atributo ou declaraao EXTERNAL (seao c a c c c 8.2.12).

7.3

Funes inquisidoras de qualquer tipo co

As seguintes so funoes inquisidoras, com argumentos que podem ser de qualquer tipo: a c ASSOCIATED(POINTER[,TARGET]). Quanto TARGET est ausente, a funao retorna o valor .TRUE. se o ponteiro a c a a (pointer) est associado com um alvo (target) e retorna o valor .FALSE. em caso contrrio. O status de associaao de ponteiro de POINTER no deve ser indenido. Se TARGET estiver presente, este deve ter o c a mesmo tipo, espcie e posto de POINTER. O valor da funao .TRUE. se POINTER estiver associado a TARGET e c e ou .FALSE. em caso contrrio. No caso de matrizes, .TRUE. obtido somente se as formas so idnticas a e a e e elementos de matriz correspondentes, na ordem de elementos de matriz, esto associadas umas com as a outras. Se o comprimento do caractere ou tamanho da matriz so iguais a zero, .FALSO. obtido. Um a e limite diferente, como no caso de ASSOCIATED(P,A) seguindo a atribuiao de ponteiro P => A(:) quando c LBOUND(A)= 0, insuciente para causar um resultado .FALSE.. TARGET pode ser tamm um ponteiro, e e em cujo caso seu alvo comparado com o alvo de POINTER; o status de associaao de ponteiro de TARGET e c no deve ser indenido e se ou POINTER ou TARGET esto dissociados, o resultado .FALSE. a a e PRESENT(A). Pode ser chamada em um subprograma que possui um argumento mudo opcional A (ver seao c 8.2.9) ou acesse este argumento mudo a partir de seu hospedeiro. A funao retorna o valor .TRUE. se o c argumento est presente na chamada do subprograma ou .FALSE. em caso contrrio. Se um argumento a a mudo opcional usado como um argumento real na chamada de outra rotina, ele considerado tambm e e e ausente pela rotina chamada. KIND(X). Tem o argumento X de qualquer tipo e espcie e o seu resultado tem o tipo inteiro padro e de valor e a igual ao valor do parmetro de espcie de X. a e

7.4

Funes elementais numricas co e

H 17 funoes elementais destinadas ` realizaao de operaoes numricas simples, muitas das quais realizam a c a c c e converso de tipo de variveis para alguns ou todos os argumentos. a a

7.4.1

Funes elementais que podem converter co

Se o especicador KIND estiver presente nas funoes elementais seguintes, este deve ser uma expresso inteira c a e fornecer um parmetro de espcie de tipo que seja suportado pelo processador. a e ABS(A). Retorna o valor absoluto de um argumento dos tipos inteiro, real ou complexo. O resultado do tipo e inteiro se A for inteiro e real nos demais casos. O resultado da mesma espcie que A. e e e AIMAG(Z). Retorna a parte imaginria do valor complexo Z. O tipo do resultado real e a espcie a mesma a e e e que Z. AINT(A[,KIND]). Trunca um valor real A em sentido ao zero para produzir um valor real cujos valores decimais so iguais a zero. Se o argumento KIND estiver presente, o resultado da espcie dada por este; caso a e e contrrio, retorna o resultado na espcie padro do tipo real. a e a ANINT(A[,KIND]). Retorna um real cujo valor o n mero completo (sem parte fracionria) mais prximo de e u a o A. Se KIND estiver presente, o resultado do tipo real da espcie denida; caso contrrio, o resultado ser e e a a real da espcie padro. e a CEILING(A). Retorna o menor inteiro maior ou igual ao seu argumento real. Se KIND estiver presente, o resultado ser do tipo inteiro com a espcie denida pelo parmetro; caso contrrio, o resultado ser inteiro da espcie a e a a a e padro. a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 7. Rotinas Intr nsecas

65

CMPLX(X[,Y][,KIND]). Converte X ou (X,Y) ao tipo complexo com a espcie denida pelo argumento KIND, e caso presente, ou na espcie padro do tipo complexo em caso contrrio. Se Y for ausente, X pode ser dos e a a tipos inteiro, real ou complexo. Se Y estiver presente, tanto X quanto Y devem ser dos tipos inteiro ou real. FLOOR(A[,KIND]). Retorna o maior inteiro menor ou igual a seu argumento real A. Se KIND estiver presente, o resultado do tipo inteiro da espcie denida; caso contrrio, o resultado inteiro da espcie padro. e e a e e a INT(A[,KIND]). Converte ao tipo inteiro da espcie padro ou dada pelo argumento KIND. O argumento A pode e a ser: inteiro, em cujo caso INT(A)= A; real, em cujo caso o valor truncado em sentido ao zero, ou e complexo, em cujo caso somente a parte real considerada e esta truncada em sentido ao zero. e e NINT(A[,KIND]). Retorna o valor inteiro mais prximo do real A. Se KIND estiver presente, o resultado do o e tipo inteiro da espcie denida; caso contrrio, o resultado ser inteiro da espcie padro. e a a e a REAL(A[,KIND]). Converte ao tipo real da espcie dada pelo argumento KIND. O argumento A pode ser dos e tipos inteiro, real ou complexo. Se A for complexo, a parte imaginria ignorada. Se o argumento KIND a e estiver ausente, o resultado ser da espcie padro do tipo real se A for inteiro ou real e da mesma espcie a e a e de A se este for complexo.

7.4.2

Funes elementais que no convertem co a

As seguintes so funoes elementais cujos resultados so do tipo e da espcie iguais aos do primeiro ou unico a c a e argumento. Para aquelas que possuem mais de um argumento, todos devem ser do mesmo tipo e espcie. e CONJG(Z). Retorna o conjugado do valor complexo Z. DIM(X,Y). Retorna MAX(X-Y,0) para argumentos que so ambos inteiros ou ambos reais. a MAX(A1,A2[,A3,...]). Retorna o mximo (maior valor) entre dois ou mais valores inteiros ou reais. a MIN(A1,A2[,A3,...]). Retorna o m nimo (menor valor) entre dois ou mais valores inteiros ou reais. MOD(A,P). Retorna o restante de A mdulo P, ou seja, A-INT(A/P)*P. Se P=0, o resultado depende do proceso sador. A e P devem ambos ser inteiros ou ambos reais. MODULO(A,P). Retorna A mdulo P quando A e P so ambos inteiros ou ambos reais; isto , A-FLOOR(A/P)*P no o a e caso real ou A-FLOOR(AP)*P no caso inteiro, onde representa diviso matemtica ordinria. Se P=0, o a a a resultado depende do processador. SIGN(A,B). Retorna o valor absoluto de A vezes o sinal de B. A e B devem ser ambos inteiros ou ambos reais. Se B=0 e inteiro, seu sinal assumido positivo. Se o processador no tem a capacidade de disting ir entre e e a u zeros reais positivos ou negativos ento, para B= 0.0 o sinal assumido positivo. a e

7.5

Funes elementais matemticas co a

As seguintes so funoes elementais que calculam o conjunto imagem de funoes matemticas elementares. a c c a O tipo e espcie do resultado so iguais aos do primeiro argumento, o qual, usualmente, o unico. e a e ACOS(X). Retorna a funao arco coseno (ou cos1 ) para valores reais do argumento X (|X| 1). O resultado c e obtido em radianos no intervalo 0 ACOS(X) . ASIN(X). Retorna a funao arco seno (ou sin1 ) para valores reais do argumento X (|X| 1). O resultado c e obtido em radianos no intervalo /2 ASIN(X) /2. ATAN(X). Retorna a funao arco tangente (ou tan1 ) para valores reais do argumento X ( < X < ). O c resultado obtido em radianos no intervalo /2 ATAN(X) /2. e ATAN2(Y,X). Retorna a funao arco tangente (ou tan1 ) para pares de argumentos reais, X e Y, ambos do mesmo c tipo e espcie. O resultado o valor principal do argumento do n mero complexo (X,Y), expresso em e e u radianos no intervalo < ATAN2(Y, X) . Os valores de X e Y no devem ser simultaneamente nulos. a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

66

7.6. Funoes elementais lgicas e de caracteres c o

COS(X). Retorna o valor da funao coseno para um argumento dos tipos real ou complexo. A unidade do c argumento X suposta ser radianos. e COSH(X). Retorna o valor da funao coseno hiperblico para um argumento X real. c o EXP(X). Retorna o valor da funao exponencial para um argumento X real ou complexo. c LOG(X). Retorna o valor da funao logaritmo natural para um argumento X real ou complexo. No caso real, X c deve ser positivo. No caso complexo, X no pode ser nulo e a parte imaginria do resultado (Zi ) est no a a a intervalo < Zi . LOG10(X). Retorna o valor da funao logaritmo de base 10 para um argumento X real e positivo. c SIN(X). Retorna o valor da funao seno para um argumento dos tipos real ou complexo. A unidade do argumento c X suposta ser radianos. e SINH(X). Retorna o valor da funao seno hiperblico para um argumento X real. c o SQRT(X). Retorna o valor da funao raiz quadrada para um argumento X real ou complexo. No caso real, X c no pode ser negativo. No caso complexo, o resultado consiste na raiz principal, ou seja, a parte real do a resultado positiva ou nula. Quando a parte real do resultado for nula, a parte imaginria positiva ou e a e nula. TAN(X). Retorna o valor da funao tangente para um argumento X real. A unidade do argumento suposta ser c e radianos. TANH(X). Retorna o valor da funao tangente hiperblica para um argumento X real. c o

7.6
7.6.1

Funes elementais lgicas e de caracteres co o


Converses caractere-inteiro o

As seguintes so funoes elementais para converter um unico caractere em um inteiro e vice-versa. a c ACHAR(I). O resultado do tipo de caractere padro de comprimento um e retorna o caractere que est na e a a posiao especicada pelo valor inteiro I na tabela ASCII de caracteres. I deve estar no intervalo 0 I c 127; caso contrrio, o resultado depende do processador. a CHAR(I[,KIND]). O resultado do tipo caractere de comprimento um. A espcie dada pelo argumento e e e opcional KIND, se presente ou, em caso contrrio, ser a espcie padro. A funao retorna o caractere na a a e a c posiao I (tipo inteiro) da seqncia de caracteres interna do processador associada com o parmetro de c ue a espcie relevante. I deve estar no intervalo 0 I n 1, onde n o n mero de caracteres na seqncia e e u ue interna do processador. IACHAR(C). O resultado do tipo inteiro padro e retorna a posiao do caractere C na tabela ASCII. Se C no e a c a est na tabela, o resultado depende do processador. a ICHAR(C). O resultado do tipo inteiro padro e retorna a posiao do caractere C na seqncia interna do e a c ue processador associada com a espcie de C. e

7.6.2

Funes de comparao lxica co ca e

As seguintes funoes elementais aceitam strings de caracteres da espcie padro, realizam uma comparaao c e a c lxica baseada na tabela ASCII e retornam um resultado lgico da espcie padro. Se as strings tiverem e o e a comprimentos distintos, a mais curta complementada com espaos em branco. e c LGE(STRING_A,STRING_B). Retorna o valor .TRUE. se STRING_A segue STRING_B na seqncia estabelecida pela ue tabela ASCII, ou a iguala. O resultado .FALSE. em caso contrrio. e a LGT(STRING_A,STRING_B). Retorna o valor .TRUE. se STRING_A segue STRING_B na seqncia estabelecida pela ue tabela ASCII. O resultado .FALSE. em caso contrrio. e a LLE(STRING_A,STRING_B). Retorna o valor .TRUE. se STRING_A precede STRING_B na seqncia estabelecida ue pela tabela ASCII, ou a iguala. O resultado .FALSE. em caso contrrio. e a LLT(STRING_A,STRING_B). Retorna o valor .TRUE. se STRING_A precede STRING_B na seqncia estabelecida ue pela tabela ASCII. O resultado .FALSE. em caso contrrio. e a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 7. Rotinas Intr nsecas

67

7.6.3

Funes elementais para manipulaes de strings co co

As seguintes so funoes elementais que manipulam strings. Os argumentos STRING, SUBSTRING e SET so a c a sempre do tipo de caractere e, quando dois esto presentes, ambos devem ser da mesma espcie. O resultado a e e da mesma espcie de STRING. e ADJUSTL(STRING). Ajusta uma string ` esquerda. Ou seja, remove os espaos em branco no in da string e a c cio coloca o mesmo n mero de brancos no nal da string. u ADJUSTR(STRING). Ajusta uma string ` direita. Ou seja, remove os espaos em branco no nal da string e a c coloca o mesmo n mero de brancos no in da string. u cio INDEX(STRING,SUBSTRING[,BACK]). Retorna um valor do tipo inteiro padro, o qual consiste na posiao inicial a c de SUBSTRING como uma substring de STRING, ou zero se tal substring no existe. Se BACK (varivel a a lgica) est ausente, ou se est presente com o valor .FALSE., a posiao inicial da primeira das substrings o a a c retornada; o valor 1 retornado se SUBSTRING tem comprimento zero. Se BACK est presente com valor e e a .TRUE., a posiao inicial da ultima das substrings retornada; o valor LEN(STRING)+1 retornado se c e e SUBSTRING tem comprimento zero. LEN_TRIM(STRING). Retorna um valor inteiro padro correspondente ao comprimento de STRING, ignorando a espaos em branco no nal do argumento. c SCAN(STRING,SET[,BACK]). Retorna um valor inteiro padro correspondente ` posiao de um caractere de a a c STRING que esteja em SET, ou zero se no houver tal caractere. Se a varivel lgica BACK est ausente, ou a a o a presente com valor .FALSE., a posiao mais ` esquerda deste caractere retornada. Se BACK est presente c a e a com valor .TRUE., a posiao mais ` direita deste caractere retornada. c a e VERIFY(STRING,SET[,BACK]). Retorna o valor inteiro padro 0 se cada caractere em STRING aparece em SET, a ou a posiao de um caractere de STRING que no esteja em SET. Se a varivel lgica BACK est ausente, ou c a a o a presente com valor .FALSE., a posiao mais ` esquerda de tal caractere retornada. Se BACK est presente c a e a com valor .TRUE., a posiao mais ` direita de tal caractere retornada. c a e

7.6.4

Converso lgica a o

A funao elemental a seguir converte de uma espcie do tipo lgico em outra. c e o LOGICAL(L[,KIND]). Retorna o valor lgico idntico ao valor de L. A espcie do resultado denida pelo o e e e argumento opcional KIND, caso esteja presente, ou da espcie padro em caso contrrio. e e a a

7.7
7.7.1

Funes no-elementais para manipulao de strings co a ca


Funo inquisidora para manipulao de strings ca ca

LEN(STRING). Trata-se de uma funao inquisidora que retorna um valor inteiro padro escalar que corresponde c a ao n mero de caracteres em STRING se esta escalar ou de um elemento de STRING se a mesma uma u e e matriz. O valor de STRING no precisa estar denido. a

7.7.2

Funes transformacionais para manipulao de strings co ca

Existem duas funoes que no so elementais porque o comprimento do resultado depende do valor de um c a a argumento. REPEAT(STRING,NCOPIES). Forma a string que consiste na concatenaao de NCOPIES cpias de STRING, onde c o NCOPIES do tipo inteiro e seu valor no deve ser negativo. Ambos argumentos devem ser escalares. e a TRIM(STRING). Retorna STRING com todos os espaos em branco no nal da varivel removidos. STRING deve c a ser escalar.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

68

7.8. Funoes inquisidoras e de manipulaoes numricas c c e

7.8
7.8.1

Funes inquisidoras e de manipulaes numricas co co e


Modelos para dados inteiros e reais

As funoes inquisidoras e de manipulaoes numricas so denidas em termos de modelos de representaao c c e a c de n meros inteiro e reais para cada espcie suportada pelo processador. u e Para cada espcie do tipo inteiro, o modelo : e e
q

i=s
k=1

wk rk1 ,

(7.1)

onde s = 1, q um inteiro positivo, r um inteiro maior que um (usualmente 2) e cada valor de wk um e e e inteiro no intervalo 0 wk < r. Para cada espcie do tipo real, o modelo : e e x=0 e x = s be
k=1 p

fk bk ,

(7.2)

onde s = 1, p e b so inteiros maiores que um, e um inteiro no intervalo emin e emax e cada fk um a e e inteiro no intervalo 0 fk < b, exceto f1 , que no nulo. e a Os valores de todos os parmetros nestes modelos so escolhidos para o processador de tal forma que o a a modelo melhor se ajuste ao hardware, desde que todos os n meros sejam representveis. u a

7.8.2

Funes numricas inquisidoras co e

H nove funoes inquisidoras que retornam valores para os modelos de dados associados com seus argumentos. a c Cada funao tem um unico argumento que pode ser escalar ou matricial e todas retornam um valor escalar. O c valor per se do argumento no precisa ser denido, somente o seu tipo e espcie. a e DIGITS(X). Para X real ou inteiro, retorna o inteiro padro cujo valor o nmero de d a e u gitos signicantes no modelo que inclui X; isto , retorna p para X real ou q para X inteiro. e EPSILON(X). Para X real, retorna um resultado real com o mesmo tipo de X e que quase indisting do valor e uvel 1.0 no modelo que inclui X. Ou seja, a funao calcula b1p . c HUGE(X). Para X real ou inteiro, retorna o maior valor representvel no modelo que inclui X. O resultado possui a o mesmo tipo e espcie de X. O valor e e 1 bp bemax para X real ou rq 1 para X inteiro. MAXEXPONENT(X). Para X real, retorna o inteiro padro emax , ou seja, o expoente mximo no modelo que inclui a a X. MINEXPONENT(X). Para X real, retorna o inteiro padro emin, ou seja, o expoente m a nimo no modelo que inclui X. PRECISION(X). Para X real ou complexo, retorna um inteiro padro que contm a preciso decimal equivaa e a lente no modelo que representa n meros reais da mesma espcie de X. O valor da funao INT((p u e c e 1)) LOG10(b))+k, onde k 1 se b uma potncia inteira de 10 ou 0 em outro caso. e e e RADIX(X). Para X real ou inteiro, retorna o inteiro padro que a base no modelo que inclui X. Isto , retorna a e e b para X real ou r para X inteiro. RANGE(X). Para X inteiro, real ou complexo, retorna o inteiro padro que contm o intervalo de expoentes a e decimais nos modelos representando n meros reais ou inteiro da mesma espcie de X. O valor da funao u e c INT(LOG10(huge)) para X inteiro e e INT(MIN(LOG10(huge), LOG10(tiny))) para X real, onde huge e tiny so, respectivamente, o maior e o menor n meros positivos nos modelos. a u
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 7. Rotinas Intr nsecas TINY(X). Para X real, retorna o menor n mero positivo, u bemin 1 no modelo que inclui X. O resultado do mesmo tipo e espcie de X. e e

69

7.8.3

Funes elementais que manipulam quantidades reais co

H sete funoes elementais cujo primeiro ou unico argumento do tipo real e que retorna valores relacionados a c e aos componentes dos modelos de valores associados ao valor do argumento. EXPONENT(X). Retorna o inteiro padro cujo valor a parte de expoente e de X quando representado como um a e n mero de modelo. Se X=0, o resultado tambm nulo. u e e FRACTION(X). Retorna uma quantidade real da mesma espcie que X e cujo valor a parte fracionria de X e e a quando representado como um n mero de modelo; isto , a funao retorna Xbe . u e c NEAREST(X,S). Retorna uma quantidade real da mesma espcie que X e cujo valor o n mero distinto mais e e u prximo de X no sentido dado pelo sinal da quantidade real S. O valor de S no pode ser nulo. o a RRSPACING(X). Retorna uma quantidade real da mesma espcie que X cujo valor a rec e e proca do espaamento c relativo dos n meros de modelo prximos a X; isto , a funao retorna |Xbe | bp . u o e c SCALE(X,I). Retorna uma quantidade real da mesma espcie que X cujo valor XbI , onde b a base do modelo e e e para X e I do tipo inteiro. e SET_EXPONENT(X,I). Retorna uma quantidade real da mesma espcie que X cuja parte fracionria a parte e a e fracionria da representaao de X e cuja parte exponencial I; isto , a funao retorna Xb1e . a c e e c SPACING(X). Retorna uma quantidade real da mesma espcie que X cujo valor o espaamento absoluto do e e c modelo de n meros prximos a X. O resultado bep se X no nulo e este resultado est dentro do u o e e a a intervalo de n meros representveis. Caso contrrio, a funao retorna TINY(X). u a a c

7.8.4

Funes transformacionais para valores de espcie (kind) co e

H duas funoes que retornam o menor valor do parmetro de espcie que ir satisfazer um dado requerimento a c a e a numrico. As funoes tm argumentos e resultados escalares; porm so classicadas como transformacionais. e c e e a Estas funoes j foram discutidas na seao 3.7.3. c a c SELECTED_INT_KIND(R). Retorna o inteiro escalar padro que o valor do parmetro da espcie para um dado a e a e do tipo inteiro capaz de representar todos os valor inteiros n no intervalo 10R < n < 10R , onde R e um inteiro escalar. Se mais de uma espcie for dispon e vel, a espcie com menor intervalo exponencial e e escolhida. Se nenhuma espcie dispon e e vel, o resultado -1. e SELECTED_REAL_KIND([P][,R]). Retorna o inteiro escalar padro que o valor do parmetro da espcie para a e a e um dado do tipo real com preciso decimal (conforme retornada pela funao PRECISION) no m a c nimo igual a P e intervalo de expoente decimal (conforme retornado pela funao RANGE) no m c nimo igual a R. Se mais de uma espcie for dispon e vel, a espcie com a menor preciso decimal escolhida. Tanto P quanto R so e a e a inteiros escalares; pelo menos um destes deve estar presente. Se no houver espcie dispon a e vel, o resultado : e -1: se a preciso requerida no for dispon a a vel; -2: se um intervalo de expoente grande o suciente no for dispon a vel; -3: se ambos no forem dispon a veis.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

70

7.9. Rotinas de manipulao de bits ca

7.9

Rotinas de manipulao de bits ca

H onze rotinas para manipular bits contidos em quantidades inteiras. Estas rotinas so elementais, quando a a apropriado. As rotinas so baseadas em um modelo no qual um valor inteiro representado por s bits wk , com a e k = 0, 1, . . . , s 1, em uma seqncia da direita para a esquerda, baseada no valor no-negativo ue a
s1

wk 2k .
k=0

Este modelo vlido somente no contexto destas rotinas intr e a nsecas e idntico ao modelo de n meros inteiros e e u (7.1) quando r uma potncia inteira de 2 e ws1 = 0; mas quando ws1 = 1 os modelos diferem. e e

7.9.1

Funo inquisidora ca

BIT_SIZE(I). Retorna o n mero de bits no modelo para bits dentro de um inteiro da mesma espcie que I. O u e resultado um inteiro escalar da mesma espcie que I. e e

7.9.2

Funes elementais co

BTEST(I,POS). Retorna o valor lgico da espcie padro .TRUE. se o bit POS do inteiro I tem valor 1 and retorna o e a .FALSE. em outra situaao. POS deve ser um inteiro com valor no intervalo 0 POS < BIT SIZE(I). c IAND(I,J). Retorna o lgico AND de todos os bits em I e bits correspondentes em J, de acordo com a tabelao verdade I 1100 J 1010 I AND(I, J) 1 0 0 0 I e J devem ser do mesmo tipo; o resultado tambm ser do mesmo tipo. e a IBCLR(I,POS). Retorna um inteiro do mesmo tipo que I e valor igual ao de I exceto que o bit POS levado a e 0. POS deve ser um inteiro com valor no intervalo 0 POS < BIT SIZE(I). IBITS(I,POS,LEN). Retorna um inteiro do mesmo tipo que I e valor igual aos LEN bits de I iniciando no bit POS ajustado ` direita e com todos os outros bits iguais a 0. POS e LEN devem ser inteiros positivos tais a que POS + LEN BIT SIZE(I). IBSET(I,POS). Retorna um inteiro do mesmo tipo que I e valor igual ao de I exceto que o bit POS levado a e 1. POS deve ser um inteiro com valor no intervalo 0 POS < BIT SIZE(I). IEOR(I,J). Retorna o OU lgico exclusivo de todos os bits de I e correspondentes bits em J, de acordo com a o tabela-verdade I 1100 J 1010 I EOR(I, J) 0 1 1 0 I e J devem ser do mesmo tipo; o resultado tambm ser do mesmo tipo. e a IOR(I,J). Retorna o OU lgico inclusivo de todos os bits de I e correspondentes bits em J, de acordo com a o tabela-verdade I 1100 J 1010 I IOR(I, J) 1 1 1 0 I e J devem ser do mesmo tipo; o resultado tambm ser do mesmo tipo. e a ISHFT(I,SHIFT). Retorna um inteiro do mesmo tipo que I e valor igual ao de I exceto que os bits so deslocados a SHIFT posioes para a esquerda (-ISHIFT desloca para a direita se SHIFT for positivo). Zeros so inseridos c a a partir da extremidade oposta. SHIFT deve ser um inteiro com valor que satisfaz a inegualdade |SHIFT| BIT SIZE(I).
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 7. Rotinas Intr nsecas

71

ISHFTC(I,SHIFT[,SIZE]). Retorna um inteiro do mesmo tipo que I e valor igual ao de I exceto que os SIZE bits mais ` direita (ou todos os bits se SIZE for ausente) so deslocados de forma circular SHIFT posioes a a c para a esquerda (-ISHIFT desloca para a direita se SHIFT for positivo). Zeros so inseridos a partir da a extremidade oposta. SHIFT deve ser um inteiro com valor que no excede o valor de SIZE ou BIT_SIZE(I), a se SIZE estiver ausente. NOT(I). Retorna o complemento lgico de todos os bits em I, de acordo com a tabela-verdade o I 01 NOT(I) 1 0

7.9.3

Subrotina elemental

MVBITS(FROM,FROMPOS,LEN,TO,TOPOS). Copia a seqncia de bits em FROM que inicia na posiao FROMPOS e tem ue c comprimento LEN para TO, iniciando na posiao TOPOS. Os outros bits de TO permanecem inalterados. FROM, c FROMPOS, LEN e TOPOS so todos inteiros com intent IN e devem ter valores que satisfazem as inegualdades: a LEN 0, FROMPOS+LEN BIT_SIZE(FROM), FROMPOS 0, TOPOS 0 e TOPOS+LEN BIT_SIZE(TO). TO um inteiro com intent INOUT; ele deve ser da mesma espcie que FROM. A mesma varivel pode ser e e a especicada para FROM e TO.

7.10

Funo de transferncia ca e

A funao de transferncia permite que dados de um tipo sejam transferidos a outro tipo sem que a reprec e sentaao f c sica dos mesmos seja alterada. Esta funao pode ser util, por exemplo, ao se escrever um sistema de c armazenamento e recuperaao de dados; o sistema pode ser escrito para uma dado tipo, por exemplo, inteiro, e c os outros tipos so obtidos atravs de transferncias de e para este tipo. a e e TRANSFER(SOURCE,MOLD[,SIZE]). Retorna um valor do tipo e espcie de MOLD. Quando SIZE estiver ausente, e o resultado escalar se MOLD for escalar e de posto 1 e tamanho suciente para armazenar toda a SOURCE e e se MOLD for uma matriz. Quando SIZE estiver presente, o resultado de posto 1 e tamanho SIZE. Se e a representaao f c sica do resultado to ou mais longa que o tamanho de SOURCE, o resultado contm e a e SOURCE como sua parte inicial e o resto indenido; em outros casos, o resultado a parte inicial de e e SOURCE. Como o posto do resultado depende se SIZE ou no especicado, o argumento em si no pode e a a ser um argumento opcional.

7.11

Funes de multiplicao vetorial ou matricial co ca

H duas funoes transformacionais que realizam multiplicaoes vetorial ou matricial. Elas possuem dois a c c argumentos que so ambos de um tipo numrico (inteiro, real ou complexo) ou ambas do tipo lgico. O a e o resultado do mesmo tipo e espcie como seria resultante das operaoes de multiplicaao ou .AND. entre dois e e c c escalares. As funoes SUM e ANY, usadas nas denioes abaixo, so denidas na seao 7.12.1 abaixo. c c a c DOT_PRODUCT(VETOR_A,VETOR_B). Requer dois argumentos, ambos de posto 1 e do mesmo tamanho. Se VETOR_A dos tipos inteiro ou real, a funao retorna SUM(VETOR_A*VETOR_B); se VETOR_A do tipo complexo, a fune c e cao retorna SUM(CONJG(VETOR_A)*VETOR_B); e se VETOR_A do tipo lgico, a funao retorna ANY(VETOR_A e o c .AND. VETOR_B). MATMUL(MATRIZ_A,MATRIZ_B). Realiza a multiplicaao escalar. Para argumentos numricos, trs casos so c e e a poss veis: 1. MATRIZ_A tem forma (/n,m/) e MATRIZ_B tem forma (/m,k/). O resultado tem forma (/n,k/) e o elemento (i, j) tem o valor dado por SUM(MATRIZ_A(I,:)*MATRIZ_B(:,J)). 2. MATRIZ_A tem forma (/m/) e MATRIZ_B tem forma (/m,k/). O resultado tem forma (/k/) e o elemento j tem o valor dado por SUM(MATRI_A*MATRIZ_B(:,J)). 3. MATRIZ_A tem forma (/n,m/) e MATRIZ_B tem forma (/m/). O resultado tem forma (/n/) e o elemento i tem o valor dado por SUM(MATRIZ_A(I,:)*MATRIZ_B). Para argumentos lgicos, as formas so as mesmas que para argumentos numricos e os valores so detero a e a minados pela substituiao da funao SUM e do operador * pela funao ANY e pelo operador .AND.. c c c
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

72

7.12. Funoes transformacionais que reduzem matrizes c

7.12

Funes transformacionais que reduzem matrizes co

H sete funoes transformacionais que executam operaoes em matrizes, tais como somar seus elementos. a c c

7.12.1

Caso de argumento unico

Nas suas formas mais simples, estas funoes tm um unico argumento matricial e o resultado um valor c e e escalar. Todas, exceto COUNT tem o resultado do mesmo tipo e espcie que o argumento. e ALL(MASK). Retorna o valor .TRUE. se todos os elementos da matriz lgica MASK forem verdadeiros ou se MASK o for nula; caso contrrio, retorna o valor .FALSE. a ANY(MASK). Retorna o valor .TRUE. se algum dos elementos da matriz lgica MASK for verdadeiro e o valor o .FALSE. se todos os elementos forem falsos ou se a matriz for nula. COUNT(MASK). Retorna o valor inteiro padro igual ao n mero de elementos da matriz MASK que tm o valor a u e .TRUE. MAXVAL(ARRAY). Retorna o valor mximo dentre os elementos da matriz ARRAY, a qual pode ser inteira ou real. a Se ARRAY for nula, a funao retorna o valor negativo de maior magnitude suportado pelo processador. c MINVAL(ARRAY). Retorna o valor m nimo dentre os elementos da matriz ARRAY, a qual pode ser inteira ou real. Se ARRAY for nula, a funao retorna o valor positivo de maior magnitude suportado pelo processador. c PRODUCT(ARRAY). Retorna o produto de todos os elementos de uma matriz inteira, real ou complexa. A funao c retorna o valor 1 se ARRAY for nula. SUM(ARRAY). Retorna a soma de todos os elementos de uma matriz inteira, real ou complexa. A funao retorna c o valor 0 se ARRAY for nula.

7.12.2

Argumento opcional DIM

Todas as funoes acima tm um segundo argumento opcional DIM, o qual um inteiro escalar. Se este c e e argumento est presente, a operaao aplicada a todas as seoes de posto 1 que varrem atravs da dimenso a c e c e a DIM para produzir uma matriz de posto reduzido por um e extenses iguais `s extenses nas outras dimenses. o a o o Por exemplo, se A uma matriz real de forma (/4,5,6/), SUM(A,DIM=2) uma matriz real de forma (/4,6/) e e e o seu elemento (i, j) tem o valor dado por SUM(A(I,:,J)).

7.12.3

Argumento opcional MASK

As funoes MAXVAL, MINVAL, PRODUCT e SUM tm um terceiro argumento opcional; uma matriz lgica MASK. c e o Se esta matriz estiver presente, ela deve ter a mesma forma que o primeiro argumento e a operaao aplicada c e aos elementos do primeiro argumento correspondentes aos elementos verdadeiros de MASK. Por exemplo, SUM(A, MASK= A>0) soma todos os elementos positivos da matriz A. O argumento MASK afeta somente o valor da funao c e no afeta o desenvolvimento de argumentos que so expresses matriciais. a a o

7.13

Funes inquisidoras de matrizes co

H cinco funoes que inquirem sobre os limites, forma, tamanho e status de alocaao de uma matriz de a c c qualquer tipo. Uma vez que o resultado depende somente nas propriedades da matriz, o valor desta no a necessita ser denido.

7.13.1

Status de alocao ca

ALLOCATED(ARRAY). Retorna, quando a matriz alocvel ARRAY est correntemente alocada, o valor .TRUE.; na a a outra situaao, o valor .FALSE. retornado. Se os status da alocaao indenido, o resultado tambm c e c e e e indenido.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 7. Rotinas Intr nsecas

73

7.13.2

Limites, forma e tamanho

As funoes a seguir inquirem sobre as propriedades de uma matriz. No caso de uma matriz alocvel, esta c a c deve estar alocada. No caso de um ponteiro (pointer), ele deve estar associado a um alvo (target). Uma seao de matriz ou uma expresso matricial assumida ter limite inferior 1 e limite superior igual `s extenses. a e a o LBOUND(ARRAY[,DIM]). Quando DIM ausente, retorna uma matriz inteira padro de posto um, a qual contm e a e os limites inferiores. Quando DIM presente, este deve ser um inteiro escalar e o resultado um escalar e e inteiro padro com o valor do limite inferior na dimenso DIM. Como o posto do resultado depende da a a presena de DIM, o argumento da funao no pode ser, por sua vez, um argumento mudo opcional. c c a SHAPE(SOURCE). Retorna um vetor inteiro padro contendo a forma da matriz ou escalar SOURCE. No caso de a um escalar, o resultado tem tamanho zero. SIZE(ARRAY[,DIM]). Retorna um escalar inteiro padro igual ao tamanho da matriz ARRAY ou a extenso ao a a longo da dimenso DIM, caso este argumento esteja presente. a UBOUND(ARRAY[,DIM]). Similar a LBOUND exceto que retorna limites superiores.

7.14

Funes de construo e manipulao de matrizes co ca ca

H oito funoes que constrem ou manipulam matrizes de qualquer tipo. a c o

7.14.1

Funo elemental MERGE ca

MERGE(TSOURCE,FSOURCE,MASK). Trata-se de uma funao elemental. TSOURCE pode ter qualquer tipo e FSOURCE c deve ser do mesmo tipo e espcie. MASK deve ser do tipo lgico. O resultado TSOURCE se MASK verdadeiro e o e e ou FSOURCE no contrrio. a

7.14.2

Agrupando e desagrupando matrizes

A funao transformacional PACK agrupa dentro de um vetor aqueles elemento de uma matriz que so selec a cionados por uma matriz lgica conforme e a funao transformacional UNPACK executa a operaao reversa. Os o c c elementos so tomados na ordem dos elementos das matrizes. a PACK(ARRAY,MASK[,VECTOR]). Quando VECTOR ausente, retorna um vetor contendo os elementos de ARRAY e correspondentes aos valores verdadeiros de MASK na ordem dos elementos das matrizes. MASK pode ser um escalar de valor .TRUE.; em cujo caso, todos os elementos so selecionados. Se VECTOR presente, este a e deve ser um vetor do mesmo tipo e espcie de ARRAY e tamanho no m e nimo igual ao n mero t de elementos u selecionados. O resultado, neste caso, tem tamanho igual ao tamanho n do VECTOR; se t < n, elementos i do resultado para i > t so os elementos correspondentes de VECTOR. a UNPACK(VECTOR,MASK,FIELD). Retorna uma matriz do tipo e espcie de VECTOR e da forma de MASK. MASK deve e ser uma matriz lgica e VECTOR deve ser um vetor de tamanho no m o nimo igual ao n mero de elementos u verdadeiros de MASK. FIELD deve ser do mesmo tipo e espcie de VECTOR e deve ou ser escalar ou ter e a mesma forma que MASK. O elemento do resultado correspondendo ao i-simo elemento verdadeiro de e MASK, na ordem dos elementos da matriz, o i-simo elemento de VECTOR; todos os outros so iguais aos e e a correspondentes elementos de FIELD se este for uma matriz ou igual a FIELD se este for um escalar.

7.14.3

Alterando a forma de uma matriz

A funao transformacional RESHAPE permite que a forma de uma matriz seja alterada, com a poss perc vel mutaao dos c ndices. RESHAPE(SOURCE,SHAPE[,PAD][,ORDER]). Retorna uma matriz com forma dada pelo vetor inteiro SHAPE e tipo e espcie iguais aos da matriz SOURCE. O tamanho de SHAPE deve ser constante e seus elementos no podem e a ser negativos. Se PAD est presente, esta deve ser uma matriz do mesmo tipo e espcie de SOURCE. Se PAD a e estiver ausente or for uma matriz de tamanho zero, o tamanho do resultado no deve exceder o tamanho a de SOURCE. Se ORDER estiver ausente, os elementos da matriz resultante, arranjados na ordem de elementos de matrizes (seao 6.6.2), so os elementos de SOURCE, seguidos por cpias de PAD, tambm na ordem de c a o e elementos de matrizes. Se ORDER estiver presente, este deve ser um vetor inteiro com um valor que uma e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

74

7.15. Funoes transformacionais para localizao geomtrica c ca e permutaao de (1, 2, ..., n); os elementos R(s1 , . . . , sn ) do resultado, tomados na ordem dos c ndices para a matriz tendo elementos R(sordem(1) , . . . , sordem(n) ), so aqueles de SOURCE na ordem de elementos de matriz a seguidos por cpias de PAD, tambm na ordem de elementos de matriz. Por exemplo, se ORDER tem o valor o e (/3,1,2/), os elementos R(1,1,1), R(1,1,2), ..., R(1,1,k ), R(2,1,1), R(2,1,2), ... correspondem aos elementos de SOURCE e PAD na ordem de elementos de matriz.

7.14.4

Funo transformacional para duplicao ca ca

SPREAD(SOURCE,DIM,NCOPIES). Returna uma matriz do tipo e espcie de SOURCE e de posto acrescido por e um. SOURCE pode ser escalar ou matriz. DIM e NCOPIES so inteiros escalares. O resultado contm a e MAX(NCOPIES,0) cpias de SOURCE e o elemento (r1 , . . . , rn+1 ) do resultado SOURCE(s1, . . . , sn ), onde o e (s1 , . . . , sn ) (r1 , . . . , rn+1 ) com subscrito DIM omitido (ou a prpria SOURCE se esta for um escalar). e o

7.14.5

Funes de deslocamento matricial co

CSHIFT(ARRAY,SHIFT[,DIM]). Retorna uma matriz do mesmo tipo, espcie e forma de ARRAY. DIM um escalar e e inteiro. Se DIM for omitido, o seu valor ser assumido igual a 1. SHIFT do tipo inteiro e deve ser um escalar a e se ARRAY tiver posto um. Se SHIFT escalar, o resultado obtido deslocando-se toda seao vetorial que se e e c estende ao longo da dimenso DIM de forma circular SHIFT vezes. O sentido do deslocamento depende do a sinal de SHIFT e pode ser determinado a partir do caso com SHIFT= 1 e ARRAY de posto um e tamanho m, quando o elemento i do resultado ARRAY(i + 1), i= 1, 2, ..., m-1 e o elemento m ARRAY(1). Se SHIFT e e for uma matriz, esta deve ter a forma de ARRAY com a dimenso DIM omitida; desta forma, SHIFT oferece a um valor distinto para cada deslocamento. e EOSHIFT(ARRAY,SHIFT[,BOUNDARY][,DIM]). E idntica a CSHIFT, exceto que um deslocamento nal execue tado e valores de borda so inseridos nas lacunas assim criadas. BOUNDARY pode ser omitida quando ARRAY a tiver tipo intr nsecos, em cujo caso o valor zero inserido para os casos inteiro, real e complexo; .FALSE. e no caso lgico e brancos no caso de caracteres. Se BOUNDARY estiver presente, deve ser do mesmo tipo e o espcie de ARRAY; ele pode ser um escalar e prover todos os valores necessrios ou pode ser uma matriz e a cuja forma a de ARRAY com dimenso DIM omitida e prover um valor separado para cada deslocamento. e a

7.14.6

Transposta de uma matriz

A funao TRANSPOSE executa a transposiao matricial para qualquer matriz de posto dois. c c TRANSPOSE(MATRIX). Retorna uma matriz do mesmo tipo e espcie da matriz de posto dois MATRIX. Elemento e (i,j ) do resultado igual a MATRIX(i,j ). e

7.15

Funes transformacionais para localizao geomtrica co ca e

H duas funoes transformacionais que localizam as posioes dos valores mximos e m a c c a nimos de uma matriz inteira ou real. MAXLOC(ARRAY,DIM[,MASK]) ou MAXLOC(ARRAY[,MASK]). Retorna um vetor inteiro padro de tamanho igual a ao posto de ARRAY. Seu valor a seqncia de subscritos de um elemento de valor mximo (dentre aqueles e ue a correspondentes aos elementos de valor .TRUE. da matriz lgica MASK, caso esta exista), como se todos os o limites inferiores de ARRAY fossem iguais a 1. Se houver mais de um elemento com o mesmo valor mximo, a o primeiro na ordem de elementos de matriz assumido. Caso o argumento DIM esteja presente, este e e um escalar inteiro padro que indica a dimenso ao longo da qual o valor mximo deve ser procurado. O a a a compilador pode disting ir sem aux caso o segundo argumento seja DIM ou MASK pelo fato de que o tipo u lio de varivel distinto. a e MINLOC(ARRAY,DIM[,MASK]) ou MAXLOC(ARRAY[,MASK]). Retorna um vetor inteiro padro de tamanho igual a ao posto de ARRAY. Seu valor a seqncia de subscritos de um elemento de valor m e ue nimo (dentre aqueles correspondentes aos elementos de valor .TRUE. da matriz lgica MASK, caso esta exista), como se todos os o limites inferiores de ARRAY fossem iguais a 1. Se houver mais de um elemento com o mesmo valor m nimo, o primeiro na ordem de elementos de matriz assumido. e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 7. Rotinas Intr nsecas

75

7.16

Funo transformacional para dissociao de ponteiro ca ca

Em Fortran95, a funao NULL est dispon para fornecer statos de dissociado a ponteiros. c a vel NULL([MOLDE]). Retorna um pointer dissociado. O argumento MOLDE um ponteiro de qualquer tipo e que e pode ter qualquer status, inclusive de indenido. O tipo, espcie e posto do resultado so aqueles de e a MOLDE se ele est presente; em caso contrrio, so aqueles do objeto com o qual o ponteiro est associado. a a a a

7.17

Subrotinas intr nsecas no-elementais a

H cinco subrotinas intr a nsecas no elementais, as quais foram escolhidas ser subrotinas no lugar de funoes a c devido ` necessidade destas retornarem diversas informaoes atravs de seus argumentos. a c e

7.17.1

Relgio de tempo real o

H duas subrotinas que retornam informaao acerca do relgio de tempo real; a primeiro baseada no a c o e padro ISO 8601 (Representaao de datas e tempos). Assume-se que exista um relgio bsico no sistema que a c o a incrementado por um para cada contagem de tempo at que um valor mximo COUNT_MAX alcanado e da e e a e c , na prxima contagem de tempo, este zerado. Valores padronizados so retornados em sistemas sem relgio. o e a o Todos os argumentos tm intenao OUT (seao 8.2.5). Adicionalmente, h uma subrotina que acessa o relgio e c c a o interno do processador. Acesso a qualquer argumento opcional pode ser realizado atravs do uso das palavras-chave (seoes 8.2.8 e e c 8.2.9). CALL DATE_AND_TIME([DATE][,TIME][,ZONE][,VALUES]). Retorna os seguintes valores (com valores-padro a nulos ou -HUGE(0), conforme apropriado, caso no haja relgio): a o DATE uma varivel escalar de caractere da espcie pado que contm a data na forma ccyymmdd, core a e a e respondendo ao sculo, ano, ms e dia, respectivamente. e e TIME uma varivel escalar de caractere padro que contm o tempo na forma hhmmss.sss, correspondendo e a a e a horas, minutos, segundos e milisegundos, respectivamente. ZONE uma varivel escalar de caractere padro que xada como a diferena entre o tempo local e e a a e c o Tempo Coordenado Universal (UTC, de Coordinated Universal Time, tambm conhecido como e Tempo Mdio de Greenwich, ou Greenwich Mean Time) na forma Shhmm, correspondendo ao sinal, e horas e minutos, respectivamente. Por exemplo, a hora local de Bras corresponde a UTC= -0300. lia VALUES um vetor inteiro padro que contm a seguinte seqncia de valores: o ano, o ms do ano, o dia e a e ue e do ms, a diferena temporal em minutos com relaao ao UTC, a hora do dia, os minutos da hora, e c c os segundos do minuto e os milisegundos do segundo. CALL SYSTEM_CLOCK([COUNT][,COUNT_RATE][,COUNT_MAX]). Retorna o seguinte: COUNT uma varivel escalar inteira padro que contm o valor, dependente do processador, que correse a a e ponden ao valor corrente do relgio do processador, ou -HUGE(0) caso no haja relgio. Na primeira o a o chamada da subrotina, o processador pode xar um valor inicial igual a zero. COUNT_RATE uma varivel escalar inteira padro que contm o n mero de contagens por segundo do e a a e u relgio, ou zero caso no haja relgio. o a o COUNT_MAX uma varivel escalar inteira padro que contm o valor mximo que COUNT pode assumir, ou e a a e a zero caso no haja relgio. a o

7.17.2

Tempo da CPU

Em Fortran95, h uma subrotina intr a nseca no-elemental que retorna o tempo do processador. a CALL CPU_TIME(TIME). Retorna o seguinte: TIME uma varivel real escalar padro ` qual atribu uma aproximaao (dependente de processador) e a a a e da c do tempo do processador em segundos, ou um valor negativo (dependente de processador) caso no a haja relgio. o
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

76

7.17. Subrotinas intr nsecas no-elementais a

7.17.3

Nmeros aleatrios u o

Uma seqncia de n meros pseudo-aleatrios gerada a partir de uma semente que fornecida como um ue u o e e vetor de n meros inteiros. A subrotina RANDOM_NUMBER retorna os n meros pseudo-aleatrios e a subrotina u u o RANDOM_SEED permite que uma inquiriao seja feita a respeito do tamanho ou valor do vetor-semente e, ento, c a redenir o mesmo. As subrotinas fornecem uma interface a uma seqncia que depende do processador. ue CALL RANDOM_NUMBER(COLHE) Retorna um n mero pseudo-aleatrio a partir da distribuiao uniforme de n u o c u meros no intervalo 0 x < 1 ou um vetor destes n meros. COLHE tem intenao OUT, pode ser um escalar u c ou vetor e deve ser do tipo real. CALL RANDOM_SEED([SIZE][,PUT][,GET]). Tem os argumentos abaixo. No mais de um argumento pode a ser especicado; caso nenhum argumento seja fornecido, a semente xada a um valor dependente do e processador. SIZE tem intenao OUT e um inteiro escalar padro que o processador xa com o tamanho n do vetorc e a semente. PUT tem intenao IN e um vetor inteiro padro de tamanho n que usado pelo processador para xar c e a e uma nova semente. Um processador pode xar o mesmo valor de semente para mais de um valor de PUT. GET tem intenao OUT e um vetor inteiro padro de tamanho n que o processador xa como o valor atual c e a da semente.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

Cap tulo 8

Subprogramas e Mdulos o
Como foi visto nos cap tulos anteriores, poss escrever um programa completo em Fortran em um unico e vel arquivo, ou como uma unidade simples. Contudo, se o cdigo sucientemente complexo, pode ser necessrio o e a que um determinado conjunto de instrues seja realizado repetidas vezes, em pontos distintos do programa. co Um exemplo desta situao seria a denio de uma funo extr ca ca ca nseca, ou seja, no contida no conjunto de a funes intr co nsecas discutidas no cap tulo 7. Neste caso, melhor quebrar o programa em unidades distintas. e Cada uma das unidades de programa corresponde a um conjunto completo e consistente de tarefas que podem ser, idealmente, escritas, compiladas e testadas individualmente, sendo posteriormente inclu das no programa principal para gerar um arquivo executvel. Em Fortran h dois tipos de estruturas que se encaixam nesta a a categoria: subrotinas e funes (externas ou extr co nsecas). Em Fortran 77, havia somente dois tipos de unidades de programas distintas:
Programa principal. Rotinas externas.

Em Fortran 90/95, existem, ao todo, trs unidades distintas de programa: e


Programa principal. Rotinas externas. Mdulos. o

Cada uma destas unidades de programas sero discutidas nas sees seguintes. a co Neste cap tulo (e nos posteriores), os termos rotina (procedure) e subprograma sero usados alternadamente a para indicar de forma genrica tanto subrotinas quanto funes. Outros textos podem vir a tratar estes dois e co termos como representando entidades ligeiramente distintas.

8.1

Unidades de programa

Tanto em Fortran77 quanto em Fortran90/95, um cdigo executvel criado a partir de um e somente o a e um programa principal, o qual pode invocar rotinas externas e, no caso do Fortran90/95, pode usar tambm e mdulos. A unica unidade de programa que deve necessariamente existir sempre o programa principal. o e Com a introduo do Fortran90/95, quaisquer uma destas trs unidades de programas podem tambm ca e e invocar rotinas internas, as quais tm estrutura semelhante `s rotinas externas, porm no podem ser testadas e a e a isoladamente. Um diagrama ilustrativo das trs unidades de programas existentes no Fortran90/95 pode ser e visto na gura 8.1. Uma descrio mais completa das unidades de programas dada a seguir. ca e

8.1.1

Programa principal

Todo cdigo executvel deve ser composto a partir de um, e somente um, programa principal. Opcionalmente, o a este pode invocar subprogramas. Um programa principal possui a seguinte forma: 77

78
Programa Principal

8.1. Unidades de programa


Modulo

Rotina Externa

Rotina de Modulo Rotina Interna


Figura 8.1: As trs unidades de programa, as quais podem possuir tambm rotinas internas. e e

[PROGRAM <nome do programa> [<declara~es de variveis>] co a [<comandos executveis>] a [CONTAINS <subprogramas internos> END [PROGRAM [<nome do programa>]] A declarao PROGRAM opcional, porm o seu uso recomendado.1 O unico campo no opcional na estrutura ca e e e a de um programa, na denio do padro da linguagem, a instruo END, a qual possui dois propsitos: indicar ca a e ca o ao compilador que o programa chegou ao m e, quando da execuo do cdigo, provoca a parada do mesmo. ca o Nos cap tulos anteriores, j foram dados vrios exemplos da estrutura do programa principal e, portanto, a a maiores detalhes no so necessrios aqui. a a a A declarao CONTAINS indica a presena de um ou mais subprogramas internos. Estes sero descritos em ca c a mais detalhes na seo 8.2.2. Se a execuo do ultimo comando anterior a CONTAINS no provoca um desvio de ca ca a percurso na execuao do programa, atravs de uma instruo GO TO, por exemplo, o controle passa por sobre c e ca os subprogramas internos ao comando END e o programa pra. a O comando END pode ser rotulado e ser ento atingido por um desvio de execuo, como no exemplo a ca ... GO TO 100 ... 100 END PROGRAM em cuja situao o programa tambm termina. Contudo, este estilo de programao t ca e ca e pico do Fortran77, mas no recomendado pelo padro do Fortran90/95. a e a O comando STOP. Outra forma de interromper a execuo do programa atravs do comando STOP, o qual ca e e pode ser rotulado, pode ser parte de um comando ou construto IF e um comando que pode aparecer no e programa principal ou em um subprograma.
1 No

caso do compilador F, obrigatrio. e o

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o

79

Caso haja vrios comandos STOP em uma mesma unidade, estes podem ser distingidos por um cdigo de a u o acesso, que se trata de uma constante de caractere ou uma string de at 5 d e gitos. Isto originar uma mensagem a na sa padro indicando o ponto onde a execuo foi terminada. A seguir, dois exemplos deste caso: da a ca STOP Dados incompletos. STOP 12345 Programa interrompido.

8.1.2

Rotinas externas

Rotinas externas so chamadas de dentro de um program principal ou de outra unidade, usualmente com o a intuito de executar uma tarefa bem denida dentro dos objetivos cumpridos pelo programa completo. Rotinas externas so escritas em arquivos distintos, separados do arquivo do programa principal. a Durante o processo de criao do programa executvel, estas rotinas podem ser compiladas conjuntamente ca a com o programa principal ou em separado. Nesta ultima situao, os programas objetos criados durante com ca pilaes prvias das rotinas externas so linkados junto com o programa objeto do programa principal. Embora co e a seja poss colocar-se mais de uma rotina externa no mesmo arquivo, esta prtica no recomendada. vel a a e

8.1.3

Mdulos o

O terceiro tipo de unidade de programa, exclusivo no Fortran90/95, o mdulo. Trata-se de uma maneira e o de se agrupar dados globais, tipos derivados e suas operaes associadas, blocos de interface, grupos NAMELIST co (cap tulo ??) e rotinas internas. Tudo associado com uma determinada tarefa pode ser coletado dentro de um mdulo e acessado quando necessrio. Aquelas partes que so restritas ao funcionamento interno da tarefa e no o a a a so do interesse direto do programador podem ser feitas invis a veis a este, o que permite que o funcionamento interno do mdulo possa ser alterado sem a necessidade de alterar o programa que o usa, prevenindo-se assim o alterao acidental dos dados. ca Um mdulo tem a seguinte forma: o MODULE <nome mdulo> o <declara~es de variveis> co a [CONTAINS <rotinas de mdulo> o END [MODULE [<nome mdulo>]] o Assim como para END PROGRAM, recomendado o uso da forma completa do comando END. e Uma discusso mais extensa acerca dos mdulos em Fortran90/95 ser feita na seo 8.3. a o a ca

8.2

Subprogramas

Subprogramas podem ser subrotinas ou funoes. Como j foi mencionado, tarefas que podem ser delimitadas c a por um nmero nito de operaes e que devem ser realizadas repetidas vezes durante a execuo de um programa u co ca devem ser escritas como subprogramas. Uma funo retorna um unico valor, o qual pode ser um escalar ou uma matriz, e esta usualmente no ca a altera os valores de seus argumentos2 . Neste sentido, uma funo em Fortran age como uma funo em anlise ca ca a matemtica. J uma subrotina pode executar uma tarefa mais complexa e retornar diversos valores atravs de a a e seus argumentos, os quais podem ser modicados ao longo da computao da subrotina. ca

8.2.1

Funoes e subrotinas c

Exceto pela declarao inicial, os subprogramas apresentam uma forma semelhante a de um programa ca principal. Um subprograma pode ser uma subrotina: [PURE] [ELEMENTAL] [RECURSIVE] SUBROUTINE <nome subrotina> [(<lista argumentos mudos>)] [<declara~es de variveis>] co a [<comandos executveis>] a
2 Situaes co

onde este requisito pode ser relaxado e como estabelecer salvaguardas so discutidas na seao 8.2.16. a c

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 26 de mar o de 2008 c

80

8.2. Subprogramas [CONTAINS <subprogramas internos>] END [SUBROUTINE [<nome subrotina>]]

ou pode ser uma funo: ca [PURE] [ELEMENTAL] [<tipo>] [RECURSIVE] FUNCTION <nome fun~o> & ca (<lista argumentos mudos>)[RESULT (<nome resultado>)] [<declara~es de variveis>] co a [<comandos executveis>] a [CONTAINS <subprogramas internos>] END [FUNCTION [<nome fun~o>]] ca Os diversos constituintes das formas gerais apresentadas acima sero discutidos em detalhes nas sees seguintes. a co Por enquanto, sero apresentados alguns dos atributos usualmente empregados no campo de <declara~es de a co variveis> de um subprograma. Alm dos atributos j vistos, relacionados com as declaraes de tipo e espcie a e a co e de variveis, dos atributos DIMENSION e ALLOCATABLE, os seguintes atributos podem ser usados: a INTENT([IN][OUT][INOUT]) OPTIONAL SAVE EXTERNAL INTRINSIC POINTER TARGET A declarao CONTAINS cumpre exatamente o mesmo papel cumprido dentro do programa principal. O efeito ca do comando END em um subprograma consiste em retornar o controle ` unidade que o chamou, ao invs de a e interromper a execuo do programa. Aqui tambm recomenda-se o uso da forma completa do comando para ca e deixar claro ao compilador e ao programador qual parte do programa est sendo terminada. a Uma funo ativada ou chamada de forma semelhante como se usa uma funo em anlise matemtica. ca e ca a a Por exemplo, dada a funo BESSELJ(n,x), a qual calcula Jn (x), o valor da funo de Bessel do primeiro tipo ca ca de ordem n no ponto x. Esta funo pode ser chamada para atribuir seu valor a uma varivel escalar ou a um ca a elemento de matriz: y= BESSELJ(n,x) sendo que o tipo e espcie de y devem, em princ e pio, concordar com o tipo e espcie do resultado de BESe SELJ(n,x). Contudo, caso isto no ocorra, valem as regras de converso denidas no cap a a tulo 4. Uma funo ca pode tambm fazer o papel de um operando em uma expresso: e a y= BESSELJ(n,x) + 2*BESSELJ(n,x**2) ou ainda servir de argumento para uma outra rotina. Uma subrotina, devido ao fato de esta retornar, em geral, mais de um valor em cada chamada, no pode ser a operada como uma funo em anlise matemtica mas deve, isto sim, ser chamada atravs da instruo CALL. ca a a e ca Supondo que exista a subrotina BASCARA, a qual calcula as ra zes de um polinmio de segundo grau, x1 e x2, o estas sero obtidas atravs da chamada: a e CALL BASCARA(A0,A1,A2,X1,X2) onde os argumentos da subrotina sero discutidos na seo 8.2.3 e posteriores. Por exemplo, poss usar-se a ca e vel uma funo como argumento da subrotina: ca CALL BASCARA(A0,A1,BESSELJ(n,x),x1,x2)
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o

81

8.2.2

Rotinas internas

J foi observado nas sees anteriores que rotinas internas podem ser denidas dentro de quaisquer unidades a co de programa. Uma rotina interna possui a seguinte estrutura: [RECURSIVE] SUBROUTINE <nome subrotina> [(<lista argumentos mudos>)] [<declara~es de variveis>] co a [<comandos executveis>] a END SUBROUTINE [<nome subrotina>]] ou [<tipo>] [RECURSIVE] FUNCTION <nome fun~o> (<lista argumentos mudos>) & ca [RESULT (<nome resultado>)] [<declara~es de variveis>] co a [<comandos executveis>] a END FUNCTION [<nome fun~o>]] ca Nota-se agora que as declaraes FUNCTION e SUBROUTINE agora so obrigatrias no comando END. Uma deterco a o minada unidade de programa pode conter qualquer nmero de rotinas internas, porm estas, por sua vez, no u e a podem conter outras rotinas internas. Cabe aqui uma meno a respeito da diferena entre uma rotina interna e uma rotina de mdulo. Esta ca c o ultima tambm inclu depois da palavra-chave CONTAINS, em um mdulo, mas pode conter rotinas internas e e da o a ela. Uma rotina interna automaticamente tem acesso a todas as entidades do hospedeiro, tais como variveis, e a possuem tambm a habilidade de chamar as outras rotinas deste. Contudo, uma determinada rotina interna e no possui acesso `s entidades de outra rotina interna. a a Um exemplo simples do uso de uma funo interna apresentado a seguir. Note que a varivel a declaca e a e rada no programa principal, tornando-se assim uma varivel declarada tambm dentro do mbito da funo a e a ca calc_a_raiz: program r o t i n t i m p l i c i t none real : : x , a ! print * , Entre com o v a l o r de x : read * , x print * , Entre com o v a l o r de a : read * , a print * , O r e s u l t a d o de a + s q r t ( x ) : e print * , c a l c a r a i z ( x ) print * , O r e s u l t a d o de a + s q r t (1+ x * * 2 ) : e print * , c a l c a r a i z ( 1 . 0 + x * * 2 ) CONTAINS function c a l c a r a i z ( y ) real :: calc a raiz real , intent ( in ) : : y c a l c a r a i z= a + s q r t ( y ) return end function c a l c a r a i z end program r o t i n t No restante deste cap tulo, sero descritas vrias propriedades que se aplicam a subprogramas internos, a a externos e a rotinas de mdulos. o

8.2.3

Argumentos de subprogramas

Argumentos de subprogramas fornecem um meio alternativo para que duas unidades de programa compartilhem os mesmos dados. Estes consistem em uma lista de variveis escalares ou matriciais, constantes, expresses a o escalares ou matriciais e at mesmo os nomes de outras rotinas. Os argumentos de um subprograma so muitas e a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

82

8.2. Subprogramas

vezes denominados variveis mudas (dummy variables). Estes devem coincidir com os argumentos transferidos a a partir da unidade que chama a rotina em tipo, espcie e forma. Contudo, os nomes no necessitam ser os e a mesmos, como se pode ver no exemplo acima. Com base no mesmo exemplo, poder-se-ia realizar duas chamadas da funo calc_a_raiz: ca ... read*, a,x print*, calc_a_raiz(x) print*, calc_a_raiz(a + x**2) ... Sempre que poss vel, recomendado que o nome do argumento transferido ao subprograma seja igual ao nome e da varivel muda. O ponto importante que subprogramas podem ser escritos de forma independente uns dos a e outros. A associao das variveis mudas com os argumentos verdadeiros ocorrem somente quando a rotina ca a chamada. Desta forma, bibliotecas de subprogramas podem ser constru e dos, possibilitando que estes sejam usados em diferentes programas (ver seo 8.2.6). ca O programa-exemplo bascara1, apresentado na pgina 83, implementa, de forma ingnua, o clculo das ra a e a zes de um polinmio de segundo grau atravs da Frmula de Bscara usando uma subrotina interna. Exemplos o e o a semelhantes a este sero usados para ilustrar o uso de rotinas em outras unidades de programa. a

8.2.4

Comando RETURN

No padro da linguagem, um subprograma pode ser encerrado pelo comando END, sendo o controle do uxo a retornado ` unidade que chamou este subprograma. Contudo, o meio recomendado de se retornar controle a a partir de um subprograma consiste na utilizao do comando RETURN, o qual pode surgir em mais de um ponto ca da rotina, ao contrrio do END. a Como no caso dos comandos STOP e END, o RETURN pode ser rotulado, pode fazer parte de um construto como o IF e um comando executvel. O RETURN no pode aparecer entre os comandos executveis do programa e a a a principal.

8.2.5

Atributo e declarao INTENT ca

No programa bascara1, (programa 8.1) as variveis mudas a0, a1 e a2 foram utilizadas para transferir ` a a subrotina informao acerca dos coecientes do polinmio de 2 grau. Por isto, estes nomes foram declarados ca o ter a inteno INTENT(IN). Por outro lado, a subrotina devolveu ao programa os valores das ra ca zes reais (caso existam) atravs das variveis mudas r1 e r2, as quais foram declaradas ter a inteno INTENT(OUT). Uma e a ca terceira possibilidade seria a existncia de uma varivel cujo valor inicalmente transferido para dentro da e a e subrotina, modicado por esta e, ento transferido para fora da subrotina. Neste caso, esta varivel deveria a a ser declarada com a inteno INTENT(INOUT). ca Se uma varivel muda especicada com atributo INTENT(IN), o seu valor no pode ser alterado pela rotina, a e a seja atravs de atribuio de valor a partir de uma expresso, ou atravs de sua transferncia para uma outra e ca a e e rotina que, por sua vez, alteraria este valor. Se a varivel especicada com INTENT(OUT), o seu valor indenido na chamada da rotina, sendo este a e e ento denido durante a execuo da mesma e nalmente transferido ` unidade que chamou a rotina. a ca a Se a varivel especicada com INTENT(INOUT), esta tem o seu valor inicial transferido na chamada da a e rotina, o valor pode ser alterado e, ento, o novo valor pode ser devolvido ` unidade que chamou a rotina. a a E recomendado que a inteno de todas as variveis mudas seja declarada. Em funes, variveis mudas ca a co a somente podem ser declaradas com INTENT(IN). Como alternativa ao uso do atributo INTENT(INOUT), pode-se declarar a inteno de nomes de argumentos ca mudos de rotinas, que no sejam subprogramas mudos, atravs da declarao INTENT(INOUT), a qual tem a a e ca forma geral: INTENT(<inout>) [::] <lista nomes argumentos mudos> Por exemplo, SUBROUTINE SOLVE(A, B, C, X, Y, Z) REAL :: A, B, C, X, Y, Z INTENT(IN) :: A, B, C
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o

83

Programa 8.1: Exemplo de emprego de rotinas internas.

program b a s c a r a 1 i m p l i c i t none logical : : controle real : : a , b , c r e a l : : x1 , x2 ! R a i z e s r e a i s . ! do print * , Entre com o s v a l o r e s dos c o e f i c i e n t e s ( a , b , c ) , print * , onde a * x ** 2 + b * x + c . read * , a , b , c c a l l b a s c a r a ( a , b , c , c o n t r o l e , x1 , x2 ) i f ( c o n t r o l e ) then print * , As r a i z e s ( r e a i s ) s a o : print * , x1= , x1 print * , x2= , x2 exit else print * , As r a i z e s s a o complexas . Tente novamente . end i f end do CONTAINS subroutine b a s c a r a ( a2 , a1 , a0 , r a i z e s r e a i s , r1 , r 2 ) ! V a r i a v e i s mudas : real , intent ( in ) : : a0 , a1 , a2 l o g i c a l , intent ( out ) : : r a i z e s r e a i s real , intent ( out ) : : r1 , r 2 ! Variaveis l o ca is : real : : d i s c ! r a i z e s r e a i s= t e s t a d i s c ( a2 , a1 , a0 ) i f ( . not . r a i z e s r e a i s ) return d i s c= a1 * a1 4 * a0 * a2 r 1= 0.5 * ( a1 s q r t ( d i s c ) ) / a2 r 2= 0.5 * ( a1 + s q r t ( d i s c ) ) / a2 return end subroutine b a s c a r a ! function t e s t a d i s c ( c2 , c1 , c0 ) logical : : testa disc ! V a r i a v e i s mudas : real , intent ( in ) : : c0 , c1 , c2 i f ( c1 * c1 4 * c0 * c2 >= 0 . 0 ) then t e s t a d i s c= . t r u e . else t e s t a d i s c= . f a l s e . end i f return end function t e s t a d i s c end program b a s c a r a 1

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 26 de mar o de 2008 c

84 INTENT(OUT) :: X, Y, Z ...

8.2. Subprogramas

8.2.6

Rotinas externas e bibliotecas

Em muitas situaes, uma determinada rotina escrita com o intuito de ser utilizada em diversas aplicaes co e co distintas. Um exemplo seria uma rotina genrica que calcula a integral de uma funo qualquer entre dois pontos e ca reais. Nesta situaao, mais interessante manter a rotina como uma entidade distinta do programa principal, c e para que esta possa ser utilizada por outras unidades de programas. Por isto, uma ou mais rotinas podem ser escritas em um arquivo em separado, constituindo uma unidade de programa prpria, j mencionada na seo 8.1.2. Esta unidade pode ento ser compilada em separado, o a ca a quando ser ento gerado o programa-objeto correspondente a esta parte do cdigo. Este programa-objeto a a o ento acessado pelo programa linkador para gerar o programa executvel, ligando a(s) rotina(s) contida(s) e a a nesta unidade com as outras unidades que fazem referncia `(s) mesma(s). O procedimento para realizar esta e a linkagem realizado, usualmente, de duas maneiras distintas: e 1. O(s) programa-objeto(s) (so) linkado(s) diretamente com as demais unidades de programa. Neste caso, e a o compilador e o linkador identicam a existncia do programa-objeto pela sua extenso, fornecida na e a linha de comando que demanda a criao do cdigo executvel. A extenso de um programa-objeto ca o a a e usualmente *.o em sistemas operacionais Linux/Unix ou *.obj em sistemas DOS/Windows. 2. O programa-objeto recm criado armazenado, inicialmente, em uma biblioteca de programas-objeto e e criados anteriormente. Ento, no momento de se gerar o cdigo executvel a partir de um programa-fonte, a o a o linkador instru com o nome e o endereo da biblioteca que contm o(s) programa-objeto(s) da(s) e do c e rotina(s) chamadas pelo programa principal e/ou por outras unidades de programas. O linkador procura nesta biblioteca pelos nomes das rotinas invocadas e incorpora o cdigo destas (e somente destas) ao o programa executvel. a Com base nesta losoa, o programa bascara1, apresentado na pgina 8.1, pode ser ento desmembrado em a a trs arquivos distintos, dois contendo a subrotina bascara e a funo testa_disc e um contendo o programa e ca principal bascara2, apresentados na pgina 85. Note o uso do atributo EXTERNAL para indicar que o nome a TESTA_DISC consiste em uma funo externa do tipo lgico. ca o

8.2.7

Interfaces impl citas e expl citas

No exemplo apresentado na pgina 85, o nome testa_disc identicado como pertencente a uma funo a e ca lgica pelo atributo EXTERNAL: o ... LOGICAL, EXTERNAL :: TESTA_DISC ... Caso esta declaraao no fosse realizada, o compilador iria gerar uma mensagem de erro indicando que este c a nome no foi declarado. a Uma outra maneira de declarar um nome como pertencente a uma funo externa usando a declarao ca e ca EXTERNAL, em vez do atributo. Esta a forma utilizada no Fortran77. Desta maneira, o mesmo resultado seria e obtido atravs das seguintes linhas: e ... LOGICAL :: TESTA_DISC EXTERNAL :: TESTA_DISC ... A unica diferena entre o exemplo acima e o mesmo tipo de declarao em um programa Fortran77 consiste na c ca ausncia dos (::) no ultimo caso. e Em ambas as opes anteriores, somente fornecido ao compilador o nome da funo. Nenhum controle existe co e ca sobre os argumentos da funo testa_disc e da subrotina bascara. Por isto, seria poss o programa bascara2 ca vel chamar a subrotina bascara tentando transferir variveis complexas, por exemplo, quando os argumentos mudos a da subrotina esperam variveis reais. Esta falta de controle, no somente quanto ao tipo e espcie das variveis a a e a transferidas a rotinas externas, mas tambm quanto ao nmero e a ordem dos argumentos, inerente ao e u e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o ! Chamada p e l a s u b r o t i n a b a s c a r a para t e s t a r s e r a z e s s o r e a i s . a ! function t e s t a d i s c ( c2 , c1 , c0 ) i m p l i c i t none logical : : testa disc ! V a r i v e i s mudas : a real , intent ( in ) : : c0 , c1 , c2 i f ( c1 * c1 4 * c0 * c2 >= 0 . 0 ) then t e s t a d i s c= . t r u e . else t e s t a d i s c= . f a l s e . end i f return end function t e s t a d i s c ! C a l c u l a as r a z e s r e a i s , c a s o ex ist a m , de um p o l i n n i o de grau 2 . o ! Usa f u n o t e s t a d i s c . ca ! subroutine b a s c a r a ( a2 , a1 , a0 , r a i z e s r e a i s , r1 , r 2 ) i m p l i c i t none ! V a r i v e i s mudas : a real , intent ( in ) : : a0 , a1 , a2 l o g i c a l , intent ( out ) : : r a i z e s r e a i s real , intent ( out ) : : r1 , r 2 ! Fun o e x t e r n a : ca l o g i c a l , external : : t e s t a d i s c ! Variveis l o ca i s : a real : : d i s c ! r a i z e s r e a i s= t e s t a d i s c ( a2 , a1 , a0 ) i f ( . not . r a i z e s r e a i s ) return d i s c= a1 * a1 4 * a0 * a2 r 1= 0.5 * ( a1 s q r t ( d i s c ) ) / a2 r 2= 0.5 * ( a1 + s q r t ( d i s c ) ) / a2 return end subroutine b a s c a r a ! C a l c u l a as r a z e s r e a i s de um p o l i n m i o de grau 2 . o program b a s c a r a 2 i m p l i c i t none logical : : controle real : : a , b , c r e a l : : x1 , x2 ! R az e s r e a i s . ! do print * , Entre com o s v a l o r e s dos c o e f i c i e n t e s ( a , b , c ) , print * , onde a * x ** 2 + b * x + c . read * , a , b , c c a l l b a s c a r a ( a , b , c , c o n t r o l e , x1 , x2 ) i f ( c o n t r o l e ) then print * , As r a z e s ( r e a i s ) s o : a print * , x1= , x1 print * , x2= , x2 exit else print * , As r a z e s s o complexas . Tente novamente . a end i f end do end program b a s c a r a 2
Autor: Rudi Gaelzer IFM/UFPel

85

Impresso: 26 de mar o de 2008 c

86

8.2. Subprogramas

Fortran77; nenhum mecanismo de controle existe para auxiliar o compilador e o linkador na tarefa de determinar a coerncia entre as diferentes unidades de programas. e Para gerar chamadas a subprogramas de forma correta, o compilador necessita conhecer certos detalhes destes subprogramas, como os seus nomes e o nmero, tipo e espcie dos argumentos. Em Fortran90/95, esta u e tarefa desempenhada pelos blocos de interface. e No caso de rotinas intr nsecas, subprogramas internos e mdulos, esta informao sempre conhecida pelo o ca e compilador; por isso, diz-se que as interfaces so expl a citas. Contudo, quando o compilador chama uma rotina externa, esta informao no conhecida de antemo e da a interface dita impl ca a e a e cita. Um bloco de interface, ento, fornece a informao necessria ao compilador. A forma geral de um bloco de interface : a ca a e INTERFACE <corpo interface> END INTERFACE Nesta forma, este bloco de interface no pode ser nomeado. Assim, a interface deixa de ser impl a cita e se torna expl cita. O <corpo interface> consiste das declaraes FUNCTION ou SUBROUTINE, declaraes dos tipos e espcies co co e dos argumentos dos subprogramas e do comando END FUNCTION ou END SUBROUTINE. Em outras palavras, consiste, normalmente, em uma cpia exata do subprograma sem seus comandos executveis ou rotinas internas, o a cujas interfaces sempre so expl a citas. Por exemplo, INTERFACE FUNCTION FUNC(X) REAL :: FUNC REAL, INTENT(IN) :: X END FUNCTION FUNC END INTERFACE Neste exemplo, o bloco fornece ao compilador a interface da funo FUNC. ca Existe uma certa exibilidade na denio de um bloco de interfaces. Os nomes (mas no os tipos e espcies) ca a e das variveis podem ser distintos dos nomes mudos denidos na rotina ou usados na chamada da mesma e outras a especicaes podem ser inclu co das, como por exemplo para uma varivel local ` rotina. Contudo, rotinas internas a a e comandos DATA ou FORMAT no podem ser inclu a dos. Um bloco de interfaces pode conter as interfaces de mais de um subprograma externo e este bloco pode ser colocado na unidade de programa que chama as rotinas externas ou atravs do uso de mdulos, como ser e o a discutido na seo 8.3. Em qualquer unidade de programa, o bloco de interfaces sempre colocado aps as ca e o declaraes de variveis mudas ou de variveis locais. co a a Em certas situaoes, necessrio fornecer a uma rotina externa o nome de outra rotina externa como um de c e a seus argumentos. Isto pode ser realizado de duas maneiras: 1. Usando o atributo ou declarao EXTERNAL, como foi realizado na subrotina bascara, na pgina 8.2.6. ca a 2. Com o uso de um bloco de interface. Neste caso, a interface indicar ao compilador que um determinado a nome consiste, na verdade, no nome de um outro subprograma. As situaes onde isto pode ocorrer so discutidas na seo 8.2.12 co a ca Como exemplo do uso de interfaces expl citas ser apresentado o programa bascara3, o qual chama novaa mente as rotinas bascara e testa_disc. Este programa est listado nas pginas 87 e 88. a a

8.2.8

Argumentos com palavras-chave

Argumentos com palavras-chave (keyword arguments) so um recurso j utilizado em comandos de Entraa a da/Sa (E/S) no Fortran77: da READ(UNIT= 5, FMT= 101, END= 9000) X,Y,Z onde UNIT, FMT e END so as palavras-chave. Elas indicam, respectivamente, o nmero da unidade de acesso a u para leitura, o rtulo do comando de formato e o rtulo para onde o controle de uxo deve ser desviado quando o o se atingir o ponto nal de entrada dos dados. Em Fortran90/95, argumentos com palavras-chave podem ser utilizados no somente em comandos de E/S, a mas tambm em rotinas. Quando uma rotina tem diversos argumentos, palavras-chave so um excelente recurso e a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o

87

! Chamada p e l a s u b r o t i n a b a s c a r a para t e s t a r s e r a z e s s o r e a i s . a ! function t e s t a d i s c ( c2 , c1 , c0 ) i m p l i c i t none logical : : testa disc ! V a r i v e i s mudas : a real , intent ( in ) : : c0 , c1 , c2 i f ( c1 * c1 4 * c0 * c2 >= 0 . 0 ) then t e s t a d i s c= . t r u e . else t e s t a d i s c= . f a l s e . end i f return end function t e s t a d i s c ! C a l c u l a as r a z e s r e a i s , c a s o ex ist a m , de um p o l i n n i o de grau 2 . o ! Usa f u n o t e s t a d i s c . ca ! subroutine b a s c a r a ( a2 , a1 , a0 , r a i z e s r e a i s , r1 , r 2 ) i m p l i c i t none ! V a r i v e i s mudas : a real , intent ( in ) : : a0 , a1 , a2 l o g i c a l , intent ( out ) : : r a i z e s r e a i s real , intent ( out ) : : r1 , r 2 ! Variveis l o ca i s : a real : : d i s c INTERFACE function t e s t a d i s c ( c2 , c1 , c0 ) logical : : testa disc real , intent ( in ) : : c0 , c1 , c2 end function t e s t a d i s c END INTERFACE ! r a i z e s r e a i s= t e s t a d i s c ( a2 , a1 , a0 ) i f ( . not . r a i z e s r e a i s ) return d i s c= a1 * a1 4 * a0 * a2 r 1= 0.5 * ( a1 s q r t ( d i s c ) ) / a2 r 2= 0.5 * ( a1 + s q r t ( d i s c ) ) / a2 return end subroutine b a s c a r a

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 26 de mar o de 2008 c

88

8.2. Subprogramas

! C a l c u l a as r a z e s r e a i s de um p o l i n m i o de grau 2 . o program b a s c a r a 3 i m p l i c i t none logical : : controle real : : a , b , c r e a l : : x1 , x2 ! R az e s r e a i s . INTERFACE subroutine b a s c a r a ( a2 , a1 , a0 , r a i z e s r e a i s , r1 , r 2 ) real , intent ( in ) : : a0 , a1 , a2 l o g i c a l , intent ( out ) : : r a i z e s r e a i s real , intent ( out ) : : r1 , r 2 end subroutine b a s c a r a END INTERFACE ! do print * , Entre com o s v a l o r e s dos c o e f i c i e n t e s ( a , b , c ) , print * , onde a * x ** 2 + b * x + c . read * , a , b , c c a l l b a s c a r a ( a , b , c , c o n t r o l e , x1 , x2 ) i f ( c o n t r o l e ) then print * , As r a z e s ( r e a i s ) s o : a print * , x1= , x1 print * , x2= , x2 e xit else print * , As r a z e s s o complexas . Tente novamente . a end i f end do end program b a s c a r a 3

para evitar confuso entre os mesmos. A grande vantagem no uso de palavras-chave est em que no necessrio a a a e a lembrar a ordem dos argumentos. Contudo, necessrio conhecer os nomes dos argumentos mudos denidos no e a campo de declaraoes da rotina. c Por exemplo, dada a seguinte funo interna: ca ... CONTAINS FUNCTION AREA(INICIO, FINAL, TOL) REAL :: AREA REAL, INTENT(IN) :: INICIO, FINAL, TOL ... END FUNCTION AREA esta pode ser chamada por quaisquer uma das trs seguintes atribuies: e co A= AREA(0.0, 100.0, 1.0E-5) B= AREA(INICIO= 0.0, TOL= 1.0E-5, FINAL= 100.0) C= AREA(0.0, TOL= 1.0E-5, FINAL= 100.0) VALOR= 100.0 ERRO= 1.0E-5 D= AREA(0.0, TOL= ERRO, FINAL= VALOR) onde A, B, C e D so variveis declaradas previamente como reais. Todos os argumentos antes da primeira palavraa a chave devem estar ordenados na ordem denida pela funo. Contudo, se uma palavra-chave utilizada, esta ca e no necessita estar na ordem da denio. Alm disso, o valor atribu ao argumento mudo pode ser uma a ca e do constante, uma varivel ou uma expresso, desde que a interface seja obedecida. Depois que uma palavraa a chave utilizada pela primeira vez, todos os argumentos restantes tambm devem ser transferidos atravs de e e e palavras-chave. Consequentemente, a seguinte chamada no vlida: a e a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o C= AREA(0.0, TOL= 1.0E-5, 100.0) ! N~o vlido. a e a

89

O exemplo acima no vlido porque tentou-se transferir o valor 100.0 sem haver a informao da palavra-chave. a e a ca Uma vez que o compilador no ser capaz de realizar as associaes apropriadas exceto se este conhecer as a a co palavras-chave (nomes dos argumentos mudos), a interface do subprograma deve ser expl cita caso palavraschave sejam utilizadas. No caso de rotinas internas ou rotinas de mdulo, a interface j expl o ae cita. No caso de rotinas externas, faz-se necessrio o uso de um bloco de interfaces. a

8.2.9

Argumentos opcionais

Em algumas situaes, nem todos os argumentos de um subprograma necessitam ser transferidos durante co uma chamada do mesmo. Um argumento que no necessita ser transferido em todas as chamadas poss a veis de um subprograma denominado opcional. Estes argumentos opcionais podem ser declarados pelo atributo e OPTIONAL na declarao do tipo de variveis. ca a Mantendo o exemplo da funo AREA acima, a seguinte denio pode ser feita: ca ca ... CONTAINS FUNCTION AREA(INICIO, FINAL, TOL) REAL :: AREA REAL, INTENT(IN), OPTIONAL :: INICIO, FINAL, TOL ... END FUNCTION AREA a qual agora tem as seguintes chamadas vlidas, entre outras: a A= B= C= D= AREA(0.0, 100.0, 1.0E-2) AREA(INICIO= 0.0, FINAL= 100.0, TOL= 1.0E-2) AREA(0.0) AREA(0.0, TOL= 1.0E-2)

onde se fez uso tanto da associao posicional para os valores dos argumentos, quanto da associao via o uso ca ca de palavras-chave. Um argumento obrigatrio (que no declarado opcional) deve aparecer exatamente uma vez na lista de o a e argumentos da chamada de uma rotina, ou na ordem posicional ou na lista de palavras-chave. J um argumento a opcional pode aparecer, no mximo uma vez, ou na lista posicional de argumentos ou na lista de palavras-chave. a Da mesma forma como na seo 8.2.8, a lista de palavras-chave pode aparecer em qualquer ordem; poca rm, depois que o primeiro argumento transferido via uma palavra-chave, todos os restantes, obrigatrios ou e e o opcionais, devem ser transferidos da mesma forma. A rotina necessita de algum mecanismo para detectar se um argumento opcional foi transferido na sua chamada, para que esta possa tomar a medida adequada no caso de presena ou de ausncia. Este mecanismo c e e fornecido pela funo intr ca nseca PRESENT (seo 7.3). Por exemplo, na funo AREA acima, pode ser necessrio ca ca a vericar a existncia da varivel TOL para denir a tolerncia do clculo ou usar um valor padro caso ela no e a a a a a tenha sido transferida: ... REAL :: TTOL ... IF(PRESENT(TOL))THEN TTOL= TOL ELSE TTOL= 1.0E-3 END IF ... A varivel TTOL utilizada aqui porque ela pode ser redenida, ao passo que a varivel TOL no, uma vez que a e a a ela foi declarada com INTENT(IN). Como no caso dos argumento com palavras-chave, se a rotina externa e possui algum argumento opcional, e um bloco de interface deve ser fornecido em algum momento. Este no o caso da funo AREA, uma vez que a e ca ela interna. Contudo se externa ela o fosse, dever-se-ia declarar o seguinte bloco de interface: e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

90

8.2. Subprogramas INTERFACE FUNCTION AREA(INICIO, FINAL, TOL) REAL :: AREA REAL, INTENT(IN), OPTIONAL :: INICIO, FINAL, TOL END FUNCTION AREA END INTERFACE

8.2.10

Tipos derivados como argumentos de rotinas

Argumentos de rotinas podem ser do tipo derivado se este est denido em somente uma unica unidade de a programa. Isto pode ser obtido de duas maneiras: 1. A rotina interna ` unidade de programa na qual o tipo derivado denido. e a e 2. O tipo derivado denido em um mdulo o qual acessado pela rotina. e o e

8.2.11

Matrizes como argumentos de rotinas

Um outro recurso importante em Fortran a capacidade de usar matrizes como argumentos mudos de e subprogramas. Se um argumento mudo de uma rotina uma matriz, ento o argumento real pode ser: e a
o nome da matriz (sem subscritos); um elemento de matriz.

A primeira forma transfere a matriz inteira; a segunda forma, a qual transfere somente uma seo que inicia no ca elemento especicado, descrita em mais detalhes a seguir. e 8.2.11.1 Matrizes como argumentos em Fortran77

O Fortran77 j possu diversos recursos para realizar a transferncia de matrizes entre subprogramas. Estes a a e recursos foram posteriormente estendidos com a denio do novo padro com o Fortran90/95. ca a O uso mais simples e comum de argumentos mudos matriciais consiste em tornar dispon vel o contedo u completo de uma matriz em uma rotina. Se as matrizes usadas como argumentos reais sero todas do mesmo a tamanho, ento as matrizes mudas na rotina podem usar limites xos (alocao esttica). Por exemplo: a ca a SUBROUTINE PROD(X, Y, Z) C Calcula o produto dos vetores X e Y, com 100 elementos cada, C resultando no vetor Z do mesmo tamanho. REAL X(100), Y(100), Z(100) DO 10, I= 1,100 Z(I)= X(I)*Y(I) 15 CONTINUE END Esta subrotina pode ser chamada por um programa semelhante a este: PROGRAM CHAMA_PROD REAL A(100), B(100), C(100) READ(UNIT=*, FMT=*) A,B CALL PROD(A, B, C) WRITE(UNIT=*, FMT=*)C END Este uso de matrizes como argumentos mudos de subprogramas perfeitamente leg e timo, porm inex e vel, porque no permite o uso de matrizes de qualquer outro tamanho. Para possibilitar uma exibilidade maior, a o Fortran77 introduziu dois mecanismos que possibilitaram uma alocao dinmica no tamanho de matrizes ca a usadas como argumentos mudos de subprogramas. Estes mecanismos so as matrizes ajustveis e as matrizes a a de tamanho assumido. A alocao dinmica, entretanto, parcial, porque as matrizes reais transferidas aos ca a e subprogramas deveriam ter seu tamanho denido por alocao esttica em algum ponto dentro das unidades de ca a programas que chamavam as rotinas.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o Matrizes ajustveis a

91

Consiste na generalizao dos argumentos matriciais de uma rotina para permitir o uso de matrizes de ca qualquer tamanho. Neste caso, as expresses inteiras que denem os limites em cada dimenso das matrizes o a mudas so inclu a das nas declaraes destas dentro da rotina, usando variveis inteiras que so transferidas junto co a a com as matrizes nos argumentos da rotina ou atravs do uso de um bloco COMMON (ver seo 8.3.1). O exemplo e ca a seguir mostra como isto realizado: e SUBROUTINE PROD(NPTS, X, Y, Z) REAL X(NPTS), Y(NPTS), Z(NPTS) DO 15, I= 1, NPTS ... END Esta subrotina pode ser invocada pela seguinte linha no programa principal ou em outra unidade de programa: CALL PROD(100, A, B, C) as matrizes A, B e C devem ter o seu tamanho alocado de forma esttica nesta ou em alguma outra unidade de a programa anterior, conforme j foi mencionado. a O recurso das matrizes ajustveis pode ser estendido de forma trivial para cobrir o caso de matrizes multia dimensionais, com limites inferior e superior distintos. Por exemplo, SUBROUTINE MULTI(MAP, K1, L1, K2, L2, TRACO) DOUBLE PRECISION MAP(K1:L1, K2:L2) REAL TRACO(L1-K1+1) Como o exemplo mostra, os limites das dimenses das matrizes mudas pode ser expresses inteiras envolvendo o o no somente constantes mas tambm variveis inteiras transferidas ` rotina ou na lista de argumentos ou atravs a e a a e de um bloco COMMON. O mecanismo de matrizes ajustveis pode ser usado para matrizes de qualquer tipo. Uma matriz ajustvel a a tambm pode ser transferida a uma outra rotina como um argumento real com, se necessrio, os limites das e a dimenses sendo passados de forma concomitante. o Matrizes de tamanho assumido Podem haver circunstncias onde seja impraticvel o uso tanto de matrizes xas quanto de matrizes ajustveis a a a como argumentos mudos de um subprograma. A circunstncia mais freqnte ocorre quando o tamanho real da a ue matriz desconhecido quando a rotina inicialmente chamada. Neste caso, uma matriz de tamanho assumido e e a alternativa existente em Fortran77. e Estas matrizes tambm somente so permitidas como argumentos mudos de subprogramas, mas neste caso e a a matriz , efetivamente, declarada como tendo tamanho desconhecido. Por exemplo: e REAL FUNCTION SOMADOIS(TABELA, ANGULO) REAL TABELA(*) N= MAX(1, NINT(SIN(ANGULO)*500.0)) SOMADOIS= TABELA(N) + TABELA(N+1) END Neste caso, a funo somente sabe que a matriz TABELA unidimensional, com um limite inferior igual a um. ca e Isto tudo que a funo necessita saber para acessar os elementos apropriados N e N + 1. Ao executar a funo, e ca ca responsabilidade do programador assegurar que o valor do ANGULO nunca ir resultar em um subscrito fora e a do intervalo correto. Este sempre um problema quando se usa matrizes de tamanho assumido, porque o e compilador no tem nenhuma informao a respeito do limite superior da matriz. a ca Uma matriz de tamanho assumido somente pode ter o limite superior de sua ultima dimenso especicado a por um asterisco; todas as outras dimenses devem ter seus limites denidos pelas regras usuais ou serem o denidos na forma de matrizes ajustveis. a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

92 Sees de matrizes co

8.2. Subprogramas

As regras do Fortran requerem que as extenses de uma matriz, usada como argumento real de uma rotina, o sejam, no m nimo, iguais `s respectivas extenses da matriz muda declarada na rotina. Entretanto, a matriz real a o pode ter extenses maiores e as regras permitem tambm uma discordncia entre os limites inferior e superior o e a das matrizes real e muda. Por exemplo: PROGRAM CONFUS REAL X(-1:50), Y(10:1000) READ(UNIT=*, FMT=*)X, Y CALL SAIDA(X) CALL SAIDA(Y) END C SUBROUTINE SAIDA(MATRIZ) REAL MATRIZ(50) WRITE(UNIT=*,FMT=*)MATRIZ END O resultado deste programa ser escrever na sa padro inicialmente os elementos X(-1) a X(48), uma vez a da a que este ultimo coresponde ` posio na memria de MATRIZ(50). Em seguida, o programa escreve Y(10) a a ca o Y(59). Esta subrotina ir funcionar de forma semelhante na seo de uma matriz bi-dimensional: a ca PROGRAM DOIS_D REAL D(100,20) ... NFATIA= 15 CALL SAIDA(D(1,NFATIA)) ... Neste exemplo, a seo da matriz dos elementos D(1,15) a D(50,15)ser escrita na sa padro. Isto ocorre ca da a atravs da variaao dos e c ndices das linhas, porque esta a ordem dos elementos de matrizes em Fortran (ver e seo 6.6.2). ca O uso de um elemento de matriz como argumento real, quando o argumento mudo da rotina uma matriz e completa consiste uma prtica que facilmente incorre em erro e, portanto, deve ser evitada. a 8.2.11.2 Matrizes como argumentos em Fortran90/95

Com a denio do novo padro Fortran90/95, os recursos para uso de matrizes como argumentos mudos de ca a subprogramas foi ampliado em relao aos mecanismos j existentes no Fortran77. ca a No Fortran90/95, como j foi visto na seo 6.9, a alocao do tamanho das matrizes pode ser realizada de a ca ca maneira inteiramente dinmica, sendo o espao na memria da CPU alocado em tempo real de processamento. a c o Para fazer uso deste novo recurso, o Fortran90/95 deniu dois novos mecanismos para a denio de matrizes ca mudas variveis como argumentos de subprogramas: as matrizes de forma assumida, as quais generalizam as a matrizes de tamanho assumido do Fortran77 e os objetos automticos, os quais no so argumentos da rotina, a a a mas tem suas extenses denidas pelas matrizes mudas desta. o Matrizes de forma assumida Novamente como no caso de matrizes ajustveis ou de tamanho assumido, as formas dos argumentos reais a e mudos ainda devem concordar. Contudo, agora uma matriz muda pode assumir a forma (no somente o a tamanho) da matriz real usada no argumento da rotina. Tal matriz muda denominada matriz de forma e assumida. Quando a forma declarada com a especicao DIMENSION, cada dimenso tem a sintaxe: e ca a [<lim inferior>]: isto , pode-se denir o limite inferior da dimenso onde <lim inferior>, no caso mais geral, uma expresso e a e a inteira que pode depender dos outros argumentos da rotina ou de variveis globais denidas em mdulos (ou a o em blocos COMMON, mas o seu uso desaconselhado no Fortran90/95). Se <lim inferior> omitido, o valor e e padro 1. Deve-se notar que a forma da matriz que transferida, no os seus limites. Por exemplo: a e e e a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o PROGRAM TESTA_MATRIZ IMPLICIT NONE REAL, DIMENSION(0:10, 0:20) :: A ... CALL SUB_MATRIZ(A) ... CONTAINS SUBROUTINE SUB_MATRIZ(DA) REAL, DIMENSION(:,:), INTENT(INOUT) :: DA ... END SUBROUTINE SUB_MATRIZ END PROGRAM TESTA_MATRIZ

93

A subrotina SUB_MATRIZ declara a matriz de forma assumida DA. A correspondncia entre os elementos da e matriz real A e a matriz muda DA : A(0,0)DA(1,1) . . . A(I,J)DA(I+1,J+1) . . . A(10,20)DA(11,21). e Para que houvesse a mesma correspondncia entre os elemento de A e DA, seria necessrio declarar esta ultima e a como: REAL, DIMENSION(0:,0:), INTENT(INOUT) :: DA Neste caso, a correspondncia seria a desejada: A(0,0)DA(0,0) . . . A(I,J)DA(I,J) . . . A(10,20)DA(10,20). e Para se denir matrizes de forma assumida, necessrio que a interface seja expl e a cita na unidade que chama a rotina. A matriz real pode ter sido declarada, na unidade que chama a rotina ou em outra unidade anterior, como uma matriz alocvel. Como exemplo, considere a seguinte rotina externa, seguida do programa que a a chama, programa 8.2, listado na pgina 94: a subroutine sub ( ra , rb , rc , max a ) i m p l i c i t none real , dimension ( : , : ) , intent ( in ) real , dimension ( : , : ) , intent ( out ) real , intent ( out ) ! max a= maxval ( r a ) r c= 0 . 5 * rb return end subroutine sub

: : ra , rb : : rc : : max a

Objetos automticos a Uma rotina com argumentos mudos que so matrizes cujos tamanhos variam de uma chamada a outra pode a tambm precisar de matrizes locais (no mudas) cujos tamanhos variem ao sabor dos tamanhos das matrizes e a mudas. Um exemplo simples a matriz TEMP na subrotina abaixo, destinada a trocar os elementos entre duas e matrizes: SUBROUTINE TROCA(A,B) IMPLICIT NONE REAL, DIMENSION(:), INTENT(INOUT) :: A, B REAL, DIMENSION(SIZE(A)) :: TEMP !A fun~o SIZE fornece o tamanho de TEMP. ca TEMP= A A= B B= TEMP RETURN END SUBROUTINE TROCA Matrizes como a TEMP, cujas extenses variam da maneira apresentada so chamadas matrizes automticas e o a a so exemplos de objetos automticos de dados. Estes so objetos de dados cujas declaraes dependem do valor a a a co de expresses no-constantes e que no so argumentos mudos de rotinas. o a a a Um outro objeto automtico, relacionado com variveis de caracteres, surge atravs do comprimento varivel a a e a de um caractere:
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

94

8.2. Subprogramas
Programa 8.2: Exemplica o uso de matrizes de forma assumida.

program p r o g s u b i m p l i c i t none real , dimension ( 0 : 9 , 1 0 ) : : a real , dimension ( 5 , 5 ) :: c real : : valor max integer : : i INTERFACE subroutine sub ( ra , rb , rc , max a ) real , dimension ( : , : ) , intent ( in ) : : ra , rb real , dimension ( : , : ) , intent ( out ) : : r c real , intent ( out ) : : max a end subroutine sub END INTERFACE ! a= r e s h a p e ( s o u r c e =(/( c o s ( r e a l ( i ) ) , i= 1 , 1 0 0 ) / ) , shape= ( / 1 0 , 1 0 / ) ) c a l l sub ( a , a ( 0 : 4 , : 5 ) , c , valor max ) print * , A m a t r i z a : do i= 0 , 9 print * , a ( i , : ) end do print * , print * , O maior v a l o r em a : , valor max print * , print * , A m a t r i z c : do i= 1 , 5 print * , c ( i , : ) end do end program p r o g s u b

SUBROUTINE EXEMPLO(PALAVRA1) IMPLICIT NONE CHARACTER(LEN= *) :: PALAVRA1 CHARACTER(LEN= LEN(PALAVRA1)) :: PALAVRA2 ... como um exemplo. Se este objeto consiste em uma funo de caractere de tamanho varivel, a interface deve ca a ser expl cita, como no programa-exemplo loren abaixo. A denio dos limites das dimenses de um objeto automtico pode ser realizada tambm de argumentos ca o a e mudos ou de variveis denidas por associao por uso ou por associao ao hospedeiro. Associao por uso a ca ca ca program l o r e n i m p l i c i t none character ( len= * ) , parameter : : a= S um pequeno exemplo . o print * , dobro ( a ) CONTAINS function dobro ( a ) character ( len= * ) , intent ( in ) : : a character ( len= 2 * len ( a )+2) : : dobro dobro= a // // a return end function dobro end program l o r e n

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o

95

ocorre quando variveis globais pblicas declaradas no corpo de um mdulo so disponibilizadas ` rotina atravs a u o a a e da instruo USE; enquanto que associao ao hospedeiro ocorre quando variveis declaradas em uma unidade ca ca a de programa so disponibilizadas `s suas rotinas internas. a a Matrizes automticas so automaticamente criadas (alocadas) na entrada da rotina e automaticamente a a dealocadas na sa da. Assim, o tamanho das matrizes automticas pode variar em diferentes chamadas da rotina. a Note que no h mecanismo para vericar a disponibilidade de memria para a criao de matrizes automticas. a a o ca a Caso no haja memria suciente, o programa interrompido. Alm disso, uma matriz automtica no pode a o e e a a aparecer em uma declarao SAVE (seo 8.2.15) ou NAMELIST, ou possuir o atributo SAVE na sua declarao. ca ca ca Alm disso, a matriz no pode ser inicializada na sua declarao. e a ca O seguinte programa-exemplo usa matrizes alocveis, de forma assumida e automticas: a a subroutine sub mat ( a , r e s ) i m p l i c i t none real , dimension ( : , : ) , intent ( in ) : : a ! M a t r i z de forma assumida real , intent ( out ) : : r e s real , dimension ( s i z e ( a , 1 ) , s i z e ( a , 2 ) ) : : temp ! M a t r i z a u t o m t i c a a ! temp= s i n ( a ) r e s= minval ( a+temp ) return end subroutine sub mat program m a t r i z a u t i m p l i c i t none real , dimension ( : , : ) , a l l o c a t a b l e : : a real : : res integer : : n , m, i INTERFACE subroutine sub mat ( a , r e s ) real , dimension ( : , : ) , intent ( in ) : : a real , intent ( out ) : : r e s real , dimension ( s i z e ( a , 1 ) , s i z e ( a , 2 ) ) : : temp end subroutine sub mat END INTERFACE print * , Entre com dim e ns e s da m a t r i z : o read * , n ,m a l l o c a t e ( a ( n ,m) ) a= r e s h a p e ( s o u r c e =(/( tan ( r e a l ( i ) ) , i= 1 , n *m) / ) , shape= ( / n ,m/ ) ) print * , Matriz a : do i= 1 , n print * , a ( i , : ) end do c a l l sub mat ( a , r e s ) print * , print * , O menor v a l o r de a + s i n ( a ) : , r e s e end program m a t r i z a u t

8.2.12

Subprogramas como argumentos de rotinas

At este ponto, os argumentos de uma rotina forma supostos ser variveis ou expresses. Contudo, uma e a o outra possibilidade um ou mais argumentos sendo nomes de outras rotinas que sero invocadas. Um exemplo e a de situaao onde necessrio mencionar o nome de uma rotina como argumento de outra quando a segunda c e a e executa a integrao numrica da primeira. Desta forma, poss escrever-se um integrador numrico genrico, ca e e vel e e que integra qualquer funo que satisfaa a interface imposta a ela. ca c Um exemplo de uso do nome de uma rotina como argumento ocorre abaixo. a funo MINIMO calcula o ca m nimo (menor valor) da funo FUNC em um intervalo: ca FUNCTION MINIMO(A, B, FUNC)
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

96

8.2. Subprogramas ! Calcula o mnimo de FUNC no intervalo [A,B]. REAL :: MINIMO REAL, INTENT(IN) :: A, B INTERFACE FUNCTION FUNC(X) REAL :: FUNC REAL, INTENT(IN) :: X END FUNCTION FUNC END INTERFACE REAL :: F,X ... F= FUNC(X) !Invoca~o da fun~o. ca ca ... END FUNCTION MINIMO

Note o uso de um bloco de interface para indicar ao compilador que o nome FUNC corresponde a uma funo ca denida pelo usurio. a Em Fortran77, como no havia o recurso de blocos de interface, a indicao que o nome FUNC corresponde a a ca uma funo externa realizada atravs da declarao EXTERNAL. Assim, no exemplo acima, no lugar da interface ca e e ca apareceria: ... REAL FUNC EXTERNAL FUNC ... para indicar a funo externa. A mesma alternativa continua vlida em Fortran90/95, onde, alm da declarao, ca a e ca pode-se usar tambm a palavra-chave EXTERNAL como atributo de um nome. Contudo, como j foi mencionado e a na seo 8.2.7, o simples uso da declarao ou atributo EXTERNAL no possibilita o controle nos argumentos ca ca a desta funo, ao contrrio do que ocorre quando a interface expl ca a e cita. Um exemplo de programa que chama a funo MINIMO seria o seguinte: ca PROGRAM MIN IMPLICIT NONE REAL :: MENOR INTERFACE FUNCTION FUN(X) REAL :: FUN REAL, INTENT(IN) :: X END FUNCTION FUN END INTERFACE ... MENOR= MINIMO(1.0, 2.0, FUN) ... END PROGRAM MIN O uso de um bloco de interface no necessrio se a interface de FUN for expl a e a cita, como no caso de uma rotina de mdulo. o No exemplo acima, a funo FUN no pode ser interna, porque estas no so admitidas quando os seus nomes ca a a a so usados como argumentos de outras rotinas. Ou seja, somente rotinas externas ou de mdulos so aceitas a o a quando os seus nomes so transferidos a outras rotinas como argumentos. a O programa-exemplo das pginas 97 e 98 descreve uma subrotina que gera uma matriz de pontos a partir a de uma funo fornecida pelo programador. ca

8.2.13

Funes de valor matricial co

Funes, alm de fornecer os resultados usuais na forma de valores dos tipos intr co e nsecos inteiro, real, complexo, lgico e de caractere, podem tambm fornecer como resultado valores de tipo derivado, matrizes e ponteio e ros. No caso de funes de valor matricial, o tamanho do resultado pode ser determinado de forma semelhante co a ` maneira como matrizes automticas so declaradas. a a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o

97

! Usa s u b r o t i n a p l o t a e chama a f u n o e x t e r n a Meu F . ca ! program t e s p l o t a i m p l i c i t none integer : : pts , j real : : yi , y f real , dimension ( : , : ) , a l l o c a t a b l e : : xy INTERFACE subroutine p l o t a ( f , xi , xf , npt , p l o t ) integer , intent ( in ) : : npt real , intent ( in ) : : xi , x f real , dimension ( 2 , npt ) , intent ( out ) : : p l o t INTERFACE function f ( x ) real : : f real , intent ( in ) : : x end function f END INTERFACE end subroutine p l o t a ! function Meu F ( y ) r e a l : : Meu F real , intent ( in ) : : y end function Meu F END INTERFACE ! print * , Entre com o n mero de p o n t o s : u read * , p t s print * , Entre com o s l i m i t e s i n f e r i o r e s u p e r i o r : read * , yi , y f a l l o c a t e ( xy ( 2 , p t s ) ) ! c a l l p l o t a ( Meu F , yi , yf , pts , xy ) ! do j= 1 , p t s print * , xy ( : , j ) end do end program t e s p l o t a ! Fun o sen ( exp ( x ) ) . ca function Meu F ( x ) r e a l : : Meu F real , intent ( in ) : : x ! Meu F= s i n ( exp ( x ) ) return end function Meu F

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 26 de mar o de 2008 c

98

8.2. Subprogramas

! Gera uma m a t r i z de p o n t o s de uma f u n o q u a l q u e r d e s t i n a d a ` p l o t a g e m ca a ! do g r f i c o d e s t a f u n o . a ca ! Par metros : a ! f : Fun o e x t e r n a a s e r p l o t a d a . ca ! x i : Ponto i n i c i a l ( e n t r a d a ) . ! x f : Ponto f i n a l ( e n t r a d a ) . ! npt : Nmero de p o n t o s a s e r g e r a d o s ( e n t r a d a ) u ! p l o t : m a t r i z de forma (/ npt , 2 /) contendo as a b c i s s a s e ordenadas dos ! p o n t o s ( s ad a ) . ! subroutine p l o t a ( f , xi , xf , npt , p l o t ) i m p l i c i t none integer , intent ( in ) : : npt real , intent ( in ) : : xi , x f real , dimension ( 2 , npt ) , intent ( out ) : : p l o t INTERFACE function f ( x ) real : : f real , intent ( in ) : : x end function f END INTERFACE ! Variveis l o ca i s : a integer : : i real : : passo , x ! p a s s o= ( x f x i ) / r e a l ( npt 1 ) x= x i do i= 1 , npt p l o t ( 1 , i )= x p l o t ( 2 , i )= f ( x ) x= x + p a s s o end do return end subroutine p l o t a

Considere o seguinte exemplo de uma funo de valor matricial: ca PROGRAM TES_VAL_MAT IMPLICIT NONE INTEGER, PARAMETER :: M= 6 INTEGER, DIMENSION(M,M) :: IM1, IM2 ... IM2= FUN_VAL_MAT(IM1,1) !Chama fun~o matricial. ca ... CONTAINS FUNCTION FUN_VAL_MAT(IMA, SCAL) INTEGER, DIMENSION(:,:), INTENT(IN) :: IMA INTEGER, INTENT(IN) :: SCAL INTEGER, DIMENSION(SIZE(IMA,1),SIZE(IMA,2)) :: FUN_VAL_MAT FUN_VAL_MAT= IMA*SCAL END FUNCTION FUN_VAL_MAT END PROGRAM TES_VAL_MAT Neste exemplo, o limites das dimenses de FUN_VAL_MAT so herdadas do argumento verdadeiro transferido ` o a a funo e usadas para determinar o tamanho da matriz resultante. ca Para que o compilador conhea a forma da matriz resultante, a interface de uma funo de valor matricial c ca deve ser expl cita em todas as unidades onde esta funo invocada. ca e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o

99

8.2.14

Recurso e rotinas recursivas a

Recurso ocorre quando rotinas chamam a si mesma, seja de forma direta ou indireta. Por exemplo, sejam a as rotinas A e B. Recurso pode ocorrer de duas formas: a Recurso direta: A invoca A diretamente. a Recurso indireta: A invoca B, a qual invoca A. a Qualquer cadeia de invocaes de rotinas com um componente circular (isto , invocao direta ou indireta) co e ca exibe recurso. Embora recurso seja uma tcnica bonita e sucinta para implementar uma grande variedade de a a e problemas, o uso incorreto da mesma pode provocar uma perda na ecincia da computao do cdigo. e ca o Fortran77 Em Fortran77, recurso direta no permitida. Qualquer tentativa de forar uma rotina a chamar a si a a e c prpria resultar em erro de compilao. Em grande parte dos textos, arma-se que recurso indireta tambm o a ca a e no poss 3 . Contudo, recurso pode ser simulada em Fortran77 quando uma rotina chama a si prpria a e vel a o usando no o seu nome real mas atravs de um argumento mudo, como no exemplo abaixo:4 a e PROGRAM MAIN INTEGER N, X EXTERNAL SUB1 COMMON /GLOBALS/ N X= 0 PRINT*, Entre nmero de repeti~es: u co READ(*,*) N CALL SUB1(X, SUB1) END PROGRAM MAIN ------------------------------------------SUBROUTINE SUB1(X, SUBMUDO) INTEGER N, X EXTERNAL SUBMUDO COMMON /GLOBALS/ N IF(X .LT. N)THEN X= X + 1 PRINT*, X=, X CALL SUBMUDO(X, SUBMUDO) END IF RETURN END SUBROUTINE SUB1 Como a subrotina SUB1 no sabe que ao invocar o argumento mudo SUBMUDO, o qual o nome de uma rotina a e externa, vai estar na verdade invocando a si prpria, o compilador no ir gerar mensagem de erro e o cdigo o a a o ir funcionar em grande parte das plataformas. Por exemplo, se o valor de N for denido igual a 5, o resultado a ser a X = 1 X = 2 ... X = 5 o que demonstra que poss simular-se recurso mesmo em Fortran77. e vel a Fortran90/95 Em Fortran90/95, por outro lado, recurso suportada como um recurso expl a e cito da linguagem.
3 Ver, 4 Referncia: e

por exemplo, o texto de Clive Page [4, seo 4.3]. ca Fortran Examples http://www.esm.psu.edu/~ajm138/fortranexamples.html, consultada em 07/06/2005.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 26 de mar o de 2008 c

100

8.2. Subprogramas

Recurso direta. Para ns de ecincia na execuo do cdigo, rotinas recursivas devem ser explicitamente a e ca o declaradas usando-se a palavra-chave RECURSIVE SUBROUTINE ... ou RECURSIVE FUNCTION ... A declarao de uma funo recursiva realizada com uma sintaxe um pouco distinta da at ento abordada: ca ca e e a uma funo explicitamente declarada recursiva deve conter tambm a palavra-chave RESULT, a qual especica ca e o nome de uma varivel ` qual o valor do resultado do desenvolvimento da funo deve ser atribu a a ca do, em lugar do nome da funao propriamente dito. c A palavra-chave RESULT necessria, uma vez que no poss usar-se o nome da funo para retornar e a a e vel ca o resultado, pois isso implicaria em perda de ecincia no cdigo. De fato, o nome da palavra-chave deve ser e o usado tanto na declarao do tipo e espcie do resultado da funo quanto para atribuio de resultados e em ca e ca ca expresses escalares ou matriciais. Esta palavra-chave pode tambm ser usada para funes no recursivas. o e co a Cada vez que uma rotina recursiva invocada, um conjunto novo de objetos de dados locais criado, o qual e e eliminado na sa da rotina. Este conjunto consiste de todos os objetos denidos no campo de declaraes e da co da rotina ou declarados implicitamente, exceto aqueles com atributos DATA ou SAVE (ver seo 8.2.15). Funes ca co de valor matricial recursivas so permitidas e, em algumas situaes, a chamada de uma funo recursiva deste a co ca tipo indisting de uma referncia a matrizes. e uvel e O exemplo tradicional do uso de rotinas recursivas consiste na implementao do clculo do fatorial de um ca a inteiro positivo. A implementao realizada a partir das seguintes propriedades do fatorial: ca e 0! = 1; N ! = N (N 1)!

A seguir, o clculo do fatorial implementado tanto na forma de uma funo quanto na forma de uma subrotina a e ca recursivas: RECURSIVE FUNCTION FAT(N) RESULT (N_FAT) IMPLICIT NONE INTEGER :: N_FAT !Define tambm o tipo de FAT. e INTEGER, INTENT(IN) :: N IF(N == 0)THEN N_FAT= 1 ELSE N_FAT= N*FAT(N-1) END IF RETURN END FUNCTION FAT ---------------------------------------------RECURSIVE SUBROUTINE FAT(N, N_FAT) IMPLICIT NONE INTEGER, INTENT(IN) :: N INTEGER, INTENT(INOUT) :: N_FAT IF(N == 0)THEN N_FAT= 1 ELSE CALL FAT(N - 1, N_FAT) N_FAT= N*N_FAT END IF RETURN END SUBROUTINE FAT Recurso indireta. Uma rotina tambm pode ser invocada por recurso indireta, isto , uma rotina chama a e a e outra a qual, por sua vez, invoca a primeira. Para ilustrar a utilidade deste recurso, supe-se que se queira o realizar uma integrao numrica bidimensional quando se dispe somente de um cdigo que executa integrao ca e o o ca unidimensional. Um exemplo de funo que implementaria integrao unidimensional dado a seguir. O ca ca e exemplo usa um mdulo, o qual uma unidade de programa que ser discutido na seo 8.3: o e a ca
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o FUNCTION INTEGRA(F, LIMITES) ! Integra F(x) de LIMITES(1) a LIMITES(2). implicit none REAL, DIMENSION(2), INTENT(IN) :: LIMITES INTERFACE FUNCTION F(X) REAL :: F REAL, INTENT(IN) :: X END FUNCTION F END INTERFACE ... INTEGRA= <implementa~o integra~o numrica> ca ca e RETURN END FUNCTION INTEGRA -------------------------------------------MODULE FUNC IMPLICIT NONE REAL :: YVAL REAL, DIMENSION(2) :: LIMX, LIMY CONTAINS FUNCTION F(XVAL) REAL :: F REAL, INTENT(IN) :: XVAL F= <express~o envolvendo XVAL e YVAL> a RETURN END FUNCTION F END MODULE FUNC -----------------------------------------FUNCTION FY(Y) ! Integra em X, para um valor fixo de Y. USE FUNC REAL :: FY REAL, INTENT(IN) :: Y YVAL= Y FY= INTEGRA(F, LIMX) RETURN END FUNCTION FY

101

Com base nestas trs unidades de programa, um programa pode calcular a integral sobre o retngulo no plano e a (x, y) atravs da chamada: e AREA= INTEGRA(FY, LIMY)

8.2.15

Atributo e declarao SAVE ca

A declarao ou o atributo SAVE so utilizados quando se deseja manter o valor de uma varivel local em um ca a a subprograma aps a sa o da. Desta forma, o valor anterior desta varivel est acess quando o subprograma a a vel e invocado novamente. Como exemplo, a subrotina abaixo contm as variveis locais CONTA, a qual conta o nmero de chamadas da e a u subrotina e inicializada a zero e a varivel A, que somada ao valor do argumento. e a e SUBROUTINE CONTA_SOMA(X) IMPICIT NONE REAL, INTENT(IN) :: X REAL, SAVE :: A INTEGER :: CONTA= 0 !Inicializa o contador. ... CONTA= CONTA + 1 IF(CONTA == 1)THEN
Autor: Rudi Gaelzer IFM/UFPel

Mantm o valor da varivel. e a

Impresso: 26 de mar o de 2008 c

102 A= 0.0 ELSE A= A + X END IF ... RETURN END SUBROUTINE CONTA_SOMA

8.2. Subprogramas

Neste exemplo, tanto a varivel A quanto CONTA tm o seu valor mantido quando a subrotina abandonada. Isto a e e garantido porque a varivel A declarada com o atributo SAVE. J a varivel CONTA no precisa ser declarada e a e a a a com o mesmo atributo porque ela tem o seu valor inicializado na declarao. De acordo com o padro da ca a linguagem, as variveis que tm o seu valor inicializado no momento da declarao automaticamente adquirem a e ca o atributo SAVE. Alternativamente ao uso do atributo, pode-se declarar uma lista de nomes de variveis com a mesma proa priedade atravs da declarao SAVE. Desta forma, a varivel A, no exemplo acima, podia ser declarada atravs e ca a e das linhas: ... REAL :: A SAVE :: A ... A forma geral desta declarao : ca e SAVE [[::] <lista nomes variveis>] a onde uma declarao SAVE sem a subseqnte <lista nomes variveis> equivale ` mesma declarao aplicada ca ue a a ca a todos os nomes da rotina, em cujo caso nenhuma outra varivel pode ser declarada com o atributo SAVE. a O comando ou atributo SAVE podem aparecer no campo de declaraes de um programa principal, mas neste co caso o seu efeito nulo. O uso prtico deste recurso est restrito `s outras unidades de programa. e a a a

8.2.16

Funes de efeito lateral e rotinas puras co

Na seo 8.2, foi mencionado que funes normalmente no alteram o valor de seus argumentos. Entretanto, ca co a em certas situaes esta ao permitida. Funes que alteram o valor de seus argumentos so denominadas co ca e co a funes de efeito lateral (side-eect functions). co Para auxiliar na otimizao do cdigo, o padro da linguagem estabelece uma proibio no uso de funes ca o a ca co de efeito lateral quando o uso de tal funo em uma expresso altera o valor de um outro operando na mesma ca a expresso, seja este operando uma varivel ou um argumento de uma outra funo. Caso este tipo de funo a a ca ca fosse poss neste caso, a atribuio vel ca RES= FUN1(A,B,C) + FUN2(A,B,C) onde ou FUN1 ou FUN2, ou ambas, alterassem o valor de um ou mais argumentos, a ordem de execuo desta ca expresso seria importante; o valor de RES seria diferente caso FUN1 fosse calculada antes de FUN2 do que seria a caso a ordem de clculo fosse invertida. Exemplos de funes de efeito lateral so dados a seguir: a co a FUNCTION FUN1(A,B,C) INTEGER :: FUN1 REAL, INTENT(INOUT) :: A REAL, INTENT(IN) :: B,C A= A*A FUN1= A/B RETURN END FUNCTION FUN1 ----------------------------------FUNCTION FUN2(A,B,C) INTEGER :: FUN2 REAL, INTENT(INOUT) :: A REAL, INTENT(IN) :: B,C
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o A= 2*A FUN2= A/C RETURN END FUNCTION FUN2

103

Nota-se que ambas as funes alteram o valor de A; portanto, o valor de RES totalmente dependente na ordem co e de execuo da expresso. ca a Como o padro da linguagem no estabelece uma ordem para a execuo das operaes e desenvolvimentos a a ca co em uma expresso, este efeito lateral proibido neste caso. Isto possibilita que os compiladores executem as a e operaes na ordem que otimiza a execuo do cdigo. co ca o O uso de funes de efeito lateral em comandos ou construtos FORALL (seo 6.10), por exemplo, acarretaria co ca em um impedimento severo na otimizao da execuo do comando em um processador paralelo, efetivamente ca ca anulando o efeito desejado pela denio deste recurso. ca Para controlar esta situao, o programador pode assegurar ao compilador que uma determinada rotina ca (no somente funes) no possui efeitos laterais ao incluir a palavra-chave PURE ` declarao SUBROUTINE ou a co a a ca FUNCTION: PURE SUBROUTINE ... --------------------------PURE FUNCTION ... Em termos prticos, esta palavra-chave assegura ao compilador que: a
se a rotina uma funo, esta no altera os seus argumentos mudos; e ca a a rotina no altera nenhuma parte de uma varivel acessada por associao ao hospedeiro (rotina interna) a a ca ou associao por uso (mdulos); ca o a rotina no possui nenhuma varivel local com o atributo SAVE; a a a rotina no executa operaes em um arquivo externo; a co a rotina no contm um comando STOP. a e

Para assegurar que estes requerimentos sejam cumpridos e que o compilador possa facilmente vericar o seu cumprimento, as seguintes regras adicionais so impostas: a
qualquer argumento mudo que seja o nome de uma rotina e qualquer rotina invocada devem tambm ser e puras e ter a interface expl cita; as intenes de um argumento mudo qualquer devem ser declaradas, exceto se este seja uma rotina ou um co ponteiro, e a inteno deve sempre ser IN no caso de uma funo; ca ca qualquer rotina interna de uma rotina pura tambm deve ser pura; e uma varivel que acessada por associao ao hospedeiro ou por uso ou um argumento mudo de inteno a e ca e ca IN no pode ser o alvo de uma atribuio de ponteiro; se a varivel do tipo derivado com uma componente a ca a e de ponteiro, ela no pode estar no lado direito de uma atribuio e ela no pode estar associada como o a ca a argumento real de um argumento mudo que seja um ponteiro ou que tenha intenes OUT ou INOUT. co

Esta ultima regra assegura que um ponteiro local no pode causar um efeito lateral. a A principal razo para se permitir subrotinas puras est na possibilidade de seu uso em construtos FORALL. a a Porm, ao contrrio de funes, uma subrotina pura pode ter argumentos mudos com intenes OUT ou INOUT e a co co ou atributo POINTER. A sua existncia tambm oferece a possibilidade de se fazer chamadas a subrotinas de e e dentro de funes puras. co Uma rotina externa ou muda que seja usada como rotina pura deve possuir uma interface expl cita que a caracterize inequivocamente como tal. Contudo, a rotina pode ser usada em outros contextos sejm o uso de um bloco de interface ou com uma interface que no a caracterize como pura. Isto permite que rotinas em a bibliotecas sejam escritas como puras sem que elas sejam obrigatoriamente usadas como tal. Todas as funes intr co nsecas (cap tulo 7) so puras e, portanto, podem ser chamadas livremente de dentro a de qualquer rotina pura. Adicionalmente, a subrotina intr nseca elemental MVBITS (seo 7.9.3) tambm pura. ca e e O atributo PURE dado automaticamente a qualquer rotina que seja denida com o atributo ELEMENTAL e (seo 8.2.17). ca
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

104

8.2. Subprogramas

8.2.17

Rotinas elementais

Na seo 6.7 j foi introduzida a noo de rotinas intr ca a ca nsecas elementais, as quais so rotinas com argumentos a mudos escalares que podem ser invocadas com argumentos reais matriciais, desde que os argumentos matriciais tenham todos a mesma forma (isto , que sejam conformveis). Para uma funo, a forma do resultado a e a ca e forma dos argumentos matriciais. O Fortran95 estende este conceito a rotinas no-intr a nsecas. Uma rotina elemental criada pelo programador deve ter um dos seguintes cabealhos: c ELEMENTAL SUBROUTINE ... -------------------------ELEMENTAL FUNCTION ... Um exemplo fornecido abaixo. Dado o tipo derivado INTERVALO: e TYPE :: INTERVALO REAL :: INF, SUP END TYPE INTERVALO pode-se denir a seguinte funo elemental: ca ELEMENTAL FUNCTION SOMA_INTERVALOS(A,B) INTRINSIC NONE TYPE(INTERVALO) :: SOMA_INTERVALOS TYPE(INTERVALO), INTENT(IN) :: A, B SOMA_INTERVALOS%INF= A%INF + B%INF SOMA_INTERVALOS%SUP= A%SUP + B%SUP RETURN END FUNCTION SOMA_INTERVALOS a qual soma dois intervalos de valores, entre um limite inferior e um limite superior. Nota-se que os argumentos mudos so escritos como escalares, mas a especicao ELEMENTAL possibilita o uso de matrizes conformveis a ca a como argumentos reais. Neste caso, as operaes de soma dos intervalos so realizadas componente a componente co a das matrizes A e B da maneira mais eciente poss vel. Uma rotina no pode ser ao mesmo tempo elemental e recursiva. a Uma rotina elemental deve satisfazer todos os requisitos de uma rotina pura; de fato, ela j possui autoa maticamente o atributo PURE. Adicionalmente, todos os argumentos mudos e resultados de funo devem ser ca variveis escalares sem o atributo POINTER. Se o valor de um argumento mudo usado em uma declarao, a e ca especicando o tamanho ou outra propriedade de alguma varivel, como no exemplo a ELEMENTAL FUNCTION BRANCO(N) IMPLICIT NONE INTEGER, INTENT(IN) :: N CHARACTER(LEN= N) :: BRANCO BRANCO= RETURN END FUNCTION BRANCO esta funo deve ser chamada com argumento real escalar, uma vez que um argumento real matricial resultaria ca em uma matriz cujos elementos seriam caracteres de comprimentos variveis. a Uma rotina externa elemental deve possuir uma interface expl cita que sempre a caracterize de forma inequ voca como elemental. Isto exigido para que o compilador possa determinar o mecanismo de chamada que e acomode os elementos de matriz de forma mais eciente. Isto contrasta com o caso de uma rotina pura, onde a interface nem sempre necessita caracterizar a rotina como pura. No caso de uma subrotina elemental, se algum argumento real matriz, todos os argumentos com intenes e co OUT ou INOUT devem ser matrizes. No exemplo abaixo, ELEMENTAL SUBROUTINE TROCA(A,B) IMPLICIT NONE REAL, INTENT(INOUT) :: A, B REAL :: TEMP
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o TEMP= A A= B B= TEMP RETURN END SUBROUTINE TROCA

105

chamar esta subrotina com um argumento escalar e um matricial est obviamente errado, uma vez que o a mecanismo de distribuir o valor da varivel escalar por uma matriz conformvel com o outro argumento no a a a pode ser aplicado aqui. Se a referncia a uma rotina genrica (seo 8.3.4) consistente tanto com uma rotina elemental quanto com e e ca e uma no-elemental, a segunda verso invocada, pois espera-se que a verso elemental de uma rotina rode, em a a e a geral, mais lentamente. Finalmente, uma rotina elemental no pode ser usada como um argumento real de outra rotina. a

8.3

Mdulos o

Uma das novidades mais importantes introduzidas pelo Fortran90 um novo tipo de unidade de programa e denominada mdulo. Um mdulo um recurso muito poderoso para transferir dados entre subprogramas e para o o e organizar a arquitetura global de um programa grande e complexo. A funcionalidade de um mdulo pode ser explorada por qualquer unidade de programa que deseja fazer uso o (atravs de uma instruo USE) dos recursos disponibilizados por este. Os recursos que podem ser inclu e ca dos em um mdulo so os seguintes: o a Declarao de objetos globais. Mdulos devem ser empregados no lugar das declaraes COMMON e INCLUDE, ca o co comuns no Fortran77. Se dados globais so necessrios, por exemplo para transferir valores entre rotinas, a a ento estes so so tornados vis a a a veis sempre que o mdulo usado. Objetos em um mdulo podem ser o e o inicializados com valores estticos, de tal forma que estes mantm seu valor em diferentes unidades que a e usam o mesmo mdulo. o Blocos de interfaces. Na maior parte das situaes vantajoso congregar todos os blocos de interfaces em co e um ou poucos mdulos e ento usar o mdulo sempre que uma interface expl o a o cita necessria. Isto pode e a realizado em conjunto com a clusula ONLY. a Rotinas de mdulos. Rotinas podem ser denidas internamente em um mdulo, sendo estas tornadas aceso o s veis a qualquer unidade de programa que USE o mdulo. Esta estratgia mais vantajosa que usar uma o e e rotina externa porque em um mdulo a interface das rotinas internas sempre expl o e cita. Acesso controlado a objetos. Variveis, rotinas e declaraes de operadores podem ter a sua visibilidade a co controlada por declaraes ou atributos de acesso dentro de um mdulo. Desta forma, poss especicar co o e vel que um determinado objeto seja vis vel somente no interior do mdulo. Este recurso freqentemente o e u utilizado para impedir que um usurio possa alterar o valor de um objeto de mbito puramente interno a a ao mdulo. o Interfaces genricas. Um mdulo pode ser usado para denir um nome genrico para um conjunto de rotinas, e o e com interfaces distintas, mas que executem todas a mesma funo. Interfaces genricas podem ser usadas ca e tambm para estender a funcionalidade de rotinas intr e nsecas. Sobrecarga de operadores. Um mdulo pode ser usado tambm para redenir a operao executada pelos o e ca operadores intr nsecos da linguagem (= + - * / **) ou para denir novos tipos de operadores. Extenso semntica. Um mdulo de extenso semntica uma coleo de denies de tipos derivados, a a o a a e ca co rotinas e operadores sobrecarregados tais que, quando agregados a uma unidade de programa, permitem que o usurio use esta funcionalidade estendida como se zesse parte da linguagem padro. a a A forma geral de um mdulo : o e MODULE <nome mdulo> o <declara~es variveis> co a <comandos executveis> a [CONTAINS <rotinas de mdulo>] o END [MODULE [<nome mdulo>]] o
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

106

8.3. Mdulos o

8.3.1

Dados globais

Em Fortran, variveis so usualmente entidades locais. Contudo, em muitas situaes necessrio que a a co e a alguns objetos tenham o seu valor compartilhado entre diferentes unidades de programa. A maneira mais usual de se realizar este compartilhamento atravs da lista de argumentos de uma rotina. Entretanto, facilmente e e surge uma situao onde uma varivel no pode ser compartilhada como argumento de um subprograma. Neste ca a a momento, necessria uma outra estratgia para se denir dados globais. Esta necessidade j era corriqueira e a e a no Fortran77. Fortran77 A maneira mais usada no Fortran77 para compartilhar dados globais atravs de blocos common. Um bloco e e common uma lista de variveis armazenadas em uma rea da memria do computador que identicada e a a o e atravs de um nome e que pode ser acessada diretamente em mais de uma unidade de programa. e A necessidade de se criar um bloco common surge, muitas vezes, com o uso de rotinas de bibliotecas de aplicao generalizada, as quais so denidas com um conjunto restrito de argumentos. Muitas vezes, faz-se ca a necessrio transferir informao entre estas rotinas ou entre rotinas que usam as bibliotecas de maneira no a ca a prevista na lista de argumentos. Por exemplo, seja a subrotina INTEG, a qual realiza a integrao numrica unidimensional de uma funo ca e ca F(x) qualquer, no intervalo (A,B): SUBROUTINE INTEG(F,A,B,RES) REAL*8 A, B, F, RES, TEMP EXTERNAL F ... TEMP= F(X) ... RES= <resultado> END SUBROUTINE INTEG Caso o programador queira integrar a funo g(x) = cos(x) no intervalo [0, 1], ele no poder informar ao ca a a integrador o valor de na lista de argumentos da subrotina INTEG. A soluo est no uso de um bloco common: ca a REAL*8 FUNCTION G(X) REAL*8 X, ALFA COMMON /VAR/ ALFA G= COS(ALFA*X) RETURN END FUNCTION G onde VAR o nome que identica o espao de memria onde o valor de ALFA ser armazenado. Assim, o programa e c o a pode realizar a integrao usando o mesmo bloco common: ca PROGRAM INTEGRA REAL*8 G, A, INT EXTERNAL G COMMON /VAR/ A ... PRINT*, Entre com o valor de alfa: READ(*,*) A C CALL INTEG(G,0.0D0,1.0D0,INT) C ... END PROGRAM INTEGRA Note que o bloco VAR aparece tanto no programa quanto na funo; porm no h necessidade de ele aparecer ca e a a na subrotina INTEG. A forma geral de um bloco common : e COMMON /<nome common>/ <lista variveis> a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o

107

onde <nome common> qualquer nome vlido em Fortran e <lista variveis> uma lista de variveis que e a a e a podem ser escalares, elementos de matrizes, sees de matrizes ou matrizes completas. Neste ultimo caso, co somente se utiliza o nome da matriz. E claro que a informao acerca da natureza e tipo das variveis listadas ca a no bloco common deve ser fornecida por declaraes adequadas de variveis. co a A grande desvantagem desta forma descentralizada de denir-se dados globais est no fato de que em todas a as unidades de programa que utilizam um dado bloco common, as variveis listadas nele devem concordar em a nmero, ordem, natureza e tipo. Caso o programador esteja desenvolvendo um cdigo complexo, composto por u o um nmero grande de unidades que usam o mesmo bloco common, e ele sinta a necessidade de alterar de alguma u forma a lista de variveis em uma determinada unidade, ele dever buscar em todas unidades restantes que fazem a a referncia ao mesmo bloco e realizar a mesma alterao; caso contrrio, mesmo que o programa compile e linke e ca a sem erro, quase certo que as variveis sero compartilhadas de forma incoerente entre as diferentes unidade de e a a a programa e este acabe gerando resultados incorretos. E fcil perceber que este controle torna-se sucessivamente mais dif ` medida que a complexidade do programa aumenta. cil a Os blocos common so ainda aceitos em Fortran90/95; porm, o seu uso no recomendado, pela razo a e a e a exposta acima. Fortran90/95 O uso de um mdulo fornece um mecanismo centralizado de denio de objetos globais. Por exemplo, o ca suponha que se queira ter acesso `s variveis inteiras I, J e K e `s variveis reais A, B e C em diferentes unidades a a a a de programa. Um mdulo que permitira o compartilhamento destas variveis o seguinte: o a e MODULE GLOBAIS IMPLICIT NONE INTEGER :: I, J, K REAL :: A, B, C END MODULE GLOBAIS Estas variveis se tornam acess a veis a outras unidades de programa (inclusive outros mdulos) atravs da o e instruo USE, isto : ca e USE GLOBAIS A instruo USE no executvel e deve ser inserida logo aps o cabealho da unidade de programa (PROGRAM, ca e a a o c ca a a ca FUNCTION, SUBROUTINE ou MODULE) e antes de qualquer outra instruo no executvel, tal como uma declarao de variveis. Uma unidade de programa pode invocar um nmero arbitrrio de mdulos usando uma srie de a u a o e instrues USE. Um mdulo pode usar outros mdulos, porm um mdulo no pode usar a si prprio, seja de co o o e o a o forma direta ou indireta. Assim, o mdulo GLOBAIS pode ser usado da seguinte forma: o FUNCTION USA_MOD(X) USE GLOBAIS IMPLICIT NONE REAL :: USA_MOD REAL, INTENT(IN) :: X USA_MOD= I*A - J*B + K*C - X RETURN END FUNCTION USA_MOD O vantagem de um mdulo sobre um bloco COMMON para compartilhar objetos globais evidente. A denio o e ca dos nomes, tipos e espcies das variveis realizada em uma unica unidade de programa, a qual simplesmente e a e e usada por outras, estabelecendo assim um controle centralizado sobre os objetos. O uso de variveis de um mdulo pode causar problemas se o mesmo nome usado para diferentes variveis a o e a em partes diferentes de um programa. A declarao USE pode evitar este problema ao permitir a especicao ca ca de um nome local distinto daquele denido no mdulo, porm que ainda permita o acesso aos dados globais. o e Por exemplo, ... USE GLOBAIS, R => A, S => B ... USA_MOD= I*R - J*S + K*C - X ...
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

108

8.3. Mdulos o

Aqui, os nomes R e S so usado para acessar as variveis globais A e B, denidas no mdulo, caso estes nomes a a o ultimos sejam usados para diferentes variveis na mesma unidade de programa. Os s a mbolos => promovem a ligao do nome local com o nome no mdulo. Tudo se passa como se R fosse o apelido de A e S o apelido de B ca o nesta unidade de programa. Os ponteiros em Fortran90/95 tambm atuam como apelidos, porm, neste caso, e e pode-se usar tanto o nome verdadeiro de uma varivel quanto o nome de um ponteiro que aponta a ela. a Existe tambm uma forma da declarao USE que limita o acesso somente a certos objetos dentro de um e ca mdulo. Este recurso no exatamente igual ao uso dos atributos PUBLIC ou PRIVATE (seo 8.3.3), uma vez o a e ca que ele atua somente na unidade que acessa o mdulo, e no sobre o mdulo em geral. O recurso requer o uso o a o do qualicador ONLY, seguido de dois pontos : e uma <lista only>: USE <nome mdulo>, ONLY: <lista only> o Por exemplo para tornar somente as variveis A e C do mdulo GLOBAIS acess a o veis em uma dada unidade de programa, a declarao ca: ca ... USE GLOBAIS, ONLY: A, C ... Os dois ultimos recursos podem ser tambm combinados: e ... USE GLOBAIS, ONLY: R => A ... para tornar somente a varivel A acess a vel, porm com o nome R. Uma unidade de programa pode ter mais e de uma declarao USE rerendo-se ao mesmo mdulo. Por conseguinte, deve-se notar que que um USE com o ca o qualicador ONLY no cancela uma declarao USE menos restritiva. a ca Um uso freqente de mdulos para armazenar dados globais consiste em denies de parmetros de espcie u o co a e de tipo, constantes universais matemticas e/ou f a sicas e outros objetos estticos, como no exemplo abaixo: a ! *** Module E s p c o n s t *** ! D e f i n e e s p c i e s de t i p o p a d r e s e c o n s t a n t e s u n i v e r s a i s . e o ! M D L esp const O UE ! INTEGER, P R M T R : : I4B = SELECTED INT KIND ( 9 ) A A EE INTEGER, P R M T R : : I2B = SELECTED INT KIND ( 4 ) A A EE INTEGER, P R M T R : : I1B = SELECTED INT KIND ( 2 ) A A EE integer , parameter : : sp= kind ( 1 . 0 ) integer , parameter : : dp= s e l e c t e d r e a l k i n d ( 2 * precision ( 1 . 0 s p ) ) integer , parameter : : qp= s e l e c t e d r e a l k i n d ( 2 * precision ( 1 . 0 dp ) ) complex ( kind= dp ) , parameter : : z1= ( 1 . 0 dp , 0 . 0 dp ) , z i= ( 0 . 0 dp , 1 . 0 dp ) REAL(DP) , P R M T R : : PI= A A EE 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3 8 3 2 7 9 5 0 2 8 8 4 1 9 7 1 7 dp REAL(DP) , P R M T R : : PID2= A A EE 1 . 5 7 0 7 9 6 3 2 6 7 9 4 8 9 6 6 1 9 2 3 1 3 2 1 6 9 1 6 3 9 7 5 1 4 4 2 0 9 8 5 8 dp REAL(DP) , P R M T R : : TWOPI= A A EE 6 . 2 8 3 1 8 5 3 0 7 1 7 9 5 8 6 4 7 6 9 2 5 2 8 6 7 6 6 5 5 9 0 0 5 7 6 8 3 9 4 3 4 dp r e a l ( dp ) , parameter : : r t p i= 1 . 7 7 2 4 5 3 8 5 0 9 0 5 5 1 6 0 2 7 2 9 8 1 6 7 4 8 3 3 4 1 1 4 5 1 8 2 7 9 7 5 5 dp REAL(DP) , P R M T R : : SQRT2= A A EE 1 . 4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 0 4 8 8 0 1 6 8 8 7 2 4 2 0 9 6 9 8 0 7 8 5 6 9 6 7 dp r e a l ( dp ) , parameter : : e u l e r e= 2 . 7 1 8 2 8 1 8 2 8 4 5 9 0 4 5 2 3 5 3 6 0 2 8 7 4 7 1 3 5 2 6 6 2 4 9 7 7 5 7 2 5 dp REAL(SP ) , P R M T R : : PI S= A A EE 3.14159265358979323846264338327950288419717 sp REAL(SP ) , P R M T R : : PID2 S= 1 . 5 7 0 7 9 6 3 2 6 7 9 4 8 9 6 6 1 9 2 3 1 3 2 1 6 9 1 6 3 9 7 5 1 4 4 2 0 9 8 5 8 s p A A EE REAL(SP ) , P R M T R : : TWOPI s= 6 . 2 8 3 1 8 5 3 0 7 1 7 9 5 8 6 4 7 6 9 2 5 2 8 6 7 6 6 5 5 9 0 0 5 7 6 8 3 9 4 3 4 s p A A EE r e a l ( sp ) , parameter : : r t p i s= 1 . 7 7 2 4 5 3 8 5 0 9 0 5 5 1 6 0 2 7 2 9 8 1 6 7 4 8 3 3 4 1 1 4 5 1 8 2 7 9 7 5 5 s p REAL(SP ) , P R M T R : : SQRT2 S= 1 . 4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 0 4 8 8 0 1 6 8 8 7 2 4 2 0 9 6 9 8 0 7 8 5 6 9 6 7 s p A A EE ! ! Fundamental p h y s i c a l c o n s t a n t s , o b t a i n e d from NIST : ! h t t p : / / p h y s i c s . n i s t . gov / cuu / C o n s t a n t s / i n d e x . html r e a l ( dp ) , parameter : : rmemp= 5 . 4 4 6 1 7 0 2 1 7 3 e4 dp ! E l e c t r o n p r o t o n mass r a t i o . r e a l ( dp ) , parameter : : rmpme= 1 8 3 6 . 1 5 2 6 7 2 6 1 dp ! Protrone l e c t r o n mass r a t i o . END M D L e s p c o n s t O UE
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o


Programa 8.3: Ilustra uso de mdulo para armazenar dados globais. o

109

M D L modu1 O UE i m p l i c i t none real , parameter : : p i= 3 . 1 4 1 5 9 2 6 5 3 6 real , parameter : : e u l e r e= 2 . 7 1 8 2 8 1 8 2 8 END M D L modu1 O UE ! ***************************************** program mod1 use modu1 i m p l i c i t none real : : x do print * , Entre com o v a l o r de x : read * , x print * , s e n ( p i * x)= , s e n ( ) print * , l n ( e * x)= , l n ( ) end do CONTAINS function se n ( ) real : : sen s e n= s i n ( p i * x ) return end function s e n ! function l n ( ) real : : ln l n= l o g ( e u l e r e * x ) return end function l n end program mod1

O programa-exemplo mod1.f90 (programa 8.3), ilustra o uso de um mdulo para armazenar dados globais. o

8.3.2

Rotinas de mdulos o

Rotinas podem ser denidas em mdulos e estas so denominadas rotinas de mdulos. Estas podem ser o a o tanto subrotinas quanto funes e ter a mesma forma de rotinas internas denidas dentro de outras unidades co de programa. O nmero de rotinas de mdulo arbitrrio. u o e a Rotinas de mdulo podem ser chamadas usando o comando CALL usual ou fazendo referncia ao nome de o e uma funo. Contudo, estas somente so acess ca a veis a unidades de programa que fazem uso do mdulo atravs o e da instruo USE. ca Uma rotina de mdulo pode invocar outras rotinas de mdulo contidas no mesmo mdulo. As variveis o o o a declaradas no mdulo antes da palavra-chave CONTAINS so diretamente acess o a veis a todas as rotinas deste, por associao ao hospedeiro. Contudo, variveis declaradas localmente em um determinado subprograma de ca a mdulo so opacas aos outros subprogramas. Caso o mdulo invoque outro mdulo com uma instruo USE o a o o ca antes da palavra-chave CONTAINS, estes objetos tambm se tornam acess e veis a todas as rotinas de mdulo. o Por outro lado, uma determinada rotina de mdulo pode usar localmente outro mdulo (no o hospedeiro), o o a em cuja situao os objetos somente so acess ca a veis localmente. Em suma, uma rotina de mdulo possui todas o as propriedades de rotinas internas em outras unidades de programa, exceto que uma rotina de mdulo pode o conter, por sua vez, rotinas internas a ela. Por exemplo, o seguinte mdulo vlido: o e a MODULE INTEG IMPLICIT NONE REAL :: ALFA ! Varivel global. a CONTAINS
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

110 FUNCTION FF(X) REAL :: FF REAL, INTENT(IN) :: X FF= EXP(-ALFA*X*X) FF= FF*X2(X) RETURN CONTAINS FUNCTION X2(Y) REAL :: X2 REAL, INTENT(IN) :: Y X2= Y**2 RETURN END FUNCTION X2 END FUNCTION FF END MODULE INTEG

8.3. Mdulos o

A outra grande diferena est no fato de que as interfaces das rotinas de mdulo so expl c a o a citas no mbito deste. a Todavia, quando uma outra unidade de programa usa o mdulo, todas os objetos pblicos nele contidos se o u tornam acess veis a esta, resultando que as interfaces das rotinas de mdulo so automaticamente expl o a citas tambm para a unidade de programa que o invoca. Portanto, um mdulo considerado a unidade ideal para e o e armazenar grupos de subprogramas criados para desempenhar uma determinada tarefa, juntamente com os objetos globais associados a estes subprogramas. Ao se compilar um arquivo contendo um mdulo, os compiladores automaticamente geram um novo tipo de o arquivo, geralmente com a extenso *.mod, onde as informaes contidas no mdulo, tais como variveis globais e a co o a interfaces, so armazenadas. Quando uma outra unidade de programa faz referncia a este mdulo, o compilador a e o busca estas informaes no arquivo .mod . Desta forma, cria-se um mecanismo para vericar se as variveis e as co a interfaces esto sendo corretamente utilizadas pela unidade que chama o mdulo. Quando o mdulo no dene a o o a um rotina interna, no necessrio guardar o arquivo objeto (*.o ou *.obj) associado, bastando guardar o a e a arquivo *.mod. Por esta razo, muitos compiladores oferecem uma chave extra de compilao atravs da qual a ca e nenhum arquivo objeto criado, mas somente o arquivo de mdulo. e o Rotinas de mdulo pode ser uteis por diversas razes. Por exemplo, um mdulo que dene a estrutura de um o o o conjunto particular de dados pode tambm incluir rotinas especiais, necessrias para operar com estes dados; e a ou um mdulo pode ser usado para conter uma biblioteca de rotinas relacionadas entre si. o Como exemplo, um mdulo pode ser usado para adicionar variveis de tipo derivado: o a MODULE MOD_PONTO IMPLICIT NONE TYPE :: PONTO REAL :: X, Y END TYPE PONTO CONTAINS FUNCTION ADPONTOS(P,Q) TYPE(POINT) :: ADPONTOS TYPE(POINT), INTENT(IN) :: P, Q ADPONTOS%X= P%X + Q%X ADPONTOS%Y= P%Y + Q%Y RETURN END FUNCTION ADPONTOS END MODULE MOD_PONTO Neste caso, o programa principal usa este mdulo: o PROGRAM P_PONTO USE MOD_PONTO IMPLICIT NONE TYPE(POINT) :: PX, PY, PZ ... PZ= ADPONTO(PX,PY) ... END PROGRAM P_PONTO
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o


Programa 8.4: Ilustra o uso de rotinas de mdulo. o

111

M D L modu2 O UE i m p l i c i t none real , parameter : : p i= 3 . 1 4 1 5 9 2 6 5 3 6 real , parameter : : e u l e r e= 2 . 7 1 8 2 8 1 8 2 8 real : : x CONTAINS function se n ( ) real : : sen s e n= s i n ( p i * x ) return end function s e n ! function l n ( ) real : : ln l n= l o g ( e u l e r e * x ) return end function l n END M D L modu2 O UE ! ***************************************** program mod2 use modu2 i m p l i c i t none do print * , Entre com o v a l o r de x : read * , x print * , s e n ( p i * x)= , s e n ( ) print * , l n ( e * x)= , l n ( ) end do end program mod2

O recurso avanado de sobrecarga de operador (operator overloading) permite redenir a operao de adio (+), c ca ca por exemplo, dentro do mbito do mdulo M_PONTO, de tal forma que o processo de adio de duas variveis do a o ca a tipo PONTO automaticamente iria chamar a funo ADPONTO. Desta forma, ao invs do programa chamar esta ca e funo, bastaria realizar a operao: ca ca PZ= PX + PY Entretanto, este recurso no ser discutido aqui. a a O programa-exemplo mod2.f90 (programa 8.4) igual ao mod1.f90, porm usando rotinas de mdulo. e e o

8.3.3

Atributos e declaraoes PUBLIC e PRIVATE c

Usualmente, todas as entidades em um mdulo esto dispon o a veis para qualquer unidade de programa que chame este mdulo com a instruo USE. Contudo, em certas situaes recomendvel proibir o uso de certas o ca co e a entidades (objetos globais e/ou rotinas) contidas no mdulo para forar o usurio a invocar as rotinas de mdulo o c a o que realmente deveriam ser acess veis a este, ou para permitir exibilidade no aperfeioamento das entidades c contidas no mdulo sem haver a necessidade de informar o usurio a respeito destes aperfeioamentos. o a c Este controle exercido atravs dos atributos ou declaraes PUBLIC ou PRIVATE. Por exemplo, abaixo temos e e co a declaraes de variveis com dois atributos distintos: co a REAL, PUBLIC :: X, Y, Z INTEGER, PRIVATE :: U, V, W Dentro deste conjunto de variveis, somente X, Y e Z so acess a a veis ` unidade de programa que acessa este a mdulo. o
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

112

8.3. Mdulos o

Outra maneira de se estabelecer o controle de acesso atravs de declaraes, as quais listam os nomes dos e e co objetos que so pblicos ou privados: a u PUBLIC :: X, Y, Z PRIVATE :: U, V, W A forma geral da declarao : ca e PUBLIC [[::] <lista acesso>] PRIVATE [[::] <lista acesso>] Caso nenhum controle estabelecido em um mdulo, seja atravs de um atributo ou de uma declarao, todas e o e ca as entidades tm o atributo PUBLIC. e Se uma declarao PUBLIC ou PRIVATE no possui uma lista de entidades, esta conrma ou altera o acesso ca a padro. Assim, a declarao a ca PUBLIC conrma o acesso padro, ao passo que a declarao a ca PRIVATE altera o acesso padro. Desta forma, uma seqncia de declaraes como as abaixo: a ue co ... PRIVATE PUBLIC <lista acesso> ... confere aos nomes na <lista acesso> o atributo PUBLIC enquanto que todas as entidades restantes no mdulo o so privadas, podendo ser acessadas somente dentro do mbito do mdulo. a a o

8.3.4

Interfaces e rotinas genricas e

Outro recurso poderoso introduzido pelo Fortran90 a habilidade do programador denir suas prprias e o rotinas genricas, de tal forma que um unico nome suciente para invocar uma determinada rotina, enquanto e e que a ao que realmente executada quando este nome usado depende do tipo de seus argumentos. Embora ca e e possam ser declaradas em quaisquer unidades de programa, rotinas genricas so usualmente denidas em e a mdulos. o Uma rotina genrica denido usando-se um bloco interfaces e um nome genrico usado para todas as e e e e rotinas denidas dentro deste bloco de interfaces. Assim, a forma geral : e INTERFACE <nome genrico> e <bloco interface rotina especfica 1> <bloco interface rotina especfica 2> ... END INTERFACE <nome genrico> e onde <bloco interface rotina especfica 1>, etc, so os blocos das interfaces das rotinas espec a cas, isto , que se referem a um dado conjunto de tipos de variveis, e que so acessadas atravs do <nome genrico>. e a a e e As rotinas per se podem se encontrar em outras unidades; por exemplo, elas podem ser rotinas externas. O uso do <nome genrico> no nal do bloco somente permitido a partir do Fortran95. e e Como um mdulo a unidade de programa ideal para armazenar todas estas rotinas espec o e cas relacionadas entre si e como as interfaces das rotinas de mdulo so sempre expl o a citas, estas rotinas genricas so, em geral, e a denidas dentro de mdulos. Neste caso, a declarao o ca MODULE PROCEDURE <lista nomes rotinas> inclu no bloco de interface para nomear as rotinas de mdulo que so referidas atravs do nome genrico. e da o a e e Assim, a declarao geral : ca e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o INTERFACE <nome genrico> e [<blocos interfaces>] [MODULE PROCEDURE <lista nomes rotinas>] ! Em Fortran95 blocos de interfaces e declara~es MODULE PROCEDURE co ! podem aparecer em qualquer ordem. END INTERFACE [<nome genrico>] e ! Somente em Fortran95 o nome genrico aceito aqui. e e

113

Deve-se notar que todos os nomes na <lista nomes rotinas> devem ser de rotinas de mdulo acess o veis; portanto, elas no necessariamente devem estar denidas no mesmo mdulo onde a interface genrica estabelecida, a o e e bastando que elas sejam acess veis por associao de uso. ca Para demonstrar o poderio de uma interface genrica, ser utilizada novamente a subrotina TROCA, a qual e a foi denida primeiramente na pgina 93 e depois, na forma de uma subrotina elemental, na seo 8.2.17. O a ca mdulo gentroca na pgina 114 dene o nome genrico de uma srie de subrotinas elementais TROCA associadas o a e e a variveis dos tipos real, inteiro, lgico e do tipo derivado ponto, o qual denido no mesmo mdulo. a o e o Este mdulo utilizado ento em duas situaes distintas. Na primeira vez, o mdulo ser utilizado para o e a co o a trocar o valor de duas variveis escalares do tipo ponto, como no programa usa gentroca.f90 na pgina 115. a a Posteriormente, o mesmo mdulo ser utilizado para trocar os elementos de duas matrizes inteiras, como o a no programa usa_gt_mat.f90, tambm listado na pgina 115. e a

Uma declarao MODULE PROCEDURE somente permitida se um <nome genrico> fornecido. Porm, ca e e e e o nome genrico pode ser igual ao nome de uma das rotinas declaradas na <lista nomes rotinas>. Em e conjunto com esta propriedade, o nome genrico denido em um mdulo pode ser o mesmo de outro nome e o genrico acess ao mdulo, inclusive no caso onde o nome genrico corresponde ao de uma rotina intr e vel o e nseca. Neste caso, o mdulo estar estendendo o intervalo de aplicao de uma rotina intr o a ca nseca. As rotinas `s quais so dadas um certo nome genrico devem ser todas ou subrotinas ou funes, incluindo a a e co as intr nsecas quando uma rotina intr nseca estendida. Quaisquer duas rotinas no-intr e a nsecas associadas ao mesmo nome genrico devem ter argumentos que diferem de tal forma que qualquer invocao feita de forma e ca e inequ voca. As regras so que: a 1. uma delas tenha mais argumentos obrigatrios mudos de um tipo, espcie e posto particulares que a outra o e ou 2. que ao menos uma delas tenha um argumento mudo obrigatrio tal que o (a) corresponda por posio na lista de argumentos a um argumento mudo que no esteja presente na ca a outra, ou esteja presente com um tipo e/ou espcie distinta ou com posto distinto, e e (b) corresponda por nome a um argumento mudo que no esteja presente na outra, ou presente com tipo a e/ou espcie diferente ou com posto diferente. e Para o caso (2), ambas as regras so necessrias para descartar a possibilidade de invocao amb a a ca gua por uso de palavras-chave. Como exemplo onde haver ambigidade, o exemplo abaixo: a u !Exemplo de defini~o ambgua de nome genrico ca e INTERFACE F MODULE PROCEDURE FXI, FIX END INTERFACE F CONTAINS FUNCTION FXI(X,I) REAL :: FXI REAL, INTENT(IN) :: X INTEGER, INTENT(IN) :: I ... END FUNCTION FXI ! FUNCTION FIX(I,X) REAL :: FIX REAL, INTEN(IN) :: X
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

114

8.3. Mdulos o

! D e f i n e nome g e n r i c o para t r o c a de duas v a r i v e i s q u a i s q u e r . e a M D L gentroca O UE i m p l i c i t none type : : ponto real : : x , y end type ponto ! INTERFACE t r o c a M D L PROCEDURE t r o c a p o n t o , t r o c a r e a l , t r o c a i n t , t r o c a l o g O UE END INTERFACE t r o c a ! CONTAINS e l e m e n t a l subroutine t r o c a p o n t o ( a , b ) type ( ponto ) , intent ( inout ) : : a , b type ( ponto ) : : temp temp= a a= b b= temp end subroutine t r o c a p o n t o ! e l e m e n t a l subroutine t r o c a r e a l ( a , b ) real , intent ( inout ) : : a , b r e a l : : temp temp= a a= b b= temp end subroutine t r o c a r e a l ! e l e m e n t a l subroutine t r o c a i n t ( a , b ) integer , intent ( inout ) : : a , b integer : : temp temp= a a= b b= temp end subroutine t r o c a i n t ! e l e m e n t a l subroutine t r o c a l o g ( a , b ) l o g i c a l , intent ( inout ) : : a , b l o g i c a l : : temp temp= a a= b b= temp end subroutine t r o c a l o g END M D L g e n t r o c a O UE

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o program u s a g e n t r o c a use g e n t r o c a type ( ponto ) : : b= ponto ( 1 . 0 , 0 . 0 ) , c= ponto ( 1 . 0 , 1 . 0 ) print * , V a l o r e s o r i g i n a i s : print * , b , c call troca (b , c ) print * , Novos v a l o r e s : print * , b , c end program u s a g e n t r o c a

115

program u s a g t m a t use g e n t r o c a integer , dimension ( 2 , 2 ) : : b , b= r e s h a p e ( s o u r c e= ( / ( ( i+j , c= r e s h a p e ( s o u r c e= ( / ( ( i+j , print * , V a l o r e s o r i g i n a i s : do i= 1 , 2 print * , b ( i , : ) , ,c(i end do call troca (b , c ) print * , Novos v a l o r e s : do i= 1 , 2 print * , b ( i , : ) , ,c(i end do end program u s a g t m a t

c i= 1 , 2 ) , j= 1 , 2 ) / ) , shape= ( / 2 , 2 / ) ) i= 3 , 4 ) , j= 3 , 4 ) / ) , shape= ( / 2 , 2 / ) )

,:)

,:)

INTEGER, INTENT(IN) :: I ... END FUNCTION FIX Neste caso, a chamada ao nome genrico F ser no-amb e a a gua no caso de argumentos posicionais: A= F(INT,VAR) porm ser amb e a gua para chamada usando palavras-chave: A= F(I= INT, X= VAR) Se uma invocao genrica amb ca e e gua entre uma rotina intr nseca e uma no-intr a nseca, esta ultima sempre e invocada.

8.3.5

Estendendo rotinas intr nsecas via blocos de interface genricos e

Como j foi mencionado, uma rotina intr a nseca pode ser estendida ou tambm redenida. Uma rotina ine tr nseca estendida suplementa as rotinas intr nsecas espec cas j existentes. Uma rotina intr a nseca redenida substitui uma rotina intr nseca espec ca existente. Desta forma poss e vel ampliar um determinado clculo a de uma funo, por exemplo, para interfaces no previstas pelo padro da linguagem (extenso) e/ou subsca a a a tituir o processo de clculo do valor da funo por um cdigo distinto daquele implementado no compilador a ca o (substituio). ca Quando um nome genrico igual ao nome genrico de uma rotina intr e e e nseca e o nome declarado com o e atributo ou declarao INTRINSIC (ou aparece em um contexto intr ca nseco), a interface genrica extende a rotina e genrica intr e nseca. Quando um nome genrico igual ao nome genrico de uma rotina intr e e e nseca e este nome no possui o atributo a INTRINSIC (nem possui este atributo pelo contexto), a rotina genrica redene a rotina genrica intr e e nseca. Como exemplo, o mdulo EXT_SINH abaixo estende o clculo da funo seno hiperblico para um argumento o a ca o escalar complexo, enquanto que o padro da linguagem somente considera argumentos reais (seo 7.5): a ca
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

116

8.4. Ambito (Scope) MODULE EXT_SINH IMPLICIT NONE INTRINSIC :: SINH ! INTERFACE SINH MODULE PROCEDURE SINH_C END INTERFACE SINH ! CONTAINS FUNCTION SINH_C(Z) COMPLEX :: SINH_C COMPLEX, INTENT(IN) :: Z REAL :: X,Y X= REAL(Z) Y= AIMAG(Z) SINH_C= CMPLX(SINH(X)*COS(Y),COSH(X)*SIN(Y)) RETURN END FUNCTION SINH_C END MODULE EXT_SINH

8.4

Ambito (Scope)

J foi mencionado neste texto, em diversos lugares, o mbito de um certo nome de varivel. O mbito de a a a a um objeto nomeado ou de um rtulo o conjunto de unidades de mbito, que no se sobrepe, onde o nome o e a a o deste objeto pode ser usado sem ambigidade. u Uma unidade de mbito qualquer um dos seguintes: a e
uma denio de tipo derivado; ca o corpo de um bloco de interfaces de rotinas, excluindo quaisquer denies de tipo derivado e blocos de co interfaces contidos dentro deste, ou uma unidade de programa ou subprograma, excluindo denies de tipo derivado, blocos de interfaces e co rotinas internas contidas dentro desta unidade.

8.4.1

Ambito dos rtulos o

Toda unidade de programa ou subprograma, interno ou externo, tem seu conjunto independente de rtulos. o Portanto, o mesmo rtulo pode ser usado em um programa principal e em seus subprogramas internos sem o ambigidade. u Assim, o mbito de um rtulo um programa principal ou subprograma, excluindo quaisquer subprogramas a o e internos que eles contenham. O rtulo pode ser usado sem ambigidade em qualquer ponto entre os comandos o u executveis de seu mbito. a a

8.4.2

Ambito dos nomes

O mbito de um nome declarado em uma unidade de programa estende-se do cabeado da unidade de a c programa ao seu comando END. O mbito de um nome declarado em um programa principal ou rotina externa a estende-se a todos os subprogramas que eles contm, exceto quando o nome redeclarado no subprograma. e e O mbito de um nome declarado em uma rotina interna somente a prpria rotina, e no os outros suba e o a programas internos. O mbito do nome de um subprograma interno e do nmero e tipos dos seus argumentos a u estende-se por toda a unidade de programa que o contm, inclusive por todos os outros subprogramas internos. e O mbito de um nome declarado em um mdulo estende-se a todas as unidades de programa que usam este a o mdulo, exceto no caso em que a entidade em questo tenha o atributo PRIVATE, ou renomeada na unidade de o a e programa que usa o mdulo ou quando a instruo USE apresenta o qualicador ONLY e a entidade em questo no o ca a a esteja na <lista only>. O mbito de um nome declarado em um mdulo estende-se a todos os subprogramas a o internos, excluindo aqueles onde o nome redeclarado. e Considerando a denio de unidade de mbito acima, ca a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 26 de mar o de 2008 c

Cap tulo 8. Subprogramas e Mdulos o

117

Entidades declaradas em diferentes unidades de mbito so sempre distintas, mesmo que elas tenham o a a mesmo nome e propriedades. Dentro de uma unidade de mbito, cada entidade nomeada deve possuir um nome distinto, com a exceo a ca de nomes genricos de rotinas. e Os nomes de unidades de programas so globais; assim, cada nome deve ser distinto dos outros e distinto a de quaisquer entidades locais na unidade de programa. O mbito do nome de uma rotina interna estende-se somente por toda a unidade de programa que a a contm. e O mbito de um nome declarado em uma rotina interna esta rotina interna. a e

Este conjunto de regras resume a denio de mbito de um nome. ca a Nomes de entidades so acess a veis por associaao ao hospedeiro ou associao por uso quando: c ca Associo ao hospedeiro. O mbito de um nome declarado em uma unidade de programa estende-se do ca a cabealho da unidade de programa ao comando END. c Associao por uso. O mbito de um nome declarado em um mdulo, o qual no possui o atributo PRIVATE, ca a o a estende-se a qualquer unidade de programa que usa o mdulo. o Nota-se que ambos os tipos de associao no se estende a quaisquer rotinas externas que possam ser invocadas ca a e no incluem quaisquer rotinas internas onde o nome redeclarado. a e Um exemplo contendo 5 unidades de mbito ilustrado a seguir: a e MODULE AMBITO1 ... CONTAINS SUBROUTINE AMBITO2 TYPE :: AMBITO3 ... END TYPE AMBITO3 INTERFACE ... END INTERFACE ... CONTAINS FUNCTION AMBITO5(...) ... END FUNCTION AMBITO5 END SUBROUTINE AMBITO2 END MODULO AMBITO1 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito Ambito 1 1 1 2 3 3 3 2 4 2 2 2 5 5 5 2 1

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 26 de mar o de 2008 c

Cap tulo 9

Comandos de Entrada/Sa de Dados da


O Fortran 90/95 possui um conjunto rico de instruoes de entrada/sa (E/S) de dados. Entretanto, este c da cap tulo ir apresentar apenas um conjunto de instruoes que implementam um processo bsico de E/S. a c a Muitos programas necessitam de dados iniciais para o seu processamento. Depois que os clculos estiverem a completos, os resultados naturalmente precisam ser impressos, mostrados gracamente ou salvos para uso posterior. Durante a execuao de um programa, algumas vezes h uma quantidade grande de dados produzidos por c a uma parte do programa, os quais no podem ser todos armazenados na memria de acesso aleatrio (RAM) do a o o computador. Nesta situaao tambm se usam os comandos de E/S da linguagem. c e O Fortran 90/95 possui muitos comandos de E/S. Os mais utilizados so: a OPEN READ WRITE PRINT CLOSE REWIND BACKSPACE estes comandos esto todos embutidos dentro da linguagem a qual possui, adicionalmente, recursos de formataao a c que instruem a maneira como os dados so lidos ou escritos. a At este ponto, todos os exemplos abordados executaram operaoes de E/S de dados com teclado (entrada) e c e terminal (sa da). Adicionalmente, Fortran 90/95 permite que diversos outros objetos, como arquivos de dados, estejam conectados a um programa para leitura e/ou escrita. Neste cap tulo, sero abordados os processos de a E/S em arquivos de dados, por ser este o uso mais freqnte deste recurso. Outros tipos de usos incluem sa ue da direta de dados em impressoras, ploters, programas grcos, recursos de multimeios, etc. a Devido ` variedade de usos dos comandos de E/S, interessante que se faa inicialmente uma introduao a e c c simples ao assunto, abordando os usos mais freq entes dos processos com arquivos externos, para posteriormente u entrar-se em maiores detalhes. Com este intuito, a seao 9.1 contm esta introduao rpida, ao passo que as c e c a seoes posteriores (9.2 9.10) abordam o assunto de uma forma bem mais abrangente. c

9.1

Comandos de Entrada/Sa da: introduo rpida ca a

Na seao 2.3 na pgina 7 j foram apresentadas a entrada (teclado) e a sa (tela do monitor) padres do c a a da o Fortran. Usado desta forma, o recurso demasiado limitado. O programador possui controle muito restrito, por e exemplo, sobre onde, na tela, o resultado deve ser apresentado e sobre o n mero de casas decimais que deve ser u utilizado para representar o valor. Adicionalmente, o programador est limitado ao teclado para o fornecimento a de parmetros ao programa. a Um uso mais desejvel dos recursos de E/S do Fortran consiste na habilidade de ler e gravar dados, por a exemplo, em arquivos residentes no disco r gido do computador ou em outra m dia ` qual o mesmo tem acesso. a Nesta seao, o acesso de E/S a arquivos ser brevemente discutido na forma de tarefas atribu c a das ao programador. 119

120

9.1. Comandos de Entrada/Sa da: introduo rpida ca a

9.1.1

Tarefa 1. Sa formatada na tela do monitor da

Considera-se inicialmente o seguinte programa que realiza sa no formato livre na tela: da program F o ut fo r ma ta do i m p l i c i t none i n t e g e r , pa r a meter : : dp= 8 r e a l ( kind= dp ) : : a , b , c a= 1 . 0 dp / 7 . 0 dp b= s q r t ( 2 . 0 dp ) c= 4 a ta n ( 1 . 0 dp ) w r i t e ( , fmt= ( 1 x , f 7 . 5 , 1 x , f 9 . 7 , 1 x , f 1 1 . 9 ) ) a , b , c w r i t e ( , fmt= ( 1 x , e7 . 5 , 1 x , e9 . 7 , 1 x , e11 . 9 ) ) a , b , c w r i t e ( , fmt= ( 1 x , a= , f 7 . 5 , 1 x , b= , f 9 . 7 , 1 x , c= , f 1 1 . 9 ) ) a , b , c end program F o ut fo r ma ta do Os resultados deste programa so apresentados da seguinte maneira na tela do monitor: a 0.142857142857143 1.41421356237310 3.14159265358979

Observa-se que h um n mero grande de espaos em branco antes e entre os valores dos resultados e todos so a u c a apresentados com o n mero total de d u gitos representveis para uma varivel real de dupla preciso. a a a O programa a seguir apresenta os mesmos resultados, porm de maneiras mais organizadas: e program F o ut fo r ma ta do i m p l i c i t none i n t e g e r , pa r a meter : : dp= 8 r e a l ( kind= dp ) : : a , b , c a= 1 . 0 dp / 7 . 0 dp b= s q r t ( 2 . 0 dp ) c= 4 a ta n ( 1 . 0 dp ) w r i t e ( , fmt= ( 1 x , f 7 . 5 , 1 x , f 9 . 7 , 1 x , f 1 1 . 9 ) ) a , b , c ! Sa ida 1 w r i t e ( , fmt= ( 1 x , e7 . 5 , 1 x , e9 . 5 , 1 x , e11 . 5 ) ) a , b , c ! Sa ida 2 w r i t e ( , ( 1 x , a= , f 7 . 5 , 2 x , b= , f 9 . 7 , 3 x , c= , f 1 1 . 9 ) ) a , b , c ! Sa ida 3 end program F o ut fo r ma ta do Agora, os resultados so: a 0.14286 1.4142136 3.141592654 ******* ********* 0.31416E+01 a= 0.14286 b= 1.4142136 c= 3.141592654 Nos trs resultados, o segundo argumento dos comandos WRITE indica a formataao na sa e c da, conforme determinada pelo especicador FMT=,1 o qual no obrigatrio se o formato dos dados aparecer como segundo elemento a e o de um comando de E/S. A formataao dos dados de sa determinada pela seqncia de descritores de ediao c da e ue c (X, F e E), os quais tm os seguintes signicados: e Os descritores 1X, 2X e 3X indicam quantos espaoes em branco (respectivamente 1, 2 e 3) devem ser c deixados na sa dos dados. da Os descritores F e G so descritores de ediao de dados e eles se aplicam ao dados na lista de variveis (A, B a c a e C) na mesma ordem em que aparecem, ou seja, na sa 1, F7.5 determina a ediao da varivel A, F9.7 da c a determina a adiao de B e F11.9 determina a ediao de C. c c O descritor F7.5 indica que a varivel deve ser impressa no formato de ponto utuante, com um total de a 7 algarismos alfanumricos, contando o ponto decimal e o sinal (se houver), destinando 5 d e gitos para a parte fracionria da varivel A. a a
1 Discutido

em detalhes na seao 9.6 na pgina 127. c a

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da

121

O descritor E11.5, que aparece na sa 2 determinando o formato de sa da varivel C, indica a sa da da a da na forma de ponto utuante com parte exponencial. O resultado impresso (0.31416E+01) possui uma extenso total de 11 algarismos alfanumricos, contando o ponto decimal, o sinal (se houver), o s a e mbolo da parte exponencial (E), o sinal da parte exponencial (+) e o seu valor, com duas casas decimais (01). Restam, ento, somente 5 d a gitos para a parte fracionria. Caso a extenso total do descritor, descontado a a o n mero de d u gitos na parte fracionria, no for suciente para imprimir a parte exponencial e mais o a a sinal, ocorre um estouro de campo, indicado pelos asteriscos nos resultados das variveis A e B. a Finalmente, as constantes de caractere A= , B= e C= que aparecem na formataao da sa 3 so c da a impressas ipsis literis na sa padro e na mesma ordem em que aparecem, relativamente a si prprias e da a o a `s variveis. a Uma exposiao completa de todos os descritores realizada na seao 9.7 na pgina 127. c e c a

9.1.2

Tarefa 2. Entrada formatada a partir do teclado

Entrada formatada a partir do teclado no uma tarefa muito prtica, pois uma instruao do tipo a e a c READ(*,FMT= (1X,F7.5,5X,F9.7,3X,F11.9) )A, B, C iria requerer a digitaao dos valores das variveis exatamente nas posioes assinaladas e com as extenses e c a c o partes fracionrias exatamente como determinadas pelos descritores. a

Seo em desenvolvimento! ca
Unidades lgicas o

9.2

Em Fortran, um arquivo est conectado a uma unidade lgica denotada por um n mero inteiro. Este n mero a o u u deve ser positivo e est freq entemente limitado entre 1 e 100, dependendo do compilador. Cada unidade lgica a u o possui muitas propriedades. Por exemplo, FILE. O nome do arquivo conectado ` unidade. O nome especicado pelo comando OPEN. a e ACTION. Especica o tipo de aao que pode ser executada sobre o arquivo. Estas compreendem leitura, escrita c ou ambas. Se um arquivo aberto para um tipo de aao e outro tipo tentado, uma mensagem de erro e c e ser gerada. Por exemplo, no permitida escrita sobre um arquivo aberto somente para leitura. a a e STATUS. Estabelece o status de um arquivo. Estes so: velho (old), novo (new) substituiao (replace), entre a c outros. Caso um arquivo tente ser acessado com um status incorreto, uma mensagem de erro gerada. e ACCESS. Forma de acesso a um arquivo: direto ou seq encial. Alguns arquivos pode ser acessados por ambos u os mtodos, como o caso de arquivos em discos remov e e veis ou discos r gidos. J outras midias permite a acesso somente seq encial, como o caso de uma ta magntica. u e e Seqencial. E o acesso usual. Os processos de leitura/escrita principiam no in do arquivo e seguem, u cio linha a linha, at o seu nal. e Direto. Cada linha acessada por um n mero, denominado nmero de gravaao (record number) o qual e u u c deve ser especicado no comando de leitura/escrita. O n mero mximo de arquivos que podem ser abertos simultaneamente para E/S tambm especicado pelo u a e e manual do compilador.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

122

9.3. Comando OPEN

9.3

Comando OPEN

O comando OPEN usado para conectar um dado arquivo a uma unidade lgica. Freq entemente poss e o u e vel pr-conectar um arquivo antes que o programa comece a rodar; neste caso, no necessrio usar-se o comando e a e a OPEN. Contudo, isto depende de conhecimento prvio a respeito dos n meros-padro das unidades lgicas para e u a o E/S, o que geralmente depende do processador e dos sistema operacional em uso. Para sistemas linux, as unidades pr-conectadas so, usualmente: e a Uso Mensagens de erro Entrada padro a Sa padro da a Designao ca stderr stdin stdout Nmero da unidade lgica u o 0 5 6

Sempre que poss vel, recomendado evitar-se o uso de unidade pr-conectadas, o que torna o programa mais e e portvel. a A sintaxe do comando : e OPEN([UNIT=] <int-exp> [,<op-list>]) onde <int-exp> uma espresso escalar inteira que especica o n mero da unidade lgica externa e <op-list> e a u o uma lista de especicadores opcional, formada por um conjunto de palavras-chave. Se a palavra-chave UNIT= e for inclu ela pode aparecer em qualquer posiao no campo de argumentos do comando OPEN. Um especicador da, c no pode aparecer mais de uma vez. Nos especicadores, todas as entidades so escalares e todos os caracteres a a so da espcie padro. Em expresses de caractere, todos os brancos precedentes so ignorados e, exceto no caso a e a o a do especicador FILE=, quaisquer letras mai sculas so convertidas `s correspondentes letras min sculas. Os u a a u especicadores so: a FILE= <fln>, onde <fln> uma expresso de caractere que fornece o nome do arquivo. O nome deve coincidir e a exetamente com o arquivo, inclusive com o caminho, caso o arquivo esteja em um diretrio distinto do o diretrio de trabalho. Se este especicador omitido e a unidade no conectada a uma arquivo, o o e a e especicador STATUS= deve ser especicado com o valor SCRATCH e o arquivo conectado ` unidade ir a a depender do sistema. IOSTAT= <ios>, onde <ios> uma varivel inteira padro que xada a zero se o comando executou corretae a a e mente e a um valor positivo em caso contrrio. a ERR= <rtulo-erro>, onde <rtulo-erro> o rtulo de um comando na mesma unidade de mbito, para o o o e o a qual o controle do uxo ser transferido caso ocorra algum erro na execuao do comando OPEN. a c STATUS= <status>, onde <status> uma expresso de caracteres que fornece o status do arquivo. O status e a pode ser um dos seguintes: OLD Arquivo deve existir. NEW Arquivo no deve existir. O arquivo ser criado pelo comando OPEN. A partir deste momento, o a a seu status se torna OLD. REPLACE Se o arquivo no existe, ele ser criado. Se o arquivo j existe, este ser eliminado e um novo a a a a arquivo criado com o mesmo nome. Em ambos os casos, o status ento alterado para OLD. e e a SCRATCH O arquivo temporrio e ser deletado quando este for fechado com o comando CLOSE ou na e a a sa da unidade de programa. da UNKNOWN Status do arquivo desconhecido; depende do sistema. Este o valor padro do especicador, e a caso este seja omitido. O especicador FILE= deve estar presente se NEW ou REPLACE so especicados ou se OLD a e especicado e a unidade no est conectada. a a ACCESS= <acc>, onde <acc> uma expresso de caracteres que fornece o valor SEQUENTIAL ou DIRECT. e a Para um arquivo que j exista, este valor deve ser uma opao vlida. Se o arquivo ainda no existe, ele a c a a ser criado com o mtodo de acesso apropriado. Se o especicador omitido, o valor SEQUENTIAL a e e e assumido. O signicado das especicaoes : c e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da

123

DIRECT O arquivo consiste em registros acessados por um n mero de identicaao. Neste caso, o u c tamanho do registro deve ser especicado por RECL=. Registros individuais podem ser especicados e atualizados sem alterar o restante do arquivo. SEQUENTIAL O arquivo escrito/lido seq encialmente, linha a linha. e u FORM= <fm>, onde <fm> uma expresso de caracteres que fornece os valores FORMATTED ou UNFORMATTED, e a determinando se o arquivo deve ser conectado para E/S formatada ou no formatada. Para um arquivo a que j exista, o valor deve ser uma opao vlida. Se o arquivo ainda no existe, ele ser criado com um a c a a a conjunto de forma que incluem o forma especicada. Se o especicador omitido, os valores-padro so: e a a FORMATTED Para acesso seq encial. u UNFORMATTED Para conexo de acesso direto. a RECL= <rl>, onde <rl> uma expresso inteira cujo valor deve ser positivo. e a Para arquivo de acesso direto, a opao especica o tamanho dos registros e obrigatrio. c e o Para arquivo seq encial, a opao especica o tamanho mximo de um registro, e opcional com um u c a e valor padro que depende do processador. a Para arquivos formatados, o tamanho o n mero de caracteres para registros que contenham e u somente caracteres-padro. a Para arquivos no formatados, o tamanho depende do sistema, mas o comando INQUIRE (seao a c 9.9) pode ser usado para encontrar o tamanho de uma lista de E/S. Em qualquer situaao, para um arquivo que j exista, o valor especicado deve ser permitido para o c a arquivo. Se o arquivo ainda no existe, ele criado com um conjunto permitido de tamanhos de registros a e que incluem o valor especicado. BLANK= <bl>, onde <bl> uma expresso de caracteres que fornece os valores NULL ou ZERO. A conexo e a a deve ser com E/S formatada. Este especicador determina o padro para a interpretaao de brancos em a c campos de entrada numricos. e NULL Os brancos so ignorados, exceto que se o campo for completamente em branco, ele interpretado a e como zero. ZERO Os brancos so interpretados como zeros. a Se o especicados omitido, o valor padro NULL. e a e POSITION= <pos>, onde <pos> uma expresso de caracteres que fornece os valores ASIS, REWIND ou e a APPEND. O mtodo de acesso deve ser seq encial e se o especicador omitido, o valor padro ASIS. e u e a e Um arquivo novo sempre posicionado no seu in e cio. Para um arquivo que j existe e que j est conectado: a a a ASIS O arquivo aberto sem alterar a posiao corrente de leitura/escrita no seu interior. e c REWIND O arquivo posicionado no seu ponto inicial. e APPEND O arquivo posicionado logo aps o registro de nal de arquivo, possibilitando a incluso de e o a dados novos. Para um arquivo que j existe mas que no est conectado, o efeito da especicaao ASIS no posicionaa a a c mento do arquivo indeterminado. e ACTION= <act>, onde <act> uma expresso de caracteres que fornece os valores READ, WRITE ou READWRITE. e a READ Se esta especicaao escolhida, os comandos WRITE, PRINT e ENDFILE no devem ser usados c e a para esta conexo. a WRITE Se esta especicaao escolhida, o comando READ no pode ser usado. c e a READWRITE Se esta especicaao escolhida, no h restriao. c e a a c Se o especicador omitido, o valor padro depende do processador. e a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

124

9.4. Comando READ

DELIM= <del>, onde <del> uma expresso de caracteres que fornece os valores APOSTROPHE, QUOTE ou e a NONE. Se APOSTROPHE ou QUOTE so especicados, o caractere correspondente ser usado para a a delimitar constantes de caractere escritos com formatao de lista ou com o uso da declaraao NAMELIST, e ca c ser duplicado onde ele aparecer dentro de tal constante de caractere. Alm disso, caracteres fora do padro a e a sero precedidos por valores da espcie. Nenhum caractere delimitador ser usado e nenhuma duplicaao a e a c ser feita se a especicaao for NONE. A especicaao NONE o valor padro se este especicador for a c c e a omitido. O especicador somente pode aparecer em arquivos formatados. PAD= <pad>, onde <pad> uma expresso de caracteres que fornece os valores YES ou NO. e a YES Um registro de entrada formatado ser considerado preenchido por brancos sempre que uma lista a de entrada e a formataao associada especicarem mais dados que aqueles que so lidos no registro. c a NO Neste caso, o tamanho do registro de entrada deve ser no menor que aquele especicado pela lista a de entrada e pela formataao associada, exceto na presena de um especicador ADVANCE= NO e c c uma das especicaoes EOR= ou IOSTAT=. c O valor padro se o especicador omitido YES. Para caracteres no padronizados, o caractere de a e e a branco que preenche o espao restante depende do processador. c A seguir, temos um exemplo do uso deste comando: OPEN(17, FILE= SAIDA.DAT, ERR= 10, STATUS= REPLACE, & ACCESS= SEQUENTIAL, ACTION= WRITE) Neste exemplo, um arquivo SAIDA.DAT aberto para escrita, conectado ao n mero de unidade lgica 17, o e e u o arquivo acessado linha a linha e ele j existe mas deve ser substitu e a do. O rtulo 10 deve pertencer a um o comando executvel vlido. a a OPEN(14, FILE= ENTRADA.DAT, ERR= 10, STATUS= OLD, RECL=IEXP, ACCESS= DIRECT, ACTION= READ) &

Aqui, o arquivo ENTRADA.DAT aberto somente para leitura na unidade 14. O arquivo diretamente acessado e e e deve ser um arquivo previamente existente.

9.4

Comando READ

Este o comando que executa a leitura formatada de dados. At agora, o comando foi utilizado para leitura e e na entrada padro, que usualmente o teclado: a e READ*, <lista> onde o asterisco * indica a entrada padro e <lista> a lista de variveis cujo valor lido do teclado. a e a e Este comando ser agora generalizado para uma forma com ou sem unidade lgica. Sem o n mero de unidade a o u lgica o comando ca: o READ <format> [,<lista>] e com o n mero de unidade ca: u READ([UNIT=]<u>, [FMT=] <format>[, IOSTAT= <ios>] & [, ERR= <err-label>][, END= <end-label>] & [, EOR= <eor-label>][, ADVANCE= <mode>] & [, REC= <int-exp>][, SIZE= <size>][, NML= <grp>]) <lista> Os argumentos do comando so os seguintes: a UNIT= <u>, onde <u> um n mero de unidade lgica vlido ou * para a entrada padro. Caso esta especie u o a a caao seja o primeiro argumento do comando, a palavra-chave opcional. c e FMT= <format>, onde <format> uma string de caracteres formatadores, um rtulo vlido em Fortran ou * e o a para formato livre. Caso esta especicaao seja o segundo argumento do comando, a palavra-chave c e opcional.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da

125

IOSTAT= <ios>, onde <ios> uma varivel inteira padro que armazena o status do processo de leitura. Os e a a valores poss veis so: a <ios> = 0, quando o comando executado sem erros. e <ios> > 0, quando ocorre um erro na execuao do comando. c <ios> < 0, quando uma condiao de nal de registro detectada em entrada sem avano ou quando uma c e c condiao de nal de arquivo detectada. c e ERR= <err-label>, um rtulo vlido para onde o controle de uxo transferido quando ocorre um erro de e o a e leitura. END= <end-label>, um rtulo vlido para onde o controle de uxo transferido se uma condiao de nal de e o a e c arquivo encontrada. Esta opao somente existe no comando READ com acesso seq encial. e c u EOR= <eor-label>, um rtulo vlido para onde o controle de uxo transferido se uma condiao de nal de e o a e c registro encontrada. Esta opao somente existe no comando READ com acesso seq encial e formatado e e c u somente se a especicaao ADVANCE= NO tambm estiver presente. c e ADVANCE= <mode>, onde <mode> possui dois valores: YES ou NO. A opao NO especica que cada comando c READ inicia um novo registro na mesma posiao; isto , implementa entrada de dados sem avano (nonc e c advancing I/O ). A opao padro YES, isto a cada leitura o arquivo avanado em uma posiao. Se c a e e e c c a entrada sem avano usada, ento o arquivo deve estar conectado para acesso seq encial e o formato c e a u deve ser expl cito. REC= <int-exp>, onde <int-exp> uma expresso inteira escalar cujo valor o n mero de e a e u ndice do registro lido durante acesso direto. Se REC estiver presente, os especicadores END e NML e o formato livre * no a podem ser tambm usados. e SIZE= <size>, onde <size> uma varivel escalar inteira padro, a qual guarda o nmero de caracteres lidos. e a a u Este especicador somente existe no comando READ e somente se a especicaao ADVANCE= NO tambm c e estiver presente. NML= <grp>, onde <grp> o nome de um grupo NAMELIST prviamente denido em uma declaraao NAMELIST. e e c O nome <grp> no uma constante de caracteres e sim um nome vlido em Fortran. a e a Dado o seguinte exemplo: READ(14, FMT= (3(F10.7,1X)), REC=IEXP) A, B, C este comando especica que o registro identicado pela varivel inteira IEXP seja lido na unidade 14. O registro a deve ser composto por 3 n meros reais designados pelos descritores F10.7, separados por um espao em branco. u c Estes 3 n meros sero atribu u a dos `s variveis A, B e C. Outro exemplo: a a READ(*, (A), ADVANCE= NO, EOR= 12, SIZE= NCH) STR especica que a leitura sem avano na unidade padro; isto , o cursor na tela do monitor ir permanecer na e c a e a mesma linha h medida que a string STR ser lida. O comando l uma constante de caractere porque o descritor a a e no formato A. Em uma situaao normal, isto , leitura com avano, o cursor seria posicionado no in da e c e c cio prxima linha na tela. A varivel NCH guarda o comprimento da string e o rtulo 12 indica o ponto onde o o a o programa deve se encaminhar se uma condiao de nal de registro encontrada. c e

9.5

Comandos PRINT e WRITE

Em comparaao com o comando READ, o comando WRITE suporta os mesmos argumentos, com exceao do c c especicador SIZE. At agora, foi usada somente forma do comando PRINT para a sa padro de dados, que usualmente a e da a e tela do monitor: PRINT*, <lista> O mesmo comando, generalizado para sa formatada ca, da
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

126 PRINT <format> [, <lista>] J a sintaxe mais geral do comando : a e

9.5. Comandos PRINT e WRITE

WRITE([UNIT=]<u>, [FMT=] <format>[, IOSTAT= <ios>] & [, ERR= <err-label>][, ADVANCE= <mode>] & [, REC= <int-exp>][, NML= <grp>]) <lista> Os especicadores deste comando executam, na sua maioria, as mesmas funoes executadas pelos especicadores c do comando READ, com exceao dos seguintes, os quais especicam funoes ligeiramente distintas: c c UNIT= <u>, onde <u> um n mero de unidade lgica vlido ou * para a sa padro. Caso esta especicaao e u o a da a c seja o primeiro argumento do comando, a palavra-chave opcional. e IOSTAT= <ios>, onde <ios> uma varivel inteira padro que armazena o status do processo de escrita. Os e a a valores poss veis so: a <ios> = 0, quando o comando executado sem erros. e <ios> > 0, quando ocorre um erro na execuao do comando. c <ios> < 0, quando uma condiao de nal de registro detectada em escrita sem avano ou quando uma c e c condiao de nal de arquivo detectada. c e ERR= <err-label>, um rtulo vlido para onde o controle de uxo transferido quando ocorre um erro de e o a e escrita. ADVANCE= <mode>, onde <mode> possui dois valores: YES ou NO. A opao NO especica que cada comando c WRITE inicia um novo registro na mesma posiao; isto , implementa sa de dados sem avano (nonc e da c advancing I/O ). A opao padro YES, isto a cada escrita, o arquivo avanado em uma posio. Se c a e e e c ca a sa sem avano usada, ento o arquivo deve estar conectado para acesso seq encial e o formato deve da c e a u ser expl cito. REC= <int-exp>, onde <int-exp> uma expresso inteira escalar cujo valor o n mero de e a e u ndice do registro a ser escrito durante acesso direto. Se REC estiver presente, os especicadores END e NML e o formato livre * no podem ser tambm usados. a e Considere o seguinte exemplo, WRITE(17, FMT= (I4), IOSTAT= ISTAT, ERR= 10) IVAL aqui, (I4) descreve format de dado inteiro com 4 d gitos, ISTAT uma varivel inteira que indica o status do e a processo de escrita; em caso de erro, o uxo transferido ao rtulo 10. IVAL a varivel cujo valor escrito na e o e a e unidade 17. Outro exemplo seria: WRITE(*,(A), ADVANCE= NO) Entrada: Como a especicaao de escrita sem avano foi escolhida, o cursor ir permanecer na mesma linha que a string c c a Entrada: . Em circunstncias normais, o cursor passaria ao in da linha seguinte na tela. Nota-se tambm a cio e o descritor de formato de constante de caracteres expl cito. Como exemplo do uso dos comandos de E/S apresentados nas seoes 9.3 9.5, o programa a seguir abre c um novo arquivo seq encial chamado notas.dat. O programa ento l o nome de um estudante, seguido por 3 u a e notas, as quais so introduzidas pelo teclado (entrada padro), escrevendo, nalmente, as notas e a mdia nal a a e em NOTAS.DAT e no monitor (sa padro), na mesma linha do nome. O processo de leitura e escrita repetido da a e at que um estudante com o nome Fim introduzido. e e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da PROGRAM Notas IMPLICIT NONE CHARACTER(LEN=20) :: name REAL :: mark1, mark2, mark3 OPEN (UNIT=4,FILE=NOTAS.DAT) DO READ(*,*) name, mark1, mark2, mark3 IF(name == Fim)EXIT WRITE(UNIT=4,FMT=*) name, mark1, mark2, mark3, (mark1 + mark2 + mark3)/3.0 WRITE(UNIT=*,FMT=*) name, mark1, mark2, mark3, (mark1 + mark2 + mark3)/3.0 END DO CLOSE(UNIT=4) END PROGRAM Notas

127

9.6

Comando FORMAT e especicador FMT=

O especicador FMT= em um comando READ ou WRITE pode conter ou o s mbolo de formato livre *, ou uma constante de caracteres que indica o formato ou um rtulo que indica a linha onde se encontra um comando o FORMAT. Dado o seguinte exemplo, WRITE(17, FMT= (2X,2I4,1X,nome ,A7))I, J, STR este comando escreve no arquivo SAIDA.DAT, aberto em um exemplo anterior, as trs variveis I, J e STR de e a acordo com o formato especicado: 2 espaos em branco (2X), 2 objetos inteiros de 4 d c gitos em espaos entre c eles (2I4), um espao em branco (1X) a constante de caractere nome e, nalmente, 7 caracteres de um c objeto de caracteres (A7). As variveis a ser realmente escritas so tomadas da lista de E/S aps a lista de a a o especicaoes do comando. c Outro exemplo: READ(14,*)X, Y Este comando l dos valores do arquivo ENTRADA.DAT usando formato livre e atribuindo os valores `s variveis e a a X e Y. Finalmente, no exemplo: WRITE(*,FMT= 10)A, B 10 FORMAT(Valores: ,2(F15.6,2X)) O comando WRITE acima usa o formato especicado no rtulo 10 para escrever na sa padro os valores das o da a variveis A e B. O formato de sa pode ser descrito como: 2 instncias de: um objeto real com 15 colunas ao a da a todo com uma preciso de 6 casas decimais (F15.6), seguido por 2 espaos em branco (2X). a c O formato de E/S de dados denido fazendo-se uso dos descritores de ediao, abordados na prxima seao. e c o c

9.7

Descritores de edio ca

Nos exemplos apresentados nas seoes anteriores, alguns descritores de ediao j foram mencionados. Estes c c a editores fornecem uma especicaao precisa sobre como os valores devem ser convertidos em uma string escrita c em um dispositivo externo (monitor, impressora, etc) ou em um arquivo interno (disco r gido, CD-RW, ta, etc), ou convertido de uma string em um dispositivo de entrada de dados (teclado, etc) ou arquivo interno para as diverentes representaoes de tipos de variveis suportados pela linguagem. c a Com algumas exceoes, descritores de ediao aparecem em uma lista separados por v c c rgulas e somente no caso em que a lista de E/S for vazia ou contiver somente matrizes de tamanho zero que os descritores podem estar totalmente ausentes. Em um processador que suporta tanto caracteres mai sculos quanto min sculos, os descritores de ediao so u u c a interpretados de forma independente com relaao ao caso. c Descritores de ediao dividem-se em trs classes: c e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

128

9.7. Descritores de edio ca

Descritores de edio de dados: I, B, O, Z, F, E, EN, ES, D, G, L, A. ca Descritores de controle: T, TL, TR, X, S, SP, SS, BN, BZ, P, :, /. Descritores de edio de strings: H, c, c (onde c uma constante de caractere). ca e Estes descritores sero discutidos em mais detalhes a seguir. a

9.7.1

Contadores de repetio ca

Os descritores de ediao de dados podem ser precedidos por um contador de repetiao: uma constante inteira c c positiva (sem sinal), como no exemplo 10F12.3 a qual indica 10 constantes reais com 12 posioes ao todo e com preciso de 3 casas decimais cada. Dos c a descritores de ediao restantes, somente a barra / pode ter um contador de repetiao associado. Um contador c c de repetiao tambm pode ser aplicado a um grupo de descritores de ediao, delimitado por parnteses: c e c e PRINT (4(I5,F8.2)), (I(J), A(J), J= 1,4) o que equivalente a escrever: e PRINT (I5,F8.2,I5,F8.2,I5,F8.2,I5,F8.2), (I(J), A(J), J= 1,4) Note tambm o lao DO implicado (implied-Do list) e c (I(J), A(J), J= 1,4) o que equivale a escrever I(1), A(1), I(2), A(2), I(3), A(3), I(3), A(3) Contadores de repetiao como estes podem ser encadeados: c PRINT (2(2I5,2F8.2)), (I(J),I(J+1),A(J),A(J+1), J=1,4,2) Pode-se ver que esta notaao possibilita compactar a formataao de E/S de dados. c c Se uma especicaao de formato usada com uma lista de E/S que contm mais elementos que o n mero de c e e u descritores de formataao, incluindo os contadores de repetiao, um novo registro ir comear e a especicaao c c a c c de formato ser repetida at que todos os elementos forem cobertos. Isto acontece, por exemplo, no comando a e abaixo: PRINT (10I8), (I(J), J= 1, 100)

9.7.2

Descritores de edio de dados ca

Cada tipo intr nseco de variveis em Fortran convertido por um conjunto espec a e co de descritores, com exceao do descritor G, que pode converter qualquer tipo intr c nseco. A tabela 9.1 apresenta uma descriao das c converses. o Formato dos descritores de edio de dados. ca Um descritor de ediao de dados pode assumir uma das seguintes formas em uma lista de formataao de c c E/S: [<r>]<c><w> [<r>]<c><w>.<m> [<r>]<c><w>.<d> [<r>]<c><w>.<d>[E<e>] onde os campos <r>, <w>, <d> e <e> devem ser todos constantes inteiras positivas (sem sinal). Parmetros de a espcie de tipo no podem ser especicados. O signicado dos campos o seguinte: e a e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da


Tabela 9.1: Descritores de edio que convertem os tipos intr ca nsecos.

129

Descritor A B D E EN ES F G I L O Z

Tipo de dados convertidos Caractere Inteiro de/para base binria a Real Real com expoente Real com notaao de engenharia c Real com notaao cient c ca Real de ponto utuante (sem expoente) Todos os tipo intr nsecos Inteiro Lgico o Inteiro de/para base octal Inteiro de/para base hexadecimal

<r> o contador de repetiao. O seu valor pode variar entre 1 e 2147483647 (2**31 - 1). Se <r> for omitido, e c ele assumido igual a 1. e <c> um dos descritores: I, B, O, Z, F, EN, ES, D, G, L, A. e <w> o n mero total de d e u gitos no campo (ou a largura do campo). Se <w> for omitido, assumido um valor e padro que pode variar com o sistema, porm <w> no pode ser nulo. a e a <m> o n mero m e u nimo de d gitos que devem aparecer no campo (incluindo zeros precedentes). O intervalo permitido para <m> inicia em 0 mas o valor nal depende do sistema. <d> o n mero de d e u gitos ` direita do ponto decimal (os dgitos signicativos). O intervalo de <d> inicia em 0 a mas o valor nal depende do sistema. O n mero de d u gitos signicativos afetado se um fator de escala e especicado para o descritor de ediao. e c E identica um campo de expoente. <e> o n mero de d e u gitos no expoente. O intervalo de <e> inicia em 1 mas o valor nal depende do sistema. Os descritores de ediao de dados tm as seguintes formas espec c e cas: Tipo de dado Inteiro Real e Complexo Lgico o Caractere Descritores de dado I<w>[.<m>], B<w>[.<m>], O<w>[.<m>], Z<w>[.<m>], G<w>.<d>[E<e>] F<w>.<d>, E<w>.<d>[E<e>], EN<w>.<d>[E<e>], ES<w>.<d>[E<e>], D<w>.<d>, G<w>.<d>[E<e>] L<w>, G<w>.<d>[E<e>] A[<w>], G<w>.<d>[E<e>]

O campo <d> deve ser especicado com os descritores F, E, D e G mesmo se <d> for zero. O ponto decimal tambm exigido. Para uma constante de caractere, o campo <w> opcional, independente do tamanho da e e e constante. Para todos os descritores numricos, se o campo de escrita for muito estreito para conter o n mero completo, e u de acordo com a descriao fornecida, o campo preenchido por <w> asteriscos. c e Na sa os n meros so geralmente escritos deslocados para a direita no espao de campo especicado por da u a c <w>; isto feito preenchendo de espeos em branco ` esquerda, caso necessrio. Valores negativos so sempre e c a a a escritos com o sinal de menos. Na entrada os n meros tambm deveriam ser lidos a partir da direita. Espaos em branco ` esquerda so u e c a a ignorados. Se o campo todo composto por espaos em branco, o registro ser lido como zero. e c a Nmeros inteiros (I<w>[.<m>], B<w>[.<m>], O<w>[.<m>], Z<w>[.<m>]) u Na sua forma bsica, I<w>, o inteiro ser lido ou escrito no campo de largura <w> ajustado ` direita. a a a Representando um espao em branco por , o valor -99 escrito sob o controle de I5 ir ser aparecer como -99, c a com o sinal contando como uma posiao no campo. c
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

130

9.7. Descritores de edio ca

Para impresso, uma forma alternativa deste descritor permite que o n mero de d a u gitos a ser impressos sejam especicados exatamente, mesmo que alguns deles tenham que ser zeros. Trata-se da forma I<w>.<m>, onde <m> indica o n mero m u nimo de d gitos a ser impressos. Neste caso, o valor 99 impresso sob o controle de I5.3 aparecer como 099. O valor <m> pode ser zero, em cuja situaao o campo ser preenchido por brancos se o a c a n mero impresso for 0. Na entrada, I<w>.<m> interpretado exatamente da mesma forma que I<w>. u e Inteiros tambm podem ser convertidos pelos descritores B<w>[.<m>], O<w>[.<m>] e Z<w>[.<m>]. Estes so e a similares ao descritor I, porm destinados a representar o n mero inteiro nos sistemas numricos binrio, octal e u e a e hexadecimal, respectivamente. Nmeros reais (F<w>.<d>, E<w>.<d>[E<e>], EN<w>.<d>[E<e>], ES<w>.<d>[E<e>], D<w>.<d>) u A forma bsica, F<w>.<d>, gera um n mero real de ponto utuante. O ponto decimal conta como uma a u posiao no campo. Na entrada de dados, se a string possui um ponto decimal, o valor de <d> ignorado. c e Por exemplo, a leitura da string 9.3729 com o descritor F8.3 causa a transferncia do valor 9.3729. Todos e os d gitos so usados, mas arredondamento pode ocorrer devido ` representaao nita de um n mero pelo a a c u computador. H outras duas formas de entrada de n meros aceitveis pelo descritor F<w>.<d>: a u a 1. N mero sem ponto decimal. Neste caso, os <d> d u gitos mais ` direita sero tomados como a parte fracioa a nrio do n mero. Por exemplo, a string -14629ser lida pelo descritor F7.2 como -146.29. a u a 2. N mero real na forma padro; a qual envolve uma parte exponencial (seao 3.3), como o n mero -14.629E-2 u a c u ou sua forma variante, onde o expoente sempre tem sinal e o indicador de expoente E omitido: e -14.629-2. Neste caso, o campo <d> ser novamente ignorado e o n mero na forma exponencial ser a u a escrita na forma de ponto utuante. Sob o controle do descritor F9.1, a string anterior ser convertida ao a n mero 0.14629. u Estas propriedades aplicam-se ` entrada de dados. a Na sa de dados, os valores so arredondados seguindo as regras normais de aritmtica. Assim, o valor da a e 10.9336, sob o controle do descritor F8.3 ir aparecer escrito como 10.934 e sob o controle de F4.0 ir a a aparecer como 11. (note o ponto). O descritor de ediao E possui duas formas, E<w>.<d> e E<w>.<d>E<e> e uma maneira mais apropriada de c e transferir n meros abaixo de 0.01 ou acima de 1000. u As regras para estes descritores na entrada de dados so idnticas `s do descritor F<w>.<d>. Na sa com o a e a da descritor E<w>.<d>, uma string de caractere contendo a parte inteira com valor absoluto menor que um e quatro caracteres que consistem ou no E seguido por um sinal e dois d gitos ou de um sinal seguido por trs d e gitos. Assim, o n mero 1.234 1023 , convertido pelo descritor E10.4 vai gerar a string .1234E + 24 ou .1234 + 024. u A forma contendo a letra E no usada se a magnitude do expoente exceder 99. Por exemplo, E10.4 ir imprimir a e a o n mero 1.234 10150 como .1234 149. Alguns processadores pe um zero antes do ponto decimal. Note u o que agora o valor de <w> deve ser grande o suciente para acomodar, alm dos d e gitos, o sinal (se for negativo), o ponto decimal, a letra E (caso poss vel), o sinal do expoente e o expoente. Assim, caso se tentasse imprimir o n mero anterior com o descritor F9.4, apareceria *********. u Na segunda forma do descritor, E<w>.<d>E<e>, o campo <e> determina o n mero de d u gitos no expoente. Esta forma obrigatria para n meros cujos expoentes tm valor absoluto maior que 999. Assim, o n mero e o u e u 1.234 101234 , com o descritor E12.4E4 transferido como a string .1234E + 1235. e O descritor de ediao EN implementa a notaao de engenharia. Ele atua de forma semelhante ao descritor E, c c exceto que na sa o expoente decimal m ltiplo de 3, a parte inteira maior ou igual a 1 e menor que 1000 da e u e e o fator de escala no tem efeito. Assim, o n mero 0.0217 transferido sob EN9.2 ser convertido a 21.70E-03 a u a ou 21.70-003. O descritor de ediao ES implementa a notaao cient c c ca. Ele atua de forma semelhante ao descritor E, exceto que na sa o valor absoluto da parte inteira maior ou igual a 1 e menor que 10 e o fator de escala da e no tem efeito. Assim, o n mero 0.0217 transferido sob ES9.2 ser convertido a 2.17E-02 ou 2.17E-002. a u a Nmeros complexos (F<w>.<d>, E<w>.<d>[E<e>], EN<w>.<d>[E<e>], ES<w>.<d>[E<e>], D<w>.<d>) u N meros complexos podem ser editados sob o controle de pares dos mesmos descritores de n meros reais. u u Os dois descritores no necessitam ser idnticos. O valor complexo (0.1,100.), convertido sob o controle de a e F6.1,8.1 seria convertido a 0.1.1E+03. Os dois descritores podem ser separados por uma constante de caracteres e descritores de controle de ediao. c
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da Valores lgicos (L<w>) o

131

Valores lgicos podem ser editados usando o descritor L<w>. este dene um campo de tamanho <w> o qual, o na entrada consiste de brancos opcionais, opcionalmente seguidos por um ponto decimal, seguido por T ou F. Opcionalmente, este caractere pode ser seguido por caracteres adicionais. Assim, o descritor L7 permite que as strings .TRUE. e .FALSE. sejam lidas com o seu signicado correto. Na sa da, um dos caracteres T ou F ir aparecer na posiao mais ` direita do campo. a c a Variveis de caracteres A[<w>] a Valores de caracteres podem ser editados usando o descritor A com ou sem o campo <w>. Sem o campo, a largura do campo de entrada ou sa determinado pelo tamanho real do item na lista de E/S, medido em da e termos do n mero de caracteres de qualquer espcie. u e Por outro lado, usando-se o campo <w> pode-se determinar o tamanho desejado da string lida ou escrita. Por exemplo, dada a palavra TEMPORARIO, temos os reguintes resultados no processo de escrita: Descritor A A11 A8 Registro escrito TEMPORARIO TEMPORARIO TEMPORAR

Ou seja, quando o campo do descritor menor que o tamanho real do registro, este escrito com os caracteres e e mais ` esquerda. Por outro lado, em caso de leitura da mesma string, as seguintes formas sero geradas: a a Descritor A A11 A8 Registro lido TEMPORARIO TEMPORARIO TEMPORAR

Todos os caracteres transferidos sob o controle de um descritor A ou A<w> tm a espcie do item na lista e e de E/S. Alm disso, este descritor o unico que pode ser usado para transmitir outros tipos de caracteres, e e distintos dos caracteres padres. o Descritor geral G<w>.<d>[E<e>] O descritor de ediao geral pode ser usado para qualquer tipo intr c nseco de dados. Quando usado para os tipos real ou complexo, a sua aao idntica ` do descritor E<w>.<d>[E<e>], exceto que na sa de dados, c e e a da quando a magnitude (n) do valor est no intervalo a 0.1 0.5 10<d>1 n < 10<d> 0.5 ou zero quando <d>= 0, so convertidas como com o descritor F, seguidos pelo mesmo n mero de brancos que a u o descritor E teria reservado ` parte exponencial. Esta forma util para escrever valores cujas magnitudes no a e a so bem conhecidas previamente e quando a converso do descritor F prefer ` do descritor E. a a e vel a Quando o descritor G usado para os tipos inteiro, lgico e de caracteres, ele segue as regras dos respectivos e o descritores de ediao . c Tipos derivados Valores de tipos derivados so editados pela seqncia apropriada de descritores de ediao correspondentes a ue c aos tipos intr nsecos dos componentes do tipo derivado. Como exemplo, TYPE :: STRING INTEGER :: COMP CHARACTER(LEN= 20) :: PALAVRA END TYPE STRING TYPE(STRING) :: TEXTO READ(*, (I2,A))TEXTO
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

132

9.7. Descritores de edio ca

Edio de tamanho m ca nimo de campo Para possibilitar que os registros de sa contenham o m da nimo poss de espao no usado, os descritores vel c a I, F, B, O e Z podem especicar um tamanho de campo igual a zero, como em I0 ou F0.3. Isto no denota um a campo de tamanho nulo, mas um campo com o tamanho m nimo necessrio para conter o valor de sa em a da questo. Este recurso existe para que o programador no precise se preocupar se o tamanho de um campo a a e suciente para conter o dado, em cuja situaao o uso padro destes descritores iria gerar uma sa composta c a da somente por asteriscos. Descritor de edio de string de caracteres ca Uma constante de caracteres da espcie padro, sem um pametro de espcie especicado, pode ser transferida e a a e a um arquivo de sa inserindo-a na especicaao de formato, como no exemplo: da c PRINT(Este um exemplo!) e O qual vai gerar o registro de sa da: Este um exemplo e cada vez que o comando seja executado. Descritores de edio de string de caracteres no podem ser usados em ca a entrada de dados.

9.7.3

Descritores de controle de edio ca

Um descritor de controle de ediao age de duas formas: determinando como texto organizado ou afetando c e as converses realizadas por descritores de ediao de dados subseq entes. o c u Formato dos descritores de controle de edio ca Um descritor de controle de ediao pode assumir uma das seguintes formas em uma lista de formataao de c c E/S: <c> <c><n> <n><c> onde: <c> um dos seguintes cdigos de formato: T, TL, TR, X, S, SP, SS, BN, BZ, P, dois pontos (:) e a barra (/). e o <n> um n mero de posioes de caracteres. Este n mero no pode ser uma varivel; deve ser uma constante e u c u a a inteira positiva sem especicaao de parmetro de espcie de tipo. O intervalo de <n> inicia em 1 at c a e e um valor que depende do sistema. Em processadores Intel de 32 bits, por exemplo, o maior valor <n>= e 2**15 - 1. Em geral, descritores de controle de ediao no so repet c a a veis. A unica exceao a barra (/), a qual pode c e tambm ser precedida por um contador de repetiao. e c Os descritores de controle possuem a seguintes formas espec cas quanto `s suas funoes: a c Tipo de controle Posicional Sinal Interpretaao de brancos c Fator de escala Miscelneo a Descritores de controle T<n>, TL<n>, TR<n>, <n>X S, SP, SS BN, BZ <k>P :, /

O descritor P uma exceao ` sintaxe geral dos descritores. Ele precedido por um fator de escala (<k>), em e c a e vez de um especicador de posiao. c Descritores de controle de ediao tambm podem ser agrupados em parnteses e precedidos por um contador c e e de repetiao do grupo. c
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da Edio posicional ca

133

Os descritores T, TL, TR e X especicam a posiao onde o prximo caractere transferido de ou para um c o e registro. Na sa da, estes descritores no executam a converso e transferncia de caracteres propriamente dita, alm a a e e de no afetarem o tamanho do registro. Se caracteres so transferidos a posioes na posiao especicada por um a a c c destes descritores, ou aps esta, posioes saltadas e que no eram previamente preenchidas por brancos passam o c a a ser preenchidas. O resultado como se o registro por completo estava inicialmente preenchido por brancos. e Edio T ca O descritor T especica uma posiao de caractere em um registro de E/S. Ele toma a seguinte forma: c T<n> onde <n> uma constante positiva que indica a posiao de caractere do registro, relativa ao limite ` esquerda e c a do tabulador. Na entrada, o descritor posiciona o registro externo a ser lido na posiao de caractere especicada por <n>. c Na sa da, o descritor indica que a transferncia de dados inicia na <n>-sima posiao de caractere do registro e e c externo. Exemplos. Suponha que um arquivo possua um registro contendo o valor ABCXYZe o seguinte comando de leitura seja executado: CHARACTER(LEN= 3) :: VALOR1, VALOR2 ... READ(11,(T7,A3,T1,A3))VALOR1, VALOR2 Os valores lidos sero VALOR1= XYZ e VALOR2= ABC. a Suponha agora que o seguinte comando seja executado: PRINT 25 25 FORMAT(T51,COLUNA 2,T21,COLUNA 1) a seguinte linha impressa na tela do monitor (ou na sa padro): e da a 00000000011111111112222222222333333333344444444445555555555666666666677777777778 12345678901234567890123456789012345678901234567890123456789012345678901234567890 | | COLUNA 1 COLUNA 2 Deve-se notar que as constantes de caractere foram impressas iniciando nas colunas 20 e 50 e no nas colunas 21 a e 51. Isto ocorreu poruqe o primeiro caractere do registro impresso foi reservado como um caractere de controle. Este o comportamento padro na sa de dados. e a da Edio TL ca O descritor TL especica uma posiao de caractere a esquerda da posiao corrente no registro de E/S. O c ` c descritor toma a seguinte forma: TL<n> onde <n> uma constante inteira positiva indicando a <n>-sima posiao ` esquerda do caractere corrente. Se e e c a <n> maior ou igual ` posiao corrente, o prximo caractere acessado o primeiro caractere do registro. e a c o e Exemplo. No exemplo anterior, temos: PRINT 25 25 FORMAT(T51,COLUNA 2,T21,COLUNA 1,TL20,COLUNA 3) o que gera na tela: 00000000011111111112222222222333333333344444444445555555555666666666677777777778 12345678901234567890123456789012345678901234567890123456789012345678901234567890 | | | COLUNA 3 COLUNA 1 COLUNA 2
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

134 Edio TR ca

9.7. Descritores de edio ca

O descritor TR especica uma posiao de caractere a direita da posiao corrente no registro de E/S. O c ` c descritor toma a seguinte forma: TR<n> onde <n> uma constante inteira positiva indicando a <n>-sima posiao ` direita do caractere corrente. e e c a Edio X ca O descritor X especica uma posiao de caractere ` direita da posiao corrente no registro de E/S. Este c a c descritor equivalente ao descritor TR. O descritor X toma a seguinte forma: e <n>X onde <n> uma constante inteira positiva indicando a <n>-sima posiao ` direita do caractere corrente. Na e e c a sa este descritor no gera a gravaao de nenhum caractere quando ele se encontra no nal de uma especicaao da, a c c de formato. Edio de sinal ca Os descritores S, SP e SS controlam a sa do sinal de mais (+) opcional dentro de campos de sa da da numricos. Estes descritores no tm efeito durante a execuao de comandos de entrada de dados. e a e c Dentro de uma especicaao de formato, um descritor de ediao de sinal afeta todos os descritores de dados c c subseq entes I, F, E, EN, ES, D e G at que outro descritor de ediao de sinal seja inclu na formataao. u e c do c Edio SP ca O descritor SP fora o processador a produzir um sinal de mais em qualquer posiao subseq ente onde ele c c u seria opcional. O descritor toma a forma simples SP Edio SS ca O descritor SS fora o processador a suprimir um sinal de mais em qualquer posiao subseq ente onde ele c c u seria opcional. O descritor toma a forma simples SS Edio S ca O descritor S retorna o status do sinal de mais como opcional para todos os compos numricos subseq entes. e u O descritor toma a forma simples S Interpretao de brancos ca Os descritores BN e BZ controlam a interpretaao de brancos posteriores embebidos dentro de campos de c entrada numricos. Estes descritores no tm efeito durante a execuao de comandos de sa de dados. e a e c da Dentro de uma especicaao de formato, um descritor de ediao de brancos afeta todos os descritores de c c dados subseq entes I, B, O, Z, F, E, EN, ES, D e G at que outro descritor de ediao de brancos seja inclu na u e c do formataao. c Os descritores de ediao de brancos sobrepe-se ao efeito do especicador BLANK durante a execuao de um c o c comando de entrada de dados.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da Edio BN ca

135

O descritor BN fora o processador a ignorar todos os brancos posteriores embebidos em campos de entrada c numricos. O descritor toma a forma simples: e BN O campo de entrada tratado como se todos os brancos tivessem sido removidos e o restante do campo escrito e e na posiao mais ` direita. Um campo todo composto de brancos tratado como zero. c a e Edio BZ ca O descritor BZ fora o processador a interpretar todos os brancos posteriores embebidos em campos de c entrada numricos como zeros. O descritor toma a forma simples: e BN Edio de fator de escala P ca O descritor P especica um fator de escala, o qual move a posiao do ponto decimal em valores reais e das c duas partes de valores complexos. O descritor toma a forma <k>P onde <k> uma constante inteira com sinal (o sinal opcional, se positiva) especicando o n mero de posioes, e e u c para a esquerda ou para a direita, que o ponto decimal deve se mover (o fator de escala). O intervalo de valores de <k> de -128 a 127. e No in de um comando de E/S formatado, o valor do fator de escala zero. Se um descritor de escala cio e e especicado, o fator de escala xado, o qual afeta todos os descritores de ediao de dados reais subseq entes e c u at que outro descritor de escala ocorra. Para redenir a escala a zero, deve-se obrigatoriamente especicar 0P. e Na entrada, um fator de escala positivo move o ponto decimal para a esquerda e um fator negativo move o ponto decimal para direita. Quando um campo de entrada, usando os descritores F, E, D, EN, ES ou G, contm e um expoente expl cito, o fator de escala no tem efeito. Nos outros casos, o valor interno do dado lido na lista de a E/S igual ao campo externo multiplicado por 10<k>. Por exemplo, um fator de escala 2P multiplica um valor e de entrada por 0.01, movendo o ponto decimal duas posioes a esquerda. Um fator de escala -2P multiplica o c ` valor de entrada por 100, movendo o ponto decimal duas posioes a direita. c ` A seguinte tabela apresenta alguns exemplos do uso do especicador <k>P na entrada de dados: Formato 3PE10.5 3PE10.5 -3PE10.5 Campo de entrada 37.614 37.614E2 37.614 Valor interno .037614 3761.4 37614.0

O fator de escala deve preceder o primeiro descritor de ediao real associado com ele, mas no necessariamente c a deve preceder o descritor propriamente dito. Por exemplo, todos os seguintes formatos tm o mesmo efeito: e (3P,I6,F6.3,E8.1) (I6,3P,F6.3,E8.1) (I6,3PF6.3,E8.1) Note que se o fator de escala precede imediatamente o descritor real associado, a v rgula opcional. e Na sa da, um fator de escala positivo move o ponto decimal para a direita e um fator de escala negativo move o ponto decimal para a esquerda. Neste caso, o efeito do fator de escala depende em que tipo de ediao c real est associada com o mesmo, como segue: a Para ediao F, o valor externo iguala o valor interno da lista de E/S multiplicado por 10<k> , alterando a c magnitude do dado. Para edioes E e D, o campo decimal externo da lista de E/S multiplicado por 10<k> e <k> subtra do c e e do expoente, alterando a magnitude do dado. Um fator de escala positivo diminui o expoente; um fator de escala negativo aumenta o expoente. Para fator de escala positivo, <k> deve ser menor que <d>+2 seno a ocorrer um erro no processo de converso de sa a a da.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

136

9.7. Descritores de edio ca Para ediao G, o fator de escala no tem efeito se a magnitude do dado a ser impresso est dentro do c a a intervalo efetivo do descritor. Se a magnitude estiver fora do intervalo efetivo do descritor, ediao E c e usada e o fator de escala tem o mesmo efeito como neste caso. Para edioes EN e ES, o fator de escala no tem efeito. c a

A seguir, alguns exemplos de sa de dados usando o descritor P: da Formato 1PE12.3 1PE12.2 -1PE12.2 Campo de entrada -270.139 -270.139 -270.139 Valor interno -2.701E+02 -2.70E+02 -0.03E+04

O exemplo a seguir tambm usa ediao P: e c REAL, DIMENSION(6) :: A= 25.0 WRITE(6,10) A 10 FORMAT( , F8.2,2PF8.2,F8.2) resultando os seguintes valores gravados na unidade 6: 25.00 2500.00 2500.00 2500.00 2500.00 2500.00

Edio com barra (/) ca O descritor / termina a transferncia de dados para o registro corrente e inicia a transferncia de dados para e e um registro novo. Em um arquivo ou na tela, o descritor tem a aao de iniciar uma nova linha. c A forma que o descritor toma : e [<r>]/ onde <r> um contador de repetiao. O intervalo de <r> inicia em 1 at um valor que depende do sistema. Em e c e processadores intel de 32 bits, o valor mximo <r>= 2**15-1. a e M ltiplas barras foram o sistema a pular registros de entrada ou a gerar registros brancos na sa u c da, como segue: Quando n barras consecutivas aparecem entre dois descritores de ediao, n - 1 registros so pulados na c a entrada ou n - 1 registros brancos so gerados na sa a da. A primeira barra termina o registro corrente. A segunda barra termina o primeiro pulo ou registro em branco e assim por diante. Quando n barras consecutivas aparecem no in ou nal de uma especicaao de formato, n registros so cio c a pulados ou n registros em branco so gerados na sa a da, porque o parnteses inicial e nal da especicaao e c de formato so, por si mesmos, iniciadores ou nalizadores de registros, respectivamente a Por exemplo, dado a seguinte formataao de sa c da: WRITE(6,99) 99 FORMAT(1,T51,Linha Cabealho//T51,Sublinha Cabealho//) c c ir gerar os seguintes registros no arquivo: a 00000000011111111112222222222333333333344444444445555555555666666666677777777778 12345678901234567890123456789012345678901234567890123456789012345678901234567890 | Linha Cabealho c <linha em branco> Sublinha Cabealho c <linha em branco> <linha em branco>
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da Edio com dois pontos (:) ca

137

O descritor : termina o controle de formato se no houver mais a tens na lista de E/S. Por exemplo, supondo os seguintes comandos: PRINT 1, 3 PRINT 2, 13 1 FORMAT( I=,I2, J=,I2) 2 FORMAT( K=,I2,:, L=,I2) as seguintes linhas aparecem na sa da: I=3J= K=13 Se houver tens de E/S restantes, o descritor : no tem efeito. a

9.7.4

Descritores de edio de strings ca

Descritores de ediao de strings controlam a sa das constantes de string. Estes descritores so: c da a Constantes de caracteres Descritor de ediao H (eliminado no Fortran95). c Um descritor de ediao de strings no pode ser precedido por um contador de repetiao; contudo, eles podem c a c fazer parte de um grupo contido entre parnteses, o qual, por sua vez, precedido por um contador de repetiao. e e c Edio de constantes de caracteres ca O descritor de constante de caracteres provoca a sa de uma constante de string em um registro externo. da Ele vem em duas formas: <string> <string> onde <string> uma constante de caracteres, sem especicaao de espcie. O seu comprimento o n mero de e c e e u caracteres entre os delimitadores; dois delimitadores consecutivos so contados como um caractere. a Para incluir um apstrofe () em uma constante de caractere que delimitada por apstrofes, deve-se colocar o e o c duas apstrofes consecutivas ( ) na formataao. Por exemplo, o 50 FORMAT(Today s date is: ,i2,/,i2,/,i2) e Da mesma forma, para incluir aspas ( ) em uma constante de caractere que delimitada por aspas, deve-se colocar duas aspas consecutivas na formataao. c Como exemplo do uso dos comandos de E/S apresentados nas seoes 9.3 9.7, o programa a seguir abre c o arquivo pessoal.dat, o qual contm registros dos nomes de pessoas (at 15 caracteres), idade (inteiro de 3 e e d gitos), altura (em metros e centimetros) e n mero de telefone (inteiro de 8 d u gitos). O programa l estes dados e contidos em pessoal.dat e os imprime no monitor no formato: Altura Nome Idade (metros) Tel. No. -------------------P. A. Silva 45 1,80 33233454 J. C. Pedra 47 1,75 34931458 etc.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

138

9.8. Comando CLOSE

PROGRAM Pessoais_dados IMPLICIT NONE CHARACTER(LEN=15) :: name INTEGER :: age, tel_no, stat REAL :: height OPEN(UNIT=8, FILE=pessoal.dat) WRITE(*,100) 100 FORMAT(T24,Altura) WRITE(*,200) 200 FORMAT(T4,Nome,T17,Idade,T23,(metros),T32,Tel. No.) WRITE(*,300) 300 FORMAT(T4,----,T17,-----,T23, ------ ,T32,--------) DO READ(8, FMT=(a15,1x,i3,1x,f4.2,1x,i8), IOSTAT= stat) name, age, height, tel_no IF (stat<0) EXIT ! Testa final de arquivo WRITE(*,400) name, age, height, tel_no 400 FORMAT(A,T18,I3,T25,F4.2,T32,I8) END DO END PROGRAM Pessoais_dados sendo que o arquivo pessoal.dat possui a seguinte formataao: c P. A. Silva J. C. Pedra 045 1.80 33233454 047 1.75 34931458

Cabe ressaltar tambm que os comandos FORMAT utilizados nos rtulos 100, 200, 300 e 400 poderiam ser e o igualmente substitu dos pelo especicador FMT=. Por exemplo, as linhas WRITE(*,200) 200 FORMAT(T4,Nome,T17,Idade,T23,(metros),T32,Tel. No.) so equivalentes a a WRITE(*, FMT=(T4,Nome,T17,Idade,T23,(metros),T32,Tel. No.))

9.8

Comando CLOSE
CLOSE([UNIT=]<u>[, IOSTAT=<ios>][, ERR= <err-label>][, STATUS=<status>])

O propsito do comando CLOSE desconectar um arquivo de uma unidade. Sua forma : o e e

onde <u>, <ios> e <err-label> tm os mesmos signicados descritos para o comando OPEN (seao 9.3). Novae c mente, especicadores em palavras-chaves podem aparecer em qualquer ordem, mas o especicador de unidade deve ser o primeiro ser for usada a forma posicional. A funao do especicador STATUS= de determinar o que acontecer com o arquivo uma vez desconectado. c e a O valor de <status>, a qual uma expresso escalar de caracteres da espcie padro, pode ser um dos valores e a e a KEEP ou DELETE, ignorando qualquer branco posterior. Se o valor KEEP, um arquivo que existe continuar e a existindo aps a execuao do comando CLOSE, e pode ser posteriormente conectado novamente a uma unidade. o c Se o valor DELETE, o arquivo no mais existir aps a execuao do comando. Se o especicador for omitido, e a a o c o valor padro KEEP, exceto se o arquivo tem o status SCRATCH, em cujo caso o valor padro DELETE. a e a e Em qualquer caso, a unidade ca livre para ser conectada novamente a um arquivo. O comando CLOSE pode aparecer em qualquer ponto no programa e se executado para uma unidade no existente ou desconectada, e a nada acontece. No nal da execuao de um programa, todas as unidades conectadas so fechadas, como se um comando c a CLOSE sem o especicador STATUS= fosse aplicado a cada unidade conectada. Como exemplo: CLOSE(2, IOSTAT=IOS, ERR=99, STATUS=DELETE)
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da

139

9.9

Comando INQUIRE

O status de um arquivo pode ser denido pelo sistema operacional antes da execuao do programa ou pelo c programa durante a sua execuao, seja por um comando OPEN ou seja por alguma aao sobre um arquivo prc c e conectado que o faz existir. Em qualquer momento, durante a execuao do programa, poss c e vel inquirir a respeito do status e atributos de um arquivo usando o comando INQUIRE. Usando uma variante deste comando, poss e vel determinar-se o status de uma unidade; por exemplo, se o n mero de unidade existe para o sistema em questo, se o n mero est conectado a um arquivo e, em caso u a u a armativo, quais os atributos do arquivo. Outra variante do comando permite inquirir-se a respeito do tamanho de uma lista de sa quando usada para escrever um registro no formatado. da a Alguns atributos que podem ser determinados pelo uso do comando INQUIRE so dependentes de outros. a Por exemplo, se um arquivo no est conectado a uma unidade, no faz sentido inquirir-se a respeito da forma a a a de acesso que est sendo usada para este arquivo. Se esta inquiriao feita, de qualquer forma, o especicador a c e relevante ca indenido. As trs variantes do comando so conhecidas como INQUIRE por arquivo, INQUIRE por unidade e INQUIRE e a por lista de sa da. Na descriao feita a seguir, as primeiras duas variantes so descritas juntas. Suas formas so: c a a INQUIRE({[UNIT=]<u>|FILE=<arq>}[, IOSTAT=<ios>][, ERR=<err-label>] & [, EXIST=<ex>][, OPENED=<open>][, NUMBER=<num>][, NAMED=<nmd>] & [, NAME=<nam>][, ACCESS=<acc>][, SEQUENTIAL=<seq>][, DIRECT=<dir>] & [, FORM=<frm>][, FORMATTED=<fmt>][, UNFORMATTED=<unf>][, RECL=<rec>] & [, NEXTREC=<nr>][, BLANK=<bl>][, POSITION=<pos>][, ACTION=<act>] & [, READ=<rd>][, WRITE=<wr>][, READWRITE=<rw>][, DELIM=<del>][, PAD=<pad>]) onde os especicadores entre chaves ({}) so excludentes; o primeiro deve ser usado no caso de INQUIRE por a unidade e o segundo no caso de INQUIRE por arquivo. Neste ultimo caso, <arq> uma expresso escalar de e a caracteres cujo valor, ignorando quaisquer brancos posteriores, fornece o nome do arquivo envolvido, incluindo o caminho. A interpretaao de <arq> depende do sistema. Em um sistema Unix/Linux, o nome depende do c caso. Um especicador no pode aparecer mais de uma vez na lista de especicadores opcionais. Todas as atria buioes de valores aos especicadores seguem as regras usuais e todos os valores do tipo de caracteres, exceto c no caso de NAME= so mai sculos. Os especicadores, cujos valores so todos escalares e da espcie padro so: a u a e a a IOSTAT= <ios>, tem o mesmo signicado descrito no comando OPEN (seao 9.3). A varivel <ios> a unica c a e denida se uma condiao de erro ocorre durante a execuao do INQUIRE. c c ERR= <err-label>, tem o mesmo signicado descrito no comando OPEN (seao 9.3). c EXIST= <ex>, onde <ex> uma varivel lgica. O valor .TRUE. atribu se o arquivo (ou unidade) existir e e a o e do .FALSE. em caso contrrio. a OPENED= <open>, onde <open> uma varivel lgica. O valor .TRUE. atribu se o arquivo (ou unidade) e a o e do estiver conectado a uma unidade (ou arquivo) e .FALSE. em caso contrrio. a NUMBER= <num>, onde <num> uma varivel inteira ` qual atribu o n mero da unidade conectada ao e a a e do u arquivo, ou -1 se nenhuma unidade estiver conectada ao arquivo. NAMED= <nmd>, NAME= <nam>, onde <nmd> uma varivel lgica ` qual o valor .TRUE. atribu se o arquivo tem um nome ou e a o a e do .FALSE. em caso contrrio. Se o arquivo tem um nome, este ser atribu ` varivel de caracteres <nam>. a a do a a Este valor no necessariamente o mesmo que dado no especicador FILE=, se usado, mas pode ser a e e qualicado de alguma forma. Contudo, em qualquer situaao um nome vlido para uso em um comando c e a OPEN subseq ente. Assim, o INQUIRE pode ser usado para determinar o valor real de um arquivo antes u deste ser conectado. Dependendo do sistema, o nome depende do caso. ACCESS= <acc>, onde <acc> uma varivel de caracteres ` qual so atribu e a a a dos um dos valores SEQUENTIAL ou DIRECT dependendo do mtodo de acesso para um arquivo que est conectado e UNDEFINED se no e a a houver conexo. a SEQUENTIAL= <seq>,
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

140

9.9. Comando INQUIRE

DIRECT= <dir>, onde <seq> e <dir> so variveis de caracteres `s quais so atribu a a a a dos os valores YES, NO ou UNKNOWN, dependendo se o arquivo puder ser aberto para acesso direto ou seq encial, respectivamente, u ou se isto no pode ser determinado. a FORM= <frm>, onde <frm> uma varivel de caracteres ` qual so atribu e a a a dos um dos valores FORMATTED ou UNFORMATTED, dependendo na forma para a qual o arquivo realmente conectado, ou UNDEFINED se e no houver conexo. a a FORMATTED= <fmt>, UNFORMATTED= <unf>, onde <fmt> e <unf> so variveis de caracteres `s quais so atribu a a a a dos os valores YES, NO ou UNKNOWN, dependendo se o arquivo puder ser aberto para acesso formatado ou no formatado, a respectivamente, ou se isto no pode ser determinado. a RECL= <rec>, onde <rec> uma varivel inteira ` qual atribu o valor do tamanho do registro de um e a a e do arquivo conectado para acesso direto, ou o tamanho mximo do registro permitido para um arquivo a conectado para acesso seq encial. O comprimento o n mero de caracteres para registros formatados u e u contendo somente caraacteres do tipo padro e dependente do sistema em caso contrrio. Se no houver a a a conexo, <rec> resulta indenido. a NEXTREC= <nr>, onde <nr> uma varivel inteira ` qual atribu o valor do n mero do ultimo registro lido e a a e do u ou escrito, mais um. Se nenhum registro foi ainda lido ou escrito, <nr>= 1. Se o arquivo no estiver a conectado para acesso direto ou se a posiao indeterminada devido a um erro anterior, <nr> resulta c e indenido. BLANK= <bl>, onde <bl> uma varivel de caracteres ` qual so atribu e a a a dos os valores NULL ou ZERO, dependendo se os brancos em campos numricos devem ser por padro interpretados como campos de e a nulos ou de zeros, respectivamente, ou UNDEFINED se ou no houver conexo ou se a conexo no for a a a a para E/S formatada. POSITION= <pos>, onde <pos> uma varivel de caracteres ` qual so atribu e a a a dos os valores REWIND, APPEND ou ASIS, conforme especicado no correspondente comando OPEN, se o arquivo no foi reposicionado a desde que foi aberto. Se no houver conexo ou se o arquivo est conectado para acesso direto, o valor a a a UNDEFINED. Se o arquivo foi reposicionado desde que a conexo foi estabelecida, o valor depende e a do processador (mas no deve ser REWIND ou APPEND exceto se estes corresponderem ` verdadeira a a posiao). c ACTION= <act>, onde <act> uma varivel de caracteres ` qual so atribu e a a a dos os valores READ, WRITE ou READWRITE, conforme a conexo. Se no houver conexo, o valor UNDEFINED. a a a e READ= <rd>, onde <rd> uma varivel de caracteres ` qual so atribu e a a a dos os valores YES, NO ou UNKNOWN, dependendo se leitura permitida, no permitida ou indeterminada para o arquivo. e a WRITE= <wr>, onde <wr> uma varivel de caracteres ` qual so atribu e a a a dos os valores YES, NO ou UNKNOWN, dependendo se escrita permitida, no permitida ou indeterminada para o arquivo. e a READWRITE= <rw>, onde <rw> uma varivel de caracteres ` qual so atribu e a a a dos os valores YES, NO ou UNKNOWN, dependendo se leitura e escrita so permitidas, no permitidas ou indeterminadas para o a a arquivo. DELIM= <del>, onde <del> uma varivel de caracteres ` qual so atribu e a a a dos os valores QUOTE, APOSTROPHE ou NONE, conforme especicado pelo correspondente comando OPEN (ou pelo valor padro). Se no houver a a conexo, ou se o arquivo no estiver conectado para E/S formatada, o valor UNDEFINED. a a e PAD= <pad>, onde <pad> uma varivel de caracteres ` qual so atribu e a a a dos os valores YES, caso assim especicado pelo correspondente comando OPEN (ou pelo valor padro); em caso contrrio, o valor NO. a a e Uma varivel que a especicaao em um comando INQUIRE, ou est associada com um, no deve aparecer em a e c a a outra especicador no mesmo comando. A terceira variante do comando INQUIRE, INQUIRE por lista de E/S, tem a forma: INQUIRE(IOLENGTH=<comp>) <lista-sada>
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

Cap tulo 9. Comandos de Entrada/Sa de Dados da

141

onde <comp> uma varivel inteira escalar padro que usada para determinar o compriemento de uma e a a e <lista-sada> no formatada em unidades que dependem do processador. Esta varivel pode ser usada para a a estabelecer se, por exemplo, uma lista de sa muito grande para o tamanho do registro dado pelo especicada e dor RECL= de um comando OPEN, ou ser usado como o valor do comprimento a ser determinado ao especicador RECL=. Um exemplo de uso do comando INQUIRE dado abaixo: e LOGICAL :: EX, OP CHARACTER(LEN= 11) :: NAM, ACC, SEQ, FRM INTEGER :: IREC, NR ... OPEN(2, IOSTAT= IOS, ERR= 99, FILE= Cidades, STATUS= NEW, & ACCESS= DIRECT, RECL= 100) INQUIRE(2, ERR= 99, EXIST= EX, OPENED= OP, NAME= NAM, ACCESS= ACC, & SEQUENTIAL= SEQ, FORM= FRM, RECL= IREC, NEXTREC= NR) Aps execuao bem sucedida dos comandos OPEN e INQUIRE, as variveis tero os seguintes valores: o c a a EX= .TRUE. OP= .TRUE. NAM= Cidades ACC= DIRECT SEQ= NO FRM= UNFORMATTED IREC= 100 NR= 1

9.10

Outros comandos de posicionamento

Outros comandos que exercem funoes de controle no arquivo, em adiao ` entrada e sa de dados, so c c a da a fornecidos abaixo.

9.10.1

Comando BACKSPACE

Pode acontecer em um programa que uma srie de registros sejam escritos e que, por alguma razo, o ultimo e a registro escrito deve ser substitu por um novo; isto , o ultimo registro deve ser sobrescrito. De forma do e similar, durante a leitura dos registros, pode ser necessrio reler o ultimo registro, ou vericar por leitura o a ultimo registro escrito. Para estes propsitos, Fortran fornece o comando BACKSPACE, o qual tem a sintaxe o BACKSPACE([UNIT=]<u>[, IOSTAT=<ios>][, ERR=<err-label>]) onde <u> uma expresso inteira escalar padro que designa o n mero da unidade e os outros especicadores e a a u opcionais tm o mesmo signicado que no comando READ (seao 9.4). e c A aao deste comando posicionar o arquivo antes do registro corrente, se houver. Se o comando for tentado c e quando o registro estiver no in do arquivo, nada ocorre. Se o arquivo estiver posicionado aps um registro cio o de nal de arquivo, este resulta posicionado antes deste registro. No poss solicitar BACKSPACE em um arquivo que no exista, nem sobre um registro escrito por um a e vel a comando NAMELIST. Uma serie de comandos BACKSPACE resultar no retrocesso no n mero correspondente de a u registros.

9.10.2

Comando REWIND

De forma semelhante a uma re-leitura, re-escritura ou vericaao por leitura de um registro, uma operaao c c` similar pode ser realizada sobre um arquivo completo. Com este propsito, o comando REWIND: o REWIND([UNIT=]<u>[, IOSTAT=<ios>][ERR=<err-label>]) pode ser usado para reposicionar um arquivo, cujo n mero de unidade especicado pela expresso escalar u e a inteira <u>. Novamente, os demais especicadores opcionais tm o mesmo signicado que no comando READ. e Se o arquivo j estiver no seu in a cio, nada ocorre. O mesmo ocorre caso o arquivo no exista. a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de mar o de 2008 c

142

9.10. Outros comandos de posicionamento

9.10.3

Comando ENDFILE

O nal de um arquivo conectado para acesso seq encial normalmente marcado por um registro especial, u e denominado registro de nal de arquivo, o qual assim identicado pelo computador. e Quando necessrio, poss escrever-se um registro de nal de arquivo explicitamente, usando o comando a e vel ENDFILE: ENDFILE([UNIT=]<u>[, IOSTAT=<ios>][, ERR=<err-label>]) onde todos os argumentos tm o mesmo signicado que nos comandos anteriores. e O arquivo ento posicionado aps o registro de nal de arquivo. Este registro, se lido subseq entemente por e a o u um programa, deve ser manipulado usado a especicaao END=<end-label> do comando READ seno a execuao c a c do programa ir normalmente terminar. a Antes da transferncia de dados, um arquivo no pode estar posicionado aps o registro de nal de are a o quivo, mas poss retroceder com os comandos BACKSPACE ou REWIND, o que permite a ocorrncia de outras e vel e transferncias de dados. e Um registro de nal de arquivo automaticamente escrito sempre quando ou uma operaao de retrocesso e c parcial ou completo segue um operaao de escrita como a operaao seguinte na unidade; quando o arquivo c c e fechado por um comando CLOSE, por um novo comando OPEN na mesma unidade ou por encerramento normal do programa. Se o arquivo tambm pode ser conectado para acesso direto, somente os registros alm do registro de nal e e de arquivo so considerados como escritos e somente estes podem ser lidos em uma conexo de acesso direto a a subseq ente. u

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de mar o de 2008 c

Indice Remissivo
Ambito Nomes, 116 Rtulos, 116 o COUNT, rotina intr nseca, 72 EXTERNAL, atributo e declaraao, 96 c FORALL, comando e construto, 60 INTENT, atributo e declaraao, 82 c Interfaces, 84 Genricas, 112, 115 e INTRINSIC, atributo e declaraao, 63 c Mdulos, 105 o Dados globais, 106 Rotinas de, 109 Rotinas genricas, 112, 115 e Matrizes Ajustveis, 91 a Alocveis, 57 a Automticas, 93 a Construtores de, 52 Expresses e atribuioes, 47 o c Format assumida, 92 Seoes de, 49 c Tamanho assumido, 91 Terminologia, 43 Tipos derivados, 45 ONLY, opao, 105, 108 c PRIVATE, atributo e declaraao, 111 c PUBLIC, atributo e declaraao, 111 c nseca, 76 RANDOM NUMBER, rotina intr RANDOM SEED, rotina intr nseca, 76 RESHAPE, rotina intr nseca, 54, 73 RETURN, comando, 82 Rotinas, 79 Argumentos, 81 Matrizes, 90 Opcionais, 89 Palavras-Chave, 86 Subprogramas como argumentos, 95 Tipos derivados, 90 Elementais, 104 Externas, 84 Genricas, 112 e 143 Internas, 81 Intr nsecas SINH, 66 Puras, 102 Recursivas, 99 Rotinas de mdulos, 109 o Valor matricial, 96 SAVE, atributo e declaraao, 101 c WHERE, comando e construto, 55