You are on page 1of 160

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.c

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, Fundao Universidade a ca Federal de Pelotas, Pelotas - RS.

In cio: Janeiro de 2005.

Verso: 24 de fevereiro de 2009 a

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.c

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.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.2.1 Recursos novos do Fortran 90 . . . . . . . . 1.2.2 Recursos em obsolescncia do Fortran 90 . e 1.2.3 Recursos removidos do Fortran 90 . . . . . 1.3 Uma reviso menor: Fortran 95 . . . . . . . . . . . a 1.3.1 Recursos novos do Fortran 95 . . . . . . . . 1.3.2 Recursos em obsolescncia do Fortran 95 . e 1.3.3 Recursos removidos do Fortran 95 . . . . . 1.4 O Fortran no Sculo XXI: Fortran 2003 . . . . . . e 1.4.1 Recursos novos do Fortran 2003 . . . . . . . 1.4.2 Recursos em obsolescncia do Fortran 2003 e 1.4.3 Recursos removidos do Fortran 2003 . . . . 1.5 O novo padro: Fortran 2008 . . . . . . . . . . . . a 1.5.1 Recursos novos do Fortran 2008 . . . . . . . 1.6 Comentrios sobre a bibliograa . . . . . . . . . . a 1.7 Agradecimentos . . . . . . . . . . . . . . . . . . . . 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 3 3 4 4 4 5 5 6 6 6 7 7 7 8 8 9 9 11 11 12 13 13 14 14 15 15 17 17 17 17 18 18 19 21 22 22 22 23 23

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

3 Tipos de Variveis a 3.1 Declarao de tipo de varivel . . . . . . . . . . ca 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 Funes intr co 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 . . . . . . . . . . . . . . . . . . i

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr a c k

4 Expresses e Atribuies Escalares o co 4.1 Regras bsicas . . . . . . . . . . . . . . . . . . a 4.2 Expresses numricas escalares . . . . . . . . . o e 4.3 Atribuies numricas escalares . . . . . . . . . co e 4.4 Operadores relacionais . . . . . . . . . . . . . . 4.5 Expresses e atribuies lgicas escalares . . . . o co o 4.6 Expresses e atribuies de caracteres escalares o co 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 . . . . . . . 5.1.4 Comando IF aritmtico . . . . . . . . . e 5.1.5 Comandos ASSIGN e GO TO atribu . . do 5.1.6 Laos DO rotulados . . . . . . . . . . . . c 5.2 Comando e construto IF . . . . . . . . . . . . . 5.2.1 Comando IF . . . . . . . . . . . . . . . 5.2.2 Construto IF . . . . . . . . . . . . . . . 5.3 Construto CASE . . . . . . . . . . . . . . . . . . 5.4 Construto DO . . . . . . . . . . . . . . . . . . . 5.4.1 Construto DO ilimitado . . . . . . . . . . 5.4.2 Instruo EXIT . . . . . . . . . . . . . . ca 5.4.3 Instruo CYCLE . . . . . . . . . . . . . ca

.c

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

27 27 28 29 30 30 32 35 35 35 36 36 36 37 37 38 38 38 39 41 43 43 44 47 47 51 53 54 54 54 55 55 57 58 58 59 59 59 60 61 64 64 64 67 67 67 68 68 68 69 69 70 70 70 71 71

.d o

c u -tr a c k

.c

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6 Processamento de Matrizes 6.1 Terminologia e especicaes de matrizes . . . . . co 6.2 Expresses e atribuies envolvendo matrizes . . . o co 6.3 Sees de matrizes . . . . . . . . . . . . . . . . . . co 6.3.1 Subscritos simples . . . . . . . . . . . . . . 6.3.2 Tripleto de subscritos . . . . . . . . . . . . 6.3.3 Vetores de subscritos . . . . . . . . . . . . . 6.4 Atribuies de matrizes e sub-matrizes . . . . . . . co 6.5 Matrizes de tamanho zero . . . . . . . . . . . . . . 6.6 Construtores de matrizes . . . . . . . . . . . . . . . 6.6.1 A funo intr ca 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 Declarao e atributo INTRINSIC . . . . . . . . . . . . . ca 7.3 Funes inquisidoras de qualquer tipo . . . . . . . . . . co 7.4 Funes elementais numricas . . . . . . . . . . . . . . . co e 7.4.1 Funes elementais que podem converter . . . . . co 7.4.2 Funes elementais que no convertem . . . . . . co a 7.5 Funes elementais matemticas . . . . . . . . . . . . . co a 7.6 Funes elementais lgicas e de caracteres . . . . . . . . co o 7.6.1 Converses caractere-inteiro . . . . . . . . . . . . o 7.6.2 Funes de comparao lxica . . . . . . . . . . . co ca e 7.6.3 Funes elementais para manipulaes de strings co co 7.6.4 Converso lgica . . . . . . . . . . . . . . . . . . a o
Autor: Rudi Gaelzer IFM/UFPel

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Impresso: 24 de fevereiro de 2009

ii

SUMARIO

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

7.7

7.8

7.9

7.10 7.11 7.12

7.13

7.14

7.15 7.16 7.17

Funes no-elementais para manipulao de strings . . . . . . co a ca 7.7.1 Funo inquisidora para manipulao de strings . . . . . ca ca 7.7.2 Funes transformacionais para manipulao de strings co ca Funes inquisidoras e de manipulaes numricas . . . . . . . co co e 7.8.1 Modelos para dados inteiros e reais . . . . . . . . . . . . 7.8.2 Funes numricas inquisidoras . . . . . . . . . . . . . . co e 7.8.3 Funes elementais que manipulam quantidades reais . . co 7.8.4 Funes transformacionais para valores de espcie (kind) co e Rotinas de manipulao de bits . . . . . . . . . . . . . . . . . . ca 7.9.1 Funo inquisidora . . . . . . . . . . . . . . . . . . . . . ca 7.9.2 Funes elementais . . . . . . . . . . . . . . . . . . . . . co 7.9.3 Subrotina elemental . . . . . . . . . . . . . . . . . . . . Funo de transferncia . . . . . . . . . . . . . . . . . . . . . . ca e Funes de multiplicaao vetorial ou matricial . . . . . . . . . . co c Funes transformacionais que reduzem matrizes . . . . . . . . co 7.12.1 Caso de argumento unico . . . . . . . . . . . . . . . . . 7.12.2 Argumento opcional DIM . . . . . . . . . . . . . . . . . . 7.12.3 Argumento opcional MASK . . . . . . . . . . . . . . . . . Funes inquisidoras de matrizes . . . . . . . . . . . . . . . . . co 7.13.1 Status de alocao . . . . . . . . . . . . . . . . . . . . . ca 7.13.2 Limites, forma e tamanho . . . . . . . . . . . . . . . . . Funes de construo e manipulao de matrizes . . . . . . . . co ca ca 7.14.1 Funo elemental MERGE . . . . . . . . . . . . . . . . . . ca 7.14.2 Agrupando e desagrupando matrizes . . . . . . . . . . . 7.14.3 Alterando a forma de uma matriz . . . . . . . . . . . . 7.14.4 Funo transformacional para duplicao . . . . . . . . ca ca 7.14.5 Funes de deslocamento matricial . . . . . . . . . . . . co 7.14.6 Transposta de uma matriz . . . . . . . . . . . . . . . . . Funes transformacionais para localizao geomtrica . . . . . co ca e Funo transformacional para dissociao de ponteiro . . . . . ca ca Subrotinas intr nsecas no-elementais . . . . . . . . . . . . . . . a 7.17.1 Relgio de tempo real . . . . . . . . . . . . . . . . . . . o 7.17.2 Tempo da CPU . . . . . . . . . . . . . . . . . . . . . . . 7.17.3 Nmeros aleatrios . . . . . . . . . . . . . . . . . . . . . u o

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

71 71 71 72 72 72 73 73 73 74 74 75 75 75 75 75 76 76 76 76 76 77 77 77 77 78 78 78 78 78 79 79 79 79

8 Sub-Programas 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 sub-programas . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 Funes e subrotinas . . . . . . . . . . . . . . . . . . . co 8.2.2 Rotinas internas . . . . . . . . . . . . . . . . . . . . . 8.2.3 Argumentos de sub-programas . . . . . . . . . . . . . 8.2.4 Comando RETURN . . . . . . . . . . . . . . . . . . . . . 8.2.5 Atributo e declarao INTENT . . . . . . . . . . . . . . ca 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 Fortran 77 . . 8.2.11.2 Matrizes como argumentos em Fortran 90/95 8.2.12 sub-programas como argumentos de rotinas . . . . . . 8.2.13 Funes de valor matricial . . . . . . . . . . . . . . . . co 8.2.14 Recursividade e rotinas recursivas . . . . . . . . . . . 8.2.15 Atributo e declarao SAVE . . . . . . . . . . . . . . . ca
Autor: Rudi Gaelzer IFM/UFPel

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

81 . 81 . 81 . 83 . 83 . 83 . 83 . 85 . 85 . 86 . 86 . 88 . 88 . 90 . 93 . 94 . 94 . 94 . 96 . 99 . 100 . 103 . 105

Impresso: 24 de fevereiro de 2009

SUMARIO

iii

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr a c k

.c

.d o

c u -tr a c k

.c

8.3

8.4

8.2.16 Funes de efeito lateral e rotinas puras . . . . . . . . . . . . . co 8.2.17 Rotinas elementais . . . . . . . . . . . . . . . . . . . . . . . . . Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 8.3.1 Dados globais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2 Rotinas de mdulos . . . . . . . . . . . . . . . . . . . . . . . . o 8.3.3 Atributos e declaraes PUBLIC e PRIVATE . . . . . . . . . . . . co 8.3.4 Interfaces e rotinas genricas . . . . . . . . . . . . . . . . . . . e 8.3.5 Estendendo rotinas intr nsecas via blocos de interface genricos e Ambito (Scope) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4.1 Ambito dos rtulos . . . . . . . . . . . . . . . . . . . . . . . . . o 8.4.2 Ambito dos nomes . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

106 108 109 110 113 115 116 120 120 120 121 123 123 127 131 131 134 135 136 137 137 138 141 147 148 148 151 151 151 151

9 Comandos de Entrada/Sa de Dados da 9.1 Comandos de Entrada/Sa da: introduo rpida ca a 9.2 Declarao NAMELIST . . . . . . . . . . . . . . . . ca 9.3 Unidades lgicas . . . . . . . . . . . . . . . . . . o 9.4 Comando OPEN . . . . . . . . . . . . . . . . . . . 9.5 Comando READ . . . . . . . . . . . . . . . . . . . 9.6 Comandos PRINT e WRITE . . . . . . . . . . . . . 9.7 Comando FORMAT e especicador FMT= . . . . . . 9.8 Descritores de edio . . . . . . . . . . . . . . . . ca 9.8.1 Contadores de repetio . . . . . . . . . . ca 9.8.2 Descritores de edio de dados . . . . . . ca 9.8.3 Descritores de controle de edio . . . . . ca 9.8.4 Descritores de edio de strings . . . . . . ca 9.9 Comando CLOSE . . . . . . . . . . . . . . . . . . 9.10 Comando INQUIRE . . . . . . . . . . . . . . . . . 9.11 Outros comandos de posicionamento . . . . . . . 9.11.1 Comando BACKSPACE . . . . . . . . . . . . 9.11.2 Comando REWIND . . . . . . . . . . . . . . 9.11.3 Comando ENDFILE . . . . . . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

iv

SUMARIO

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.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. http://www.liv.ac.uk/HPC/HTMLFrontPageF90.html, 1996. Acesso em: 01 jun. 2005. [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, 1995. Acesso em: 01 jun. 2005. [6] REID, JOHN. The New Features of Fortran 2003. tran/john reid new 2003.pdf, 2004. Acesso em: 03 Jun. 2006. http://www.kcl.ac.uk/kis/support/cit/for-

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr a c k

.c

.d o

c u -tr a c k

.c

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

vi

REFERENCIAS BIBLIOGRAFICAS

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.c

Cap tulo 1

Introduo ca
I dont know what the technical characteristics of the standard language for scientic and engineering computation in the year 2000 will be... but I know it will be called Fortran. John Backus Esta apostila destina-se ao aprendizado da Linguagem de Programao Fortran 95. ca

1.1

As origens da Linguagem Fortran

Programao no per ca odo inicial do uso de computadores para a soluo de problemas em f ca 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 instrues, registradores, endereos de memria e outros co 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 notao numrica denominada cdigo octal. Com o tempo, cdigos mnemo ca e o o o nicos foram introduzidos, uma forma de programao conhecida como cdigo numrico ou cdigo Assembler. ca o e o Estes cdigos eram traduzidos em instrues para a CPU por programas conhecidos como Assemblers. Durante o co os anos 50 cou claro que esta forma de programao era de todo inconveniente, no m ca nimo, devido ao tempo necessrio para se escrever e testar um programa, embora esta forma de programao possibilitasse um uso a ca 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-n vel, 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 construo do e ca 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 soluo do problema em questo. Mais importante ainda, ca a computadores se tornaram acess veis a qualquer cientista ou engenheiro disposto a devotar um pequeno esforo c na aquisio de um conhecimento bsico em Fortran; a tarefa da programao no estava mais restrita a um ca a ca a corpus pequeno de programadores especialistas. O Fortran disseminou-se rapidamente, principalmente nas reas da f a 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 Associao Americana de Padres (American Standards o ca o Association), posteriormente Instituto Americano Nacional de Padres (American National Standards Institute, o ou ANSI) originou o primeiro padro para uma linguagem de programao, agora conhecido como Fortran a ca 66. Essencialmente, era uma subconjunto comum de vrios dialetos, de tal forma que cada dialeto poderia a
1 Do

ingls: Central Processing Unit. e

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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 execuo eciente de cdigo. Era, por exemplo, uma linguagem que permanecia prxima (e ca o o explorava) o hardware dispon vel, ao invs de ser um conjunto de conceitos abstratos. Ela tambm introduziu, e e atravs das declaraes COMMON e EQUIVALENCE, a possibilidade dos programadores controlarem a alocao da e co ca armazenagem de dados de uma forma simples, um recurso que era necessrio nos primrdios da computao, a o ca quando havia pouco espao de memria, mesmo que estas declaraes sejam agora consideradas potencialmente c o co 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 proliferao de dialetos permaneceu um problema mesmo aps a publicao do padro Fortran 66. A ca o ca a primeira diculdade foi que muitos compiladores no aderiram ao padro. A segunda foi a implementao, em a a ca 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 situao, combinada com a existncia de falhas evidentes na linguagem, tais como a falta de construes ca e co estruturadas de programao, resultaram na introduo de um grande nmero de pr-processadores. Estes eram ca ca 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 publicao de um novo padro, em 1978, conhecido ca 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 transio entre o Fortran 66 e o Fortran 77 foi muito mais longo que deveria, devido aos ca atrasos na elaborao de novas verses dos compiladores e os dois padres coexistiram durante um intervalo de ca 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 programao dispon o e a ca vel para os programadores. Ao longo do tempo, novas linguagens foram desenvolvidas e, onde elas se mostraram mais adequadas para um tipo particular de aplicao, foram adotadas em seu lugar. A superioridade do Fortran ca sempre esteve na rea de aplicaes numricas, cient a co 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 freqente, 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 modernizao da linguagem, o comit tcca e e nico X3J3, aprovado pela ANSI, trabalhando como o corpo de desenvolvimento do comit da ISO (International e Standards Organization, Organizao Internacional de Padres) ISO/IEC JTC1/SC22/WG5 (doravante conheca 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 modernizao, em resposta aos desenvolvimentos nos o ca conceitos de linguagens de programao que eram explorados em outras linguagens tais como APL, Algol, Pascal, ca 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 associao de armazenagem a ca de dados, de abolir a rigidez agora desnecessria do formato xo de fonte, bem como de aumentar a segurana a c na programao. Para proteger o investimento em Fortran 77, todo o padro anterior foi mantido como um ca 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 notao concisa mais poderosa e a a ca
Autor: Rudi Gaelzer IFM/UFPel Impresso: 24 de fevereiro de 2009

1.2. O padro Fortran 90 a

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

habilidade de denir e manipular tipos de dados denidos pelo programador. O primeiro destes recursos leva a uma simplicao na escrita de muitos problemas matemticos e tambm torna o Fortran uma linguagem mais ca 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 elaboraes. co

1.2.1

Recursos novos do Fortran 90

Um resumo dos novos recursos dado a seguir: e


O Fortran 90 possui uma maneira para rotular alguns recursos antigos como em obsolescncia (isto , e e tornando-se obsoletos). Operaes de matrizes. co Ponteiros. Recursos avanados para computao numrica usando um conjunto de funes inquisidoras numricas. c ca e co e Parametrizao dos tipos intr ca 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 Tipos de dados derivados, denidos pelo programador, compostos por estruturas de dados arbitrrias e de a operaes sobre estas estruturas. co Facilidades na denio de coletneas denominadas mdulos, uteis para denies globais de dados e para ca a o co bibliotecas de subprogramas. Exigncia que o compilador detecte o uso de construes que no se conformam com a linguagem ou que e co a estejam em obsolescncia. e Um novo formato de fonte, adequado para usar em um terminal. Novas estruturas de controle, tais como SELECT CASE e uma nova forma para os laos DO. c A habilidade de escrever subprogramas internos e subprogramas recursivos e de chamar subprogramas com argumentos opcionais. Alocao dinmica de dados (matrizes automticas, matrizes alocveis e ponteiros). ca a a a Melhoramentos nos recursos de entrada/sa de dados. da 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 adaptao. ca 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 remoo de alguns recursos evidente; se a unica ao e ca e ca adotada pelo X3J3 fosse de adicionar novos recursos, a linguagem se tornaria grotescamente ampla, com muitos tens redundantes e sobrepostos. A soluo nalmente adotada pelo comit foi de publicar como uma apndice ca e e ao padro um conjunto de duas listas mostrando quais os a tens que foram removidos e quais so os candidatos a para uma eventual remoo. ca A primeira lista contm os recursos removidos (deleted features). A segunda lista contm os recursos em e e obsolescncia (obsolescent features), os quais so considerados obsoletos e redundantes, sendo assim candidatos e a ` remoo na prxima reviso da linguagem. a ca o a

1.2.2

Recursos em obsolescncia do Fortran 90 e

Os recursos em obsolescncia do Fortran 90 so: e a


IF aritmtico; e desvio para uma declarao END IF a partir de um ponto fora de seu bloco; ca
Autor: Rudi Gaelzer IFM/UFPel Impresso: 24 de fevereiro de 2009

Cap tulo 1. Introduo ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

variveis reais e de dupla preciso nas expresses de controle de um comando DO; a a o nalizao compartilhada de blocos DO, bem como nalizao por uma declarao ou comando distintos ca ca ca de um CONTINUE ou de um END DO; declarao ASSIGN e comando GO TO atribu ca do; RETURN alternativo; comando PAUSE; especicadores FORMAT atribu dos; descritor de edio H. ca

c u -tr a c k

.c

1.2.3
90.

Recursos removidos do Fortran 90

Uma vez que Fortran 90 contm o Fortran 77 como subconjunto, esta lista permaneceu vazia para o Fortran e

1.3

Uma reviso menor: Fortran 95 a

Seguindo a publicao do padro Fortran 90 em 1991, dois signicativos desenvolvimentos posteriores refeca a rentes ` linguagem Fortran ocorreram. O primeiro foi a continuidade na operao dos dois comits de regulaa ca e mentao do padro da linguagem: o X3J3 e o WG5; o segundo desenvolvimento foi a criao do Frum Fortran ca a ca o de Alta Performance (High Performance Fortran Forum, ou HPFF). Logo no inicio de suas deliberaes, os comits concordaram na estratgia de denir uma reviso menor no co 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 denio de um conjunto de extenses ao Fortran tais que permitissem a ca o construo de cdigos portveis quando se zesse uso de computadores paralelos para a soluo de problemas ca o a ca 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 instrues a a co 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. ` A medida que os comits X3J3 e WG5 trabalhavam, este comunicavam-se regularmente com o HPFF. Era e evidente que, para evitar o surgimento de dialetos divergentes de Fortran, havia a necessidade de incorporar a sintaxe nova desenvolvida pelo HPFF no novo padro da linguagem. De fato, os recursos do HPF constituem a as novidades mais importantes do Fortran 95. As outras mudanas consistem em correes, claricaes e c co co interpretaes do novo padro. Estas se tornaram prementes quando os novos compiladores de Fortran 90 co a foram lanados no mercado e utilizados; notou-se uma srie de erros e detalhes obscuros que demandavam c e reparaes. Todas estas mudanas foram inclu co c das no novo padro Fortran 95, que teve a sua verso inicial a a lanada no prprio ano de 1995.2 c o O Fortran 95 compat com o Fortran 90, exceto por uma pequena alterao na funo intr e vel ca ca nseca SIGN (seo 7.4.2) e a eliminao de recursos t ca ca picos do Fortran 77, declarados em obsolescncia no Fortran 90. Os e detalhes do Fortran 95 foram nalizados em novembro de 1995 e o novo padro ISO foi nalmente publicado a em outubro de 1996.

1.3.1

Recursos novos do Fortran 95

Os novos recursos do Fortran 95 esto discutidos ao longo desta apostila. Em relao ao Fortran 90, foram a ca introduzidos os seguintes recursos:
Concordncia aprimorada com o padro de aritmtica de ponto utuante binria da IEEE (IEEE 754 ou a a e a IEC 559-1989).
2 Fortran

95, Commitee Draft, May 1995. ACM Fortran Forum, v. 12, n. 2, June 1995.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

1.3. Uma reviso menor: Fortran 95 a

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Rotinas (procedures) puras (seo 8.2.16). ca Rotinas (procedures) elementais (seo 8.2.17). ca Dealocao automtica de matrizes alocveis (pgina 63). ca a a a Comando e construto FORALL (seo 6.10). ca Extenses do construto WHERE (pgina 60). o a Funes especicadoras. co Inicializao de ponteiro e a funo NULL (seo 7.16). ca ca ca Inicializao de componentes de tipo derivado (pgina 25). ca a Funes elementares CEILING, FLOOR e SIGN (sees 7.4.1 e 7.4.2). co co Funes transformacionais (7.15). co Subrotina intr nseca CPU_TIME (seo 7.17.2). ca Comentrio na entrada de uma lista NAMELIST (pgina 130). a a Descritores de edio com largura de campo m ca nimo. Especicao genrica na clusula END INTERFACE. ca e a

c u -tr a c k

.c

1.3.2

Recursos em obsolescncia do Fortran 95 e

Os recursos abaixo entraram na lista em obsolescncia do Fortran 95 e, portanto, pouco ou nada foram e comentados ao longo desta Apostila.
Formato xo de fonte. Comando GO TO computado. Declarao de varivel de caractere na forma CHARACTER*. ca a Declaraes DATA entre comandos executveis. co a Funes denidas em uma linha (statement functions). co Extenso assumida de caracteres quando estas so resultados de funes. a a co

1.3.3

Recursos removidos do Fortran 95

Cinco recursos foram removidos do padro da linguagem Fortran 95 e, portanto, no sero mais aceitos por a a a compiladores que respeitam o padro Fortran 95. a
Indices de laos DO do tipo real (qualquer espcie). c e Declarao ASSIGN e comando GO TO atribu e uso de um inteiro atribu por ASSIGN em uma declarao ca do do ca FORMAT. Desvio para uma declarao END IF a partir de um ponto fora do bloco. ca Comando PAUSE. Descritor de edio H. ca
Autor: Rudi Gaelzer IFM/UFPel Impresso: 24 de fevereiro de 2009

Cap tulo 1. Introduo ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

1.4

O Fortran no Sculo XXI: Fortran 2003 e

.d o

c u -tr a c k

.c

O Fortran 2003 novamente uma reviso grande do padro anterior: Fortran 95. A verso curta (draft) do e a a a novo padro foi divulgada em nais de 20033 e tornou-se desde ento o novo padro da linguagem, embora at a a a e o presente momento nenhum compilador apresenta suporte completo do novo padro. As grandes novidades a introduzidas foram: um direcionamento ainda maior para programao orientada a objeto, a qual oferece uma ca maneira efetiva de separar a programao de um cdigo grande e complexo em tarefas independentes e que ca o permite a construo de novo cdigo baseado em rotinas j existentes e uma capacidade expandida de interface ca o a com a linguagem C, necessria para que os programadores em Fortran possam acessar rotinas escritas em C e a para que programadores de C possam acessar rotinas escritas em Fortran. Esta Apostila no ir abordar os novos recursos introduzidos pelo Fortran 2003, limitando-se a list-los. a a a

1.4.1

Recursos novos do Fortran 2003

Os principais recursos introduzidos pelo padro so: a a


Aprimoramentos dos tipos derivados: tipos derivados parametrizados, controle melhorado de acessibilidade, construtores de estrutura aperfeioados e nalizadores. c Suporte para programao orientada a objeto: extenso de tipo e herana (inheritance), polimorsmo ca a c (polymorphism), alocao dinmica de tipo e rotinas (procedures) ligadas a tipo. ca a Aperfeioamentos na manipulao de dados: componentes alocveis de estruturas, argumentos mudos aloc ca a cveis, parmetros de tipo deferidos (deferred type parameters), atributo VOLATILE, especicao expl a a ca cita de tipo em construtores de matrizes e declaraes de alocao, aperfeioamentos em ponteiros, expresses co ca c o de inicializao estendidas e rotinas intr ca nsecas aperfeioadas. c Aperfeioamentos em operaes de Entrada/Sa (E/S) de dados: transferncia ass c co da e ncrona, acesso de uxo (stream access), operaes de transferncia especicadas pelo usurio para tipos derivados, conco e a trole especicado pelo usurio para o arredondamento em declaraes FORMAT, constantes nomeadas para a co unidades pr-conectadas, o comando FLUSH, regularizao de palavras-chave e acesso a mensagens de erro. e ca Ponteiros de rotinas (procedure pointers). Suporte para as excees do padro de aritmtica binria de ponto utuante ISO/IEC 559, anteriormente co a e a conhecido como padro IEEE 754. a Interoperabilidade com a linguagem de programao C. ca Suporte aperfeioado para internacionalizao: acesso ao conjunto de caracteres de 4 bytes ISO 10646 c ca and escolha de v rgula ou ponto como separador de parte inteira e parte decimal em operaes de E/S co numricas formatadas. e Integrao aperfeioada com o sistema operacional hospedeiro: acesso a argumentos de linha de comando, ca c variveis de ambiente e mensagens de erro do processador. a

1.4.2

Recursos em obsolescncia do Fortran 2003 e

Nesta lista permanecem tens que j estavam na lista de obsolescncia do Fortran 95. Os critrios para a e e incluso nesta lista continuam sendo: recursos redundantes e para os quais mtodos melhores estavam dispon a e veis no Fortran 95. A lista dos tens em obsolescncia do Fortran 2003 : e e
IF aritmtico. e END DO compartilhado por dois ou mais laos e trmino de um lao em uma clusula distinta de END DO c e c a ou CONTINUE. RETURN alternativo. Comando GO TO computado. Funes denidas em uma linha (statement functions). co
3 Ver

o draft em: http://www.dkuug.dk/jtc1/sc22/open/n3661.pdf.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

1.4. O Fortran no Sculo XXI: Fortran 2003 e

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Declaraes DATA entre comandos executveis. co a Funes de caractere de extenso assumida. co a Formato xo da fonte. Forma CHARACTER* da declarao CHARACTER. ca

c u -tr a c k

.c

1.4.3

Recursos removidos do Fortran 2003

Um recurso removido do novo padro se este for considerado redundante e praticamente sem uso pela e a comunidade, devido a novos recursos muito mais uteis na construo do cdigo. ca o A lista de recursos removidos no Fortran 2003, divulgada no draft, repete os recursos removidos do Fortran 95. Portanto, nenhum outro recurso foi removido.

1.5

O novo padro: Fortran 2008 a

Embora ainda no exista nenhum compilador que suporte completamente o padro atual, Fortran 2003, j a a a est em fase de concluso as discusses a respeito do padro futuro: Fortran 2008. A verso curta (draft) do a a o a a novo padro deve ser divulgada ao nal do ano de 2008. a O Fortran 2008, embora pelo procedimento adotado pelos comits X3J3/WG5 devesse ser uma reviso menor e a do Fortran 2003, pode vir a apresentar algumas novidades substanciais, tais como as co-matrizes (co-arrays). Os detalhes completos dos novos recursos ainda no foram plenamente divulgados para o pblico em geral, mas a u alguns dos tens que iro compor o novo padro, por consenso, esto listados a seguir. a a a

1.5.1

Recursos novos do Fortran 2008

Com base em material de divulgao obtido na World Wide Web, os seguintes recursos sero inclu ca a dos:
Co-matrizes (co-arrays). BITS, originalmente denominados objetos sem tipo (TYPELESS). Macros inteligentes (no lugar de mdulos parametrizados). o Atributo CONTIGUOUS. Laos DO concorrentes (DO CONCURRENT). c Interoperabilidade de ponteiros, objetos alocveis, matrizes de forma assumida e argumentos opcionais. a Execuo de programas externos. ca Ponteiro alocvel em resoluo genrica a ca e Rotina interna como argumento real Inicializao de ponteiros com alvos distintos de NULL(). ca Rotinas intr nsecas estendidas. Operao de E/S recursivas a distintas unidades. ca ...
Autor: Rudi Gaelzer IFM/UFPel Impresso: 24 de fevereiro de 2009

Cap tulo 1. Introduo ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

1.6

Comentrios sobre a bibliograa a

.d o

c u -tr a c k

.c

Para escrever esta apostila, z uso de um nmero restrito de publicaes, algumas das quais so de livre u co a acesso atravs da internet. e
Para informaes a respeito do padro existente na linguagem Fortran 77, a qual foi substitu pelo co a da Fortran 90/95, utilizei freqentemente o livro de Clive Page: Professional Programers Guide to Fortran u 77 [4]. A principal fonte de informao sobre o padro do Fortran 90/95 foi o amplo livro de Michael Metcalf e ca 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 freqene a e u temente consultado [1]. Informaes divulgadas sobre o Fortran 2003 foram obtidas do livreto de John Reid [6]. co

1.7

Agradecimentos

Durante o desenvolvimento e divulgao desta apostila, diversas pessoas contribuiram com o seu aprimoraca mento ao apontar erros e inconsistncias e ao oferecer sugestes quanto a sua estrutura e contedo. e o u Gostaria de agradecer publicamente as contribuies das seguintes pessoas: Leandro Tezani. co

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

1.6. Comentrios sobre a bibliograa a

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.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 programao de alto n ca vel. Programa-Objeto. Trata-se do programa-fonte compilado pelo compilador. Esta a transcrio realizada e ca 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 (traduo livre: linkagem). e a ca Programa executvel. Aps a fase de compilao, onde os programas objetos so criados, o agente de compia o ca a lao aciona o linker, o qual consiste em um programa especial que agrupa os programas objetos de forma ca a criar um arquivo nal, o programa executvel, o qual pode ser ento executado pelo programador. a a Nesta seo ser apresentada a estrutura bsica de um programa-fonte em Fortran 90/95. ca 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 restries impostas pelos cartes perfurados, que eram a unica opo para entrar com o co o ca 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 continuao de linha. ca 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 composio nal do string. o a ca Mais de uma instruo pode ser colocada na mesma linha. O separador de linhas padro o ponto-e-v ca a e rgula ;. Mltiplos ; 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

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

A = 0; B = 0; C = 0 O caractere ampersand & a marca de continuao, isto , ele indica que a linha com instrues imedie ca e co atamente posterior continuao da linha onde o & foi digitado. Desta forma, so permitidas at 39 linhas e ca 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 exclamao a o a ca ! 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 p r i m e i r o i m p l i c i t none print * , Al Mame o a end program p r i m e i r o 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 declarao ca PROGRAM primeiro sempre a primeira instruo de um programa. Ela serve para identicar o cdigo ao compilador. e ca 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 instruo implicit none. Esta instrui o compilador a exigir que todas as variveis usadas pelo ca 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 sa ue a o a e da padro. a Finalmente, o programa encerrado com a instruo e ca 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: 24 de fevereiro de 2009

10

2.1. Formato do programa-fonte

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

2.2

Nomes em Fortran 90/95

c u -tr a c k

.c

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 restrio que o primeiro caractere seja uma letra. Os seguintes exemplos so vlidos: ca 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 l e v a l o r i m p l i c i t none real : : a print * , I n f o r m e o v a l o r de a : read * , a print * , Valor l i d o : , a end program l e v a l o r 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 instruo implicit none deve ser sempre a ca a segunda linha de um programa, sub-programa ou mdulo, aparecendo antes do restante das declaraes de o co variveis. a Esta seo apresentou somente um uso muito simples dos recursos de Entrada/Sa de dados. Uma descrio ca da ca mais completa destes recursos ser realizada no cap a tulo 9 na pgina 123. a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 24 de fevereiro de 2009

Cap tulo 2. Formato do Cdigo-Fonte o

11

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Tabela 2.1: Caracteres especiais do Fortran 90/95

Caractere = + * / ( ) , . $ :

Nome/Funo ca Igual Soma Subtrao ca Multiplicao ca Diviso a Parnteses esquerdo e Parnteses direito e V rgula Ponto decimal Cifro a Dois pontos

Caractere ! % & ; ? ** < >

Nome/Funo ca Espao em branco c Exclamao ca Aspas Porcentagem E comercial (ampersand) Ponto e v rgula Ponto de interrogao ca 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 maisculas e min sculas. a c u u

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

12

2.4. Conjunto de caracteres aceitos

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.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 Fortran 77 consiste na habilidade em denir novos c tipos de variveis, baseados nos tipos intr a nsecos. Estas so os chamados tipos derivados ou estruturas, os quais a consistem 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

13

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

<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.

c u -tr a c k

.c

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: 23 de abril de 2008

Autor: Rudi Gaelzer IFM/UFPel

14

3.2. Variveis do tipo INTEGER a

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 restritos ao conjunto de caracteres padro denidos na seo 2.4. Qualquer caractere 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: 23 de abril de 2008

Cap tulo 3. Tipos de Variveis a

15

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

bom Dia bomDia BRASIL Fortran 90 As declaraoes mais utilizadas para o tipo caractere so: c a

.d o

c u -tr a c k

.c

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: 23 de abril de 2008

16

3.5. Variveis do tipo CHARACTER a

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

3.6

Variveis do tipo LOGICAL a

.d o

c u -tr a c k

.c

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 Fortran Compiler for linux (verso 9.1), gfortran e o compilador F, todos a gratuitos.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 23 de abril de 2008

Cap tulo 3. Tipos de Variveis a

17

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Tabela 3.1: Tabela de armazenamento de variveis para o compilador Intel Fortran. a

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

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 Fortran

O compilador Intel 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 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 ??). 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: 23 de abril de 2008

18

3.7. O conceito de espcie (kind) e

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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

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 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 Core 2. lia F Compiler and Tools http://www.fortran.com/imagine1/ftools.pdf.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 23 de abril de 2008

Cap tulo 3. Tipos de Variveis a

19

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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: 23 de abril de 2008

20

3.7. O conceito de espcie (kind) e

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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

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: 23 de abril de 2008

Cap tulo 3. Tipos de Variveis a

21

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 variao 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: 23 de abril de 2008

22

3.7. O conceito de espcie (kind) e

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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)

c u -tr a c k

.c

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: 23 de abril de 2008

Cap tulo 3. Tipos de Variveis a

23

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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: 23 de abril de 2008

c u -tr a c k

.c

24

3.8. Tipos derivados

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

Em Fortran 95, tornou-se poss inicializar os valores dos componentes dos tipos derivados. O valor deve vel ser especicado quando o componente declarado como parte da denio do tipo. Se o componente no for e ca a um ponteiro, a inicializao feita de forma usual, com um sinal de igual seguido da expresso de inicializao. ca e a ca Se o componente for um ponteiro, a unica inicializao admitida o s ca e mbolo de atribuio de um ponteiro (=>), ca seguida pela funo intr ca nseca NULL() (seo 7.16). Em ambos os casos os caracteres :: so exigidos. ca a Uma inicializao no deve necessariamente se aplicar a todos os componentes de um tipo derivado. Um ca a exemplo vlido seria: a TYPE :: ENTRY REAL :: VALOR= 2.0 INTEGER INDEX TYPE(ENTRY), POINTER :: NEXT => NULL() END TYPE ENTRY Dada uma declarao de matriz tal como ca TYPE(ENTRY), DIMENSION(100) :: MATRIZ os sub-objetos tais como MATRIZ(3)%VALOR tero automaticamente o valor 2.0 e a seguinte operao, que usa a ca uma funo intr ca nseca ASSOCIATED(MATRIX(3)%NEXT) vai retornar o valor .FALSE. (ver seo 7.3). ca Se as declaraes de tipos derivados estiverem aninhadas, as inicializaes associadas a componentes so co co a reconhecidas em todos os n veis. Assim, TYPE :: NODO INTEGER CONTA TYPE(ENTRY) ELEMENTO END TYPE NODO TYPE(NODO) N
Autor: Rudi Gaelzer IFM/UFPel Impresso: 23 de abril de 2008

Cap tulo 3. Tipos de Variveis a

25

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

ocasiona que o componente N%ELEMENTO%VALOR ter automaticamente o valor 2.0. a Os componentes do tipo derivado continuam podendo ser inicializados em declaraes de variveis do tipo, co a tais como TYPE(ENTRY), DIMENSION(100) :: MATRIZ= ENTRY(HUGE(0.0), HUGE(0), NULL()) em cuja situaao a inicializao inicial ignorada. c ca e

c u -tr a c k

.c

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 23 de abril de 2008

26

3.8. Tipos derivados

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.c

Cap tulo 4

Expresses e Atribuies Escalares o co


Em uma expresso, o programa descreve as operaes que devem ser executadas pelo computador. O a co resultado desta expresso pode ento ser atribu a uma varivel. H diferentes conjuntos de regras para a a do a a expresses e atribuies, dependendo se as variveis em questo so numricas, lgicas, caracteres ou de tipo o co 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 funes e uma expresso, por si a co 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 simples envolvendo 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 exceo do operador ** (ver seo 4.2). Caso seja e ca ca necessrio desenvolver parte de uma expresso, ou sub-expresso, antes de outra, parnteses podem ser usados a a a e para indicar qual sub-expresso deve ser desenvolvida primeiramente. Na expresso a a operando operador (operando operador operando) a sub-expresso 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 sub-expresso 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 operaes a seguir so, em princ e co a pio, equivalentes: 27

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Tabela 4.1: Operadores numricos escalares e

Operador ** * / + -

Operao ca Potenciao ca Multiplicao ca Diviso a Adio ca Subtrao ca

A/B/C ou A/(B*C) Poss veis diferenas nos resultados das operaes acima consistem em diferentes erros de arredondamento e/ou c co 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 interpretao poss que o segundo operador mondico. Portanto, a sintaxe pro que um operador ca 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 intr a e nsecos. 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 potenciao ** o de maior precedncia; os operadores de e ca e e multiplicao * e diviso / tm a mesma precedncia entre si e possuem precedncia sobre os operadores de ca a e e e adio + e subtraao -, os quais tm a mesma precedncia entre si. ca c e e Na ausncia de parnteses ou dentro destes, no caso de sub-expresses, a operao com a maior precedncia e e o ca e o clculo das funes, seguidos das exponenciaes que sero realizadas antes de multiplicaes ou divises e e a co co a co o estas, por sua vez, antes de adies ou subtraes. co co Uma expresso numrica especica uma computao usando constantes, variveis ou funes, seguindo o a e ca a co seguinte conjunto de regras:
Os operadores de subtrao - e de adio + podem ser usados como operadores unitrios, como em ca ca a -VELOCIDADE Uma vez que no permitido na notao matemtica ordinria, uma subtrao ou adio unitria no a e ca a a ca ca a a pode seguir imediatamente aps outro operador. Quando isto necessrio, deve-se fazer uso de parnteses. o e a e Por exemplo, as operaes matemticas a seguir: co a xy deve ser digitada: X**(-Y); x(y) deve ser digitada : X*(-Y). Como j foi mencionado na seo 4.1, um operador binrio tambm no pode seguir outro operador. a ca 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 operaes dentro deles devem ser executadas prioritariamente: co 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 multiplicao, sendo sempre necessrio o uso do operador e a ca 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 nmero de parnteses ` esquerda deve sempre ser igual ao nmero 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 operao matemtica 2x2 + y ca 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: 24 de abril de 2008

28

4.2. Expresses numricas escalares o e

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Tabela 4.2: Tipos de resultados de A .op.

B, onde .op. +, -, * ou /. e

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 exceo ` regra esquerda-para-direita para operadores de igual precedncia ocorre para a potenciao ca a e ca **. 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 multiplicao seja efetuada e o resultado da mesma do tipo real. ca e As tabelas 4.2 e 4.3 ilustram os resultados de diferentes operaes numricas escalares. co e Com relao ` ultima operao mencionada na tabela 4.3, no case de um valor complexo ser elevado a ca a ca 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 atribuio numrica escalar ca e e

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de abril de 2008

Cap tulo 4. Expresses e Atribuies Escalares o co

29

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 atribuio seja realizada, de acordo com as regras dadas na tabela 4.4. ca Deve-se notar que se o tipo da <varivel> for inteiro mas a <express~o> no, ento a atribuio ir resultar a a a a ca 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 atribuio de uma expresso complexa a uma varivel no complexa resultar, no m ca a a a a nimo, na perda da parte imaginria. Por exemplo, os valores de I e A aps as atribuies a o co I= 7.3 A= (4.01935, 2.12372) ! I do tipo inteiro. ! A do tipo real.

c u -tr a c k

.c

so, respectivamente, 7 e 4.01935. a

4.4

Operadores relacionais

A tabela 4.5 apresenta os operadores relacionais escalares, utilizados em operaes que envolvem a compaco rao entre duas variveis ou expresses. Na coluna 1 da tabela, apresentado o signicado do operador, na ca 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 comparao deste tipo tem como resultado um dos dois valores lgicos poss ca o veis em um lgebra booleana: .TRUE. e .FALSE. e este tipo de teste de crucial importncia no controle do uxo do a 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 comparao com os operadores relacionais. No terceiro exemplo acima, a ca 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 nmeros 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 funes lgicas podem aparecer como operandos em expresses lgicas. Os operadores a co o o o lgicos, em ordem decrescente de precedncia, so: o e a

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

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

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


Impresso: 24 de abril de 2008

30

4.4. Operadores relacionais

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Tabela 4.5: Operadores relacionais em Fortran 90/95

Signicado Maior que Menor que Igual a Maior ou igual Menor ou igual Diferente de Operador unitrio: a .NOT. (negao lgica) ca o Operadores binrios: a .AND. (interseco lgica, E lgico) ca o o .OR. (unio lgica, OU lgico) a o o .EQV. (equivalncia lgica) e o .NEQV. (no-equivalncia lgica). a e o

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

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

Dada ento uma declarao de variveis lgicas do tipo a ca 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 sub-expresso L .AND. .NOT. J seja desenvolvida primeiro, e o resultado combinado com a I. Na ultima expresso, as duas sub-expresses .NOT. K .AND. J e .NOT. L sero desenvolvidas e comparadas a o a para testar no-equivalncia; o resultado da comparao ser combinado com I. a e ca 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 atribuio no corpo de comandos do a o e ca programa: FLAG= .TRUE. ou no corpo de declaraes de variveis: co 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: 24 de abril de 2008

Cap tulo 4. Expresses e Atribuies Escalares o co

31

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Nos exemplos acima, todos os operando e resultados foram do tipo lgico. Nenhum outro tipo de varivel pode o a participar de uma operao lgica intr ca o nseca, ou atribuio. ca Os resultados de diversas expresses relacionais podem ser combinados em uma expresso lgica, seguida de o a o atribuio, como no caso: ca 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 freqente 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 operaes, e co .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

c u -tr a c k

.c

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 concatenao das constantes de caractere AB o ca e CD, escrita como AB//CD a constante ABCD. e Uma outra operao poss com variveis de caracteres a extrao de pedaos (substrings) das variveis, ca vel a e ca c a os quais consistem em um determinado grupo de caracteres contidos na varivel. a

Substrings de caracteres.
Consideremos a seguinte declarao da varivel de caractere HINO, a qual tem o comprimento igual a 236 ca a caracteres e cujo valor atribu no momento da declarao: e do ca 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, ina justa guerra. & &Sirvam nossas faanhas, de moc delo ` toda Terra (...) a Pode-se isolar qualquer parte da varivel HINO usando-se a notao de substring a ca 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: 24 de abril de 2008

32

4.6. Expresses e atribuies de caracteres escalares o co

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

HINO(6:11) HINO(60:79) HINO(140:140)

!Correspondente a aurora !Correspondente a Foi o 20 de setembro !Correspondente a ^ a

c u -tr a c k

.c

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 concatenaes com substrings: e co 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 faaa c nhas. 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 atribuio: ca 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 atribuio podem ser sobrepor. Neste caso, sero sempre os valores antigos ca a os usados no lado direito da expresso. Por exemplo, a PARTE2(3:5) = PARTE2(1:3) resulta em PARTE2= QuQuaauror. Comparaes e uso de operadores relacionais com variveis/constantes de caracteres so poss co a a veis entre caracteres unicos, inclusive com os operadores > e <. Neste caso, no se trata de testar qual caractere a e maior ou menor que outro. Em um sistema computacional, caracteres possuem uma propriedade denominada seqncia de intercalao,1 a qual ordena o armazenamento destes caracteres pelo sistema. ue ca O Fortran 90/95 determina que a seqncia de intercalao para qualquer arquitetura deve satisfazer as ue ca seguintes condies: co
A precede ( menor) que B, que precede C ... precede Y, que precede Z. e 0 precede 1, que precede 2 ... precede 8, que precede 9. Espao em branco precede A e Z precede 0; ou branco precede 0 e 9 precede A. c

Se letras minsculas so dispon u a veis, ento a


1 Collating

sequence.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de abril de 2008

Cap tulo 4. Expresses e Atribuies Escalares o co

33

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Tabela 4.9: Tabela de cdigos ASCII de 7 bits. o

Dec 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Hex 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F

Char NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US

(null) (start of heading) (start of text) (end of text) (end of transmission) (enquiry) (acknowledge) (bell) (backspace) (horizontal tab) (line feed, new line) (vertical tab) (form feed, new page) (carriage return) (shift out) (shift in) (data link escape) (device control 1) (device control 2) (device control 3) (device control 4) (negative acknowledge) (synchronous idle) (end of trans. block) (cancel) (end of medium) (substitute) (escape) (le separator) (group separator) (record separator) (unit separator)

Dec 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

Hex 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F

Char Space ! # $ % & ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?

Dec 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

Hex 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F

Char @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ]

Dec 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

Hex 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F

Char a b c d e f g h i j k l m n o p q r s t u v w x y z { | } DEL

a precede b, que precede c, ... precede y, que precede z. Espao em branco precede a e z precede 0; ou branco precede 0 e 9 precede a. c

Assim, no h regra que estabelea que os nmeros devem preceder ou no as letras, nem tampouco h regra a a c u a a de precedncia para caracteres especiais. e De acordo com estas regras, as expresses relacionais o A < B 0 < 1 fornecem ambas o resultado T (true). Fortran 90/95 fornece acesso tambm ` seqncia de intercalao original da tabela ASCII2 atravs de funes e a ue ca e co intr nsecas (seo 7.6.1). ASCII consiste em uma padronizao para um encodeamento de caracteres3 de 7 bits ca ca (originalmente), baseado no alfabeto ingls. Cdigos ASCII representam textos em computadores, equipamentos e o de comunicao e outros dispositivos eletrnicos que trabalham com texto. A tabela 4.9 mostra os caracteres ca o ASCII originais, juntamente com os seus identicadores nos sistemas numricos decimal, hexadecimal e octal, e bem como o cdigo html correspondente. Os primeiros 32 (0 31) caracteres mais o caractere 127 so caracteres o a de controle, destinados ` comunicao com perifricos; estes no geram caracteres que podem ser impressos. J a ca e a a os caracteres restantes (32 126) compe-se de caracteres alfanumricos mais caracteres especiais. o e
2 American 3 Character

Standard Code for Information Interchange (ASCII). encoding.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de abril de 2008

34

4.6. Expresses e atribuies de caracteres escalares o co

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.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 de ca e um construto de bloco (do ingls block construct), o qual um construto (uma construo ou estrutura) que e e ca comea com uma palavra-chave inicial, pode ter palavras-chave intermedirias e que termina com uma palavrac a chave nal que identique a palavra inicial. Cada seqncia de comandos entre as palavras-chave chamada de ue e um bloco. Um bloco pode ser vazio, embora tais casos sejam raros. Construtos executveis podem ser aninhados (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 sub-programa 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 35

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Exemplo: 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.

c u -tr a c k

.c

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: 23 de abril de 2008

36

5.1. Comandos obsoletos do Fortran 77

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

5.1.5

Comandos ASSIGN e GO TO atribu do

.d o

c u -tr a c k

.c

Estes dois comandos so normalmente usados juntos. O comando 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 sub-programa, 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 sub-programa. 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: 23 de abril de 2008

Cap tulo 5. Comandos e Construtos de Controle de Fluxo

37

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

40 50

DO 50, IY= 1,NY DO 40, IX= 1,NX FIELD(IX, IY)= 0.0 CONTINUE CONTINUE

c u -tr a c k

.c

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: 23 de abril de 2008

38

5.2. Comando e construto IF

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

IF (X < Y) THEN X= -Y ELSE Y= -Y END IF

c u -tr a c k

.c

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 quaisquer 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: 23 de abril de 2008

Cap tulo 5. Comandos e Construtos de Controle de Fluxo

39

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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: 23 de abril de 2008

40

5.3. Construto CASE

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 * , P a l a v r a i n i c i a com L e t r a m i n u s c ul a . 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 * , P a l a v r a i n i c i a com l e t r a s m a i u s c u l a . case ( 0 : 9 ) ! S e l e c i o n a n meros . u print * , P a l a v r a i n i c i a com n meros ! ! ! u case default ! Outros t i p o s de c a r a c t e r e s . print * , P a l a v r a i n i c i a com 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: 23 de abril de 2008

Autor: Rudi Gaelzer IFM/UFPel

Cap tulo 5. Comandos e Construtos de Controle de Fluxo

41

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 resultado 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: 23 de abril de 2008

42

5.4. Construto DO

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Programa 5.2: Exemplo de uso do construto DO.

! 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: 23 de abril de 2008

Cap tulo 5. Comandos e Construtos de Controle de Fluxo

43

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

5.4.3

Instruo CYCLE ca

.d o

c u -tr a c k

.c

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: 23 de abril de 2008

44

5.4. Construto DO

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

! Finalizao . ca print * , F i n a l dos dados v l i d o s . a end program conv temp

c u -tr a c k

.c

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 23 de abril de 2008

Cap tulo 5. Comandos e Construtos de Controle de Fluxo

45

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 23 de abril de 2008

46

5.4. Construto DO

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.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, cada 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

47

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 construtores de matrizes, isto , eles denem ou a e inicializam os valores de um vetor ou matriz. Estes construtores de matrizes sero descritos com mais a detalhes na seao 6.6. c Tamanho 56.

c u -tr a c k

.c

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: 23 de abril de 2008

48

6.1. Terminologia e especicaes de matrizes co

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

PARAMETER ALLOCATABLE INTENT(INOUT) OPTIONAL SAVE EXTERNAL INTRINSIC PUBLIC PRIVATE POINTER TARGET

c u -tr a c k

.c

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 sub-programa 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: 23 de abril de 2008

Cap tulo 6. Processamento de Matrizes

49

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 23 de abril de 2008

50

6.1. Terminologia e especicaes de matrizes co

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

6.2

Expresses e atribuies envolvendo matrizes o co

.d o

c u -tr a c k

.c

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: 23 de abril de 2008

Cap tulo 6. Processamento de Matrizes

51

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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: 23 de abril de 2008

VAL_MAX= DO 30 K= DO 20 DO

10 20 30

Autor: Rudi Gaelzer IFM/UFPel

52

6.2. Expresses e atribuies envolvendo matrizes o co

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Soluo Fortran 90/95. ca REAL, DIMENSION(5,5,5) :: A REAL :: VAL_MAX ... VAL_MAX= MAXVAL(A, MASK=(A<1000.0))

c u -tr a c k

.c

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 sub-matriz, tambm chamada seo de matriz, pode ser acessada atravs da especicao de um intere ca e ca valo de valores de subscritos da matriz. Uma seo de matriz pode ser acessada e operada da mesma forma que ca a 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: 23 de abril de 2008

Cap tulo 6. Processamento de Matrizes

53

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

6.3.1

Subscritos simples

.d o

c u -tr a c k

.c

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: 23 de abril de 2008

54

6.3. Sees de matrizes co

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

6.4

Atribuies de matrizes e sub-matrizes 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 48). 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 sub-matrizes 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 sub-matrizes so conformveis neste caso e o resultado da soma das duas a a sees ser atribu ` matriz C, a qual possui a mesma forma. co 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: 23 de abril de 2008

Cap tulo 6. Processamento de Matrizes

55

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

A(1,1) A(2,5) A(2,10)

A(1,20)

c u -tr a c k

.c

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 sub-matrizes 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: 23 de abril de 2008

56

6.5. Matrizes de tamanho zero

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

<matriz nula>= <escalar> sempre vlida. e a

c u -tr a c k

.c

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 49. 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 <varivel> uma varivel escalar inteira e <exp1>, <exp2> e <exp3> so expresses escalares inteiras. A a e a a o interpretaao dada a este DO impl c cito que a <lista de valores dos construtor> escrita um nmero de e e u 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: 23 de abril de 2008

Cap tulo 6. Processamento de Matrizes

57

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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 55 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: 23 de abril de 2008

58

6.6. Construtores de matrizes

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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)

c u -tr a c k

.c

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 rotinas intr nsecas elementais. A lista completa destas rotinas pode ser obtida no cap tulo ??. 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: 23 de abril de 2008

Cap tulo 6. Processamento de Matrizes

59

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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: 23 de abril de 2008

60

6.8. Comando e construto WHERE

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Programa 6.2: Exemplo do construto WHERE.

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 ??. 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: 23 de abril de 2008

Cap tulo 6. Processamento de Matrizes

61

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 freqente de declarar uma matriz tendo um nmero varivel a vel u 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: 23 de abril de 2008

c u -tr a c k

.c

62

6.9. Matrizes alocveis a

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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))

c u -tr a c k

.c

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 ??). 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: 23 de abril de 2008

Cap tulo 6. Processamento de Matrizes

63

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

6.10

Comando e construto FORALL

.d o

c u -tr a c k

.c

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 sub-matrizes: 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: 23 de abril de 2008

64

6.10. Comando e construto FORALL

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 sub-objeto (sub-matriz, 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 sub-objeto. 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: 23 de abril de 2008

Cap tulo 6. Processamento de Matrizes

65

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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: 23 de abril de 2008

66

6.10. Comando e construto FORALL

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.c

Cap tulo 7

Rotinas Intr nsecas


Em uma linguagem de programao destinada a aplicaes cient ca co cas h uma exigncia bvia para que as a e o funes matemticas mais requisitadas sejam oferecidas como parte da prpria linguagem, ao invs de terem co a o e de ser todas implementadas pelo programador. Alm disso, ao serem fornecidas como parte do compilador, e espera-se que estas funes tenham sido altamente otimizadas e testadas. co 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 nmero grande de a u operaes individuais sendo feitas simultaneamente, sendo o cdigo que as implementa otimizado para levar em co 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 funes e subrotinas. A a co distino entre estas duas classes de rotinas ser discutida com mais detalhes no cap ca 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 funo elemental, cada elemento da matriz resultante, caso exista, a ca ser obtido como se a funo tivesse sido aplicada a cada elemento individual da matriz que foi usada a ca como argumento desta funo. No caso de uma subrotina elemental com um argumento matricial, cada ca 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 Funes inquisidoras. Retornam propriedades dos seus argumentos principais que no dependem dos seus co a valores, somente do seu tipo e/ou espcie. e Funes transformacionais. So funes que no so nem elementais nem inquisidoras. Elas usualmente tm co a co 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 categorizao. a ca

7.2

Declarao e atributo INTRINSIC ca

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

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

onde <lista de nomes intrnsecos> uma lista de nomes de rotinas intr e nsecas. O uso desta declarao ca 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 denio de uma rotina intr a ca nseca, em um procedimento denominado sobrecarga de operador (operator overloading), o qual faz uso de interfaces genricas (generic e interfaces). Para mais detalhes nestes recursos avanados, ver Metcalf & Reid (1996) [3]. Alternativamente, c uma ou mais funes intr co nsecas podem ser declaradas com o atributo INTRINSIC, no lugar da declarao. ca O atributo ou declarao INTRINSIC so excludentes em relao ao atributo ou declarao EXTERNAL (seo ca a ca ca ca 8.2.12).

c u -tr a c k

.c

7.3

Funoes inquisidoras de qualquer tipo c

As seguintes so funes inquisidoras, com argumentos que podem ser de qualquer tipo: a co ASSOCIATED(POINTER[,TARGET]). Quanto TARGET est ausente, a funo retorna o valor .TRUE. se o ponteiro a ca (pointer) est associado com um alvo (target) e retorna o valor .FALSE. em caso contrrio. O status de a a associao de ponteiro de POINTER no deve ser indenido. Se TARGET estiver presente, este deve ter o ca a mesmo tipo, espcie e posto de POINTER. O valor da funo .TRUE. se POINTER estiver associado a e ca e TARGET ou .FALSE. em caso contrrio. No caso de matrizes, .TRUE. obtido somente se as formas so a e a idnticas e elementos de matriz correspondentes, na ordem de elementos de matriz, esto associadas umas e a com as outras. Se o comprimento do caractere ou tamanho da matriz so iguais a zero, .FALSO. obtido. a e Um limite diferente, como no caso de ASSOCIATED(P,A) seguindo a atribuio de ponteiro P => A(:) ca quando LBOUND(A)= 0, insuciente para causar um resultado .FALSE.. TARGET pode ser tambm um e e ponteiro, em cujo caso seu alvo comparado com o alvo de POINTER; o status de associao de ponteiro e ca de TARGET 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 sub-programa que possui um argumento mudo opcional A (ver seo ca 8.2.9) ou acesse este argumento mudo a partir de seu hospedeiro. A funo retorna o valor .TRUE. se o ca argumento est presente na chamada do sub-programa 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

Funoes elementais numricas c e

H 17 funes elementais destinadas ` realizao de operaes numricas simples, muitas das quais realizam a co a ca co e converso de tipo de variveis para alguns ou todos os argumentos. a a

7.4.1

Funoes elementais que podem converter c

Se o especicador KIND estiver presente nas funes elementais seguintes, este deve ser uma expresso inteira co 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 nmero 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: 24 de abril de 2008

68

7.3. Funes inquisidoras de qualquer tipo co

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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

Funoes elementais que no convertem c a

As seguintes so funes elementais cujos resultados so do tipo e da espcie iguais aos do primeiro ou unico a co 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 distingir e e a u entre zeros reais positivos ou negativos ento, para B= 0.0 o sinal assumido positivo. a e

7.5

Funoes elementais matemticas c a

As seguintes so funes elementais que calculam o conjunto imagem de funes matemticas elementares. a co co 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 funo arco cosseno (ou cos1 ) para valores reais do argumento X (|X| 1). O resultado ca e obtido em radianos no intervalo 0 ACOS(X) . ASIN(X). Retorna a funo arco seno (ou sin1 ) para valores reais do argumento X (|X| 1). O resultado ca e obtido em radianos no intervalo /2 ASIN(X) /2. ATAN(X). Retorna a funo arco tangente (ou tan1 ) para valores reais do argumento X ( < X < ). O ca resultado obtido em radianos no intervalo /2 ATAN(X) /2. e ATAN2(Y,X). Retorna a funo arco tangente (ou tan1 ) para pares de argumentos reais, X e Y, ambos do mesmo ca tipo e espcie. O resultado o valor principal do argumento do nmero 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: 24 de abril de 2008

Cap tulo 7. Rotinas Intr nsecas

69

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

COS(X). Retorna o valor da funo cosseno para um argumento dos tipos real ou complexo. A unidade do ca argumento X suposta ser radianos. e COSH(X). Retorna o valor da funo cosseno hiperblico para um argumento X real. ca o EXP(X). Retorna o valor da funo exponencial para um argumento X real ou complexo. ca LOG(X). Retorna o valor da funo logaritmo natural para um argumento X real ou complexo. No caso real, X ca 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 funo seno para um argumento dos tipos real ou complexo. A unidade do argumento ca X suposta ser radianos. e SINH(X). Retorna o valor da funo seno hiperblico para um argumento X real. ca o SQRT(X). Retorna o valor da funo raiz quadrada para um argumento X real ou complexo. No caso real, X ca 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 funo tangente para um argumento X real. A unidade do argumento suposta ser ca e radianos. TANH(X). Retorna o valor da funo tangente hiperblica para um argumento X real. ca o

c u -tr a c k

.c

7.6
7.6.1

Funoes elementais lgicas e de caracteres c o


Converses caractere-inteiro o

As seguintes so funes elementais para converter um unico caractere em um inteiro e vice-versa. a co ACHAR(I). O resultado do tipo de caractere padro de comprimento um e retorna o caractere que est na e a a posio especicada pelo valor inteiro I na tabela ASCII de caracteres (tabela 4.9). I deve estar no ca intervalo 0 I 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 funo retorna o caractere na a a e a ca posio I (tipo inteiro) da seqncia de caracteres interna do processador associada com o parmetro de ca ue a espcie relevante. I deve estar no intervalo 0 I n 1, onde n o nmero de caracteres na seqncia e e u ue interna do processador. IACHAR(C). O resultado do tipo inteiro padro e retorna a posio do caractere C na tabela ASCII. Se C no e a ca a est na tabela, o resultado depende do processador. a ICHAR(C). O resultado do tipo inteiro padro e retorna a posio do caractere C na seqncia interna do e a ca ue processador associada com a espcie de C. e

7.6.2

Funoes de comparao lxica c ca e

As seguintes funoes elementais aceitam strings de caracteres da espcie padro, realizam uma comparao c e a ca 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: 24 de abril de 2008

70

7.6. Funes elementais lgicas e de caracteres co o

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

7.6.3

Funoes elementais para manipulaoes de strings c c

.d o

c u -tr a c k

.c

As seguintes so funes elementais que manipulam strings. Os argumentos STRING, SUBSTRING e SET so a co 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 nmero 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 nmero de brancos no in da string. u cio INDEX(STRING,SUBSTRING[,BACK]). Retorna um valor do tipo inteiro padro, o qual consiste na posio inicial a ca 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 posio inicial da primeira das substrings o a a ca retornada; o valor 1 retornado se SUBSTRING tem comprimento zero. Se BACK est presente com valor e e a .TRUE., a posio inicial da ultima das substrings retornada; o valor LEN(STRING)+1 retornado se ca 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 ` posio de um caractere de a a ca 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 posio mais ` esquerda deste caractere retornada. Se BACK est presente ca a e a com valor .TRUE., a posio mais ` direita deste caractere retornada. ca a e VERIFY(STRING,SET[,BACK]). Retorna o valor inteiro padro 0 se cada caractere em STRING aparece em SET, a ou a posio de um caractere de STRING que no esteja em SET. Se a varivel lgica BACK est ausente, ou ca a a o a presente com valor .FALSE., a posio mais ` esquerda de tal caractere retornada. Se BACK est presente ca a e a com valor .TRUE., a posio mais ` direita de tal caractere retornada. ca a e

7.6.4

Converso lgica a o

A funo elemental a seguir converte de uma espcie do tipo lgico em outra. ca 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

Funoes no-elementais para manipulao de strings c a ca


Funo inquisidora para manipulao de strings ca ca

LEN(STRING). Trata-se de uma funo inquisidora que retorna um valor inteiro padro escalar que corresponde ca a ao nmero 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

Funoes transformacionais para manipulao de strings c ca

Existem duas funes que no so elementais porque o comprimento do resultado depende do valor de um co a a argumento. REPEAT(STRING,NCOPIES). Forma a string que consiste na concatenao de NCOPIES cpias de STRING, onde ca 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: 24 de abril de 2008

Cap tulo 7. Rotinas Intr nsecas

71

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

7.8
7.8.1

Funoes inquisidoras e de manipulaes numricas c co e


Modelos para dados inteiros e reais

.d o

c u -tr a c k

.c

As funes inquisidoras e de manipulaes numricas so denidas em termos de modelos de representao co co e a ca de nmeros 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 nmeros sejam representveis. u a

7.8.2

Funoes numricas inquisidoras c e

H nove funes inquisidoras que retornam valores para os modelos de dados associados com seus argumentos. a co Cada funo tem um unico argumento que pode ser escalar ou matricial e todas retornam um valor escalar. O ca 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 funo calcula b1p . ca 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 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 nmeros reais da mesma espcie de X. O valor da funo INT((p u e ca 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 nmeros reais ou inteiro da mesma espcie de X. O valor da funo u e ca 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 nmeros positivos nos modelos. a u
Autor: Rudi Gaelzer IFM/UFPel Impresso: 24 de abril de 2008

rq 1

72

7.8. Funes inquisidoras e de manipulaes numricas co co e

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

TINY(X). Para X real, retorna o menor nmero positivo, u bemin 1 no modelo que inclui X. O resultado do mesmo tipo e espcie de X. e e

c u -tr a c k

.c

7.8.3

Funoes elementais que manipulam quantidades reais c

H sete funes elementais cujo primeiro ou unico argumento do tipo real e que retorna valores relacionados a co 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 nmero 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 nmero de modelo; isto , a funo retorna Xbe . u e ca NEAREST(X,S). Retorna uma quantidade real da mesma espcie que X e cujo valor o nmero 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 nmeros de modelo prximos a X; isto , a funo retorna |Xbe | bp . u o e ca 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 representao de X e cuja parte exponencial I; isto , a funo retorna Xb1e . a ca e e ca SPACING(X). Retorna uma quantidade real da mesma espcie que X cujo valor o espaamento absoluto do e e c modelo de nmeros prximos a X. O resultado bep se X no nulo e este resultado est dentro do u o e e a a intervalo de nmeros representveis. Caso contrrio, a funo retorna TINY(X). u a a ca

7.8.4

Funoes transformacionais para valores de espcie (kind) c e

H duas funes que retornam o menor valor do parmetro de espcie que ir satisfazer um dado requerimento a co a e a numrico. As funes tm argumentos e resultados escalares; porm so classicadas como transformacionais. e co e e a Estas funoes j foram discutidas na seo 3.7.3. c a ca 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 funo PRECISION) no m a ca nimo igual a P e intervalo de expoente decimal (conforme retornado pela funo RANGE) no m ca 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: 24 de abril de 2008

Cap tulo 7. Rotinas Intr nsecas

73

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

7.9

Rotinas de manipulao de bits ca

.d o

c u -tr a c k

.c

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 nmeros 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 nmero 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

Funoes elementais c

BTEST(I,POS). Retorna o valor lgico da espcie padro .TRUE. se o bit POS do inteiro I tem valor 1 e retorna o e a .FALSE. em outra situao. POS deve ser um inteiro com valor no intervalo 0 POS < BIT SIZE(I). ca 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 posies para a esquerda (-ISHIFT desloca para a direita se SHIFT for positivo). Zeros so inseridos co 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: 24 de abril de 2008

74

7.9. Rotinas de manipulao de bits ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 posies a a co 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

c u -tr a c k

.c

7.9.3

Subrotina elemental

MVBITS(FROM,FROMPOS,LEN,TO,TOPOS). Copia a seqncia de bits em FROM que inicia na posio FROMPOS e tem ue ca comprimento LEN para TO, iniciando na posio TOPOS. Os outros bits de TO permanecem inalterados. FROM, ca 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 funo de transferncia permite que dados de um tipo sejam transferidos a outro tipo sem que a repreca e sentao f ca sica dos mesmos seja alterada. Esta funo pode ser util, por exemplo, ao se escrever um sistema de ca armazenamento e recuperao de dados; o sistema pode ser escrito para uma dado tipo, por exemplo, inteiro, e ca 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 representao f ca 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 funes transformacionais que realizam multiplicaes vetorial ou matricial. Elas possuem dois a co co 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 operaes de multiplicao ou .AND. entre dois e e co ca escalares. As funes SUM e ANY, usadas nas denies abaixo, so denidas na seo 7.12.1 abaixo. co co a ca 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 funo retorna SUM(VETOR_A*VETOR_B); se VETOR_A do tipo come ca e plexo, a funo retorna SUM(CONJG(VETOR_A)*VETOR_B); e se VETOR_A do tipo lgico, a funo retorna ca e o ca ANY(VETOR_A .AND. VETOR_B). MATMUL(MATRIZ_A,MATRIZ_B). Realiza a multiplicao escalar. Para argumentos numricos, trs casos so ca 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 funo SUM e do operador * pela funo ANY e pelo operador .AND.. c ca ca
Autor: Rudi Gaelzer IFM/UFPel Impresso: 24 de abril de 2008

Cap tulo 7. Rotinas Intr nsecas

75

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

7.12

Funes transformacionais que reduzem matrizes co

.d o

c u -tr a c k

.c

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

7.12.1

Caso de argumento unico

Nas suas formas mais simples, estas funes tm um unico argumento matricial e o resultado um valor co 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 nmero 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 funo retorna o valor negativo de maior magnitude suportado pelo processador. ca 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 funo retorna o valor positivo de maior magnitude suportado pelo processador. ca PRODUCT(ARRAY). Retorna o produto de todos os elementos de uma matriz inteira, real ou complexa. A funo ca 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 funo retorna ca o valor 0 se ARRAY for nula.

7.12.2

Argumento opcional DIM

Todas as funes acima tm um segundo argumento opcional DIM, o qual um inteiro escalar. Se este co e e argumento est presente, a operao aplicada a todas as sees de posto 1 que varrem atravs da dimenso a ca e co 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 funes MAXVAL, MINVAL, PRODUCT e SUM tm um terceiro argumento opcional; uma matriz lgica MASK. co e o Se esta matriz estiver presente, ela deve ter a mesma forma que o primeiro argumento e a operao aplicada ca 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 funo ca e no afeta o desenvolvimento de argumentos que so expresses matriciais. a a o

7.13

Funes inquisidoras de matrizes co

H cinco funes que inquirem sobre os limites, forma, tamanho e status de alocao de uma matriz de a co ca 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 alocao indenido, o resultado tambm c e ca e e e indenido.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 24 de abril de 2008

76

7.12. Funes transformacionais que reduzem matrizes co

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

7.13.2

Limites, forma e tamanho

.d o

c u -tr a c k

.c

As funes a seguir inquirem sobre as propriedades de uma matriz. No caso de uma matriz alocvel, esta co a deve estar alocada. No caso de um ponteiro (pointer), ele deve estar associado a um alvo (target). Uma seo ca 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 funo no pode ser, por sua vez, um argumento mudo opcional. c ca 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 funes que constroem ou manipulam matrizes de qualquer tipo. a co

7.14.1

Funo elemental MERGE ca

MERGE(TSOURCE,FSOURCE,MASK). Trata-se de uma funo elemental. TSOURCE pode ter qualquer tipo e FSOURCE ca 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 funo transformacional PACK agrupa dentro de um vetor aqueles elemento de uma matriz que so seleca a cionados por uma matriz lgica conforme e a funo transformacional UNPACK executa a operao reversa. Os o ca ca 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 nmero 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 nmero 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 funo transformacional RESHAPE permite que a forma de uma matriz seja alterada, com a poss perca vel mutao dos ca 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 ou 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 (seo 6.6.2), so os elementos de SOURCE, seguidos por cpias de PAD, tambm na ordem de ca 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: 24 de abril de 2008

Cap tulo 7. Rotinas Intr nsecas

77

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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.

c u -tr a c k

.c

7.14.4

Funo transformacional para duplicao ca ca

SPREAD(SOURCE,DIM,NCOPIES). Retorna 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 seo vetorial que se e e ca 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 funo TRANSPOSE executa a transposio matricial para qualquer matriz de posto dois. ca ca 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 funes transformacionais que localizam as posies dos valores mximos e m a co co 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 distingir 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: 24 de abril de 2008

78

7.15. Funes transformacionais para localizao geomtrica co ca e

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

7.16

Funo transformacional para dissociao de ponteiro ca ca

.d o

c u -tr a c k

.c

Em Fortran95, a funo NULL est dispon para fornecer status de dissociado a ponteiros. ca 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 funes a co devido ` necessidade destas retornarem diversas informaes atravs de seus argumentos. a co e

7.17.1

Relgio de tempo real o

H duas subrotinas que retornam informao acerca do relgio de tempo real; a primeiro baseada no a ca o e padro ISO 8601 (Representao de datas e tempos). Assume-se que exista um relgio bsico no sistema que a ca 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 inteno OUT (seo 8.2.5). Adicionalmente, h uma subrotina que acessa o relgio e ca ca a o interno do processador. Acesso a qualquer argumento opcional pode ser realizado atravs do uso das palavras-chave (sees 8.2.8 e e co 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 padro que contm a data na forma ccyymmdd, e a e a e correspondendo 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 relao ao UTC, a hora do dia, os minutos da hora, e c ca 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 pondem 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 nmero 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 aproximao (dependente de processador) e a a a e da ca 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: 24 de abril de 2008

Cap tulo 7. Rotinas Intr nsecas

79

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

7.17.3

N meros aleatrios u o

.d o

c u -tr a c k

.c

Uma seqncia de nmeros pseudo-aleatrios gerada a partir de uma semente que fornecida como um ue u o e e vetor de nmeros inteiros. A subrotina RANDOM_NUMBER retorna os nmeros pseudo-aleatrios e a subrotina u u o RANDOM_SEED permite que uma inquirio seja feita a respeito do tamanho ou valor do vetor-semente e, ento, ca a redenir o mesmo. As subrotinas fornecem uma interface a uma seqncia que depende do processador. ue CALL RANDOM_NUMBER(COLHE) Retorna um nmero pseudo-aleatrio a partir da distribuio uniforme de nu o ca u meros no intervalo 0 x < 1 ou um vetor destes nmeros. COLHE tem inteno OUT, pode ser um escalar u ca 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 inteno OUT e um inteiro escalar padro que o processador xa com o tamanho n do vetorca e a semente. PUT tem inteno IN e um vetor inteiro padro de tamanho n que usado pelo processador para xar ca e a e uma nova semente. Um processador pode xar o mesmo valor de semente para mais de um valor de PUT. GET tem inteno OUT e um vetor inteiro padro de tamanho n que o processador xa como o valor atual ca e a da semente.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de abril de 2008

80

7.17. Subrotinas intr nsecas no-elementais a

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.c

Cap tulo 8

Sub-Programas 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 ??. 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 sub-programa 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 Fortran 77 quanto em Fortran 90/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 Fortran 90/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 Fortran 90/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 Fortran 90/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 sub-programas. Um programa principal possui a seguinte forma: 81

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Programa Principal

c u -tr a c k

.c

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 <sub-programas 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 sub-programas 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 sub-programas 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 situaao o programa tambm termina. Contudo, este estilo de programao t c e ca e pico do Fortran 77, mas no recomendado pelo padro do Fortran 90/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 sub-programa.
1 No

caso do compilador F, obrigatrio. e o

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 23 de abril de 2008

82

8.1. Unidades de programa

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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.

c u -tr a c k

.c

8.1.2

Rotinas externas

Rotinas externas so chamadas de dentro de um programa 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 Fortran 90/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 (seo 9.2) e rotinas internas. Tudo associado com uma determinada tarefa pode ser coletado dentro de um ca 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 Fortran 90/95 ser feita na seo 8.3. a o a ca

8.2

sub-programas

sub-programas podem ser subrotinas ou funes. Como j foi mencionado, tarefas que podem ser delimitadas co 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 sub-programas. 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 sub-programas apresentam uma forma semelhante a de um programa ca principal. Um sub-programa 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

83

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

[CONTAINS <sub-programas 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 <sub-programas 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 sub-programa. Alm dos atributos j vistos, relacionados com as declaraes de tipo e a e a co espcie de variveis, dos atributos DIMENSION e ALLOCATABLE, os seguintes atributos podem ser usados: e 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 sub-programa consiste em retornar o controle ` unidade que o chamou, ao invs de a e interromper a execuao do programa. Aqui tambm recomenda-se o uso da forma completa do comando para c 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: 23 de abril de 2008

c u -tr a c k

.c

84

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

8.2.2

Rotinas internas

.d o

c u -tr a c k

.c

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 sub-programas internos, a a externos e a rotinas de mdulos. o

8.2.3

Argumentos de sub-programas

Argumentos de sub-programas 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 sub-programa so muitas e a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

85

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 sub-programa seja igual ao nome e da varivel muda. O ponto importante que sub-programas 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 sub-programas 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 87, 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

c u -tr a c k

.c

8.2.4

Comando RETURN

No padro da linguagem, um sub-programa pode ser encerrado pelo comando END, sendo o controle do uxo a retornado ` unidade que chamou este sub-programa. Contudo, o meio recomendado de se retornar controle a a partir de um sub-programa 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 inicialmente 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 sub-programas 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: 23 de abril de 2008

86

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

87

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 89. 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 89, 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 Fortran 77. 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 Fortran 77 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 Fortran e u e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 23 de abril de 2008

88

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d 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

c u -tr a c k

.c

Impresso: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

89

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

77; 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 sub-programas de forma correta, o compilador necessita conhecer certos detalhes destes sub-programas, como os seus nomes e o nmero, tipo e espcie dos argumentos. Em Fortran 90/95, esta u e tarefa desempenhada pelos blocos de interface. e No caso de rotinas intr nsecas, sub-programas 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 sub-programas e do comando END FUNCTION ou END SUBROUTINE. Em outras palavras, consiste, normalmente, em uma cpia exata do sub-programa 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 sub-programa 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 sub-programa. 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 91 e 92. a a

c u -tr a c k

.c

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 Fortran 77: 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 Fortran 90/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: 23 de abril de 2008

90

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

! 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

91

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

! 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

c u -tr a c k

.c

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. Conseqentemente, a seguinte chamada no vlida: u a e a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 23 de abril de 2008

92

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 sub-programa 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 sub-programa 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 sub-programa 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

93

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 sub-programas. 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 Fortran 77

O Fortran 77 j possu diversos recursos para realizar a transferncia de matrizes entre sub-programas. a a e Estes recursos foram posteriormente estendidos com a denio do novo padro com o Fortran 90/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 sub-programas 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 Fortran 77 introduziu dois mecanismos que possibilitaram uma alocao dinmica no tamanho de matrizes ca a usadas como argumentos mudos de sub-programas. 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 sub-programas deveriam ter seu tamanho denido por alocao esttica em algum ponto dentro das unidades ca a de programas que chamavam as rotinas.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 23 de abril de 2008

94

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Matrizes ajustveis a

c u -tr a c k

.c

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 sub-programa. A circunstncia mais freqente ocorre quando o tamanho real da a u matriz desconhecido quando a rotina inicialmente chamada. Neste caso, uma matriz de tamanho assumido e e a alternativa existente em Fortran 77. e Estas matrizes tambm somente so permitidas como argumentos mudos de sub-programas, 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

95

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Sees de matrizes co 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 Fortran 90/95

c u -tr a c k

.c

Com a denio do novo padro Fortran 90/95, os recursos para uso de matrizes como argumentos mudos ca a de sub-programas foi ampliado em relao aos mecanismos j existentes no Fortran 77. ca a No Fortran 90/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 Fortran 90/95 deniu dois novos mecanismos para a denio de matrizes ca mudas variveis como argumentos de sub-programas: as matrizes de forma assumida, as quais generalizam as a matrizes de tamanho assumido do Fortran 77 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 Fortran 90/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: 23 de abril de 2008

96

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d 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

c u -tr a c k

.c

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 98: 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

97

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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: 23 de abril de 2008

98

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

8.2.12

sub-programas 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

99

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

! 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 Fortran 77, 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 Fortran 90/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 101 e 102 descreve uma subrotina que gera uma matriz de pontos a partir a de uma funo fornecida pelo programador. ca

c u -tr a c k

.c

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 co ros. No caso de funes de valor matricial, o tamanho do resultado pode ser determinado de forma semelhante a ` maneira como matrizes automticas so declaradas. a a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 23 de abril de 2008

100

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

! 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

101
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

! 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

c u -tr a c k

.c

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: 23 de abril de 2008

102

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

8.2.14

Recursividade e rotinas recursivas

.d o

c u -tr a c k

.c

Recursividade ocorre quando rotinas chamam a si mesma, seja de forma direta ou indireta. Por exemplo, sejam as rotinas A e B. Recursividade pode ocorrer de duas formas: Recursividade direta: A invoca A diretamente. Recursividade indireta: A invoca B, a qual invoca A. Qualquer cadeia de invocaes de rotinas com um componente circular (isto , invocao direta ou indireta) co e ca exibe recursividade. Embora recursividade seja uma tcnica bonita e sucinta para implementar uma grande e variedade de problemas, o uso incorreto da mesma pode provocar uma perda na ecincia da computao do e ca cdigo. o Fortran 77 Em Fortran 77, recursividade direta no permitida. Qualquer tentativa de forar uma rotina a chamar a a e c si prpria resultar em erro de compilao. Em grande parte dos textos, arma-se que recursividade indireta o a ca tambm no poss 3 . Contudo, recursividade pode ser simulada em Fortran 77 quando uma rotina chama a e a e vel si prpria usando no o seu nome real mas atravs de um argumento mudo, como no exemplo abaixo:4 o 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 recursividade mesmo em Fortran 77. e vel Fortran 90/95 Em Fortran 90/95, por outro lado, recursividade suportada como um recurso expl 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

103
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Recursividade direta. Para ns de ecincia na execuo do cdigo, rotinas recursivas devem ser explicitae ca o mente 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)!

c u -tr a c k

.c

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 Recursividade indireta. Uma rotina tambm pode ser invocada por recursividade indireta, isto , uma e e rotina chama outra a qual, por sua vez, invoca a primeira. Para ilustrar a utilidade deste recurso, supe-se que o se queira realizar uma integrao numrica bi-dimensional quando se dispe somente de um cdigo que executa ca e o o integrao unidimensional. Um exemplo de funo que implementaria integrao unidimensional dado a seguir. ca ca ca e O 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: 23 de abril de 2008

104

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d 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

c u -tr a c k

.c

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 sub-programa aps a sa o da. Desta forma, o valor anterior desta varivel est acess quando o sub-programa a a vel invocado novamente. e 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

105
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

A= 0.0 ELSE A= A + X END IF ... RETURN END SUBROUTINE CONTA_SOMA 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 subseqente <lista nomes variveis> equivale ` mesma declarao aplicada ca u 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

c u -tr a c k

.c

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: 23 de abril de 2008

106

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

A= 2*A FUN2= A/C RETURN END FUNCTION FUN2

c u -tr a c k

.c

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 sejam 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

107
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

8.2.17

Rotinas elementais

.d o

c u -tr a c k

.c

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 Fortran 95 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: 23 de abril de 2008

108

8.2. sub-programas

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

TEMP= A A= B B= TEMP RETURN END SUBROUTINE TROCA

c u -tr a c k

.c

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 Fortran 90 um novo tipo de unidade de programa e denominada mdulo. Um mdulo um recurso muito poderoso para transferir dados entre sub-programas e o o e para 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 Fortran 77. 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

109
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

8.3.1

Dados globais

.d o

c u -tr a c k

.c

Em Fortran, variveis so usualmente entidades locais. Contudo, em muitas situaes necessrio que alguns a a co e a 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 surge e e uma situao onde uma varivel no pode ser compartilhada como argumento de um sub-programa. Neste ca a a momento, necessria uma outra estratgia para se denir dados globais. Esta necessidade j era corriqueira e a e a no Fortran 77. Fortran 77 A maneira mais usada no Fortran 77 para compartilhar dados globais atravs de blocos common. Um e e bloco 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: 23 de abril de 2008

110

8.3. Mdulos o

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 Fortran 90/95; porm, o seu uso no recomendado, pela razo a e a e a exposta acima. Fortran 90/95

c u -tr a c k

.c

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 FUNCTION, SUBROUTINE ou MODULE) e antes de qualquer outra instruo no executvel, tal como uma declarao ca a a ca 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

111
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d 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 Fortran 90/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 declaraao USE referindo-se ao mesmo mdulo. Por conseguinte, deve-se notar que que um USE com o c 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

c u -tr a c k

.c

! *** 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: 23 de abril de 2008

112

8.3. Mdulos o

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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

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 associaao ao hospedeiro. Contudo, variveis declaradas localmente em um determinado sub-programa de c a mdulo so opacas aos outros sub-programas. 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

113
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 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 sub-programas criados para desempenhar uma determinada tarefa, juntamente com os objetos globais associados a estes sub-programas. 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: 23 de abril de 2008

c u -tr a c k

.c

114

8.3. Mdulos o

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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

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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

115
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d 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

c u -tr a c k

.c

8.3.4

Interfaces e rotinas genricas e

Outro recurso poderoso introduzido pelo Fortran 90 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 Fortran 95. 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: 23 de abril de 2008

116

8.3. Mdulos o

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 97 e depois, na forma de uma subrotina elemental, na seo 8.2.17. O a ca mdulo gentroca na pgina 118 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 119. 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 119. 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

117
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

! 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: 23 de abril de 2008

118

8.3. Mdulos o

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d 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

c u -tr a c k

.c

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 estende 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 ??): a ca
Autor: Rudi Gaelzer IFM/UFPel Impresso: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

119
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 sub-programa, 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 sub-programa, interno ou externo, tem seu conjunto independente de rtulos. o Portanto, o mesmo rtulo pode ser usado em um programa principal e em seus sub-programas internos sem o ambigidade. u Assim, o mbito de um rtulo um programa principal ou sub-programa, excluindo quaisquer sub-programas 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 cabealho 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 sub-programas que eles contm, exceto quando o nome redeclarado no sub-programa. 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 sub-programa 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 sub-programas 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 sub-programas 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: 23 de abril de 2008

120

8.4. Ambito (Scope)

to

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Entidades declaradas em diferentes unidades de mbito so sempre distintas, mesmo que elas tenham o a a mesmo nome e propriedades.

c u -tr a c k

.c

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 Associao 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: 23 de abril de 2008

Cap tulo 8. Sub-Programas e Mdulos o

121
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 23 de abril de 2008

122

8.4. Ambito (Scope)

to

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.c

Cap tulo 9

Comandos de Entrada/Sa de Dados da


O Fortran 90/95 possui um conjunto rico de instrues de entrada/sa (E/S) de dados. Entretanto, este co da cap tulo ir apresentar apenas um conjunto de instrues que implementam um processo bsico de E/S. a co 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 execuo de um programa, algumas vezes h uma quantidade grande de dados produzidos por ca a uma parte do programa, os quais no podem ser todos armazenados na memria de acesso aleatrio (RAM) do a o o computador. Nesta situao tambm se usam os comandos de E/S da linguagem. ca 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 formatao a ca que instruem a maneira como os dados so lidos ou escritos. a At este ponto, todos os exemplos abordados executaram operaes de E/S de dados com teclado (entrada) e co 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 freqente deste recurso. Outros tipos de usos incluem sa u da direta de dados em impressoras, plotters, programas grcos, recursos de multimeios, etc. a Devido ` variedade de usos dos comandos de E/S, interessante que se faa inicialmente uma introduo a e c ca simples ao assunto, abordando os usos mais freqentes dos processos com arquivos externos, para posteriormente u entrar-se em maiores detalhes. Com este intuito, a seo 9.1 contm esta introduo rpida, ao passo que as ca e ca a sees posteriores (9.3 9.11) abordam o assunto de uma forma bem mais abrangente. co

9.1

Comandos de Entrada/Sa da: introduo rpida ca a

Na seo 2.3 na pgina 11 j foram apresentadas a entrada (teclado) e a sa (tela do monitor) padres do ca 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 nmero 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. 123

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

Tarefa 1. Sa formatada na tela do monitor da


Considera-se inicialmente o seguinte programa que realiza sa no formato livre na tela: da

.d o

c u -tr a c k

.c

program F out i m p l i c i t none integer , parameter : : dp= SELECTED REAL KIND( 1 5 , 3 0 0 ) r e a l ( dp ) : : a , b , c a= 1 . 0 dp / 7 . 0 dp b= s q r t ( 2 . 0 dp ) c= 4 * atan ( 1 . 0 dp ) print * , a , b , c end program F out 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 nmero grande de espaos em branco antes e entre os valores dos resultados e todos a u c so apresentados com o nmero total de d a 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 u t f o r m a t a d o i m p l i c i t none integer , parameter : : dp= SELECTED REAL KIND( 1 5 , 3 0 0 ) r e a l ( dp ) : : a , b , c a= 1 . 0 dp / 7 . 0 dp b= s q r t ( 2 . 0 dp ) c= 4 * atan ( 1 . 0 dp ) print ( f 7 . 5 , 1 x , f 9 . 7 , 1 x , f 1 1 . 9 ) , a , b , c print ( f 7 . 7 , 1 x , f 9 . 9 , 1 x , e11 . 5 ) , a , b , c print ( a= , f 7 . 5 , 2 x , b= , f 9 . 7 , 3 x , c= , f 1 1 . 9 ) , a , b , c end program F o u t f o r m a t a d o Agora, os resultados so: a 0.14286 1.4142136 3.141592654 ******* ********* 0.31416 E +01 a = 0.14286 b = 1.4142136 c = 3.141592654 Nos trs resultados, o segundo argumento dos comandos WRITE indica a formatao na sa e ca da, conforme determinada pelo especicador FMT=,1 o qual no obrigatrio se o formato dos dados aparecer como segundo a e o elemento de um comando de E/S. A formatao dos dados de sa determinada pela seqncia de descritores ca da e ue de edio (X, F e E), os quais tm os seguintes signicados: ca e
Os descritores 1X, 2X e 3X indicam quantos espaos em branco (respectivamente 1, 2 e 3) devem ser c deixados na sa dos dados. da Os descritores F e E so descritores de edio de dados e eles se aplicam ao dados na lista de variveis (A, B a ca a e C) na mesma ordem em que aparecem, ou seja, na sa 1, F7.5 determina a edio da varivel A, F9.7 da ca a determina a adio de B e F11.9 determina a edio de C. ca ca 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. Exemplos de nmeros de ponto utuante vlidos so: a a u a a
5 d gitos 7 d gitos 9 d gitos

F7.5: 0.14286
7 caracteres
1 Discutido

F9.7: -.1414214
9 caracteres

F12.9: -3.141592654
12 caracteres

em detalhes na seo 9.7 na pgina 136. ca a

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 27 de maio de 2008

124

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

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 nmero 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. Exemplos a vlidos de nmeros no formato exponencial so: a u a
5 d gitos 6 d gitos

c u -tr a c k

.c

E11.5: 0.31416 E+01


11 caracteres

E13.6: -4. 430949 E-12


13 caracteres

Finalmente, as constantes de caractere A= , B= e C= que aparecem na formatao da sa 3 so ca 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 exposio completa de todos os descritores realizada na seo 9.8 na pgina 137. ca e ca a

Tarefa 2. Entrada formatada a partir do teclado


Entrada formatada a partir do teclado no uma tarefa muito prtica, pois uma instruo do tipo a e a ca READ(*,FMT=(1X,F7.5,5X,F9.6,3X,F11.8))A, B, C iria requerer a digitao dos valores das variveis exatamente nas posies assinaladas e com as extenses e ca a co o partes fracionrias exatamente como determinadas pelos descritores. Por exemplo, se A= 2.6, B= -3.1 e C= a 10.8, seria necessrio digitar a 2.60000 -3.100000 10.80000000

para preencher todos os d gitos e espaos determinados pelos descritores de formatao. c ca

Tarefa 3. Sa de dados em um arquivo da


Da mesma maneira que um programa-fonte gravado em um arquivo situado no disco r e gido do computador, poss gravar dados em arquivos a partir de um programa ou, de forma alternativa, ler dados contidos em e vel arquivos situados no disco. Para possibilitar acesso de E/S em um arquivo necessrio que o programador: e a
Identique o nome do arquivo, fornecendo o caminho completo, caso o arquivo resida em um diretrio o (pasta) distinto do programa executvel. a Informe ao sistema sobre o tipo de acesso e uso que ser feito do arquivo. a

Associe instrues individuais de leitura ou gravao com o arquivo em uso. E poss existir mais de um co ca vel arquivo simultaneamente acess para E/S, alm das interfaces j utilizadas (teclado e monitor). vel e a
Quando as operaes de E/S estiverem conclu co das, necessrio instruir ao sistema no mais necessrio e a a e a acessar o(s) arquivo(s).

O programa exemplo a seguir grava informaes formatadas ao arquivo EX1.DAT. A extenso .DAT simplesmente co a identica o arquivo como sendo de dados. Se o arquivo no existir, este criado e tornado acess a e vel; se ele existe, ento os dados previamente contidos nele podem ser substitu a dos por novos. program Arq Sai i m p l i c i t none integer , parameter : : dp= SELECTED REAL KIND( 1 5 , 3 0 0 ) r e a l ( dp ) : : a , b , c a= 1 . 0 dp / 7 . 0 dp b= s q r t ( 2 . 0 dp ) c= 4 * atan ( 1 . 0 dp )
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

125
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

open ( 1 0 , f i l e=ex1 . dat ) write ( 1 0 , fmt=( f 7 . 5 , 1 x , f 9 . 7 , 1 x , f 1 1 . 9 ) ) a , b , c close (10) end program Arq Sa i Alterando os valores das variveis A, B e C, altera-se os valores gravados no arquivo EX1.DAT. a Os comandos-chave neste exemplo so: a OPEN(10, FILE="EX1.DAT"). O comando OPEN habilita acesso ao arquivo EX1.DAT para o sistema. O arquivo est situado no mesmo diretrio que o programa e este ser criado caso no exista previamente, sendo a o a a poss ento a gravao no mesmo, ou, caso ele j exista, ter acesso de leitura e/ou escrita. vel a ca a a O nmero 11 indica a unidade lgica que ser acessada. Doravante, o arquivo EX1.DAT ser sempre u o a a identicado pelo programa atravs deste nmero. e u O modo como o acesso ao arquivo feito pode ser alterado de diversas maneiras. A seo 9.4 descreve e ca todos os especicadores poss veis do comando OPEN. WRITE(10, FMT="(F7.5,1X,F9.7,1X,F11.9)") A, B, C. Este comando aqui utilizado no lugar de PRINT e para realizar um processo de escrita formatada no arquivo associado ` unidade lgica 10. A formatao a o ca fornecida pela lista de descritores de formatao que seguem a palavra-chave FMT=. O papel destes e ca descritores j foi esclarecido. a O comando essencialmente grava os valores das variveis A, B e C de maneira formatada no arquivo a associado ` unidade 10. a CLOSE(10). Finalmente, este comando informa ao computador que no ser mais necessrio acessar o arquivo a a a associado ` unidade lgica 10 e que tal associao deve ser interrompida. a o ca

c u -tr a c k

.c

Tarefa 4. Leitura/escrita de dados em arquivos. Verso 1: n mero conhecido de a u linhas


O programa a seguir l os dados gravados no arquivo EX1.DAT, criado a partir do programa ARQ_SAI, e usa e estes dados para denir valores de outros, os quais sero gravados no arquivo EX2.DAT. a program A r q S a i 2 i m p l i c i t none integer , parameter : : dp= SELECTED REAL KIND( 1 5 , 3 0 0 ) r e a l ( dp ) : : a , b , c ! Dados de e n t r a d a . r e a l ( dp ) : : d , e , f ! Dados de s a i d a . open ( 1 0 , f i l e=ex1 . dat , status= o l d ) open ( 1 1 , f i l e=ex2 . dat , status=new ) read ( 1 0 , fmt=( f 7 . 5 , 1 x , f 9 . 7 , 1 x , f 1 1 . 9 ) ) a , b , c print * , Os v a l o r e s l i d o s foram : print * , a= , a print * , b= , b print * , c= , c d= a + b + c e= b ** 2 + c o s ( c ) f= s q r t ( a ** 2 + b ** 3 + c * * 5 ) write ( 1 1 , fmt= ( 3 ( e11 . 5 , 1 x ) ) ) d , e , f end program A r q S a i 2 No programa ARQ_SAI_2 aparecem as seguintes instrues que ainda no foram discutidas: co a STATUS="OLD/NEW". Estas clusulas, que aparecem nos comandos OPEN, indicam o status exigido para o arquivo a a ser acessado. STATUS="OLD" indica que o arquivo deve existir no momento de acesso. Caso isto no a acontea, ocorre uma mensagem de erro e o programa interrompido. STATUS="NEW" indica que o arquivo c e no deve existir previamente e, ento, deve ser criado. Novamente, se estas condies no se cumprirem, a a co a o programa pra. a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

126

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

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

READ(10, FMT="(F7.5,1X,F9.7,1X,F11.9)") A, B, C. Observa-se aqui o uso de uma entrada formatada com o comando READ. A formatao das variveis A, B e C j foi discutida. Deve-se enfatizar novamente que ca a a a formatao especicada pelo FMT= deve possibilitar a leitura correta dos dados no arquivo associado ` ca a unidade lgica 10. o WRITE(11, FMT="(3(E11.5,1X))") D, E, F. O aspecto ainda no abordado neste comando WRITE o uso do a e contador de repetio 3, o qual indica que as variveis D, E e F devem ser gravado no arquivo associado ` ca a a unidade 11 com a formatao dada por "E11.5,1X" repetido 3 vezes consecutivas. ca

c u -tr a c k

.c

Finalmente, deve-se mencionar que os comandos CLOSE(10) e CLOSE(11) no foram utilizados. Isto permitido, a e uma vez que, neste caso, a associao das unidades lgicas aos arquivos ser interrompida com o nal da execuo ca o a ca do programa. Contudo, em certas situaes necessrio associar uma unidade lgica previamente empregada a co e a o um outro arquivo, o que neste caso obriga o programador a fazer uso do comando CLOSE. Modicaes posteriores no programa necessitaro tambm a eliminao do arquivo EX2.DAT, devido ` co a e ca a clusula STATUS="NEW". a

Tarefa 5. Leitura/escrita de dados em arquivos. Verso 2: n mero desconhecido a u de linhas


Quando o nmero de linhas no arquivo de entrada no previamente conhecido, necessrio um procedimento u a e e a diferente daquele adotado na Tarefa 4. O programa 9.1 ilustra dois poss veis mtodos a ser adotados, os quais e utilizam as opes IOSTAT ou END do comando READ (seo 9.5). Em ambos, aloca-se inicialmente uma matriz co ca temporria com o posto adequado e com um nmero tal de elementos que seja sempre maior ou igual ao a u nmero mximo de linhas que podem estar contidas no arquivo de entrada. Aps a leitura dos dados na matriz u a o temporria, o nmero de linhas no arquivo tornou-se conhecido e aloca-se, ento, uma matriz denitiva com o a u a nmero correto de elementos. O segundo exemplo faz uso de um rtulo (seo 5.1.1), que embora no seja um u o ca a procedimento recomendado em Fortran 90/95, completamente equivalente ao primeiro exemplo. e Existem maneiras mais inteligentes de realizar esta tarefa, sem que seja necessrio denir-se uma matriz a temporria. Porm, estas maneiras envolvem o uso de ponteiros e listas encadeadas (linked lists) os quais a e constituem recursos mais avanados e que no foram ainda abordados nesta apostila. c a Os exemplos abordados nas Tarefas 1 5 constituem um conjunto pequeno, porm freqente, de usos dos e u comando de E/S. A descrio completa destes recursos pode ser obtida nas sees 9.39.11 posteriores. ca co

9.2

Declarao NAMELIST ca

Em certas situaes, quando h por exemplo um nmero grande de parmetros sendo transferidos em proco a u a cessos de E/S, pode ser util denir-se uma lista rotulada de valores destinados ` transferncia. O Fortran 90 a e introduziu, com este m, a declarao NAMELIST, que dene um ou mais grupos de variveis referenciadas com o ca a mesmo nome. Esta declarao empregada em conjunto com operaes de E/S executadas por comandos READ ca e co e WRITE. A forma geral da declarao, que pode aparecer em qualquer unidade de programa, : ca e NAMELIST /<nome-grupo-namelist>/ <lista-nomes-variveis> & a [[,] /<nome-grupo-namelist>/ <lista-nomes-variveis> [,] ...] a Como se pode notar, poss denir-se mais de um grupo NAMELIST na mesma declarao. O primeiro campo e vel ca substitu vel: <nome-grupo-namelist> , o nome do grupo para uso subseqente nos comandos de E/S. A e u <lista-nomes-variveis> , como o nome indica, lista os nomes das variveis que compe o grupo. No podem a a o a constar desta lista nomes de matrizes mudas de forma assumida, ou objetos automticos, variveis de caractere a a de extenso varivel, matrizes alocveis, pointers, ou ser um componente de qualquer profundidade de uma a a a estrutura que seja um ponteiro ou que seja inacess vel. Um exemplo vlido de <lista-nomes-variveis> : a a e REAL :: TV, CARPETE REAL, DIMENSION(10) :: CADEIRAS ... NAMELIST /ITENS_DOMESTICOS/ CARPETE, TV, CADEIRAS Outro exemplo vlido: a NAMELIST /LISTA1/ A, B, C /LISTA2/ X, Y, Z
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

127
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

Programa 9.1: Programa que ilustra leitura de arquivo com nmero desconhecido de linhas. u

! **************************** PROGRAMA ARQ SAI 3 ****************************** ! Le um a r q u i v o de dados com um numero c o n h e c i d o de e l e m e n t o s por l i n h a , ! mas com um numero d e s c o n h e c i d o de l i n h a s no formato l i v r e , usando ! matrizes temporarias . ! A l e i t u r a do a r q u i v o e r e a l i z a d a de 2 maneiras d i s t i n t a s : ! 1 . Usando a opcao IOSTAT . ! 2 . Usando a opcao END. ! O programa e n t a o imprime na t e l a os dados e o numero de l i n h a s l i d o . ! ! Autor : Rudi G a e l z e r ! Data : Maio /2008 ! program A r q S a i 3 i m p l i c i t none integer , parameter : : dp= SELECTED REAL KIND( 1 5 , 3 0 0 ) integer : : c o n t r o l e , i , npt1= 0 , npt2= 0 character ( len= 1 ) : : c h a r r e a l ( kind=dp ) , dimension ( : , : ) , a l l o c a t a b l e : : temp1 , temp2 , matriz1 , m a t r i z 2 a l l o c a t e ( temp1 ( 2 , 1 0 0 0 ) , temp2 ( 2 , 1 0 0 0 ) ) ! Aloca m a t r i z e s t e m p o r a r i a s . ! Estima um l i m i t e s u p e r i o r no numero ! de l i n h a s . ! Metodo 1 : usando opcao IOSTAT . open ( 1 0 , f i l e = ex3 . dat , status = old ) do read ( 1 0 , * , i o s t a t= c o n t r o l e ) temp1 ( 1 , npt1 +1) , temp1 ( 2 , npt1 +1) i f ( c o n t r o l e < 0 ) exit ! F i n a l de a r q u i v o d e t e c t a d o . npt1= npt1 + 1 end do close (10) a l l o c a t e ( m a t r i z 1 ( 2 , npt1 ) ) m a t r i z 1= temp1 ( : , : npt1 ) write ( * , fmt= ( Matriz 1 l i d a : , / ) ) print ( 2 ( e10 . 3 , 1 x ) ) , ( m a t r i z 1 ( : , i ) , i= 1 , npt1 ) deallocate ( temp1 ) ! L i b e r a e s p a c o de memoria ocupado por ! temp1 . print ( / , a ) , P r e s s i o n e ENTER/R T R para c o n t i n u a r . EU N read ( * , ( a ) ) c h a r ! Metodo 2 : usando opcao END. open ( 1 0 , f i l e = ex3 . dat , status = old ) do read ( 1 0 , * , end= 1 0 0 ) temp2 ( 1 , npt2 +1) , temp2 ( 2 , npt2 +1) npt2= npt2 + 1 end do 100 continue ! Linha i d e n t i f i c a d a com o r o t u l o 1 0 0 . close (10) a l l o c a t e ( m a t r i z 2 ( 2 , npt2 ) ) m a t r i z 2= temp2 ( : , : npt2 ) print ( Matriz 2 l i d a : , / ) print ( 2 ( e10 . 3 , 1 x ) ) , ( m a t r i z 2 ( : , i ) , i= 1 , npt1 ) deallocate ( temp2 ) ! L i b e r a e s p a c o de memoria ocupado por ! temp2 . print ( / , O numero t o t a l de l i n h a s l i d a s e : , / , & Matriz 1 : , i 4 , 3x , Matriz 2 : , i 4 ) , npt1 , npt2 end program A r q S a i 3

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 27 de maio de 2008

128

9.2. Declarao NAMELIST ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

E poss tambm continuar a mesma <lista-nomes-variveis> de um dado grupo em mais de uma declavel e a rao contidas no campo de declaraes da unidade de programa. Assim, ca co NAMELIST /LISTA/ A, B, C NAMELIST /LISTA/ D, E, F

.d o

c u -tr a c k

.c

equivalente a uma unica declarao NAMELIST com os 6 nomes de variveis listados na mesma ordem acima. e ca a Alm disso, um objeto de um grupo NAMELIST pode tambm pertencer a outros grupos. e e Se o tipo, parmetro de tipo ou forma de uma varivel de um grupo especicado em uma declarao na a a e ca mesma unidade de programa , esta declarao deve constar antes da declarao NAMELIST, ou ser uma declarao ca ca ca de tipo impl cito que regule o tipo e espcie das variveis que iniciam com aquele caractere explicitado na e a declarao. ca Um grupo namelist pode possuir o atributo pblico ou privado, concedido atravs das declaraes PUBLIC u e co ou PRIVATE. Contudo, se o grupo possuir o atributo pblico, nenhum membro seu pode ser declarado com o u atributo privado ou possuir componentes privados. Para se executar uma operao de E/S em algum registro (como um arquivo, por exemplo) que contenha ca um ou mais grupos namelist, o registro sempre ir iniciar com o caractere &, seguido, sem espao, pelo <nomea c grupo-namelist>, vindo ento a lista dos nomes das variveis, sendo cada nome seguido por sinais de igual e, a a ento pelo valor da varivel, podendo ser precedido ou seguido por espaos em branco. Constantes de caractere a a c devem ser sempre delimitadas em registros de entrada. A lista de nomes e valores de um determinado grupo e sempre encerrada com o caractere / inserido fora de uma constante de caractere. Os comandos READ e WRITE, ao serem empregados em conjunto com um namelist, no possuem uma lista a expl cita de variveis ou constantes a ser transferidas, mas sim o nome do grupo NAMELIST como segundo a parmetro posicional ou com o especicador NML= contendo o nome do grupo, no lugar do especicador FMT=. a Um exemplo de registro de entrada : e INTEGER :: NO_DE_OVOS, LITROS_DE_LEITE, QUILOS_DE_ARROZ NAMELIST /FOME/ NO_DE_OVOS, LITROS_DE_LEITE, QUILOS_DE_ARROZ READ(5, NML=FOME) O associado exemplo de registro (arquivo) de entrada : e &FOME LITROS_DE_LEITE= 5, NO_DE_OVOS= 12 / Nota-se no registro acima que a ordem de atribuio de valores aos nomes no deve ser a mesma da declarao ca a ca NAMELIST. Alm disso, a varivel QUILOS_DE_ARROZ no tem seu valor atribu no registro. Quando isso e a a do acontece com uma ou mais variveis da lista o valor destas permanece inalterado. a Os valores de uma matriz podem ser atribu dos atravs do nome da mesma seguida por = e a lista de e constantes que sero atribu a dos aos elementos da matriz de acordo com o ordenamento padro da linguagem, a descrito na seo 6.6.2. Se a varivel for de tipo derivado, a lista de valores deve tambm seguir a ordem e ca a e o tipo e espcie dos componentes constantes da declarao do tipo. E poss e ca vel tambm denir-se o valor de e um elemento isolado ou de uma seo de matriz, ou qualquer sub-objeto, sem alterar os valores dos demais ca elementos, usando um designador de sub-objeto, tal como um tripleto de subscritos. Neste caso, os elementos do tripleto devem todos ser constantes inteiras escalares, sem parmetros de espcie de tipo a e Na gravao (sa ca da) do registro, todos os componentes do grupo so escritos no arquivo especicado, precea didos por & e o nome do grupo, na mesma ordem da declarao da <lista-nomes-variveis> , com os nomes ca a explicitamente escritos em letras maisculas. O registro nalizado com o caractere /. Um exemplo de sa u e da de um namelist : e INTEGER :: NUMERO, I INTEGER, DIMENSION(10) :: LISTA= (/ 14, (0, I= 1,9) /) NAMELIST /SAI/ NUMERO, LISTA WRITE(6, NML=SAI) o qual produz o seguinte registro no arquivo associado ` unidade lgica 6: a o &SAI NUMERO=1 , LISTA=14, 9*0 / Nota-se que os 9 elementos 0 do vetor LISTA so registrados usando-se a notao compacta 9*0. Esta notao a ca ca tambm vlida em registros de entrada. e e a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

129
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Todos os nomes de grupos, nomes de objetos e nomes de componentes so interpretados sem considerar o a caso de capitalizao. A lista de valores no pode ter um nmero excedente de ca a u tens, mas ela pode conter um nmero inferior, como j foi mencionado. Se o objeto do tipo caractere e o valor tiver uma extenso menor u a e a que a declarada, espaos em branco preenchem o restante do campo. Matrizes ou objetos de tamanho zero c (seo 6.5) no podem constar no registro de entrada de um NAMELIST. Se ocorrer uma mltipla atribuio de ca a u ca um mesmo objeto, o ultimo valor assumido. e Por m, comentrios podem ser inclu a dos no registro de entrada em seguida a um nome a uma v rgula que separa os nomes. O comentrio introduzido, como costumeiro a partir do caractere !. a e e O programa Testa_NAMELIST abaixo ilustra praticamente todos os recursos discutidos nesta seo a respeito ca de listas NAMELIST. program Testa NAMELIST i m p l i c i t none integer , parameter : : dp= SELECTED REAL KIND( 1 5 , 3 0 0 ) integer : : n o d e o v o s , l i t r o s d e l e i t e , q u i l o s d e a r r o z= 1 2 , numero ! Note que q u i l o s d e a r r o z f o i i n i c i a l i z a d o . integer , dimension ( 1 0 ) : : l i s t a i n t 1 , l i s t a i n t 2 real , dimension ( 1 0 ) : : a l e a t , v e t t e s= 1 . 0 r e a l ( dp ) : : pi , e e u l e r , m e l e c t r o n , c vacuum logical : : tes character ( len= 1 0 ) : : nome namelist / fome / nome , n o d e o v o s , l i t r o s d e l e i t e , q u i l o s d e a r r o z namelist / s a i / numero , l i s t a i n t 1 , l i s t a i n t 2 , v e t t e s namelist / c t e s / t e s , pi , e e u l e r , m e l e c t r o n , c vacuum ! open ( 1 0 , f i l e= Dados . e n t , status= o l d ) open ( 1 1 , f i l e= Dados . dat ) read ( 1 0 , nml= fome ) read ( 1 0 , nml= s a i ) read ( 1 0 , nml= c t e s ) ! Mostra na t e l a os v a l o r e s l i d o s . print ( a ) , L i s t a / fome / l i d a : write ( * , nml= fome ) print ( / a ) , L i s t a / s a i / l i d a : write ( * , nml= s a i ) print ( / a ) , L i s t a / c t e s / l i d a : write ( * , nml= c t e s ) print ( / a ) , Para c o n f i r m a r : print ( Vetor v e t t e s : , 1 0 ( f 4 . 2 , x ) ) , v e t t e s print ( / , l i s t a 1 : , 1 0 i 3 ) , l i s t a i n t 1 print ( / , l i s t a 2 : , 1 0 i 3 ) , l i s t a i n t 2 ! A l t e r a a l g u n s v a l o r e s e g r a v a as l i s t a s no a r q u i v o . c a l l random number ( a l e a t ) print ( / , L i s t a de No . a l e a t o r i o s : , / , 1 0 ( f 7 . 5 , x ) ) , a l e a t l i s t a i n t 1= l i s t a i n t 2 ** 2 l i s t a i n t 2= a l e a t * l i s t a i n t 2 write ( 1 1 , nml= s a i ) write ( 1 1 , nml= c t e s ) write ( 1 1 , nml= fome ) ! V e r i f i q u e Dados . d a t . end program Testa NAMELIST Um exemplo de arquivo de entrada Dados.ent que pode ser fornecido ao programa Testa_NAMELIST o e seguinte:

c u -tr a c k

.c

&fome l i t r o s d e l e i t e= 10 , n o d e o v o s= 2 4 , nome= Rancho /


Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

130

9.2. Declarao NAMELIST ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

&s a i numero= 5 0 , l i s t a i n t 1= 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , l i s t a i n t 2= 3 * 1 , 3 * 5 , 4 * 8 , v e t t e s (4:8)= 5*2.0 / &c t e s t e s= . t r u e . , PI= 3.14159265358979323846264338327950288419717 , e e u l e r= 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 , ! Euler s number . m e l e c t r o n= 9 . 1 0 9 3 8 2 1 5 e 28 , ! E l e c t r o n r e s t mass ( g ) . c vacuum= 2 . 9 9 7 9 2 4 5 8 e10 ! Speed o f l i g h t i n vacuum (cm/ s ) . /

9.3

Unidades lgicas o

Em Fortran, um arquivo est conectado a uma unidade lgica denotada por um nmero inteiro. Este nmero a o u u deve ser positivo e est freqentemente 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 ao que pode ser executada sobre o arquivo. Estas compreendem leitura, escrita ca ou ambas. Se um arquivo aberto para um tipo de ao e outro tipo tentado, uma mensagem de erro e ca 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) substituio (replace), entre a ca 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 seqencial. 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 m a dias permite acesso somente seqencial, como o caso de uma ta magntica. u e e Sequencial. E o acesso usual. Os processos de leitura/escrita principiam no in do arquivo e seguem, cio linha a linha, at o seu nal. e Direto. Cada linha acessada por um nmero, denominado nmero de gravao (record number) o qual e u u ca deve ser especicado no comando de leitura/escrita. O nmero mximo de arquivos que podem ser abertos simultaneamente para E/S tambm especicado pelo u a e e manual do compilador.

9.4

Comando OPEN

O comando OPEN usado para conectar um dado arquivo a uma unidade lgica. Freqentemente 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 nmeros-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 N mero 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
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

131
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

OPEN([UNIT=] <int-exp> [,<op-list>])

c u -tr a c k

.c

onde <int-exp> uma expresso escalar inteira que especica o nmero da unidade lgica externa e <ope a u o list> uma lista de especicadores opcional, formada por um conjunto de palavras-chave. Se a palavra-chave e UNIT= for inclu da, ela pode aparecer em qualquer posio no campo de argumentos do comando OPEN. Um ca especicador no pode aparecer mais de uma vez. Nos especicadores, todas as entidades so escalares e todos a a os caracteres so da espcie padro. Em expresses de caractere, todos os brancos precedentes so ignorados e, a e a o a exceto no caso do especicador FILE=, quaisquer letras maisculas so convertidas `s correspondentes letras u a a minsculas. Os especicadores so: u a FILE= <fln>, onde <fln> uma expresso de caractere que fornece o nome do arquivo. O nome deve coincidir e a exatamente 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 execuo do comando OPEN. a ca 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 opo vlida. Se o arquivo ainda no existe, ele a ca 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 especicaes : co e DIRECT O arquivo consiste em registros acessados por um nmero de identicao. Neste caso, o u ca 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 seqencialmente, 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 opo vlida. Se o arquivo ainda no existe, ele ser criado com um a ca 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 seqencial. 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 opo especica o tamanho dos registros e obrigatrio. ca e o
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

132

9.4. Comando OPEN

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Para arquivo seqencial, a opo especica o tamanho mximo de um registro, e opcional com um u ca a e valor padro que depende do processador. a

c u -tr a c k

.c

Para arquivos formatados, o tamanho o nmero 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 (seo a ca 9.10) pode ser usado para encontrar o tamanho de uma lista de E/S. Em qualquer situao, para um arquivo que j exista, o valor especicado deve ser permitido para o ca 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 interpretao de brancos em a ca 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 seqencial 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 posio corrente de leitura/escrita no seu interior. e ca 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 especicao ASIS no posicionaa a a ca mento do arquivo indeterminado. e ACTION= <act>, onde <act> uma expresso de caracteres que fornece os valores READ, WRITE ou READe a WRITE. READ Se esta especicao escolhida, os comandos WRITE, PRINT e ENDFILE no devem ser usados ca e a para esta conexo. a WRITE Se esta especicao escolhida, o comando READ no pode ser usado. ca e a READWRITE Se esta especicao escolhida, no h restrio. ca e a a ca Se o especicador omitido, o valor padro depende do processador. e a 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 declarao NAMELIST, e ca ca 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 duplicao a e a ca ser feita se a especicao for NONE. A especicao NONE o valor padro se este especicador for a ca ca 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 formatao associada especicarem mais dados que aqueles que so lidos no registro. ca a NO Neste caso, o tamanho do registro de entrada deve ser no menor que aquele especicado pela lista a de entrada e pela formatao associada, exceto na presena de um especicador ADVANCE= NO e ca c uma das especicaes EOR= ou IOSTAT=. co
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

133
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 nmero 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) &

c u -tr a c k

.c

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.5

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 nmero de unidade a o u lgica o comando ca: o READ <format> [,<lista>] e com o nmero 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 nmero de unidade lgica vlido ou * para a entrada padro. Caso esta especie u o a a cao seja o primeiro argumento do comando, a palavra-chave opcional. ca e FMT= <format>, onde <format> uma string de caracteres formatadores, um rtulo vlido em Fortran ou * e o a para formato livre. Caso esta especicao seja o segundo argumento do comando, a palavra-chave ca e opcional. 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 execuo do comando. ca <ios> < 0, quando uma condio de nal de registro detectada em entrada sem avano ou quando uma ca e c condio de nal de arquivo detectada. ca 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 condio de nal de e o a e ca arquivo encontrada. Esta opo somente existe no comando READ com acesso seqencial. e ca u
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

134

9.5. Comando READ

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

EOR= <eor-label>, um rtulo vlido para onde o controle de uxo transferido se uma condio de nal de e o a e ca registro encontrada. Esta opo somente existe no comando READ com acesso seqencial e formatado e e ca u somente se a especicao ADVANCE= NO tambm estiver presente. ca e

c u -tr a c k

.c

ADVANCE= <mode>, onde <mode> possui dois valores: YES ou NO. A opo NO especica que cada comando ca READ inicia um novo registro na mesma posio; isto , implementa entrada de dados sem avano (nonca e c advancing I/O). A opao padro YES, isto a cada leitura o arquivo avanado em uma posio. Se c a e e e c ca a entrada sem avano usada, ento o arquivo deve estar conectado para acesso seqencial e o formato c e a u deve ser expl cito. REC= <int-exp>, onde <int-exp> uma expresso inteira escalar cujo valor o nmero 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 especicao ADVANCE= NO tambm ca e estiver presente. NML= <grp>, onde <grp> o nome de um grupo NAMELIST previamente denido em uma declarao NAMELIST. e ca 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 nmeros reais designados pelos descritores F10.7, separados por um espao em branco. u c Estes 3 nmeros 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 situao normal, isto , leitura com avano, o cursor seria posicionado no in da e ca 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 condio de nal de registro encontrada. ca e

9.6

Comandos PRINT e WRITE

Em comparao com o comando READ, o comando WRITE suporta os mesmos argumentos, com exceo do ca ca 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 PRINT <format> [, <lista>] J a sintaxe mais geral do comando : a e 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 funes executadas pelos especicadores co do comando READ, com exceo dos seguintes, os quais especicam funes ligeiramente distintas: ca co UNIT= <u>, onde <u> um nmero de unidade lgica vlido ou * para a sa padro. Caso esta especicao e u o a da a ca seja o primeiro argumento do comando, a palavra-chave opcional. e
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

135
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 execuo do comando. ca <ios> < 0, quando uma condio de nal de registro detectada em escrita sem avano ou quando uma ca e c condio de nal de arquivo detectada. ca 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 opo NO especica que cada comando ca WRITE inicia um novo registro na mesma posio; isto , implementa sa de dados sem avano (nonca e da c advancing I/O). A opo padro YES, isto a cada escrita, o arquivo avanado em uma posio. Se ca a e e e c ca a sa sem avano usada, ento o arquivo deve estar conectado para acesso seqencial 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 nmero 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 especicao de escrita sem avano foi escolhida, o cursor ir permanecer na mesma linha que a string ca 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 sees 9.4 9.6, o programa a seguir abre co um novo arquivo seqencial 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

c u -tr a c k

.c

P O R M Notas RGA IMPLICIT N N O E C A A T R(LEN=20) : : name H R CE REAL : : mark1 , mark2 , mark3 OPEN (UNIT=4,FILE=NOTAS.DAT ) DO READ( * , * ) name, mark1 , mark2 , mark3 IF (name == Fim )EXIT WRITE(UNIT=4,F T= * ) name, mark1 , mark2 , mark3 , ( mark1 + mark2 + mark3 ) / 3 . 0 M WRITE(UNIT= * ,F T= * ) name, mark1 , mark2 , mark3 , ( mark1 + mark2 + mark3 ) / 3 . 0 M END DO CLOSE(UNIT=4) END P O R M Notas RGA

9.7

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,
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

136

9.7. Comando FORMAT e especicador FMT=

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

WRITE(17, FMT= (2X,2I4,1X,nome ,A7))I, J, STR

c u -tr a c k

.c

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 especicaes do comando. co 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 edio, abordados na prxima seo. e ca o ca

9.8

Descritores de edio ca

Nos exemplos apresentados nas sees anteriores, alguns descritores de edio j foram mencionados. Estes co ca a editores fornecem uma especicao precisa sobre como os valores devem ser convertidos em uma string escrita ca 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 diferentes representaes de tipos de variveis suportados pela linguagem. co a Com algumas excees, descritores de edio aparecem em uma lista separados por v co ca 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 maisculos quanto minsculos, os descritores de edio so u u ca a interpretados de forma independente com relao ao caso. ca Descritores de edio dividem-se em trs classes: ca e 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.8.1

Contadores de repetio ca

Os descritores de edio de dados podem ser precedidos por um contador de repetio: uma constante inteira ca ca positiva (sem sinal), como no exemplo 10F12.3 a qual indica 10 constantes reais com 12 posies ao todo e com preciso de 3 casas decimais cada. Dos co a descritores de edio restantes, somente a barra / pode ter um contador de repetio associado. Um contador ca ca de repetio tambm pode ser aplicado a um grupo de descritores de edio, delimitado por parnteses: ca e ca 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)
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

137
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

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

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 notao de engenharia ca Real com notao cient ca 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

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 repetio como estes podem ser encadeados: ca PRINT (2(2I5,2F8.2)), (I(J),I(J+1),A(J),A(J+1), J=1,4,2) Pode-se ver que esta notao possibilita compactar a formatao de E/S de dados. ca ca Se uma especicao de formato usada com uma lista de E/S que contm mais elementos que o nmero de ca e e u descritores de formatao, incluindo os contadores de repetio, um novo registro ir comear e a especicao ca ca a c ca 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.8.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 exceo do descritor G, que pode converter qualquer tipo intr ca nseco. A tabela 9.1 apresenta uma descrio das ca converses. o Formato dos descritores de edio de dados. ca Um descritor de edio de dados pode assumir uma das seguintes formas em uma lista de formatao de ca ca 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 <r> o contador de repetio. O seu valor pode variar entre 1 e 2147483647 (2**31 - 1). Se <r> for omitido, e ca ele assumido igual a 1. e <c> um dos descritores: I, B, O, Z, F, EN, ES, D, G, L, A. e <w> o nmero 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
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

138

9.8. Descritores de edio ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

<m> o nmero 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.

c u -tr a c k

.c

<d> o nmero de d e u gitos ` direita do ponto decimal (os d a gitos signicativos). O intervalo de <d> inicia em 0 mas o valor nal depende do sistema. O nmero de d u gitos signicativos afetado se um fator de escala e especicado para o descritor de edio. e ca E identica um campo de expoente. <e> o nmero de d e u gitos no expoente. O intervalo de <e> inicia em 1 mas o valor nal depende do sistema. Os descritores de edio de dados tm as seguintes formas espec ca 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 nmero completo, e u de acordo com a descrio fornecida, o campo preenchido por <w> asteriscos. ca e Na sa os nmeros so geralmente escritos deslocados para a direita no espao de campo especicado por da u a c <w>; isto feito preenchendo de espaos em branco ` esquerda, caso necessrio. Valores negativos so sempre e c a a a escritos com o sinal de menos. Na entrada os nmeros 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 N meros 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 posio no campo. ca Para impresso, uma forma alternativa deste descritor permite que o nmero 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 nmero 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 situao o campo ser preenchido por brancos se o a ca a nmero 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 nmero inteiro nos sistemas numricos binrio, octal e u e a e hexadecimal, respectivamente. N meros 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 nmero real de ponto utuante. O ponto decimal conta como uma a u posio no campo. Na entrada de dados, se a string possui um ponto decimal, o valor de <d> ignorado. ca 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 ` representao nita de um nmero pelo a a ca u computador. H outras duas formas de entrada de nmeros aceitveis pelo descritor F<w>.<d>: a u a 1. Nmero sem ponto decimal. Neste caso, os <d> d u gitos mais ` direita sero tomados como a parte fracioa a nrio do nmero. Por exemplo, a string -14629ser lida pelo descritor F7.2 como -146.29. a u a 2. Nmero real na forma padro; a qual envolve uma parte exponencial (seo 3.3), como o nmero u a ca u 14.629E-2 ou sua forma variante, onde o expoente sempre tem sinal e o indicador de expoente E e omitido: -14.629-2. Neste caso, o campo <d> ser novamente ignorado e o nmero na forma exponencial a u ser escrita na forma de ponto utuante. Sob o controle do descritor F9.1, a string anterior ser convertida a a ao nmero 0.14629. u
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

139
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 edio E possui duas formas, E<w>.<d> e E<w>.<d>E<e> e uma maneira mais apropriada de ca e transferir nmeros 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 nmero 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 nmero 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 nmero anterior com o descritor F9.4, apareceria *********. u Na segunda forma do descritor, E<w>.<d>E<e>, o campo <e> determina o nmero de d u gitos no expoente. Esta forma obrigatria para nmeros cujos expoentes tm valor absoluto maior que 999. Assim, o nmero e o u e u 1.234 101234 , com o descritor E12.4E4 transferido como a string .1234E + 1235. e O descritor de edio EN implementa a notao de engenharia. Ele atua de forma semelhante ao descritor E, ca ca exceto que na sa o expoente decimal mltiplo 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 nmero 0.0217 transferido sob EN9.2 ser convertido a 21.70E-03 a u a ou 21.70-003. O descritor de edio ES implementa a notao cient ca ca 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 nmero 0.0217 transferido sob ES9.2 ser convertido a 2.17E-02 ou 2.17E-002. a u a N meros complexos (F<w>.<d>, E<w>.<d>[E<e>], EN<w>.<d>[E<e>], ES<w>.<d>[E<e>], D<w>.<d>) u Nmeros complexos podem ser editados sob o controle de pares dos mesmos descritores de nmeros 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 edio. ca Valores lgicos (L<w>) o 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 posio mais ` direita do campo. a ca 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 da e tem na lista de E/S, medido em termos do nmero 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 seguintes resultados no processo de escrita: Descritor A A11 A8 Registro escrito TEMPORARIO TEMPORARIO TEMPORAR

c u -tr a c k

.c

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
Autor: Rudi Gaelzer IFM/UFPel

Registro lido TEMPORARIO TEMPORARIO TEMPORAR


Impresso: 27 de maio de 2008

140

9.8. Descritores de edio ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Todos os caracteres transferidos sob o controle de um descritor A ou A<w> tm a espcie do e e tem na lista 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 edio geral pode ser usado para qualquer tipo intr ca nseco de dados. Quando usado para os tipos real ou complexo, a sua ao idntica ` do descritor E<w>.<d>[E<e>], exceto que na sa de dados, ca 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 nmero 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 edio . ca Tipos derivados Valores de tipos derivados so editados pela seqncia apropriada de descritores de edio correspondentes a ue ca 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 Edio de tamanho m ca nimo de campo

c u -tr a c k

.c

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 situao o uso padro destes descritores iria gerar uma sa composta ca a da somente por asteriscos. Descritor de edio de string de caracteres ca Uma constante de caracteres da espcie padro, sem um parmetro de espcie especicado, pode ser transe a a e ferida a um arquivo de sa inserindo-a na especicao de formato, como no exemplo: da ca 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.8.3

Descritores de controle de edio ca

Um descritor de controle de edio age de duas formas: determinando como texto organizado ou afetando ca e as converses realizadas por descritores de edio de dados subseqentes. o ca u
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

141
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Formato dos descritores de controle de edio ca Um descritor de controle de edio pode assumir uma das seguintes formas em uma lista de formatao de ca ca 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 nmero de posies de caracteres. Este nmero no pode ser uma varivel; deve ser uma constante e u co u a a inteira positiva sem especicao de parmetro de espcie de tipo. O intervalo de <n> inicia em 1 at ca 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 edio no so repet ca a a veis. A unica exceo a barra (/), a qual pode ca e tambm ser precedida por um contador de repetio. e ca Os descritores de controle possuem a seguintes formas espec cas quanto `s suas funes: a co Tipo de controle Posicional Sinal Interpretao de brancos ca Fator de escala Miscelneo a Descritores de controle T<n>, TL<n>, TR<n>, <n>X S, SP, SS BN, BZ <k>P :, /

c u -tr a c k

.c

O descritor P uma exceo ` sintaxe geral dos descritores. Ele precedido por um fator de escala (<k>), em e ca a e vez de um especicador de posio. ca Descritores de controle de edio tambm podem ser agrupados em parnteses e precedidos por um contador ca e e de repetio do grupo. ca Edio posicional ca Os descritores T, TL, TR e X especicam a posio onde o prximo caractere transferido de ou para um ca 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 posies na posio especicada por um a a co ca destes descritores, ou aps esta, posies saltadas e que no eram previamente preenchidas por brancos passam o co 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 posio de caractere em um registro de E/S. Ele toma a seguinte forma: ca T<n> onde <n> uma constante positiva que indica a posio de caractere do registro, relativa ao limite ` esquerda e ca a do tabulador. Na entrada, o descritor posiciona o registro externo a ser lido na posio de caractere especicada por <n>. ca Na sa da, o descritor indica que a transferncia de dados inicia na <n>-sima posio de caractere do registro e e ca externo. Exemplos. Suponha que um arquivo possua um registro contendo o valor ABC leitura seja executado: CHARACTER(LEN= 3) :: VALOR1, VALOR2 ... READ(11,(T7,A3,T1,A3))VALOR1, VALOR2
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

XYZe o seguinte comando de

142

9.8. Descritores de edio ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 porque 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 posio de caractere ` esquerda da posio corrente no registro de E/S. O ca a ca descritor toma a seguinte forma: TL<n> onde <n> uma constante inteira positiva indicando a <n>-sima posio ` esquerda do caractere corrente. Se e e ca 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 Edio TR ca O descritor TR especica uma posio de caractere ` direita da posio corrente no registro de E/S. O ca a ca descritor toma a seguinte forma: TR<n> onde <n> uma constante inteira positiva indicando a <n>-sima posio ` direita do caractere corrente. e e ca a Edio X ca O descritor X especica uma posio de caractere ` direita da posio corrente no registro de E/S. Este ca a ca 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 posio ` direita do caractere corrente. Na e e ca a sa este descritor no gera a gravao de nenhum caractere quando ele se encontra no nal de uma especicao da, a ca ca de formato.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

143
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 execuo de comandos de entrada de dados. e a e ca Dentro de uma especicao de formato, um descritor de edio de sinal afeta todos os descritores de dados ca ca subseqentes I, F, E, EN, ES, D e G at que outro descritor de edio de sinal seja inclu na formatao. u e ca do ca Edio SP ca O descritor SP fora o processador a produzir um sinal de mais em qualquer posio subseqente onde ele c ca 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 posio subseqente onde ele c ca 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 campos numricos subseqentes. e u O descritor toma a forma simples S Interpretao de brancos ca Os descritores BN e BZ controlam a interpretao de brancos posteriores embebidos dentro de campos de ca entrada numricos. Estes descritores no tm efeito durante a execuo de comandos de sa de dados. e a e ca da Dentro de uma especicao de formato, um descritor de edio de brancos afeta todos os descritores de ca ca dados subseqentes I, B, O, Z, F, E, EN, ES, D e G at que outro descritor de edio de brancos seja inclu na u e ca do formatao. ca Os descritores de edio de brancos sobrepe-se ao efeito do especicador BLANK durante a execuo de um ca o ca comando de entrada de dados. Edio BN ca 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 posio mais ` direita. Um campo todo composto de brancos tratado como zero. ca 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
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

c u -tr a c k

.c

144

9.8. Descritores de edio ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

Edio de fator de escala P ca

c u -tr a c k

.c

O descritor P especica um fator de escala, o qual move a posio do ponto decimal em valores reais e das ca 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 nmero de posies, e e u co 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 edio de dados reais subseqentes e ca 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 posies ` esquerda. Um fator de escala -2P multiplica o co a valor de entrada por 100, movendo o ponto decimal duas posies ` direita. co a 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 edio real associado com ele, mas no necessariamente ca 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 edio ca real est associada com o mesmo, como segue: a
Para edio F, o valor externo iguala o valor interno da lista de E/S multiplicado por 10<k> , alterando a ca magnitude do dado. Para edies E e D, o campo decimal externo da lista de E/S multiplicado por 10<k> e <k> subtra do co 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. Para edio G, o fator de escala no tem efeito se a magnitude do dado a ser impresso est dentro do ca a a intervalo efetivo do descritor. Se a magnitude estiver fora do intervalo efetivo do descritor, edio E ca e usada e o fator de escala tem o mesmo efeito como neste caso. Para edies EN e ES, o fator de escala no tem efeito. co 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 edio P: e ca


Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

145
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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

c u -tr a c k

.c

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 ao de iniciar uma nova linha. ca A forma que o descritor toma : e [<r>]/ onde <r> um contador de repetio. O intervalo de <r> inicia em 1 at um valor que depende do sistema. Em e ca e processadores intel de 32 bits, o valor mximo <r>= 2**15-1. a e Mltiplas 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 edio, n - 1 registros so pulados na ca 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 especicao de formato, n registros so cio ca a pulados ou n registros em branco so gerados na sa a da, porque o parnteses inicial e nal da especicao e ca de formato so, por si mesmos, iniciadores ou nalizadores de registros, respectivamente a

Por exemplo, dado a seguinte formatao de sa ca 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> Edio com dois pontos (:) ca 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= 3 J= K=13 Se houver tens de E/S restantes, o descritor : no tem efeito. a
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

146

9.8. Descritores de edio ca

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

9.8.4

Descritores de edio de strings ca

.d o

c u -tr a c k

.c

Descritores de edio de strings controlam a sa das constantes de string. Estes descritores so: ca da a
Constantes de caracteres Descritor de edio H (eliminado no Fortran95). ca

Um descritor de edio de strings no pode ser precedido por um contador de repetio; contudo, eles podem ca a ca fazer parte de um grupo contido entre parnteses, o qual, por sua vez, precedido por um contador de repetio. e e ca 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 especicao de espcie. O seu comprimento o nmero de e ca 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 duas apstrofes consecutivas () na formatao. Por exemplo, o ca 50 FORMAT(Todays date is: ,i2,/,i2,/,i2)

Da mesma forma, para incluir aspas () em uma constante de caractere que delimitada por aspas, deve-se e colocar duas aspas consecutivas na formatao. ca Como exemplo do uso dos comandos de E/S apresentados nas sees 9.4 9.8, o programa a seguir abre co 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 cent metros) e nmero 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. P O R M Pessoais dados RGA IMPLICIT N N O E C A A T R(LEN=15) : : name H R CE INTEGER : : age , t e l n o , stat REAL : : h e i g h t OPEN(UNIT=8, FILE= p e s s o a l . dat ) WRITE( * , 1 0 0 ) 100 F R A T24 , Altura ) O M T( WRITE( * , 2 0 0 ) 200 F R A O M T(T4 , Nome , T17 , Idade , T23 , ( metros ) , T32 , Tel . No . ) WRITE( * , 3 0 0 ) 300 F R A O M T(T4,,T17,,T23 , , T32,) DO READ( 8 , F T= ( a15 , 1 x , i 3 , 1 x , f 4 . 2 , 1 x , i 8 ) , IOSTAT stat ) name, & M = age , h e i g h t , t e l n o IF ( stat <0) EXIT ! Testa f i n a l de a r q u i v o WRITE( * , 4 0 0 ) name, age , h e i g h t , t e l n o 400 F R A O M T(A, T18 , I3 , T25 , F4 . 2 , T32 , I 8 ) END DO END P O R M P e s s o a i s d a d o s RGA sendo que o arquivo pessoal.dat possui a seguinte formatao: ca
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

147
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

c u -tr a c k

.c

P . A. S i l v a J . C. Pedra

045 1 . 8 0 33233454 047 1 . 7 5 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.9

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 (seo 9.4). Novae ca 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 funo do especicador STATUS= de determinar o que acontecer com o arquivo uma vez desconectado. ca 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 execuo do comando CLOSE, e pode ser posteriormente conectado novamente a uma unidade. o ca Se o valor DELETE, o arquivo no mais existir aps a execuo do comando. Se o especicador for omitido, e a a o ca 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 execuo de um programa, todas as unidades conectadas so fechadas, como se um comando ca a CLOSE sem o especicador STATUS= fosse aplicado a cada unidade conectada. Como exemplo: CLOSE(2, IOSTAT=IOS, ERR=99, STATUS=DELETE)

9.10

Comando INQUIRE

O status de um arquivo pode ser denido pelo sistema operacional antes da execuo do programa ou pelo ca programa durante a sua execuo, seja por um comando OPEN ou seja por alguma ao sobre um arquivo prca ca e conectado que o faz existir. Em qualquer momento, durante a execuo do programa, poss ca 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 nmero de unidade existe para o sistema em questo, se o nmero 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 inquirio feita, de qualquer forma, o especicador a ca 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 descrio feita a seguir, as primeiras duas variantes so descritas juntas. Suas formas so: ca 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>])
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

148

9.9. Comando CLOSE

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 interpretao de <arq> depende do sistema. Em um sistema Unix/Linux, o nome depende do ca caso. Um especicador no pode aparecer mais de uma vez na lista de especicadores opcionais. Todas as atria buies de valores aos especicadores seguem as regras usuais e todos os valores do tipo de caracteres, exceto co no caso de NAME= so maisculos. 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 (seo 9.4). A varivel <ios> a unica ca a e denida se uma condio de erro ocorre durante a execuo do INQUIRE. ca ca ERR= <err-label>, tem o mesmo signicado descrito no comando OPEN (seo 9.4). ca 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

c u -tr a c k

.c

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 nmero 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 situao um nome vlido para uso em um comando ca e a OPEN subseqente. 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>, 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 seqencial, 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 seqencial. O comprimento o nmero de caracteres para registros formatados u e u contendo somente caracteres 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 nmero 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 posio indeterminada devido a um erro anterior, <nr> resulta ca e indenido.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

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

149
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

.d o

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 posio). ca 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 especicao em um comando INQUIRE, ou est associada com um, no deve aparecer em a e ca 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> onde <comp> uma varivel inteira escalar padro que usada para determinar o comprimento de uma <listae a a e sada> no formatada em unidades que dependem do processador. Esta varivel pode ser usada para estabelecer a a se, por exemplo, uma lista de sa muito grande para o tamanho do registro dado pelo especicador RECL= da e 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 execuo bem sucedida dos comandos OPEN e INQUIRE, as variveis tero os seguintes valores: o ca a a EX= .TRUE. OP= .TRUE. NAM= Cidades ACC= DIRECT SEQ= NO FRM= UNFORMATTED IREC= 100 NR= 1
Autor: Rudi Gaelzer IFM/UFPel Impresso: 27 de maio de 2008

c u -tr a c k

.c

150

9.10. Comando INQUIRE

lic

lic

to

bu

O W

w
w

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

.d o

c u -tr

. ack

9.11

Outros comandos de posicionamento

.d o

c u -tr a c k

.c

Outros comandos que exercem funes de controle no arquivo, em adio ` entrada e sa de dados, so co ca a da a fornecidos abaixo.

9.11.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 nmero da unidade e os outros especicadores e a a u opcionais tm o mesmo signicado que no comando READ (seo 9.5). e ca 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 a e vel solicitar BACKSPACE em um arquivo que no exista, nem sobre um registro escrito por um a comando NAMELIST. Uma serie de comandos BACKSPACE resultar no retrocesso no nmero correspondente de a u registros.

9.11.2

Comando REWIND

De forma semelhante a uma releitura, re-escritura ou vericao por leitura de um registro, uma operao ca ca 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 nmero 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

9.11.3

Comando ENDFILE

O nal de um arquivo conectado para acesso seqencial 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 subseqentemente por e a o u um programa, deve ser manipulado usado a especicao END=<end-label> do comando READ seno a execuo ca a ca 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 operao de retrocesso e ca parcial ou completo segue um operao de escrita como a operao seguinte na unidade; quando o arquivo ca ca 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 subseqente. u

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 27 de maio de 2008

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

151
w
w

lic

lic

to

bu

O W

w
w

PD

PD

F-

XC

h a n g e Vi e

F-

XC

h a n g e Vi e

er

er

O W

bu

to

lic

lic

to

bu

N
.c

O W
w
.d o
c u -tr a c k

.d o

c u -tr a c k

.c

Indice Remissivo
Ambito Nomes, 120 Rtulos, 120 o COUNT, rotina intr nseca, 76 EXTERNAL, atributo e declarao, 100 ca FORALL, comando e construto, 64 INTENT, atributo e declarao, 86 ca Interfaces, 88 Genricas, 116, 119 e INTRINSIC, atributo e declarao, 67 ca Mdulos, 109 o Dados globais, 110 Rotinas de, 113 Rotinas genricas, 116, 119 e Matrizes Ajustveis, 95 a Alocveis, 61 a Automticas, 97 a Construtores de, 57 Expresses e atribuies, 51 o co Format assumida, 96 Sees de, 53 co Tamanho assumido, 95 Terminologia, 47 Tipos derivados, 49 ONLY, opo, 109, 112 ca PRIVATE, atributo e declarao, 115 ca PUBLIC, atributo e declaraao, 115 c nseca, 80 RANDOM NUMBER, rotina intr RANDOM SEED, rotina intr nseca, 80 RESHAPE, rotina intr nseca, 58, 77 RETURN, comando, 86 Rotinas, 83 Argumentos, 85 Matrizes, 94 Opcionais, 93 Palavras-Chave, 90 Subprogramas como argumentos, 99 Tipos derivados, 94 Elementais, 108 Externas, 88 Genricas, 116 e 151 Internas, 85 Intr nsecas SINH, 70 Puras, 106 Recursivas, 103 Rotinas de mdulos, 113 o Valor matricial, 100 SAVE, atributo e declarao, 105 ca WHERE, comando e construto, 59

w
w

w
w

You might also like