Вы находитесь на странице: 1из 503

Universidade do Estado do Rio de Janeiro

Instituto de Fsica Armando Dias Tavares


Departamento de Fsica Aplicada e Termodinmica
Fortran 2003
Traduo Livre do Rascunho Final do Fortran 2003
com acrscimos e comentrios
Verso 0.9
TEXTO ainda SEM REVISO (ainda incompleto)
ltima atualizao: maro 2011
Texto original
Final Committee Draft
Reference number of working document: ISO/IEC JTC1/SC22/WG5 N1578
Date: 2003-10-8
Information technology - Programming languages Fortran
Part 1: Base Language
Technologies de linformation - Langages de programmation Fortran
Partie Reference number of working document: 1: Langage de base
A traduo de um padro complicada e difcil
(porque muitas vezes no processo de traduo algo se perde ou deforma)
Por este motivo: Sempre faa uso do texto original
O rascunho final do Fortran 2003 pode ser obtido em: http://std.dkuug.dk/jtc1/sc22/open/n3661.pdf
(acessado em 20 de dezembro de 2010)
Professor: Anibal Leonardo Pereira
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 2
Sumrio
Algumas Informaes..................................................................................................................................18
Prefcio........................................................................................................................................................20
Introduo....................................................................................................................................................21
Padro da Linguagem de Programao Fortran...........................................................................................21
Organizao desta parte da ISO/IEC 1539..................................................................................................22
1. Viso Geral...............................................................................................................................................23
1.1 Escopo...............................................................................................................................................23
1.2 Processador........................................................................................................................................23
1.3 Incluses............................................................................................................................................23
1.4 Excluses...........................................................................................................................................23
1.5 Conformidade....................................................................................................................................24
1.6 Compatibilidade................................................................................................................................25
1.6.1 Compatibilidade Fortran 95.......................................................................................................25
1.6.2 Compatibilidade com o Fortran 90............................................................................................25
1.6.3 Compatibilidade FORTRAN 77................................................................................................26
1.7 Notao Usada neste Padro.............................................................................................................26
1.7.1 Notas Informativas....................................................................................................................27
1.7.2 Regras de Sintaxes.....................................................................................................................27
1.7.3 Restries...................................................................................................................................28
1.7.4 Regras de Sintaxe Assumidas....................................................................................................28
1.7.5 Convenes de Sintaxe e Caractersticas...................................................................................28
1.7.6 Convenes no Texto.................................................................................................................29
1.8 Caractersticas Removidas e Obsoletas.............................................................................................29
1.8.1 Natureza das Caractersticas Removidas...................................................................................29
1.8.2 Natureza das Caractersticas Obsoletas.....................................................................................29
1.9 Referncias Normativas....................................................................................................................30
2. Termos e Conceitos usado pelo Fortran...................................................................................................31
2.1 Sintaxe de Alto Nvel........................................................................................................................31
2.2 Conceitos de Unidade de Programa..................................................................................................33
2.2.1 Programa....................................................................................................................................33
2.2.2 Programa Principal....................................................................................................................34
2.2.3 Procedimento.............................................................................................................................34
2.2.3.1 Procedimento Externo........................................................................................................34
2.2.3.2 Procedimento Mdulo........................................................................................................34
2.2.3.3 Procedimento Interno.........................................................................................................34
2.2.3.4 Bloco de Interface..............................................................................................................34
2.2.4 Mdulo.......................................................................................................................................35
2.3 Conceitos de Execuo......................................................................................................................35
2.3.1 Instrues Executveis e No Executveis................................................................................35
2.3.2 Ordem das Instrues................................................................................................................35
2.3.3 A Instruo END........................................................................................................................36
2.3.4 Sequncia de Execuo.............................................................................................................37
2.4 Conceitos de Dados...........................................................................................................................37
2.4.1 Tipo............................................................................................................................................37
2.4.1.1 Tipo Intrnseco ..................................................................................................................38
2.4.1.2 Tipo Derivado....................................................................................................................38
2.4.2 Valor de Dado............................................................................................................................38
2.4.3 Entidade de Dado.......................................................................................................................38
2.4.3.1 Objeto de Dado..................................................................................................................39
2.4.3.1.1 Varivel...........................................................................................................................39
2.4.3.1.2 Constante........................................................................................................................39
2.4.3.1.3 Subobjeto de uma Constante...........................................................................................39
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 3
2.4.3.2 Expresso...........................................................................................................................40
2.4.3.3 Referncia de Funo.........................................................................................................40
2.4.4 Escalar.......................................................................................................................................40
2.4.5 Matriz.........................................................................................................................................40
2.4.6 Ponteiro......................................................................................................................................41
2.4.7 Armazenamento.........................................................................................................................41
2.5 Termos Fundamentais........................................................................................................................42
2.5.1 Nome e designador....................................................................................................................42
2.5.2 Palavra-chave.............................................................................................................................42
2.5.3 Associao.................................................................................................................................42
2.5.4 Declarao.................................................................................................................................43
2.5.5 Definio...................................................................................................................................43
2.5.6 Referncia..................................................................................................................................43
2.5.7 Intrnseco...................................................................................................................................43
2.5.8 Operador....................................................................................................................................44
2.5.9 Sequncia...................................................................................................................................44
2.5.10 Processadores Associados........................................................................................................44
3. Caracteres, Totens Lxicos e Forma dos Cdigos Fontes........................................................................45
3.1 Conjunto de Caracteres do Processador............................................................................................45
3.1.1 Letras.........................................................................................................................................45
3.1.2 Dgitos.......................................................................................................................................46
3.1.3 Sublinha.....................................................................................................................................46
3.1.4 Caracteres Especiais..................................................................................................................46
3.1.5 Outros Caracteres......................................................................................................................47
3.2 Sintaxe de Baixo Nvel......................................................................................................................48
3.2.1 Nomes........................................................................................................................................48
3.2.2 Constantes..................................................................................................................................48
3.2.3 Operadores.................................................................................................................................49
3.2.4 Rtulo de Instruo....................................................................................................................49
3.2.5 Delimitadores.............................................................................................................................50
3.3 Formas dos Cdigos Fontes..............................................................................................................50
3.3.1 Cdigo Fonte Formato Livre.....................................................................................................50
3.3.1.1 Comentrio Formato Livre................................................................................................51
3.3.1.2 Instruo de Continuao no Formato Livre.....................................................................52
3.3.1.3 Terminador de Instruo no Formato Livre.......................................................................52
3.3.1.4 Instruo no Formato Livre...............................................................................................52
3.3.2 Formato Fixo.............................................................................................................................52
3.3.2.1 Comentrio no Formato Fixo.............................................................................................53
3.3.2.2 Instruo de Continuao no Formato Fixo.......................................................................53
3.3.2.3 Terminador de Instruo no Formato Fixo........................................................................53
3.3.2.4 Instrues no Formato Fixo...............................................................................................53
3.4 Incluindo Cdigo Fonte.....................................................................................................................53
4. Tipos.........................................................................................................................................................55
4.1 O conceito de Tipo............................................................................................................................55
4.1.1 Conjunto de valores...................................................................................................................55
4.1.2 Constantes..................................................................................................................................55
4.1.3 Operaes..................................................................................................................................56
4.2 Parmetros de Tipo............................................................................................................................56
4.3 Relacionamento entre Tipos e Valores dos Objetos..........................................................................59
4.4 Tipos Intrnsecos...............................................................................................................................59
4.4.1 Tipo Inteiro................................................................................................................................60
4.4.2 Tipo Real....................................................................................................................................61
4.4.3 Tipo Complexo..........................................................................................................................63
4.4.4 Tipo Caractere............................................................................................................................64
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 4
4.4.4.1 Especificador Tipo Caractere.............................................................................................64
4.4.4.2 Constante Literal Caractere...............................................................................................65
4.4.4.3 Sequncia de Arrumao...................................................................................................66
4.4.5 Tipo Lgico................................................................................................................................67
4.5 Tipos Derivados.................................................................................................................................68
4.5.1 Definio de Tipo Derivado......................................................................................................68
4.5.1.1 Acessibilidade....................................................................................................................69
4.5.1.2 Tipo Sequncia...................................................................................................................70
4.5.1.3 Determinao dos Tipos Derivados...................................................................................70
4.5.2 Parmetros de Tipo Derivado....................................................................................................72
4.5.2.1 Ordem do Parmetro de Tipo.............................................................................................72
4.5.3 Componentes.............................................................................................................................73
4.5.3.1 Componentes de Matriz.....................................................................................................74
4.5.3.2 Componentes de Ponteiro.................................................................................................75
4.5.3.3 Argumento Mudo Objeto passado.....................................................................................75
4.5.3.4 Inicializao default para Componentes............................................................................76
4.5.3.5 Ordem dos Componentes...................................................................................................77
4.5.3.6 Acessibilidade do Componente..........................................................................................78
4.5.4 Procedimentos Ligado ao Tipo..................................................................................................79
4.5.5 Sub-rotinas Finais......................................................................................................................81
4.5.5.1 Processo de Finalizao.....................................................................................................81
4.5.5.2 Quando Finalizao Ocorre...............................................................................................82
4.5.5.3 Entidades que no foram Finalizadas................................................................................82
4.5.6 Extenso de Tipo.......................................................................................................................82
4.5.6.1 Herana..............................................................................................................................83
4.5.6.2 Sobrecarga de Procedimento Ligado ao Tipo....................................................................84
4.5.7 Valores Tipo Derivado...............................................................................................................85
4.5.8 Especificador de Tipo Derivado................................................................................................85
4.5.9 Construo de Valores do Tipo Derivado..................................................................................85
4.5.10 Atribuio e Operaes com Tipo Derivado............................................................................87
4.6 Enumerao e Enumeradores............................................................................................................87
4.7 Construo de Valores da Matriz.......................................................................................................89
5. Declarao e Especificaes de Objeto de Dados...................................................................................92
5.1 Instrues de Declarao de Tipo......................................................................................................92
5.1.1 Especificadores de Declarao de Tipo.....................................................................................95
5.1.1.1 Tipo....................................................................................................................................95
5.1.1.2 Classe.................................................................................................................................95
5.1.2 Atributos....................................................................................................................................96
5.1.2.1 Acessibilidade do Atributo.................................................................................................96
5.1.2.2 Atributo Alocvel...............................................................................................................97
5.1.2.3 Atributo Assncrono...........................................................................................................97
5.1.2.4 Atributo Ligado para Entidades de Dado...........................................................................97
5.1.2.5 Atributo Dimenso.............................................................................................................98
5.1.2.5.1 Matriz de Forma Explcita........................................................................................99
5.1.2.5.2 Matriz de Forma Assumida.......................................................................................99
5.1.2.5.3 Matriz de Forma Postergada.....................................................................................99
5.1.2.5.4 Matriz de Tamanho Assumido..................................................................................100
5.1.2.6 Atributo Externo..............................................................................................................101
5.1.2.7 Atributo Inteno.............................................................................................................101
5.1.2.8 Atributo Intrnseco...........................................................................................................103
5.1.2.9 Atributo Opcional............................................................................................................103
5.1.2.10 Atributo Parmetro.........................................................................................................103
5.1.2.11 Atributo Ponteiro............................................................................................................103
5.1.2.12 Atributo Protegido..........................................................................................................104
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 5
5.1.2.13 Atributo Salvo................................................................................................................104
5.1.2.14 Atributo Alvo.................................................................................................................105
5.1.2.15 Atributo Valor.................................................................................................................105
5.1.2.16 Atributo Voltil...............................................................................................................105
5.2 Instrues de Especificao de Atributos........................................................................................106
5.2.1. Instruo Acessibilidade.........................................................................................................106
5.2.2. Instruo Alocvel..................................................................................................................107
5.2.3. Instruo de Assncrona..........................................................................................................107
5.2.4. Instruo BIND.......................................................................................................................107
5.2.5 Instruo DATA.......................................................................................................................107
5.2.6. Instruo Dimenso................................................................................................................110
5.2.7. Instruo Inteno...................................................................................................................110
5.2.8. Instruo Opcional..................................................................................................................110
5.2.9. Instruo Parmetro................................................................................................................110
5.2.10. Instruo Ponteiro.................................................................................................................111
5.2.11. Instruo Protegido...............................................................................................................111
5.2.12. Instruo Salvo.....................................................................................................................111
5.2.13. Instruo Alvo.......................................................................................................................112
5.2.14. Instruo Valor......................................................................................................................112
5.2.15. Instruo Voltil....................................................................................................................112
5.3 Instruo Implcita...........................................................................................................................112
5.4 Instruo NAMELIST.....................................................................................................................114
5.5 Associao de Armazenamento e Objetos de Dado........................................................................115
5.5.1 Instruo Equivalncia.............................................................................................................115
5.5.1.1 Associao de Equivalncia.............................................................................................117
5.5.1.2 Equivalncia de Objetos Caractere default......................................................................117
5.5.1.3 Nomes de Matrizes e Designadores de Elementos de Matriz..........................................117
5.5.1.4 Restries nas Instrues de Equivalncia.......................................................................117
5.5.2 Instruo Comum.....................................................................................................................118
5.5.2.1 Sequncia de Armazenamento Bloco Comum.................................................................119
5.5.2.2 Tamanho do Bloco Comum.............................................................................................119
5.5.2.3 Associao Comum..........................................................................................................119
5.5.2.4 Diferenas entre Bloco Comum com Nome e Bloco Comum sem Nome.......................120
5.5.2.5 Restries sobre Comum e Equivalncia.........................................................................120
6. Uso de Objetos de Dados.......................................................................................................................122
6.1 Escalares..........................................................................................................................................122
6.1.1 Subcadeias...............................................................................................................................123
6.1.2 Componentes de uma Estrutura...............................................................................................124
6.1.3 Inquisio de Parmetro de Tipo.............................................................................................125
6.2 Matrizes...........................................................................................................................................125
6.2.1 Matrizes Inteiras......................................................................................................................126
6.2.2 Elementos de Matriz e Sees de Matriz.................................................................................126
6.2.2.1 Elementos de Matriz........................................................................................................127
6.2.2.2 Ordem dos Elementos da Matriz.....................................................................................127
6.2.2.3 Sees de Matriz..............................................................................................................127
6.2.2.3.1 Subscrito Tripleto.....................................................................................................128
6.2.2.3.2 Subscrito Vetor.........................................................................................................128
6.3 Associao Dinmica......................................................................................................................129
6.3.1 Instruo Alocao..................................................................................................................129
6.3.1.1 Alocao de Variveis Alocveis.....................................................................................131
6.3.1.2 Alocao de Alvos de Ponteiros.......................................................................................132
6.3.1.3 Especificador ERRMSG=................................................................................................132
6.3.2 Instruo de Nulificao..........................................................................................................132
6.3.3 Instruo de Desalocao........................................................................................................133
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 6
6.3.3.1 Desalocao de Variveis Alocadas.................................................................................133
6.3.3.2 Desalocao os Alvos de Ponteiros.................................................................................135
7. Expresses e Atribuio.........................................................................................................................136
7.1 Expresses.......................................................................................................................................136
7.1.1 Forma de uma Expresso.........................................................................................................136
7.1.1.1 Primria............................................................................................................................136
7.1.1.2 Expresses nvel-1...........................................................................................................137
7.1.1.3 Expresses nvel-2...........................................................................................................137
7.1.1.4 Expresses nvel-3...........................................................................................................138
7.1.1.5 Expresses nvel-4...........................................................................................................138
7.1.1.6 Expresses nvel-5...........................................................................................................138
7.1.1.7 Forma Geral de uma Expresso.......................................................................................139
7.1.2 Operaes Intrnsecas..............................................................................................................139
7.1.3 Operaes Definidas................................................................................................................141
7.1.4 Tipo, Parmetros de Tipo e Forma de uma Expresso............................................................142
7.1.4.1 Tipo, Parmetros de Tipo e Forma de uma Primria.......................................................142
7.1.4.2 Tipo, Parmetros de Tipo e Forma do Resultado de uma Operao................................143
7.1.5 Regras de Conformidade para Operaes Elementares...........................................................144
7.1.6 Expresso de Especificao.....................................................................................................144
7.1.7 Expresso de Inicializao.......................................................................................................145
7.1.8 Avaliao de Operaes...........................................................................................................147
7.1.8.1 Avaliao de Operandos...................................................................................................148
7.1.8.2 Integridade dos Parnteses...............................................................................................148
7.1.8.3 Avaliao de Operaes Intrnsecas Numricas..............................................................148
7.1.8.4 Avaliao de Operaes Intrnsecas Caractere................................................................150
7.1.8.5 Avaliao de Operaes Intrnsecas Relacionais.............................................................150
7.1.8.6 Avaliao de Operaes Intrnsecas Lgicas...................................................................150
7.1.8.7 Avaliao de Operao Definida .....................................................................................151
7.2 Interpretao de Operaes.............................................................................................................151
7.2.1 Operaes Intrnsecas Numricas............................................................................................151
7.2.1.1 Diviso Inteira..................................................................................................................152
7.2.1.2 Exponenciao Complexa................................................................................................152
7.2.2 Operao Intrnseca Caractere.................................................................................................152
7.2.3 Operaes Intrnsecas Relacionais..........................................................................................153
7.2.4 Operaes Intrnsecas Lgicas................................................................................................154
7.3 Precedncia dos Operadores............................................................................................................155
7.4 Atribuio........................................................................................................................................157
7.4.1 Instruo de Atribuio............................................................................................................157
7.4.1.1.Forma Geral.....................................................................................................................157
7.4.1.2.Instruo de Atribuio Intrnseca...................................................................................157
7.4.1.3.Interpretao da Atribuio Intrnseca.............................................................................158
7.4.1.4.Instruo de Atribuio Definida.....................................................................................161
7.4.1.5.Interpretao da Instruo de Atribuio Definida..........................................................161
7.4.2 Atribuio de Ponteiro.............................................................................................................162
7.4.2.1 Atribuio de Ponteiro de Dado.......................................................................................163
7.4.2.2 Atribuio de Ponteiro de Procedimento.........................................................................163
7.4.2.3 Exemplos.........................................................................................................................164
7.4.3 Atribuio de Matriz Mascarada WHERE...........................................................................164
7.4.3.1 Forma Geral de uma Atribuio de Matriz Mascarada....................................................164
7.4.3.2 Interpretao da Atribuio de Matriz Mascarada...........................................................165
7.4.4 Para Todos...............................................................................................................................167
7.4.4.1 O Construtor FORALL....................................................................................................167
7.4.4.2 Execuo de um Construtor FORALL............................................................................169
7.4.4.2.1 Determinao dos Valores das Variveis ndice.......................................................169
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 7
7.4.4.2.2 Avaliao de uma Expresso Mscara.....................................................................169
7.4.4.2.3 Execuo do Corpo das Construes FORALL.......................................................170
7.4.4.3 A Instruo FORALL.......................................................................................................171
7.4.4.4 Restries para as Instrues e Construes FORALL ..................................................172
8. Controle de Execuo............................................................................................................................173
8.1 Construes Executveis Contendo Blocos....................................................................................173
8.1.1 Regras para os Blocos..............................................................................................................173
8.1.1.1 Construes Executveis dentro de Blocos.....................................................................173
8.1.1.2 Controle de Fluxo dentro de Blocos................................................................................174
8.1.1.3 Execuo de um Bloco....................................................................................................174
8.1.2 Construo IF..........................................................................................................................174
8.1.2.1 Forma da Construo IF..................................................................................................174
8.1.2.2 Execuo de uma Construo IF.....................................................................................174
8.1.2.3 Exemplos de Construes IF...........................................................................................175
8.1.2.4 Instruo IF......................................................................................................................175
8.1.3 Construo Caso......................................................................................................................175
8.1.3.1 Forma de uma Construo Caso......................................................................................176
8.1.3.2 Execuo de uma Construo Caso.................................................................................176
8.1.3.3 Exemplos das Construes Caso.....................................................................................177
8.1.4 Construo Associado..............................................................................................................178
8.1.4.1 Formas de uma Construo Associado............................................................................178
8.1.4.2 Execuo de uma Construo Associado.........................................................................178
8.1.4.3 Atributos dos Nomes Associados.....................................................................................179
8.1.4.4 Exemplos de uma Construo Associado........................................................................179
8.1.5 Construo SELECT TYPE....................................................................................................179
8.1.5.1 Formas da Construo SELECT TYPE...........................................................................179
8.1.5.2 Execuo da Construo SELECT TYPE.......................................................................180
8.1.5.3 Exemplos da Construo SELECT TYPE.......................................................................181
8.1.6 Construo DO........................................................................................................................182
8.1.6.1 Formas da Construo DO...............................................................................................182
8.1.6.1.1 Formas da Construo DO na Forma Bloco............................................................182
8.1.6.1.2 Formas da Construo DO na Forna No Bloco......................................................183
8.1.6.2 Intervalo da Construo DO............................................................................................183
8.1.6.3 Construes DO Ativa e Inativa......................................................................................184
8.1.6.4 Execuo de uma Construo DO...................................................................................184
8.1.6.4.1 Inicializao da Iterao...........................................................................................184
8.1.6.4.2 O Ciclo de Execuo................................................................................................185
8.1.6.4.3 Instruo Pula...........................................................................................................185
8.1.6.4.4 Trmino da Iterao.................................................................................................185
8.1.6.5 Exemplos de Construes DO ........................................................................................186
8.2 Desvio .............................................................................................................................................187
8.2.1 Instruo GO TO.....................................................................................................................187
8.2.2 Instruo GO TO Calculada....................................................................................................187
8.2.3 Instruo IF Aritmtica............................................................................................................187
8.3 Instruo Continua..........................................................................................................................188
8.4 Instruo Para..................................................................................................................................188
9. Instrues de Entrada/Sada...................................................................................................................189
9.1 Registros..............................................................................................................................................189
9.1.1 Registro Formatado.................................................................................................................189
9.1.2 Registro No Formatado..........................................................................................................190
9.1.3 Registro Fim-de-arquivo..........................................................................................................190
9.2 Arquivos Externos...........................................................................................................................190
9.2.1 Existncia de Arquivo..............................................................................................................191
9.2.2 Acesso ao Arquivo...................................................................................................................191
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 8
9.2.2.1 Acesso Sequencial............................................................................................................191
9.2.2.2 Acesso Direto...................................................................................................................192
9.2.2.3 Acesso de Fluxo...............................................................................................................192
9.2.3 Posio no Arquivo..................................................................................................................194
9.2.3.1 Entrada/Sada Avana e No Avana...............................................................................194
9.2.3.2 Posio do Arquivo antes da Transferncia de Dados.....................................................194
9.2.3.3 Posio do Arquivo depois da Transferncia de Dados...................................................195
9.2.4 Unidades de Armazenamento de Arquivo...............................................................................196
9.3 Arquivos Interno..............................................................................................................................196
9.4 Conexo de Arquivo........................................................................................................................197
9.4.1 Modos de Conexo..................................................................................................................198
9.4.2 Existncia da Unidade.............................................................................................................198
9.4.3 Conexo de um Arquivo uma Unidade.................................................................................198
9.4.4 Pr-conexo.............................................................................................................................199
9.4.5 A instruo OPEN....................................................................................................................199
9.4.5.1 Especificador ACCESS= na Instruo OPEN.................................................................201
9.4.5.2 Especificador ACTION= na Instruo OPEN.................................................................201
9.4.5.3 Especificador ASYNCHRONOUS= na Instruo OPEN...............................................201
9.4.5.4 Especificador BLANK= na Instruo OPEN..................................................................201
9.4.5.5 Especificador DECIMAL= na Instruo OPEN..............................................................202
9.4.5.6 Especificador DELIM= na Instruo OPEN...................................................................202
9.4.5.7 Especificador ENCODING= na Instruo OPEN...........................................................202
9.4.5.8 Especificador FILE= na Instruo OPEN........................................................................202
9.4.5.9 Especificador FORM= na Instruo OPEN.....................................................................202
9.4.5.10 Especificador PAD= na Instruo OPEN......................................................................202
9.4.5.11 Especificador POSITION= na Instruo OPEN............................................................203
9.4.5.12 Especificador RECL= na Instruo OPEN....................................................................203
9.4.5.13 Especificador ROUND= na Instruo OPEN................................................................203
9.4.5.14 Especificador SIGN= na Instruo OPEN.....................................................................203
9.4.5.15 Especificador STATUS= na Instruo OPEN................................................................204
9.4.6 A Instruo CLOSE.................................................................................................................204
9.4.6.1 Especificador STATUS= na Instruo CLOSE................................................................205
9.5 Instrues de Transferncia de Dados.............................................................................................205
9.5.1 Lista de Informao de Controle ............................................................................................206
9.5.1.1 Especificador FMT= na Instruo de Transferncia de Dados........................................207
9.5.1.2 Especificador NML= na Instruo de Transferncia de Dados.......................................208
9.5.1.3 Especificador ADVANCE= na Instruo de Transferncia de Dados.............................208
9.5.1.4 Especificador ASYNCHRONOUS= na Instruo de Transferncia de Dados...............208
9.5.1.5 Especificador BLANK= na Instruo de Transferncia de Dados..................................209
9.5.1.6 Especificador DECIMAL= na Instruo de Transferncia de Dados..............................209
9.5.1.7 Especificador DELIM= na Instruo de Transferncia de Dados...................................209
9.5.1.8 Especificador ID= na Instruo de Transferncia de Dados............................................209
9.5.1.9 Especificador PAD= na Instruo de Transferncia de Dados........................................209
9.5.1.10 Especificador POS= na Instruo de Transferncia de Dados.......................................210
9.5.1.11 Especificador REC= na Instruo de Transferncia de Dados......................................210
9.5.1.12 Especificador ROUND= na Instruo de Transferncia de Dados................................210
9.5.1.13 Especificador SIGN= na Instruo de Transferncia de Dados.....................................210
9.5.1.14 Especificador SIZE= na Instruo de Transferncia de Dados......................................210
9.5.2 Lista de Entrada/Sada na Transferncia de Dados..................................................................211
9.5.3 Execuo da Instruo de Entrada/Sada de uma Transferncia de Dados.............................213
9.5.3.1 Direo da Transferncia de Dados.................................................................................214
9.5.3.2 Identificando a Unidade...................................................................................................214
9.5.3.3 Estabelecendo um Formato..............................................................................................215
9.5.3.4 Transferncia de Dados....................................................................................................215
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 9
9.5.3.4.1 Transferncia Dados No Formatados.....................................................................216
9.5.3.4.2 Transferncia de Dados Formatados........................................................................217
9.5.3.5 Formatao Lista Dirigida ............................................................................................217
9.5.3.6 Formatao Lista de Nome..............................................................................................217
9.5.3.7 Entrada/Sada de Tipo Derivado Definido pelo Usurio.................................................218
9.5.3.7.1 Executando Transferncias de Entrada/Sada de Dados Tipo Derivado Definido pelo
Usurio.........................................................................................................................................218
9.5.3.7.2 Procedimentos de Entrada/sada Tipo Derivado Definido pelo Usurio......................219
9.5.3.7.3 Resolvendo Referncia de Procedimento de Entrada/Sada Tipo Derivado............223
9.5.4 Trmino de Instrues de Transferncia de Dados.................................................................223
9.6 Espera na Transferncia de Dados Pendente...................................................................................224
9.6.1 Instruo Espera......................................................................................................................224
9.6.2 Operao Espera......................................................................................................................225
9.7 Instrues de Posicionamento de Arquivo......................................................................................225
9.7.1 Instruo Retrocede.................................................................................................................226
9.7.2 Instruo Fim-de-arquivo........................................................................................................226
9.7.3 Instruo Rebobina..................................................................................................................227
9.8 Instruo Descarrega.......................................................................................................................227
9.9 Inquisio de Arquivo.....................................................................................................................228
9.9.1 Especificadores de Inquisio.................................................................................................228
9.9.1.1 Especificador FILE= na Instruo INQUIRE..................................................................229
9.9.1.2 Especificador ACCESS= na Instruo INQUIRE...........................................................229
9.9.1.3 Especificador ACTION= na Instruo INQUIRE...........................................................230
9.9.1.4 Especificador ASYNCHRONOUS= na Instruo INQUIRE.........................................230
9.9.1.5 Especificador BLANK= na Instruo INQUIRE............................................................230
9.9.1.6 Especificador DECIMAL= na Instruo INQUIRE........................................................230
9.9.1.7 Especificador DELIM= na Instruo INQUIRE.............................................................230
9.9.1.8 Especificador DIRECT= na Instruo INQUIRE............................................................230
9.9.1.9 Especificador ENCODING= na Instruo INQUIRE.....................................................230
9.9.1.10 Especificador EXIST= na Instruo INQUIRE.............................................................231
9.9.1.11 Especificador FORM= na Instruo INQUIRE.............................................................231
9.9.1.12 Especificador FORMATTED= na Instruo INQUIRE................................................231
9.9.1.13 Especificador ID= na Instruo INQUIRE....................................................................231
9.9.1.14 Especificador NAME= na Instruo INQUIRE............................................................231
9.9.1.15 Especificador NAMED= na Instruo INQUIRE.........................................................232
9.9.1.16 Especificador NEXTREC= na Instruo INQUIRE......................................................232
9.9.1.17 Especificador NUMBER= na Instruo INQUIRE.......................................................232
9.9.1.18 Especificador OPENED= na Instruo INQUIRE........................................................232
9.9.1.19 Especificador PAD= na Instruo INQUIRE................................................................232
9.9.1.20 Especificador PENDING= na Instruo INQUIRE.......................................................232
9.9.1.21 Especificador POS= na Instruo INQUIRE.................................................................233
9.9.1.22 Especificador POSITION= na Instruo INQUIRE......................................................233
9.9.1.23 Especificador READ= na Instruo INQUIRE.............................................................233
9.9.1.24 Especificador READWRITE= na Instruo INQUIRE.................................................233
9.9.1.25 Especificador RECL= na Instruo INQUIRE..............................................................234
9.9.1.26 Especificador ROUND= na Instruo INQUIRE..........................................................234
9.9.1.27 Especificador SEQUENTIAL= na Instruo INQUIRE...............................................234
9.9.1.28 Especificador SIGN= na Instruo INQUIRE...............................................................234
9.9.1.29 Especificador SIZE= na Instruo INQUIRE................................................................234
9.9.1.30 Especificador STREAM= na Instruo INQUIRE........................................................235
9.9.1.31 Especificador UNFORMATTED= na Instruo INQUIRE..........................................235
9.9.1.32 Especificador WRITE= na Instruo INQUIRE............................................................235
9.9.2 Restries sobre os Especificadores de Inquisio .................................................................235
9.9.3 Inquirindo sobre Lista Sada....................................................................................................235
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 10
9.10 Erro, Fim-de-registro e Condio Fim-de-arquivo.......................................................................236
9.10.1 Condies de Erro e Especificador ERR=.............................................................................236
9.10.2 Condio Fim-de-arquivo e especificador END=.................................................................236
9.10.3 Condio Fim-de-registro e Especificador EOR=.................................................................237
9.10.4 Especificador IOSTAT=........................................................................................................237
9.10.5 Especificador IOMSG=.........................................................................................................238
9.11 Restries sobre Instrues Entrada/Sada....................................................................................238
10. Editao de Entrada/Sada...................................................................................................................240
10.1 Mtodos Explcitos de Especificao de Formato........................................................................240
10.1.1 Instruo Formato..................................................................................................................240
10.1.2 Especificao de Formato Caractere.....................................................................................240
10.2. Forma de uma Lista de Itens de Formatos...................................................................................241
10.2.1 Descritores de Edio............................................................................................................241
10.2.2 Campos..................................................................................................................................243
10.3. Interao entre Lista de Entrada/sada e Formato........................................................................243
10.4. Posicionando pelo uso de Controle de Formato ..........................................................................244
10.5. Smbolo Decimal..........................................................................................................................245
10.6. Descritores de Edio de Dados...................................................................................................245
10.6.1 Edio Numrica...................................................................................................................245
10.6.1.1 Edio de Inteiro............................................................................................................246
10.6.1.2 Edio de Real e Complexo...........................................................................................247
10.6.1.2.1 Edio F.................................................................................................................247
10.6.1.2.2 Edio E e D...........................................................................................................248
10.6.1.2.3 Edio EN..............................................................................................................249
10.6.1.2.4 Edio ES...............................................................................................................250
10.6.1.2.5 Edio de Complexo..............................................................................................250
10.6.1.2.6 Modo de Arredondamento......................................................................................251
10.6.2 Edio do Tipo Lgico..........................................................................................................251
10.6.3 Edio de Caractere...............................................................................................................252
10.6.4 Edio Generalizada..............................................................................................................252
10.6.4.1 Edio Numrica Generalizada.....................................................................................252
10.6.4.1.1 Edio de Tipo Inteiro Generalizada......................................................................253
10.6.4.1.2 Edio de Tipo Real e Complexo Generalizada.....................................................253
10.6.4.2 Edio de Tipo Lgico Generalizada.............................................................................254
10.6.4.3 Edio de Tipo Caractere Generalizada.........................................................................254
10.6.5 Edio de Tipo Derivado Definido pelo Usurio..................................................................254
10.7 Descritores de Edio de Controle................................................................................................254
10.7.1 Edio de Posio..................................................................................................................254
10.7.1.1 Edio T, TL e TR..........................................................................................................255
10.7.1.2 Edio X........................................................................................................................255
10.7.2 Edio Barra..........................................................................................................................255
10.7.3 Edio Dois Pontos................................................................................................................256
10.7.4 Edio SS, SP e S..................................................................................................................256
10.7.5 Edio P.................................................................................................................................256
10.7.6 Edio BN e BZ.....................................................................................................................257
10.7.7 Edio RU, RD, RZ, RN, RC e RP.......................................................................................257
10.7.8 Edio DC e DP.....................................................................................................................257
10.8 Descritores de Edio de Cadeia de Caracteres............................................................................257
10.9 Formatao Lista dirigida ...........................................................................................................258
10.9.1 Entrada Lista Dirigida .........................................................................................................259
10.9.1.1 Valores Nulos.................................................................................................................260
10.9.2 Sada Lista Dirigida ............................................................................................................261
10.10 Formatao Lista de Nomes........................................................................................................262
10.10.1 Entrada Lista de Nomes.......................................................................................................262
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 11
10.10.1.1 Nomes de Objetos no Grupo Lista de Nomes..............................................................263
10.10.1.2 Valores na Entrada Lista de Nomes.............................................................................263
10.10.1.3 Itens da Lista de Objetos do Grupo da Lista de Nomes...............................................264
10.10.1.4 Valores Nulos...............................................................................................................265
10.10.1.5 Brancos........................................................................................................................265
10.10.1.6 Comentrios na Lista de Nomes..................................................................................265
10.10.2 Sada Lista de Nomes..........................................................................................................266
10.10.2.1 Edio de Sada de Lista de Nomes.............................................................................266
10.10.2.2 Registros de Sada de Lista de Nomes.........................................................................267
11. Unidades de Programa.........................................................................................................................268
11.1 Programa Principal........................................................................................................................268
11.2 Mdulos.........................................................................................................................................269
11.2.1 Instruo Uso e Associao de Uso.......................................................................................270
11.3 Unidades de Programa Dados em Bloco.......................................................................................272
12. Procedimentos......................................................................................................................................274
12.1 Classificao de Procedimentos....................................................................................................274
12.1.1 Classificao de Procedimento por Referncia.....................................................................274
12.1.2 Classificao de Procedimento por meio da Definio.........................................................274
12.1.2.1 Procedimentos Intrnsecos.............................................................................................274
12.1.2.2 Procedimentos Externo, Interno e Mdulo....................................................................275
12.1.2.3 Procedimentos Mudos....................................................................................................275
12.1.2.4 Ponteiros de Procedimento............................................................................................275
12.1.2.5 Funes Instruo..........................................................................................................275
12.2 Caractersticas dos Procedimentos................................................................................................275
12.2.1 Caractersticas dos Argumentos mudos.................................................................................275
12.2.1.1 Caractersticas dos Objetos de Dados Mudos................................................................276
12.2.1.2 Caractersticas dos Procedimentos Mudos e Ponteiros de Procedimentos Mudos........276
12.2.1.3 Caractersticas dos Argumentos Mudos Asterisco.........................................................276
12.2.2 Caractersticas dos Resultados de Funo.............................................................................276
12.3 Interface de Procedimento.............................................................................................................276
12.3.1 Interfaces Implcitas e Explcitas...........................................................................................277
12.3.1.1 Interface Explcita..........................................................................................................277
12.3.2 Especificao da Interface de Procedimento.........................................................................277
12.3.2.1 Bloco de Interface..........................................................................................................278
12.3.2.1.1 Operaes Definidas..............................................................................................281
12.3.2.1.2 Atribuies Definidas.............................................................................................282
12.3.2.1.3 Interfaces de Procedimento de Entrada/Sada Tipo Derivado Definido pelo Usurio
.................................................................................................................................................283
12.3.2.2 Instruo Externa...........................................................................................................283
12.3.2.3 Instruo Declarao de Procedimento..........................................................................283
12.3.2.4 Instruo Intrnseca........................................................................................................285
12.3.2.5 Especificao Interface Implcita...................................................................................285
12.4 Referncia de Procedimento..........................................................................................................285
12.4.1 Argumentos Reais, Mudos e Associao Argumento............................................................287
12.4.1.1 O Argumento Mudo Objeto Passado e Associao Argumento.....................................287
12.4.1.2 Argumento Real Associado com Objetos de Dados Mudo............................................287
12.4.1.3 Argumentos Reais Associados com Entidades Procedimento Mudo.............................290
12.4.1.4 Argumentos Reais Associados com Indicadores Alternativos de Retorno....................290
12.4.1.5 Associao Sequncia....................................................................................................291
12.4.1.6 Restries para os Argumentos Mudos no Presentes...................................................291
12.4.1.7 Restries para as Entidades com Argumentos Mudos.................................................292
12.4.2 Referncia de Funo............................................................................................................294
12.4.3 Referncia de Sub-rotina.......................................................................................................294
12.4.4 Resolvendo Referncias de Procedimentos com Nome........................................................295
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 12
12.4.4.1 Resolvendo Referncias de Procedimento para Nomes Estabelecidos para serem
Genricos.....................................................................................................................................295
12.4.4.2 Resolvendo Referncias de Procedimento para Nomes Estabelecidos para serem
somente Especficos.....................................................................................................................296
12.4.4.3 Resolvendo Referncias de Procedimento para Nomes No Estabelecidos..................297
12.4.5 Resolvendo Referncias de Procedimento Ligado ao Tipo...................................................297
12.5 Definio de Procedimento...........................................................................................................297
12.5.1 Definio de Procedimento Intrnseco..................................................................................297
12.5.2 Subprogramas definidos por Procedimentos.........................................................................298
12.5.2.1 Subprograma Funo.....................................................................................................298
12.5.2.2 Subprograma Sub-rotina................................................................................................300
12.5.2.3 Instncias de um Subprograma......................................................................................301
12.5.2.4 Instruo Entra...............................................................................................................301
12.5.2.5 Instruo Retorna...........................................................................................................302
12.5.2.6 Instruo Contm...........................................................................................................303
12.5.3 Definindo e Invocando Procedimentos por outros meios que no o Fortran........................303
12.5.4 Funo Instruo....................................................................................................................303
12.6 Procedimentos Puros.....................................................................................................................304
12.7 Procedimentos Elementares..........................................................................................................305
12.7.1 Declarao de Procedimento Elementar e Interface..............................................................305
12.7.2 Argumento Real de Funo Elementar e Resultados.............................................................306
12.7.3 Argumento Real de Sub-rotina Elementar.............................................................................306
13. Procedimentos Intrnsecos e Mdulos.................................................................................................308
13.1 Classes de Procedimentos Intrnsecos...........................................................................................308
13.2 Argumentos para os Procedimentos Intrnsecos............................................................................308
13.2.1 A Forma de Argumentos Matriciais.......................................................................................309
13.2.2 Argumentos Mscara.............................................................................................................309
13.3 Modelo de Bit................................................................................................................................309
13.4 Modelos Numricos......................................................................................................................310
13.5 Procedimentos Intrnsecos Genricos Padro...............................................................................311
13.5.1 Funes Numricas................................................................................................................311
13.5.2 Funes Matemticas.............................................................................................................311
13.5.3 Funes Caractere..................................................................................................................312
13.5.4 Funes Subtipo....................................................................................................................312
13.5.5 Miscelnea de Funes Converso de Tipo...........................................................................312
13.5.6 Funes Inquisio Numrica...............................................................................................312
13.5.7 Funes Inquisio de Matriz................................................................................................313
13.5.8 Outras Funes de Inquisio................................................................................................313
13.5.9 Procedimentos de Manipulao de Bit..................................................................................313
13.5.10 Funes de Manipulao de Ponto Flutuante......................................................................313
13.5.11 Funes de Multiplicao de Vetor e Matriz.......................................................................313
13.5.12 Funes de Reduo de Matriz............................................................................................314
13.5.13 Funes de Construo de Matriz.......................................................................................314
13.5.14 Funes de Localizao de Matriz......................................................................................314
13.5.15 Funo Nulo........................................................................................................................314
13.5.16 Procedimento de Transferncia de Alocao.......................................................................314
13.5.17 Sub-rotina Nmero Aleatrio..............................................................................................314
13.5.18 Procedimentos Sistema Ambiente.......................................................................................315
13.6 Nomes Especficos para Funes Intrnsecas Padro...................................................................315
13.7 Especificaes dos Procedimentos Intrnsecos Padro.................................................................316
13.8 Mdulos Intrnsecos Padro..........................................................................................................320
13.8.1 Os Mdulos IEEE..................................................................................................................320
13.8.2 O Mdulo Intrnseco ISO_FORTRAN_ENV........................................................................320
13.8.2.1 CHARACTER_STORAGE_SIZE................................................................................320
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 13
13.8.2.2 ERROR_UNIT...............................................................................................................320
13.8.2.3 FILE_STORAGE_SIZE................................................................................................320
13.8.2.4 INPUT_UNIT ...............................................................................................................320
13.8.2.5 IOSTAT_END ...............................................................................................................320
13.8.2.6 IOSTAT_EOR ...............................................................................................................321
13.8.2.7 NUMERIC_STORAGE_SIZE .....................................................................................321
13.8.2.8 OUTPUT_UNIT ...........................................................................................................321
13.8.3 O Mdulo ISO_C_BINDING................................................................................................321
14. Excees e Aritmtica IEEE................................................................................................................322
14.1 Tipos Derivados e Constantes definidas nos Mdulos..................................................................323
14.2 As Excees...................................................................................................................................324
14.3 Os Modos de Arredondamento......................................................................................................325
14.4 Modo Subtransbordamento...........................................................................................................326
14.5 Parada............................................................................................................................................326
14.6 O Estado do Ponto Flutuante.........................................................................................................327
14.7 Valores das Excees.....................................................................................................................327
14.8 Aritmtica IEEE............................................................................................................................327
14.9 Tabelas de Procedimentos.............................................................................................................328
14.9.1 Funes de Inquisio...........................................................................................................328
14.9.2 Funes Elementares.............................................................................................................328
14.9.3 Funo Subtipo......................................................................................................................329
14.9.4 Sub-rotinas Elementares........................................................................................................329
14.9.5 Sub-rotinas No Elementares................................................................................................329
14.10 Especificaes dos Procedimentos..............................................................................................329
14.10.1 IEEE_CLASS(X) ................................................................................................................330
14.10.2 IEEE_COPY_SIGN(X, Y) .................................................................................................331
14.10.3 IEEE_GET_FLAG(FLAG, FLAG VALUE) ......................................................................331
14.10.4 IEEE_GET_HALTING_MODE(FLAG, HALTING) ........................................................331
14.10.5 IEEE_GET_ROUNDING_MODE(ROUND_VALUE) .....................................................332
14.10.6 IEEE_GET_STATUS(STATUS_VALUE) .........................................................................332
14.10.7 IEEE_GET_UNDERFLOW_MODE(GRADUAL) ...........................................................333
14.10.8 IEEE_IS_FINITE(X) ..........................................................................................................333
14.10.9 IEEE_IS_NAN(X) ..............................................................................................................333
14.10.10 IEEE_IS_NEGATIVE(X) .................................................................................................334
14.10.11 IEEE_IS_NORMAL(X) ...................................................................................................334
14.10.12 IEEE_LOGB(X) ...............................................................................................................334
14.10.13 IEEE_NEXT_AFTER(X, Y) ............................................................................................335
14.10.14 IEEE_REM(X, Y) .............................................................................................................335
14.10.15 IEEE_RINT(X) .................................................................................................................336
14.10.16 IEEE_SCALB(X, I) ..........................................................................................................336
14.10.17 IEEE_SELECTED_REAL_KIND([P, R]) .......................................................................337
14.10.18 IEEE_SET_FLAG(FLAG, FLAG_VALUE) ...................................................................337
14.10.19 IEEE_SET_HALTING_MODE(FLAG, HALTING) .......................................................338
14.10.20 IEEE_SET_ROUNDING_MODE(ROUND VALUE) ....................................................338
14.10.21 IEEE_SET_STATUS(STATUS_VALUE) ........................................................................338
14.10.22 IEEE_SET_UNDERFLOW_MODE (GRADUAL) ........................................................339
14.10.23 IEEE_SUPPORT_DATATYPE() ou IEEE_SUPPORT_DATATYPE(X) ........................339
14.10.24 IEEE_SUPPORT_DENORMAL() ou IEEE_SUPPORT_DENORMAL(X) ...................340
14.10.25 IEEE_SUPPORT_DIVIDE() ou IEEE_SUPPORT_DIVIDE(X) ....................................340
14.10.26 IEEE_SUPPORT_FLAG(FLAG) ou IEEE_SUPPORT_FLAG(FLAG, X) ....................341
14.10.27 IEEE_SUPPORT_HALTING(FLAG) ..............................................................................341
14.10.28 IEEE_SUPPORT_INF() ou IEEE_SUPPORT_INF(X) ...................................................341
14.10.29 IEEE_SUPPORT_IO() ou IEEE_SUPPORT_IO(X) ........................................................342
14.10.30 IEEE_SUPPORT_NAN() ou IEEE_SUPPORT_NAN(X) ...............................................342
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 14
14.10.31 IEEE_SUPPORT_ROUNDING(ROUND_VALUE) ou
IEEE_SUPPORT_ROUNDING(ROUND_VALUE, X) ...........................................................343
14.10.32 IEEE_SUPPORT_SQRT() ou IEEE_SUPPORT_SQRT(X) ............................................343
14.10.33 IEEE_SUPPORT_STANDARD() ou IEEE_SUPPORT_STANDARD(X) .....................344
14.10.34 IEEE_SUPPORT_UNDERFLOW_CONTROL() ou
IEEE_SUPPORT_UNDERFLOW_CONTROL(X) ..................................................................344
14.10.35 IEEE_UNORDERED(X, Y) .............................................................................................345
14.10.36 IEEE_VALUE(X, CLASS) ..............................................................................................345
14.11 Exemplos.....................................................................................................................................346
15. Interoperabilidade com o C..................................................................................................................349
15.1 O Mdulo Intrnseco ISO_C_BINDING......................................................................................349
15.1.1 Constantes com Nome e Tipos Derivados no Mdulo..........................................................349
15.1.2 Procedimentos no Mdulo.....................................................................................................350
15.2 Interoperabilidade entre Entidades do Fortran e C........................................................................353
15.2.1 Interoperabilidade de Tipos Intrnsecos.................................................................................353
15.2.2 Interoperabilidade com Tipos Ponteiros do C.......................................................................355
15.2.3 Interoperabilidade de Tipos derivados com Tipos Struct C...................................................355
15.2.4 Interoperabilidade de Variveis Escalares.............................................................................356
15.2.5 Interoperabilidade de Variveis Matriciais............................................................................356
15.2.6 Interoperabilidade de Procedimentos e Interface de Procedimentos.....................................357
15.3 Interoperabilidade Com Variveis Globais C................................................................................359
15.3.1 Rtulos de Ligao para Blocos e Variveis.........................................................................359
15.4 Interoperabilidade Com Funes C...............................................................................................360
15.4.1 Rtulos de Ligao para Procedimentos...............................................................................360
15.4.2 Excees e Procedimentos Aritmticos IEEE.......................................................................361
16. Escopo, Associao e Definio..........................................................................................................362
16.1 Escopo de Identificadores Globais................................................................................................362
16.2 Escopo de Identificadores Local...................................................................................................363
16.2.1 Identificadores Local que so os mesmos que os Nome em Blocos Comum.......................364
16.2.2 Resultados de Funo............................................................................................................364
16.2.3 Restries e Declaraes Genricas......................................................................................364
16.2.4 Componentes, Parmetros de Tipos e Ligaes....................................................................365
16.2.5 Palavras-chaves de Argumento..............................................................................................365
16.3 Instrues e Entidades Construo................................................................................................366
16.4 Associao.....................................................................................................................................367
16.4.1 Associao de Nome..............................................................................................................367
16.4.1.1 Associao de Argumento..............................................................................................367
16.4.1.2 Associao de Uso.........................................................................................................367
16.4.1.3 Associao de Hospedagem...........................................................................................368
16.4.1.4 Associao de Ligao...................................................................................................370
16.4.1.5 Associao de Construo.............................................................................................370
16.4.2 Associao de Ponteiro..........................................................................................................370
16.4.2.1 Estado da Associao de Ponteiro.................................................................................370
16.4.2.1.1 Eventos que Fazem Ponteiros se Tornarem Associados.........................................371
16.4.2.1.2 Eventos que Fazem Ponteiros se Tornarem Desassociados...................................371
16.4.2.1.3 Eventos que Fazem o Estado de Associao de Ponteiros se tornar Indefinido....371
16.4.2.1.4 Outros Eventos que mudam o Estado de Associao de Ponteiros........................372
16.4.2.2 Estado de Definio do Ponteiro...................................................................................372
16.4.2.3 Relacionamento entre o Estado de Associao e Estado de Definio..........................372
16.4.3 Associao de Armazenamento.............................................................................................372
16.4.3.1 Sequncia de Armazenamento.......................................................................................372
16.4.3.2 Associao de Sequncias de Armazenamento..............................................................373
16.4.3.3 Associao de Objetos de Dados Escalar......................................................................374
16.4.4 Associao de Herana..........................................................................................................375
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 15
16.4.5 Associaes Estabelecidas.....................................................................................................375
16.5 Definio e Indefinio de Variveis.............................................................................................376
16.5.1 Definio de Objetos e Subobjetos........................................................................................376
16.5.2 Variveis que esto Sempre Definidas...................................................................................376
16.5.3 Variveis que esto Inicialmente Definidos...........................................................................376
16.5.4 Variveis que esto Inicialmente Indefinidas........................................................................377
16.5.5 Eventos que Fazem Variveis se Tornarem Definidas..........................................................377
16.5.6 Eventos que Fazem Variveis Tornarem-se Indefinidas........................................................378
16.5.7 Contexto de Definio de Variveis......................................................................................379
Anexo A (Informativo).............................................................................................................................381
Anexo B (Informativo).............................................................................................................................398
B.1 Caractersticas Removidas..................................................................................................................398
B.2 Caractersticas Obsoletas.....................................................................................................................398
B.2.1 Caractersticas Obsoletas.............................................................................................................399
B.2.2 Instruo GO TO Calculada........................................................................................................399
B.2.3 Funes Instruo........................................................................................................................399
B.2.4 Instrues DATA entre Executveis............................................................................................399
B.2.5 Funes Comprimento Caractere Assumidas..............................................................................400
B.2.6 Cdigo Fonte na Forma Fixa.......................................................................................................400
B.2.7 Forma CHARACTER* para a Declarao CHARACTER.........................................................400
Anexo C (Informativo).............................................................................................................................401
C.1 Notas da Seo 4.................................................................................................................................401
C.1.1 Tipos Intrnseco e Derivado (4.4, 4.5).........................................................................................401
C.1.2 Seleo dos Mtodos de Aproximao(4.4.2).............................................................................402
C.1.3 Extenso de Tipo e Acessibilidade de Componente (4.5.1.1, 4.5.3)...........................................402
C.1.4 Tipos Abstratos............................................................................................................................403
C.1.5 Ponteiros (4.5.1)..........................................................................................................................404
C.1.6 Construtores de Estrutura e Nomes Genricos............................................................................404
C.1.7 Procedimentos Ligado ao tipo Genrico.....................................................................................406
C.1.8 Sub-rotinas Finais (4.5.5, 4.5.5.1,4.5.5.2, 4.5.5.3)......................................................................407
C.2 Notas da Seo 5.................................................................................................................................409
C.2.1 O Atributo Ponteiro (5.1.2.11).....................................................................................................409
C.2.2 O Atributo TARGET (5.1.2.14)...................................................................................................409
C.2.3 O atributo Voltil (5.1.2.16).........................................................................................................410
C.3 Notas da Seo 6.................................................................................................................................410
C.3.1 Componentes de Estrutura (6.1.2)...............................................................................................410
C.3.2 Tipo Dinmico com Alocao (6.3.1)..........................................................................................411
C.3.3 Alocao de Ponteiro e Associao.............................................................................................412
C.4 Notas da Seo 7.................................................................................................................................413
C.4.1 Atribuio Caractere....................................................................................................................413
C.4.2 Avaliao de Referencias de Funo...........................................................................................413
C.4.3 Ponteiros em Expresses ............................................................................................................413
C.4.4 Ponteiros no lado esquerdo de uma Atribuio...........................................................................413
C.4.5 Um exemplo de Construo FORALL contendo uma Construo WHERE..............................414
C.4.6 Exemplos de Instrues FORALL..............................................................................................415
C.5 Notas da Seo 8.................................................................................................................................416
C.5.1 Controle de Loop.........................................................................................................................416
C.5.2 A Construo CASO....................................................................................................................416
C.5.3 Exemplos de Construes DO.....................................................................................................416
C.5.4 Exemplos de Construes DO invlidas.....................................................................................418
C.6 Notas da Seo 9.................................................................................................................................418
C.6.1 Arquivos Externos (9.2)...............................................................................................................418
C.6.1.1 Conexo de Arquivos (9.4)..................................................................................................419
C.6.1.2 Existncia de Arquivos (9.2.1).............................................................................................419
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 16
C.6.1.3 Nomes de Arquivos (9.4.5.8)...............................................................................................419
C.6.1.4 Acesso de Arquivos (9.2.2)..................................................................................................419
C.6.2 Entrada/sada sem Avano (9.2.3.1)............................................................................................420
C.6.3 Entrada/sada Assncrona.............................................................................................................421
C.6.4 Instruo OPEN (9.4.5)...............................................................................................................422
C.6.5 Propriedades da Conexo (9.4.3).................................................................................................424
C.6.6 Instruo CLOSE (9.4.6).............................................................................................................424
C.7 Notas da Seo 10...............................................................................................................................424
C.7.1 Nmero de Registros (10.3, 10.4, 10.7.2)....................................................................................424
C.7.2 Entrada Lista dirigida (10.9.1)..................................................................................................425
C.8 Notas da Seo 11...............................................................................................................................426
C.8.1 Programa Principal e Unidade de Programa Dados em Bloco (11.1, 11.3).................................426
C.8.2 Compilao Dependente (11.2)...................................................................................................426
C.8.2.1 Instruo USE e Compilao Dependente (11.2.1).............................................................427
C.8.2.2 Atributos de Acessibilidade..................................................................................................428
C.8.3 Exemplos de uso de Mdulos......................................................................................................428
C.8.3.1 Blocos Comuns idnticos.....................................................................................................428
C.8.3.2 Dados Global.......................................................................................................................428
C.8.3.3 Tipos Derivado.....................................................................................................................429
C.8.3.4 Matrizes Alocveis Global...................................................................................................429
C.8.3.5 Bibliotecas de Procedimentos..............................................................................................429
C.8.3.6 Extenses de Operadores ....................................................................................................430
C.8.3.7 Abstrao de Dados..............................................................................................................430
C.8.3.8 Renomeao de Entidades Pblicas.....................................................................................432
C.9 Notas da Seo 12...............................................................................................................................433
C.9.1 Problemas de Portabilidade com Procedimentos Externos (12.3.2.2).........................................433
C.9.2 Procedimentos definidos por meios diferentes do Fortran (12.5.3)............................................433
C.9.3 Interfaces de Procedimentos (12.3).............................................................................................434
C.9.4 Interfaces Abstratas (12.3) e Componentes Ponteiro de Procedimento (4.5)..............................434
C.9.5 Argumentos Associados e Avaliao (12.4.1.2)...........................................................................436
C.9.6 Ponteiros e Alvos como Argumentos (12.4.1.2)..........................................................................437
C.9.7 Associao de Argumentos Polimrficos (12.4.1.3)....................................................................438
C.10 Notas da Seo 15.............................................................................................................................439
C.10.1 Ambiente de Execuo .............................................................................................................439
C.10.2 Exemplos de Interoperao entre Fortran e Funes C.............................................................439
C.10.2.1 Exemplos de Fortran chamando C....................................................................................439
C.10.2.2 Exemplos de C chamando Fortran....................................................................................440
C.10.2.3 Exemplos de chamada de Funes C com dados no Interoperveis...............................441
C.10.2.4 Exemplos de Comunicao Opaca entre C e Fortran.......................................................442
C.11 Notas da Seo 16.............................................................................................................................443
C.11.1 Exemplos de Associao de Hospedagem (16.4.1.3)................................................................443
C.11.2 Regras assegurando no Ambiguidades Genricas (16.2.3)......................................................444
C.12 Notas Caractersticas de Matrizes.....................................................................................................448
C.12.1 Sumrios de Caractersticas.......................................................................................................448
C.12.1.1 Expresses de Matriz Inteira e Atribuies (7.4.1.2, 7.4.1.3)............................................448
C.12.1.2 Sees de Matriz (2.4.5, 6.2.2.3).......................................................................................449
C.12.1.3 Instruo WHERE (7.4.3)..................................................................................................449
C.12.1.4 Matrizes Automticas e Variveis Alocveis (5.1, 5.1.2.5.3)............................................449
C.12.1.5 Construes de Matriz (4.7)...............................................................................................450
C.12.2 Exemplos...................................................................................................................................450
C.12.2.1 Clculos de Matriz Incondicional......................................................................................450
C.12.2.2 Clculos de Matriz Condicional.........................................................................................451
C.12.2.3 Um programa Simples: O modelo Ising............................................................................451
C.12.2.3.1 Problemas para serem Resolvidos .............................................................................452
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 17
C.12.2.3.2 Solues em Fortran...................................................................................................452
C.12.2.3.3 Uma Sub-rotina Fortran Completa.............................................................................453
C.12.2.3.4 Reduo de Armazenamento......................................................................................454
C.12.3 FORmula TRANslation e Processando Matriz..........................................................................454
C.12.3.1 A Soma dos Produtos.........................................................................................................454
C.12.3.2 O produto das Somas.........................................................................................................455
C.12.3.3 Adio de Elementos Selecionados...................................................................................455
C.12.4 Soma dos Resduos ao Quadrados.............................................................................................455
C.12.5 Norma de Vetores: Norma infinita e Norma um........................................................................455
C.12.6 Normas de Matrizes: Norma infinita e Norma um....................................................................455
C.12.7 Filas Lgicas .............................................................................................................................456
C.12.8 Clculos em Paralelo.................................................................................................................456
C.12.9 Exemplos de Clculos elemento a elemento.............................................................................457
C.12.10 Manipulao de Bit e Procedimentos Inquisitrios.................................................................457
Anexo D (Informativo)............................................................................................................................458
D.1 Extrato de Todas as Regras de Sintaxe................................................................................................458
Anexo E (Informativo).............................................................................................................................503
Smbolos....................................................................................................................................................503
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 18
Algumas Informaes
Originalmente no intencionava fazer uma traduo do rascunho final do padro Fortran 2003, mas aps iniciar a
traduo livre de algumas partes, o material foi se acumulando e por fim terminou na traduo do texto completo.
A principal motivao para gerar um texto traduzido do rascunho do padro Fortran 2003 foi disponibilizar material
que facilitasse, aos nossos alunos, a leitura do texto original.
Para fins prticos o Final Draft (rascunho final que estou usando) do padro igual ao padro Fortran
2003, mas com a vantagem de estar disponvel, sem custo, na Internet.
importante destacar que o texto do rascunho final contm algumas poucas inconsistncias que no
inviabiliza o seu uso (obviamente, estas poucas inconsistncias foram corrigidas na publicao do padro).
Em vrios locais desta traduo livre, voc encontrar parte do texto original junto com a traduo. Isto intenciona
facilitar a busca e leitura no texto original. A traduo de um padro sempre complicada e difcil porque
(principalmente porque no sou tradutor) no processo de traduo algo pode se perder ou deformar. Por este motivo,
sempre faa uso do texto original.
O rascunho do Fortran 2003 pode ser obtido em: http://std.dkuug.dk/jtc1/sc22/open/n3661.pdf
(acessado em 20 de dezembro de 2010)
Este texto uma traduo livre, portanto no pode ser considerado uma traduo oficial nem completamente fiel
ao original, alm disto ele contm acrscimos e comentrios. Este texto no e nem pode ser considerado uma
traduo oficial ou mesmo uma substituio ao texto original. Leia o original.
Ler um padro no uma tarefa das mais agradvel, mas o padro tem que ser lido. Use esta traduo livre para
facilitar a leitura do texto original (principal motivo da existncia deste texto).
O padro Fortran 2003 uma reviso do padro Fortran 95 (uma melhora significativa no padro 95).
A partir deste padro o Fortran passa, oficialmente, a suportar o paradigma da Orientao a Objeto.
O padro Fortran 2008 uma reviso do padro Fortran 2003 (uma pequena melhora no padro 2003).
Na prtica, o padro 2008 pode ser considerado o padro 2003 melhorado.
Padro FORTRAN 77 ISO/IEC 1539-1978
Padro Fortran 90 ISO/IEC 1539-1991
Padro Fortran 95 ISO/IEC 1539-1:1997 15 de dezembro de 1997
Padro Fortran 2003 ISO/IEC 1539-1:2004 18 de novembro de 2004
Padro Fortran 2008 ISO/IEC 1539-1:2010 06 de outubro de 2010
Principais mudanas do Fortran 95 para o Fortran 2003:
http://fortranwiki.org/fortran/show/Fortran+2003
acessado em 06/01/2011
Tipos derivados parametrizados
Parametrized derived types
Programao Orientada a objeto
Object-oriented programming: type extension and
inheritance, polymorphism,
dynamic type allocation, and type-bound procedures
Ponteiro de procedimento
Procedure pointers
Interoperabilidade com o C
C interoperability
Integrao com o Sistema Operacional
OS integration: command-line arguments and
environment variables
Aritmtica IEEE
IEEE arithmetic
Alocao melhorada
Allocatable enhancements
As principais mudanas no Fortran 2008 foram:
http://fortranwiki.org/fortran/show/Fortran+2008
acessado em 06/01/2011
submodules
coarrays
do concurrent construct
contiguous attribute
block construct
exit statement
error stop statement
internal procedures can be passed as actual
arguments
procedure pointers can point to an internal
procedure
maximum rank increased to 15
newunit= in open statement
g0 edit descriptor
unlimited format item
mais as mudanas nos procedimentos intrnsecos
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 19
Para ler o padro de forma mais fcil e compreensvel necessrio levar em conta os termos tcnicos que so
utilizados no padro. Por isto importante ler e consultar regularmente o anexo A (informativo) Glossrio de
Termos Tcnicos.
No deixe de levar em considerao que: o padro no um texto didtico, por isto os assuntos esto
juntos por caractersticas, desconsiderando qualquer forma de abordagem facilitada para quem inicia o aprendizado
da linguagem. Mesmo assim muito importante ler o padro (mesmo para quem esta iniciando).
Ao ler um assunto que no entendeu ou se deparar com um termo que no compreendeu claramente, no pare a
leitura, ao contrrio, leia mais. Leia, ou releia, o significado do termo tcnico (anexo A) e tambm outros pargrafos
que esto ligados ao termo ou assunto. A leitura do padro no tem que comear, necessariamente, pela seo
um e o mais importante, ela tem que envolver (conforme necessidade de cada leitor) a leitura de textos colocados
em locais diferentes no padro. Lembre-se, um texto referencial, um padro, no um texto didtico.
$$$$$$$$$$$$$$
FAZER escrever neste ponto sobre conjunto de caractersticas antigas (dos padres antigos)
mantidas neste padro, o que leva a uma mistura de tudo no padro, por isto os comentrios que acrescentei
Orientao a Objeto: O principal objetivo da anlise e projeto orientados a objetos o de identificar o
melhor conjunto de objetos para descrever um sistema de software. A partir da, o funcionamento deste
sistema (descrito pelo conjunto de objetos criado) feito pelo relacionamento (principalmente pela troca de
mensagens) entre os objetos utilizados para lidar com o problema (a tarefa desejada). Por este motivo, na
programao orientada a objeto (OOP Object-Oriented Programming), objetos so os elementos constituintes
essenciais. O Fortran 2003, permite a definio e utilizao de objetos, mas no utiliza a palavra-chave
classe da mesma forma que as outras linguagens (classe o mecanismo usado pelas outras linguagem para definir e
criar objetos). O Fortran 2003, define e cria objetos utilizando o que chama de tipo derivado, portanto o tipo
derivado faz o mesmo que a classe faz nas outras linguagens de programao orientada a objeto. Por
este motivo, necessrio ter muita ateno quando se utiliza a palavra-chave CLASS no Fortran, pois seu
significado identificar um objeto extensvel (um objeto polimrfico, isto , um objeto que muda de tipo durante a
execuo do programa), no uma classe como nas outras linguagem de programao orientada a objeto (esta e
outras diferenas, na terminologia, podem criar confuso, muita confuso, se houver desateno ou descuido na utilizao da
linguagem quando usada com o paradigma da orientao a objeto).
Os requerimentos mnimos para que uma linguagem de programao seja orientada a objeto so:
Encapsulamento
Encapsulation capacidade de colocar atributos e mtodos juntos num objeto
Agregao
Aggregation capacidade de guardar um objeto dentro de outro objeto
Herana
Inheritance capacidade de uma objeto (de uma classe) depender de outro objeto (ou de outros objetos de
outra classe) para alguns de seus atributos e/ou mtodos
(aqui classe sendo usado no sentido tradicional das outras linguagem orientada a objeto)
Polimorfismo
Polymorphism capacidade de escrever uma funo (mtodo) que funciona de modos diferentes
O Fortran 2003 suporta todos estes requerimentos, sendo portanto uma linguagem orientada a objeto.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 20
Prefcio
Foreword
A ISO (the International Organization for Standardization) e a IEC (the International Electrotechnical Commission)
formam um sistema especializado para padronizao de alcance mundial. Os integrantes Nacionais da ISO ou da
IEC participam do desenvolvimento do Padro Internacional por meio de comits tcnicos estabelecidos pelas
respectivas organizaes para lidar com os campos especficos das atividades tcnicas. Os comits tcnicos ISO e
IEC colaboram em campos de interesse mtuos. Outras organizaes internacionais, governamentais e no
governamentais, em acordo com a ISO e IEC tambm tomam parte no trabalho.
No campo da tecnologia da informao (information technology) a ISO e a IEC estabeleceram um comit
tcnico integrado (joint technical committee) denominado ISO/IEC JTC 1. Rascunhos do Padro Internacional (Draft
International Standards) adotado pelo comit tcnico integrado so circulados pelo integrantes internacionais para
votao. A publicao de um Padro Internacional requer aprovao, por votao, de pelo menos 75% dos
integrantes nacionais.
A International Standard ISO/IEC 1539-1 foi preparada pelo comit tcnico integrado ISO/IEC/JTC1,
Information technology, Subcommittee SC22, Programming languages, their environments and system software
interfaces.
Esta quarta edio cancela e troca a terceira edio (ISO/IEC 1539-1:1997), que foi tecnicamente revisada.
A ISO/IEC 1539 consiste das seguintes partes, sob o ttulo geral de Information technology - Programming
languages Fortran:
- Part 1: Base language
- Part 2: Varying length character strings
- Part 3: Conditional Compilation
Os anexos desta parte da ISO/IEC 1539 so para informao somente.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 21
Introduo
Padro da Linguagem de Programao Fortran
Introduction
Standard programming language Fortran
Esta parte do padro internacional inclu a especificao da base da linguagem Fortran, informalmente
conhecido como Fortran 2003. Respeitado as limitaes listadas em 1.6.2, a sintaxe e a semntica do Fortran 95
esto inteiramente contida no Fortran 2003. Portanto, qualquer programa conforme com o padro ( standard-
conforming) Fortran 95 no afetado por estas limitaes um programa conforme com o padro Fortran 2003.
Novas caractersticas do Fortran 2003 podem ser incorporadas de forma compatvel nos programas Fortran 95, com
as excees indicadas no texto desta parte do padro.
O Fortran 2003 contm vrias extenses do Fortran 95; entre elas pode-se citar:
1. Melhoramentos no tipo derivado: parametrizao dos tipos derivados [permitindo que o subtipo, o
comprimento ou a forma (kind, length or shape) dos componentes do tipo derivado sejam escolhidos quando
o tipo derivado usado], utilizar acessibilidade de componentes diversos (mixed component accessibility)
(permitindo componentes diferentes terem acessibilidade diferentes), entidades pblicas com tipo particular
(private type), construtor de estrutura melhorado e finalizadores
2. Suporte a programao orientada a objeto: abstrao de dados ampliada (permitindo a extenso da
definio de tipo para outro tipo), polimorfismo (permitindo o tipo da varivel mudar durante o tempo de
execuo), alocao dinmica de tipo, construo SELECT TYPE (permitindo a escolha do fluxo de
execuo dependendo somente do tipo que o objeto polimrfico tem) e procedimentos ligado ao tipo (type-
bound procedures)
3. A construo ASSOCIATE (permite uma expresso complexa ou objeto ser denotado [identificado-
representado] por um smbolo simples).
4. Melhoramento na manipulao de dados: componentes alocveis, parmetros de tipo postergados
(deferred type parameters), atributo VOLATILE, especificao de tipo explcito em um construtor de matriz,
especificao INTENT para argumentos ponteiros, especificao de limites inferiores de atribuio de
ponteiros e remapeamento do numero de dimenses (rank) de ponteiro, expresses de inicializao
estendida, intrnsecos MAX e MIN para tipo caractere e constantes complexas melhoradas
5. Melhoramentos na entrada/sada: operaes de transferncia assncrona (permitindo um programa
continuar o processamento enquanto a transferncia de entrada/sada de dados ocorrem), acesso em fluxo
(stream access) (permitindo acesso a um arquivo sem referncia a qualquer tipo de estrutura do registro),
operaes de transferncia especificada pelo usurio para tipos derivado, controle de arredondamento
especificado pelo usurio durante a converso de formato, instruo FLUSH, constantes com nome para
unidades pr-conectadas, palavras-chaves de entrada/sada regularizadas e aceso a mensagens de erro de
entrada/sada
6. Ponteiros de procedimento (procedure pointers)
7. Melhoramentos de escopo: habilidade de renomear operadores definidos (suporta maior abstrao de
dados) e controle de associao por hospedagem nos corpos das interfaces
8. Suporte para as excees IEC 60559 (IEEE 754) e aritmticas (para estender a aritmtica do processador
para suportar o padro IEC)
9. Interoperabilidade com a linguagem de programao C (permitindo acesso portvel a vrias bibliotecas e
facilidade de baixo nvel provida pelo C e permitindo o uso das bibliotecas Fortran por programas escritos
em C)
10. Suporte para uso internacional: (ISO 10646) e escolha de ponto ou vrgula no formato de entrada/sada
numrico
11. Integrao melhorada com o sistema operacional hospedeiro: acesso a argumentos da linha de
comando, variveis de ambiente e mensagens de erro do processo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 22
Organizao desta parte da ISO/IEC 1539
Organization of this part of ISO/IEC 1539
Esta parte da ISO/IEC 1539 est organizada em 16 sees, lidando com 8 reas conceituais. Estas 8 reas e
as sees nas quais elas so tratadas so:
High/low level concepts Sections 1, 2, 3
Data concepts Sections 4, 5, 6
Computations Sections 7, 13, 14
Execution control Sections 8
Input/output Section 9, 10
Program units Sections 11, 12
Interoperability with C Section 15
Scoping and association rules Section 16
O padro tambm contm o seguinte material no normativo:
Glossary A
Decremental features B
Extended notes C
Syntax rules D
Index E
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 23
Information technology Programming languages - Fortran
Part 1: Base Language
1. Viso Geral
Section 1: Overview
1.1 Escopo
1.1 Scope
ISO/IEC 1539 um Padro Internacional multiparte; as partes so publicadas separadamente. Esta
publicao, ISO/IEC 1539-1, que a primeira parte, especifica e estabelece interpretaes de programas escritos na
linguagem de programao Fortran. O propsito desta parte da ISO/IEC 1539 o de promover portabilidade
(portability ), confiabilidade (reliability), manutenibilidade (maintainability) e execuo eficiente (efficient execution) de
programas Fortran para uso em uma variedade de sistemas de computao. A segunda parte, ISO/IEC 1539-2,
define as facilidades (facilidades regras mecanismos formas facilities) para a manipulao de cadeias de
caracteres (character strings) com comprimento varivel. A terceira parte, ISO/IEC 1539-3, define regras para a
compilao condicional padro do Fortran. Um processador conforme com a parte 1 no precisa ser conforme com
a ISO/IEC 1539-2 ou ISO/IEC 1539-3, entretanto, conformidade com uma ou outra assume conformidade com a
primeira. Neste texto, o termo este padro (this standard) refere-se a ISO/IEC 1539-1.
1.2 Processador
1.2 Processor
A combinao do sistema de computao (computing system) e o mecanismo pelo qual os programas so
transformados para uso neste sistema de computao chamado de processador (processor).
1.3 Incluses
1.3 Inclusions
Este padro especifica:
1. as formas que um programa escrito na linguagem de programao Fortran pode assumir
2. as regras para interpretao do significado de um programa e seus dados
3. a forma do dado de entrada para ser processado por um programa Fortran
4. a forma do dado de sada como resultado do uso do programa Fortran
1.4 Excluses
1.4 Exclusions
Este padro no especifica:
1. o mecanismo pelo qual programas so transformados para uso nos sistemas de computao
2. as operaes necessrias para configura e controlar o uso dos programas nestes sistemas de computao
3. o mtodo de transcrio do programa ou sua entrada ou sada de dados para ou vindo de um meio de
armazenamento
4. o comportamento do programa e do processador quando este padro falha em estabelecer uma
interpretao exceto para a deteco feita pelo processador e requerimentos listados nos itens (2) ao (8) de
1.5
5. o tamanho e complexidade de um programa e seus dados que excedem a capacidade de qualquer sistema de
computao particular ou a capacidade de um processador particular
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 24
6. as propriedades fsicas da representao de quantidades e o mtodo de arredondamento, aproximao ou
valores numricos calculados em um processador em particular
7. as propriedades fsicas de registros de entrada/sada, arquivos e unidades
8. as propriedades fsicas e implementao de armazenamento
1.5 Conformidade
1.5 Conformance
Um programa (2.2.1) um programa conforme com o padro (standard-conforming program) se ele
somente utiliza as formas e relaes descritas neste padro e se o programa tem uma interpretao concordante com
este padro. Uma unidade de programa (2.2) conforme com este padro se ela pode ser includa em um programa
de forma tal que permita ao programa ficar conforme com o padro.
Um processador conforme com este padro se:
1. executa qualquer programa conforme com o padro de uma maneira que satisfaz as interpretaes do
padro, sujeitas a qualquer limitao que o processador possa impor no tamanho e complexidade do
programa
2. possua a capacidade de detectar e reportar o uso dentro de uma unidade de programa de formas indicadas
como obsoletas, na medida que este uso pode ser detectado pela referncia s regras numeradas de sintaxe
e restries
3. contm a capacidade de detectar e reportar o uso dentro de unidades de programa de uma forma adicional
ou relao que no permitida pelas regras de sintaxes numeradas e restries, incluindo as caractersticas
removidas descritas no Anexo B
4. contm a capacidade de detectar e reportar o uso dentro de unidades de programa de um valor de parmetro
de tipo subtipo (kind type parameter) no suportado pelo processador (4.4)
5. contm a capacidade de detectar e reportar o uso dentro de unidades de programa de formas ou caracteres
no permitidos pela seo 3
6. contm a capacidade de detectar e reportar o uso dentro de unidades de programa do uso de nome no
consistente com as regras de escopo para nomes, rtulos, operadores e smbolos de atribuio da seo 16
7. contm a capacidade de detectar e reportar o uso dentro de unidades de programa de procedimentos cujos
nomes no so definidos na seo 13
8. contm a capacidade de detectar e reportar a razo para rejeitar a submisso de um programa
Entretanto, em um formato especificado que no uma instruo FORMAT (10.1.1), um processador no
precisa detectar o uso de caractersticas removidas ou obsoletas nem o uso de formas adicionais ou relaes.
Um processador conforme com o padro pode permitir forma adicionais e relacionamentos garantido que
estas adies no conflitem com as formas e relacionamentos do padro. Entretanto, um processador conforme com
o padro pode permitir procedimentos intrnsecos adicionais mesmo que eles causem conflitos com o nome de um
procedimento conforme com o padro. Se este tipo de conflito ocorrer e envolver o nome de um procedimento
externo, permitido ao processador o uso do procedimento intrnseco a menos que o nome tenha o atributo
EXTERNAL (5.1.2.6) na unidade de escopo (16). Um programa conforme com o padro no usa procedimentos
intrnsecos no padro ou mdulos que tenham sido adicionados pelo processador.
Porque um programa conforme com o padro pode colocar demandas sobre o processador que no esto no
escopo deste padro ou pode incluir itens padres que no so portteis, tal como procedimentos externos definidos
por meios diferentes do Fortran, conformidade com este padro no garante que o programa ir executar
consistentemente em todos e quaisquer processadores conforme com o padro.
Em vrios casos, este padro permite previso para uso de facilidades que no esto completamente
especifica neste padro. Estas facilidades so identificadas como dependente do processador (processor
dependent). Elas tem que ser providas, com mtodos e semntica determinadas pelo processador.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 25
Nota 1
O processador deve ser acompanhado por documentao que especifica os limites impostos no tamanho e
complexidade de um programa e de meios para reportar quando estes limites so excedidos, define as formas
adicionais e relacionamentos que ele permite e define os significados das mensagens que reportam o uso de forma
adicionais e relacionamentos e o uso de formas removidas e obsoletas. Neste contexto, o uso de uma forma
removida o uso de uma forma adicional.
O processador tem que ser acompanhado pela documentao que especifica os mtodos e semnticas das
facilidade dependente do processador
1.6 Compatibilidade
1.6 Compatibility
Cada padro, desde o ISO 1539:1980 (informalmente referido como FORTRAN 77), define mais
procedimentos intrnsecos que a verso anterior. Portanto, um programa Fortran conforme com um padro anterior
pode ter uma interpretao diferente quando usado com o padro mais recente se ele invoca procedimento externo
tendo o mesmo nome que o nome de um procedimento intrnseco padro do novo padro, a menos que o
procedimento seja especificado com o atributo EXTERNAL.
1.6.1 Compatibilidade Fortran 95
1.6.1 Fortran 95 compatibility
Exceto como identificado nesta seo, este padro uma extenso compatvel (um incremento) com o
padro anterior Fortran International Standard, ISO/IEC 1539-1:1997 (Fortran 95). Qualquer programa
conforme com o padro Fortran 95 permanece conforme com o padro Fortran 2003. As seguintes caractersticas
do Fortran 95 podem ter interpretao diferente neste padro:
1. padres anteriores do Fortran tm o conceito de impresso, significando que a coluna um de uma sada
formatada tem significado especial para um conjunto de unidades lgicas (possivelmente vazia) que
dependente do processador. Isto no pode ser nem detectado nem especificado por um mecanismo padro.
A interpretao da primeira coluna no especificado neste padro
2. este padro especifica um formato de sada diferente para os valores reais zeros em uma lista dirigida ( list-
directed) e sada lista de nomes (namelist output)
3. se o processador pode distinguir entre um zero real positivo e negativo, este padro requer retorno de
valores diferentes para ATAN2(Y,X) quando X < 0 e Y for o real zero e para LOG(X) e SQRT(X) quando
X complexo com REAL(X) < 0 e parte imaginria zero negativo.
1.6.2 Compatibilidade com o Fortran 90
1.6.2 Fortran 90 compatibility
Exceto para as caractersticas removidas anotadas no anexo B.1 e exceto como definido nesta seo, este
padro uma extenso melhorada da ISO/IEC 1539:1991 (Fortran 90). Qualquer programa conforme com o
padro Fortran 90 que no use qualquer caracterstica removida, permanece conforme com o padro Fortran 2003.
O especificador PAD= na instruo INQUIRE neste padro retorna o valor UNDEFINED se no h
conexo ou a conexo para uma entrada/sada no formatada. O Fortran 90 especifica YES.
O Fortran 90 especifica que se o segundo argumento de MOD ou MODULO for zero, o resultado
dependente do processador (processor dependent). Este padro especifica que o segundo argumento no pode ser
zero.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 26
1.6.3 Compatibilidade FORTRAN 77
1.6.3 FORTRAN 77 compatibility
Exceto para as caractersticas removidas anotadas no anexo B.1 e exceto como definido nesta seo, este
padro uma extenso melhorada da ISO 1539:1980 (Fortran 77). Qualquer programa conforme com o padro
FORTRAN 77 que no use caractersticas removidas anotadas no anexo B.1 e que no dependa das diferenas
especificadas aqui permanece conforme com este padro. Este padro restringe o comportamento de algumas
caractersticas que so dependente do processador (processor dependent) no FORTRAN 77. Portanto, um programa
conforme com o padro FORTAN 77 que use uma destas caractersticas dependente do processador pode ter
interpretao diferente, sob este padro, mesmo que permanea um programa conforme com o padro. As seguintes
caractersticas do FORTRAN 77 podem ter interpretao diferente neste padro:
1. o FORTRAN 77 permite que um processador fornea mais preciso derivada para a constante real do que a
representada no datum real (datum um valor) quando a constante usada para inicializar um objeto de
dado do tipo real de preciso dupla em uma instruo DATA. Este padro no permite ao processador esta
opo
2. se uma varivel com nome (varivel identificada por um nome) (named variable) que no est num bloco
comum (common block) foi inicializada em uma instruo DATA e no possu o atributo SAVE especificado,
o FORTRAN 77 deixa o atributo SAVE dependente do processador. Este padro especifica (5.2.5) que esta
varivel com nome tem o atributo SAVE
3. o FORTRAN 77 especifica que o nmero de caracteres requerido pela lista de entrada tem que ser menor
que ou igual ao nmero de caracteres no registro durante entrada formatada. Este padro especifica
(9.5.3.4.2) que o registro de entrada logicamente preenchido com brancos se no h caracteres suficientes
no registro, a menos que o especificador PAD= com o valor NO seja especificado em uma instruo
apropriada OPEN ou READ
4. Um valor de 0 (zero) para um item da lista em uma instruo de sada formatada ser formatada em uma
forma diferente para alguns descritores de edio G. Em adio, este padro especifica como o
arredondamento de valores ir afetar a forma do campo de sada, mas o FORTRAN 77 no trata deste
assunto. Portanto, alguns processadores FORTRAN 77 podem produzir formas diferentes para a forma de
sada produzida pelo processador Fortran 2003 para certas combinaes de valores e descritores de formato
G
5. se o processador pode distinguir entre um zero real positivo e negativo, o comportamento da funo
intrnseca SIGN quando o segundo argumento um zero real negativo mudado por este padro
1.7 Notao Usada neste Padro
1.7 Notation used in this standard
Neste padro, shall para ser interpretado como um requerimento enquanto shall not interpretado
como uma proibio. Exceto quando definido de outra forma, estas requisies e proibies aplicam-se a
programas em vez de processadores.
must uma expresso de tem que com sentido obrigatrio uma imposio
shall exprime um deve uma solicitao, no uma imposio.
Must no deixa margem para outra ao, shall solicita, indica que voc deve fazer ou seguir
O texto em ingls usa shall (por educao, para ser menos agressivo), mas expressa um tem que
obrigatrio
Esta distino, destacada claramente neste item. Acredito que isto se deva ao fato do grupo de
trabalho ser internacional e em certas lnguas o uso de must seria complicado ou ofensivo, enquanto
shall no cria este tipo de problema. Entretanto, observe que este item deixa claro que uma regra a ser
seguida, no uma sugesto para seguir a regra
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 27
1.7.1 Notas Informativas
1.7.1 Informative notes
Notas informativas com explicaes, fundamentos, exemplos e outros materiais so intercalados com o
corpo normativo desta publicao. O material informativo no normativo; ele identificado em um quadro com
bordas que possu um cabealho contendo Nota
1.7.2 Regras de Sintaxes
1.7.2 Syntax rules
As regas de sintaxe descrevem as formas que os totens lxicos Fortran (Fortran lexical tokens), instrues
(statements) e construes (constructs) podem tomar. Estas regras so expressas em uma variao da forma Backus-
Naur form (BNF), na qual:
A notao Backus-Naur BNF
uma maneira matemtica formal utilizada para descrever uma linguagem. Ela foi desenvolvida por
John Backus (e possivelmente por Peter Naur tambm) para descrever a sintaxe da linguagem de
programao Algol 60.
Esta notao usada para definir formalmente a gramtica de uma linguagem de forma que no
haver desacordo ou ambiguidades quanto ao que permitido e o que no permitido.
1. caracteres obtidos no conjunto de caracteres Fortran (3.1) so interpretados literalmente como mostrado,
exceto onde for indicado que no deva ser assim
2. letras minsculas em itlico (em courier new, negrito e tamanho menor) e palavras (geralmente hifenizadas e
abreviadas) representam classes sintticas genricas para as quais entidades sinttica particular devem ser
substituda em uma instruo real
(observao: a caracterstica de usar itlico nesta traduo livre no foi respeitada; este texto usa
courier new em negrito e com um tamanho de fonte menor)
Abreviaes comuns usadas nos termos sintticos so:
arg para argument (argumento )
decl para declaration (declarao )
desc para descriptor (descritor )
int para integer (inteiro )
spec para specifier (especificador )
attr para attribute (atributo )
def para definition (definio )
expr para expression (expresso )
op para operator (operador )
stmt para statement (instruo )
3. os metasmbolos usados so:
is introduz uma definio sinttica de classe
or ou introduz uma classe sinttica alternativa
[ ] envolve um item opcional
[ ] ... envolve um item repetido opcional, que pode ocorre zero ou mais vezes
continua uma regra de sintaxe
4. cada regra de sintaxe dada um nico nmero na forma Rsnn, onde s um nico dgito ou ento dois
dgitos que identifica a seo e nn so dois dgitos indicando a posio dentro da sequncia.
As regras de sintaxe so distribudas de forma apropriada ao longo do texto e so referenciadas por
nmeros quando necessrio. Algumas regras nas sees 2 e 3 so descritas de forma mais abrangente em
sees posteriores quando necessrio. Neste caso, o nmero de seo s o nmero da ltima seo onde a
regra repetida
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 28
5. as regras de sintaxe no so completas e no descrevem acuradamente a sintaxe do Fortran e no podem ser
utilizadas para gerar automaticamente um programa Fortran (cannot be used to automatically generate a Fortran
parser); onde a regra de sintaxe incompleta ela restritas pela correspondentes restries e texto
Nota 1.2
Um exemplo do uso das regras de sintaxe :
digit-string is digit [digit] ...
O que segue so exemplos de formas para uma cadeia de dgitos permitido pela regra acima
digit
digit digit
digit digit digit digit
digit digit digit digit digit digit digit digit
Se entidades particulares so substitudas para digit, cadeias de dgitos reais podem ser:
4
67
1999
10243852
1.7.3 Restries
1.7.3 Constraints
Cada restrio (constrain) dado uma identificao numrica nica sob a forma Csnn, onde s indica o
nmero da seo (um ou dois dgitos) e nn uma sequncia de dois dgitos dentro da seo.
Frequentemente a restrio associada com uma regra de sintaxe particular. Quando este for o caso, a
restrio anotada com o nmero da regra de sintaxe entre parnteses. Uma restrio que associada com uma
regra de sintaxe constitui parte da definio do termo. Ela se aplica em todos os locais onde o termo aparece.
Algumas restries no so associadas com uma regra de sintaxe particular. O efeito destas restries
similar as restries descritas no texto, exceto que se requer que o processador tenha a capacidade de detectar e
reportar violao da restrio. Em alguns casos, um requerimento geral definido no texto e um subconjunto do
requerimento listado na restrio. Isto indica que para um programa conforme com o padro requerido aderir ao
conjunto de requerimentos, mas que um processador conforme com o padro requerido somente a capacidade de
diagnosticar violaes das restries.
1.7.4 Regras de Sintaxe Assumidas
1.7.4 Assumed syntax rules
Para minimizar o nmero de regras de sintaxe adicionais e ainda levar em conta as informaes sobre as
restries apropriadas, as seguintes regras so assumidas; uma regar de sintaxe explcita para um termo sobrescreve
a regar assumida. A letra xyz significa uma frase de uma classe sinttica legal:
R101 xyz-list is xyz [,xyz] ...
R102 xyz-names is name
R103 scalar-xyz is xyz
C101 (R103) scalar-xyz tem que se escalar
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 29
1.7.5 Convenes de Sintaxe e Caractersticas
1.7.5 Syntax conventions and characteristics
1. qualquer nome de classe sinttica terminando em -stmt seguem as seguintes regras: tem que ser
delimitada por um fim-de-linha (end-of-line) ou ponto e virgula (semicolon) e pode ser rotulada a
menos que seja parte de outra instruo (tal como IF ou WHERE). Por outro lado, tudo que for
considerado ser uma instruo de cdigos fonte (source form statement) contm um final -stmt
nas regras de sintaxe
2. as regras de ordenamento das declaraes so descritas, rigorosamente, na definio de unidade de
programa (R202). Expresses hierrquicas so descritas rigorosamente na definio de expr
(R722)
3. o sufixo -spec usado consistentemente para especificadores, tais como especificadores de
instruo de entrada/sada. Ele tambm usado para especificao de atributo de declarao de tipo
(por exemplo, array-spec em R510) e em alguns outros poucos casos
4. onde referncia feita a um parmetro de tipo, incluindo os parnteses que o envolve, o sufixo
-selector utilizado. Veja, por exemplo, kind-selector (R404) e length-selector
(R425)
5. o termo subscrito (subscript) (por exemplo, R618, R619 e R620) usado consistentemente em
definies de matrizes
1.7.6 Convenes no Texto
1.7.6 Text conventions
Em um texto descritivo, uma palavra equivalente em ingls (palavra equivalente em portugus, nesta traduo
livre) frequentemente usada no lugar do termo sinttico. Instrues particulares e atributos so identificados no
texto por uma palavra-chave em letra maiscula, exemplo, instruo END. Palavras em negrito so usadas no texto
onde elas so definidas pela primeira vez com um significado especial. A descrio de caractersticas obsoletas
aparecem em um tamanho de letra menor.
Nota 1.3
Esta sentena um exemplo de tamanho de letra usada para caraterstica obsoleta
OBSERVAO: no padro, a descrio do texto marcada como obsoleto aparece com um tamanho de letra
menor, em nosso texto a caracterstica obsoleta ser tambm colorida com esta cor.
1.8 Caractersticas Removidas e Obsoletas
1.8 Deleted and obsolescent features
Este padro protege o investimento do usurio nos softwares existentes pela incluso de todos menos cinco
elementos do Fortran 90 que no so dependente do processador. Este padro identifica duas categorias de
caractersticas fora de uso (que no mais devem ser usadas) (outmoded features). H cinco delas na primeira categoria,
caractersticas removidas (deleted features), que consiste de caractersticas consideradas como redundantes no
FORTRAN 77 e pouco usadas no Fortran 90. Aquelas colocadas na segunda categoria, caractersticas obsoletas
(obsolescent features), so consideradas redundantes no Fortran 90 e Fortran 95, mas ainda so frequentemente
utilizadas.
1.8.1 Natureza das Caractersticas Removidas
1.8.1 Nature of deleted features
1. mtodos melhores existem, do que aqueles existentes no FORTRAN 77
2. estas caractersticas no so includas no Fortran 95 ou esta reviso do Fortran
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 30
1.8.2 Natureza das Caractersticas Obsoletas
1.8.2 Nature of obsolescent features
1. melhores mtodos existem, no Fortran 90 e no Fortran 95.
2. recomendado que programadores usem estes mtodos melhores em seus programas mais recentes e
convertam os cdigos existentes para estes novos mtodos
3. estas caractersticas no texto deste documento so distinguveis pelo tamanho da letra usada (1.7.6) (e por
esta cor em nossa traduo livre)
4. se o uso destas caractersticas se tornar menos importante, os comits responsveis pelo padro Fortran
(novo padro) podero considerar remov-las
5. o prximo comit do padro Fortran dever considerar para remoo somente aquelas caractersticas da
linguagem que aparecem na lista de caractersticas obsoletas
6. processadores que suporta a linguagem de programao Fortran devem suportar estas caractersticas pelo
tempo que eles continuem a ser usados largamente nos programas Fortran
1.9 Referncias Normativas
1.9 Normative references
Os padres que seguem contm informaes que, usadas como referncias neste padro, constituem
suporte para este padro. No tempo da publicao, as edies indicadas so vlidas. Todos os padres so sujeitos a
revises e parte do acordo usado neste padro o de encorajar a investigao de se aplicar as edies mais recentes
das edies indicadas a seguir. Membros do IEC e ISO mantm registros dos padres internacionais vlidos.
ISO/IEC 646:1991, Information technologyISO 7-bit coded character set for information interchange.
ISO/IEC 646:1991 (International Reference Version) o equivalente internacional do ANSI X3.4-1986,
comumente conhecido como ASCII.
ISO 8601:1988, Data elements and interchange formatsInformation interchange - Representation of dates and
times.
ISO/IEC 9899:1999, Information technologyProgramming languages-C.
Este padro refere-se a ISO/IEC 9899:1999 como o padro C.
ISO/IEC 10646-1:2000, Information technologyUniversal multiple-octet coded character set (UCS)- Part 1:
Architecture and basic multilingual plane.
IEC 60559 (1989-01), Binary floating-point arithmetic for microprocessor systems.
Porque o IEC 60559 (1989-01) foi originalmente o IEEE 754-1985, Standard for binary floating-point arithmetic e
amplamente conhecido por este nome, este padro refere-se a ele como padro IEEE.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 31
2. Termos e Conceitos usado pelo Fortran
Section 2: Fortran terms and concepts
2.1 Sintaxe de Alto Nvel
2.1 High level syntax
Esta seo introduz os termos associados com as unidades de programa e outros conceitos Fortran sobre
construo (construct), instruo (statement) e nveis de expresses (expression levels) e ilustra seus relacionamentos.
A notao utilizada neste padro descrita em 1.7.
Nota 2.1
Restries e outras informaes relacionadas com as regras que no iniciam com R2 aparecem na seo
apropriada
R201 program is program-unit
[program-unit]...
Um programa tem que conter exatamente uma unidade de programa programa principal ou um programa principal
definido por outros meios que no o Fortran, mas no ambos
R202 program-unit is main-program
or external-subprogram
or module
or block-data
R1101 main-program is [program-stmt]
[specification-part]
[execution-part]
[internal-subprogram-part]
end-program-stmt
R203 external-subprogram is function-subprogram
or subroutine-subprogram
R1223 function-subprogram is function-stmt
[specification-part]
[execution-part]
[internal-subprogram-part]
end-function-stmt
R1231 subroutine-subprogram is subroutine-stmt
[specification-part]
[execution-part]
[internal-subprogram-part]
end-subroutine-stmt
R1104 module is module-stmt
[specification-part]
[module-subprogram-part]
end-module-stmt
R1116 block-data is block-data-stmt
[specification-part]
end-block-data-stmt
R204 specification-part is [use-stmt]...
[import-stmt]...
[implicit-part]
[declaration-constructor]...
R205 implicit-part is [implicit-part-stmt]...
implicit-stmt
R206 implicit-part-stmt is implicit-stmt]
or parameter-stmt
or format-stmt
or entry-stmt
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 32
R207 declaration-constructor is derived-type-def
or entry-stmt
or enum-def
or format-stmt
or interface-block
or parameter-stmt
or procedure-declaration-stmt
or specification-stmt
or type-declaration-stmt
or stmt-function-stmt
R208 execution-part is executable-constructor
[executable-part-constructor]...
R209 execution-part-constructor is executable-constructor
or format-stmt
or entry-stmt
or data-stmt
R210 internal-subprogram-part is contains-stmt
internal-subprogram
[internal-subprogram]...
R211 internal-subprogram-part is function-subprogram
or subroutine-subprogram
R1107 module-subprogram-part is contains-stmt
module-subprogram
[module-subprogram]...
R1108 module-subprogram is function-subprogram
or subroutine-subprogram
R212 specification-stmt is access-stmt
or allocatable-stmt
or asynchronous-stmt
or bind-stmt
or common-stmt
or data-stmt
or dimension-stmt
or equivalence-stmt
or external-stmt
or intent-stmt
or intrinsic-stmt
or namelist-stmt
or optional-stmt
or pointer-stmt
or protected-stmt
or save-stmt
or target-stmt
or volatile-stmt
or value-stmt
R213 executable-construct is action-stmt
or associate-construct
or case-construct
or do-construct
or forall-construct
or if-construct
or select-type-construct
or where-construct
R214 action-stmt is allocate-stmt
or assignment-stmt
or backspace-stmt
or call-stmt
or close-stmt
or continue-stmt
or cycle-stmt
or deallocate-stmt
or endfile-stmt
or end-function-stmt
or end-program-stmt
or end-subroutine-stmt
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 33
or exit-stmt
or flush-stmt
or forall-stmt
or goto-stmt
or if-stmt
or inquire-stmt
or nullify-stmt
or open-stmt
or pointer-assignment-stmt
or print-stmt
or read-stmt
or return-stmt
or rewind-stmt
or stop-stmt
or wait-stmt
or where-stmt
or write-stmt
or arithmetic-if-stmt
or computed-goto-stmt
C201 (R208) Uma execution-part no pode conter uma end-function-stmt, end-program-stmt
ou end-subroutine-stmt
2.2 Conceitos de Unidade de Programa
2.2 Program unit concepts
Unidades de programa so os componentes fundamentais de um programa Fortran. Uma unidade de
programa (program unit) pode ser um programa principal (main program), um subprograma externo (external
subprogram), um mdulo (module) ou uma unidade de programa dados em bloco (block data program unit). Um
subprograma pode ser um subprograma funo (function subprogram) ou um subprograma sub-rotina (subroutine
subprogram). Um mdulo (module) contm definies que so feitas acessveis a outras unidade de programas. Uma
unidade de programa dados em bloco usada para especificar valores iniciais para objetos de dados colocados em
blocos comuns com nome (named common blocks). Cada tipo de unidade de programa descrita na seo 11 e 12.
Um subprograma externo (external subprogram) um subprograma que no est num programa principal, num
mdulo ou num outro subprograma. Um subprograma interno (internal subprogram) um subprograma que est
dentro de um programa principal ou dentro de outro subprograma. Um subprograma mdulo (module
subprogram) um subprograma que est dentro de um mdulo, mas no um subprograma interno.
Uma unidade de programa consiste de um conjunto de unidades de escopo no sobrepostas. Uma unidade
de escopo (scoping unit)
1. uma unidade de programa ou subprograma, excluindo qualquer unidade de escopo dentro dele
2. uma definio de tipo derivado (4.5.1),
3. um corpo de interface, excluindo qualquer unidade de escopo dentro dele
Uma unidade de escopo que imediatamente envolve outra unidade de escopo chamada de unidade de
escopo hospedeira (host scoping unit) (frequentemente abreviado por hospedeiro host).
2.2.1 Programa
2.2.1 Program
Um programa (program) consiste de exatamente um programa principal, qualquer nmero (incluindo zero)
de outros tipos de unidades de programas e qualquer nmero (incluindo zero) de procedimentos externos e outras
entidades definidas por outros meios que no o Fortran.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 34
Nota 2.2
Existe uma restrio que no poder haver mais de uma unidade de programa dados em bloco sem nome ( unnamed
block data program unit) (11.3).
Este padro no define nenhuma ordem para as unidades de programa que constituem um programa, mas porque
as partes pblicas de um mdulo tem que estar disponveis quando a referncia do mdulo (11.2.1) for processada,
um processador pode requerer uma ordem particular das unidades de programa
2.2.2 Programa Principal
2.2.2 Main program
Um programa principal (main program) descrito em 11.1.
2.2.3 Procedimento
2.2.3 Procedure
Um procedimento (procedure) encapsula uma sequncia de aes que podem ser invocadas diretamente
durante a execuo de um programa. Procedimentos so funes ou sub-rotinas. Uma funo (function) um
procedimento que invocada (invoked) em uma expresso; sua invocao faz com que um valor seja calculado e
este valor ento usado no clculo da expresso. A varivel que retorna o valor de uma funo chamada de
varivel resultado (result variable). Uma sub-rotina (subroutine) um procedimento que invocado com a
instruo CALL, por uma instruo de atribuio ou por alguma operao realizada sobre entidade tipo derivado. A
menos que ele seja um procedimento puro (pure procedure), uma sub-rotina pode ser usada para alterar o estado do
programa pela modificao de valores de quaisquer dos objetos de dados acessveis sub-rotina; a menos que seja
um procedimento puro, uma funo pode fazer isto em adio ao clculo do valor da funo.
Procedimentos so descritos em mais detalhes na seo 12.
2.2.3.1 Procedimento Externo
2.2.3.1 External procedure
Um procedimento externo (external procedure) um procedimento que definido por um subprograma
externo ou por outros meios que no o Fortran. Um procedimento externo pode ser invocado por um programa
principal ou por qualquer outro procedimento em um programa.
2.2.3.2 Procedimento Mdulo
2.2.3.2 Module procedure
Um procedimento mdulo (module procedure) um procedimento que definido por um subprograma
mdulo (R1108). O mdulo contendo o subprograma a unidade de escopo hospedeira (host) do procedimento
mdulo.
2.2.3.3 Procedimento Interno
2.2.3.3 Internal procedure
Um procedimento interno (internal procedure) um procedimento que definido por um subprograma
interno (R211). O programa principal ou subprograma que contm o subprograma interno a unidade de escopo
hospedeira do procedimento interno. Um procedimento interno local ao seu hospedeiro (host) no sentido que o
procedimento interno acessvel dentro da unidade de escopo hospedeira e todas os outros procedimentos internos
mas, no acessvel em outros locais.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 35
2.2.3.4 Bloco de Interface
2.2.3.4 Interface block
Um corpo de interface (interface body) descreve uma interface abstrata (abstract interface) ou uma interface
de um procedimento mudo (interface of a dummy procedure), procedimento externo (external procedure), ponteiro de
procedimento (procedure pointer) ou procedimento ligado ao tipo (type-bound procedure).
Um bloco de interface (interface block) um bloco de interface especfico (specific interface block), um
bloco de interface abstrato (abstract interface block) ou um bloco de interface genrico (generic interface block). Um
bloco de interfaces uma coleo de corpos de interfaces. Um bloco de interface genrico tambm pode ser usado
para especificar que procedimentos podem ser invocados por
um nome genrico
um operador definido
uma atribuio definida
uma entrada/sada tipo derivado
2.2.4 Mdulo
2.2.4 Module
Um mdulo (module) contm (ou acessa em outros mdulos) definies que podem ser feitas acessveis a
outras unidades de programa. Estas definies incluem declaraes de objetos de dados (data object declarations),
definies de tipo, definies de procedimentos e blocos de interface. A unidade de escopo em outra unidade de
programa pode acessar as definies no mdulo.
2.3 Conceitos de Execuo
2.3 Execution concepts
Cada instruo Fortran classificada como sendo uma instruo executvel ou uma instruo no
executvel. Existem restries na ordem em que elas podem aparecer dentro de uma unidade de programa e nem
todas as instrues executveis podem aparecer em todos os contextos.
2.3.1 Instrues Executveis e No Executveis
2.3.1 Executable/nonexecutable statements
Execuo de um programa uma sequncia, no tempo, de aes. Uma instruo executvel (executable
statement ) uma instruo para realizar ou controlar uma ou mais destas aes. Ento, as instrues executveis
de uma unidade de programa determina o comportamento de uma unidade de programa. As instrues executveis
so todas aquelas que constituem a classe sinttica das construes executveis (executable-construct).
Instrues no executveis (nonexecutable statements) no especificam aes; elas so usadas para
configurar o ambiente do programa (program environment) no qual as aes sero realizadas. As instrues no
executveis so todas aquelas que no esto classificadas como executveis.
2.3.2 Ordem das Instrues
2.3.2 Statement order
As regras de sintaxes da subclusula 2.1 especifica a ordem das instrues dentro das unidades de
programa e subprogramas. Estas regras so destacadas na tabela 2.1 e tabela 2.2. A tabela 2.1 mostra as regras para
instrues e aplica-se a todos as unidades de programa, subprogramas e corpos de interface. As linhas verticais
delimitam variedades de instrues que podem ser interceptadas e linhas horizontais delimitam variedades de
instrues que no podem ser interceptadas. Subprogramas internos e subprogramas mdulo tem que ser colocados
depois da instruo CONTAINS. Entre as instrues USE e CONSTAINS em um subprograma, instrues no
executveis geralmente precedem instrues executveis, apesar da instruo ENTRY, instruo FORMAT e a
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 36
instruo DATA poderem aparecer entre as instrues executveis. A tabela 2.2 mostra quais instrues so permitidas
em uma unidade de escopo.
Tabela 2.1- Requerimentos na ordem das Declaraes
Tabela 2.2- Instrues permitidas em cada unidade de escopo
2.3.3 A Instruo END
2.3.3 The END statement
Uma end-program-stmt, end-function-stmt, end-subroutine-stmt, end-module-stmt ou end-block-
data-stmt uma instruo END. Cada unidade de programa, subprograma mdulo e subprograma interno tem
que ter exatamente uma instruo END. As instrues end-program-stmt, end-function-stmt e end-
subroutine-stmt so instrues executveis e podem ser alvo de um desvio (ramificao desvio branch target
statements) (8.2). A execuo da instruo end-program-stmt termina normalmente a execuo do programa.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 37
Execuo da instruo end-function-stmt e end-subroutine-stmt equivalente a execuo da instruo return
(return-stmt) sem uma scalar-int-expr.
As instrues end-module-stmt e end-block-data-stmt so no executveis.
2.3.4 Sequncia de Execuo
2.3.4 Execution sequence
Se um programa contm um programa principal escrito em Fortran, a execuo do programa inicia com a
primeira construo executvel do programa principal. A execuo de um programa principal ou subprograma
envolve execuo de construes executveis dentro da unidade de escopo. Quando um procedimento invocado, a
execuo inicia com a primeira construo executvel que aparece depois do ponto de entrada da invocao. Com
as seguintes excees, o efeito da execuo como se as construes executveis fossem executadas na ordem em
que aparecem no programa principal ou unidade subprograma at que uma instruo STOP, RETURN ou END
executada. As excees so as seguintes:
1. execuo de uma instruo de desvio (branching statement) (8.2) muda a sequncia de execuo. Estas
instrues especificam explicitamente um novo local de incio para a sequncia de execuo
2. construes CASE, construes DO, construes IF e construes SELECT TYPE contm uma estrutura
de instrues interna e a execuo destas construes envolvem controle internos implcitos de desvio
(implicit internal branching). Veja seo 8 para detalhes sobre a semntica de cada uma destes construtores
3. os especificadores END=, ERR= e EOR= podem resultar em desvio (branch)
4. Retornos alternativos podem resultar em desvios
Subprogramas internos podem preceder a instruo END de um programa principal ou um subprograma. A
sequncia de execuo exclui todas estas definies (isto , tudo que for colocado depois da instruo CONTAINS no
fazem parte da sequncia de execuo).
Trmino normal da execuo de um programa ocorre quando uma instruo STOP ou uma end-program-
stmt executada. A terminao normal de execuo de um programa tambm pode ocorrer durante a execuo de
um procedimento definido por um processador associado (companion processor) (padro C 5.1.2.2.3 e 7.20.4.3). Se
um trmino normal ocorre dentro de um unidade de programa Fortran e o programa contm procedimentos
definidos por um processador associado, o processo de termino da execuo tem que incluir o efeito da execuo
da funo exit() (padro C 7.20.4.3).
2.4 Conceitos de Dados
2.4 Data concepts
Instrues no executveis (nonexecutable statements) so usadas para especificar as caractersticas do
ambiente de dado (data environment). Isto inclu declarao de variveis, declarao de matrizes e definio de
novos tipos.
2.4.1 Tipo
2.4.1 Type
Um tipo (type) uma categoria de dado que caracterizado por um conjunto de valores, uma sintaxe para
representar estes valores e um conjunto de operaes que interpretam e manipulam os valores. Este conceito central
descrito em 4.1.
Um tipo pode ser parametrizado (separados em categorias ou subtipos), neste caso o conjunto de valores de
dados (data values), a sintaxe que os representa e o conjunto de operaes depende dos valores de um ou mais
parmetros. Este tipo de parmetro chamado de parmetro de tipo (type parameter) (4.2).
Existem dois tipos de dados: tipo intrnseco e tipo derivado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 38
2.4.1.1 Tipo Intrnseco
2.4.1.1 Intrinsic type
Um tipo intrnseco (intrinsic type) um tipo que definido pela linguagem, junto com as operaes e
sempre acessvel. Os tipos intrnsecos so: inteiro (integer), real (real), complexo (complex), caractere (character) e
lgico (logical). As propriedades de um tipo intrnseco so descritas em 4.4. Os parmetros do tipo intrnseco
(intrinsic type parameters) so KIND e LEN.
LEN a abreviao de length comprimento
KIND esta mais difcil de traduzir, por ser usado como um termo tcnico
Na maioria das vezes se utiliza a expresso inglesa mesmo. Mas se for para traduzir, talvez, a
melhor traduo seja subtipo
Kind significa espcie, classe ou grupo tendo caractersticas comuns, gnero, variedade
Tem-se um grupo dentro do tipo, portanto um subtipo
Neste texto usa-se indistintamente o termo ingls KIND e a palavra subtipo
O parmetro de tipo subtipo (kind type parameter) indica o intervalo do expoente decimal para o tipo
inteiro (4.4.1), a preciso decimal e o intervalo do expoente para o tipo real e complexo (4.4.2, 4.4.3) e os mtodos
de representao para os tipos caractere e lgico (4.4.4., 4.4.5). O parmetro de comprimento caractere
(character length parameter) especifica o nmero de caracteres para o tipo caractere.
2.4.1.2 Tipo Derivado
2.4.1.2 Derived type
Um tipo derivado (derived type) um tipo que no definido pela linguagem, mas requer uma definio
de tipo para declarar seus componentes. Um objeto escalar do tipo derivado chamado de estrutura (structure)
(5.1.1.1). Tipos derivados podem ser parametrizados. Atribuio de estruturas definida intrinsecamente (7.4.1.3),
mas no h operaes intrnsecas para a estruturas. Para cada tipo derivado, um construtor de estrutura est
disponvel para prover valores (4.5.9). Adicionalmente, objetos de dados do tipo derivado podem ser utilizados
como argumentos de procedimentos e resultado de funo e podem aparecer em listas de entrada/sada. Se
operaes adicionais forem necessrias para o tipo derivado, elas tem que ser supridas por procedimentos
definidos.
Tipos derivados so descritos mais em 4.5.
2.4.2 Valor de Dado
2.4.2 Data value
Cada tipo intrnseco tem associado a ele um conjunto de valores que formam um datum (um valor) que este
tipo de dado pode assumir, dependendo dos valores dos parmetros de tipo. Os valores para cada tipo intrnseco so
descritos em 4.4. Os valores que os objetos do tipo derivado podem assumir so determinados pela definio de
tipo, valores do parmetro de tipo e o conjuntos de valores de seus componentes.
2.4.3 Entidade de Dado
2.4.3 Data entity
Uma entidade de dado (data entity) um objeto de dado, o resultado de uma avaliao de uma expresso
ou o resultado da execuo de uma referncia a uma funo (chamada de resultado da funo). Uma entidade de dado
tem um tipo e parmetros de tipo; ela pode ter um valor (data value uma exceo uma varivel indefinida). Cada
entidade de dado tem um rank (nmero de dimenses) e portanto um escalar ou uma matriz.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 39
2.4.3.1 Objeto de Dado
2.4.3.1 Data object
Um objeto de dado (data object) (frequentemente abreviado por objeto) uma constante (4.1.2), uma
varivel (6) ou um subobjeto de uma constante. O tipo e parmetros de tipo de um objeto de dado com nome
(named data object) pode ser especificado explicitamente (5.1) ou implicitamente (5.3).
Subobjetos (Subobjects) so pores de certos objetos que podem ser referenciados e definidos (somente
variveis) independentemente de outras pores. Isto incluem pores de matrizes (elementos de matriz e sees de
matriz), pedaos de cadeias de caracteres (portions of character strings substrings), pores de objetos complexos
(parte real e imaginria) e pores de estruturas (componentes). Subobjetos so em si mesmo objetos de dados,
mas subobjetos so referenciados somente por designadores de objeto ou funes intrnsecas. Um subobjeto de uma
varivel uma varivel. Subobjetos so descritos na seo 6.
Objetos referenciados por um nome so:
escalar com nome (named scalar um objeto escalar)
matriz com nome (named array um objeto matricial)
Subobjetos referenciados por um designador de objeto so:
elemento de matriz (array element um subobjeto escalar)
seo de matriz (array section um subobjeto matricial)
componente de estrutura (structure component um escalar ou um subobjeto matricial)
substring (subcadeia um subobjeto escalar)
Subobjetos de objetos complexos tambm podem ser referenciados por funes intrnsecas.
2.4.3.1.1 Varivel
2.4.3.1.1 Variable
Uma varivel (variable) pode ter um valor e pode ser definida e redefinida durante a execuo de um
programa.
Uma varivel local com nome (named local variable) de uma unidade de um programa mdulo, de um
programa principal ou subprograma uma varivel com nome que uma entidade local unidade de escopo, no
um argumento mudo, no um COMMON (comum), no tem o atributo BIND (atributo ligado), no acessvel por
meio de associao de uso ou associao de hospedagem. Um subobjeto de uma varivel local com nome tambm
uma varivel local.
2.4.3.1.2 Constante
2.4.3.1.2 Constant
Uma constante (constant) tem um valor e no pode ser definida ou indefinida durante a execuo de um
programa. Uma constante identificada por um nome chamada de constante com nome (named constante) e tem o
atributo PARAMETER (5.1.2.10). Uma constante sem nome chamada de constante literal (literal constant) (4.4).
2.4.3.1.3 Subobjeto de uma Constante
2.4.3.1.3 Subobject of a constant
Um subobjeto de uma constante (subobject of a constant) uma poro da constante. A poro
referenciada pode depender do valor de uma varivel.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 40
Nota 2.3
Por exemplo, dado:
CHARACTER(LEN = 10), PARAMETER :: DIGITS = 0123456789
CHARACTER(LEN = 1) :: DIGIT
INTEGER :: I
...
DIGIT = DIGITS(I:I)
DIGITS uma constante com nome e DIGITS(I:I) designa um subobjeto da constante DIGITS
2.4.3.2 Expresso
2.4.3.2 Expression
Uma expresso (expression) (7.1) produz uma entidade de dado quando avaliada. Uma expresso
representa uma referncia a um dado ou a um clculo; ela formada por operandos, operadores e parnteses. O
tipo, parmetros de tipo, valor e rank (nmero de dimenses) so determinados pelas regras da seo 7.
2.4.3.3 Referncia de Funo
2.4.3.3 Function reference
Uma referncia de funo (function reference) (12.4.2) produz uma entidade de dado quando a funo
executada durante a avaliao de uma expresso. O tipo, parmetros de tipo e rank (nmero de dimenses) do
resultado da funo determinado pela interface da funo (12.2.2). O valor do resultado da funo determinado
pela execuo da funo.
2.4.4 Escalar
2.4.4 Scalar
Um escalar (scalar) um datum (um valor) que no uma matriz. Escalares podem ser de qualquer tipo
intrnseco ou tipo derivado.
Nota 2.4
Uma estrutura um escalar mesmo que tenha componentes matriciais
O rank (nmero de dimenses) zero. A forma (shape) de um escalar representado por uma matriz
unidimensional (rank-one array) de tamanho zero.
2.4.5 Matriz
2.4.5 Array
Uma matriz (array) um conjunto de dados escalares, todos do mesmo tipo e parmetros de tipo, cujos
elementos individuais so colocados em um arranjo retangular (retangular pattern). Um elemento de matriz (array
element) um dos elementos individuais da matriz e um escalar. Uma seo de matriz (array section) um
subconjunto dos elementos de uma matriz e tambm uma matriz.
Uma matriz pode ter at sete dimenses e qualquer extenso (extent) (nmero de elementos) em qualquer
dimenso. O rank de uma matriz o seu nmero de dimenses; o tamanho (size) da matriz o nmero total de
elementos na matriz, que igual ao produto de suas extenses. Uma matriz pode ter tamanho zero. A forma
(shape) de uma matriz determinado pelo rank e pela extenso em cada dimenso e pode ser representada por uma
matriz unidimensional cujos elementos so as extenses. Todos as matrizes com nome (named arrays) tem que ser
declarada e o rank (nmero de dimenses) da matriz especificado na sua declarao. O rank de uma matriz com
nome (named array), uma vez declarada, constante; as extenses de um matriz podem ser constantes ou podem
variar durante a execuo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 41
Duas matrizes so conforme (conformable) se elas tm a mesma forma. Um escalar conforme com uma
matriz. Qualquer operao intrnseca definida para um objeto escalar pode ser aplicada a objetos conformes. Tais
operaes so realizadas elemento a elemento para produzir um resultado matricial conforme com o operando
matricial. Operao elemento a elemento significa que os elementos correspondentes da matriz operando esto
envolvidos em uma operao escalar para produzir um elemento correspondente na matriz resultado e todos as
operaes nos elementos podem ser realizadas em qualquer ordem ou simultaneamente. Este tipo de operao
chamada de elementar (elemental).
Uma matriz unidimensional (rank-one array) pode se construda de escalares e outras matrizes e pode ser
reformatada (alterada quanto a sua forma reshaped) em qualquer forma permitida para a matriz (4.7).
Matrizes podem ser de qualquer tipo intrnseco ou tipo derivado e so descritos mais em 6.2.
2.4.6 Ponteiro
2.4.6 Pointer
Um ponteiro de dado (data pointer) uma entidade de dado que tem o atributo POINTER. Um ponteiro
de procedimento (procedure pointer) uma entidade procedimento que tem o atributo POINTER. Um ponteiro
(pointer) um ponteiro de dado ou um ponteiro de procedimento.
Um ponteiro associado (associated) com um alvo (target) por atribuio de ponteiro (pointer assignment)
(7.4.2). Um ponteiro de dado tambm pode ser associado com um alvo por alocao (allocation) (6.3.1). Um
ponteiro desassociado (disassociated dissociado ou desassociado) depois da execuo de uma instruo de
nulificao (NULLIFY), depois de uma atribuio de ponteiro com um ponteiro desassociado, por inicializao
default ou por inicializao explcita. Um ponteiro de dado tambm pode ser desassociado pela execuo de uma
instruo DEALLOCATE. Uma ponteiro desassociado no est associado com um alvo (16.4.2).
Um ponteiro que no est associado no pode ser referenciado ou definido.
Se um ponteiro de dados uma matriz, o rank (nmero de dimenses) declarado, mas as extenses so
determinadas quando o ponteiro associado com um alvo.
2.4.7 Armazenamento
2.4.7 Storage
Muitas das facilidades deste padro no faz afirmaes sobre as caractersticas do armazenamento fsico de
objetos de dados (physical storage characteristics of data objets). Entretanto, unidades de programa que inclu
caractersticas dependentes de associao de armazenamento tem que observar as restries descritas em 16.4.3.
storage ato de armazenar
depsito, local de armazenamento, memria
aqui temos a indicao de duas situaes diferentes que tem que ser separadas pelo contexto
OBSERVAO:
Associao de armazenamento descreve o relacionamento que existe entre variveis, bloco comum
e o resultado de funo. Programas Fortran modernos e eficientes (principalmente aqueles usados
em programao de alta performance) devem evitar o uso da instruo equivalncia (equivalence)
e o uso da instruo bloco comum (common block).
Restrinja o uso destas instrues para os casos em que elas sero realmente necessrias. A
maioria esmagadora dos programas escritos na atualidade no necessitam usar estas instrues.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 42
2.5 Termos Fundamentais
2.5 Fundamental terms
Os termos que seguem so definidos aqui e usados ao longo de todo o padro.
2.5.1 Nome e designador
2.5.1 Name and designator
Um nome (name) usado para identificar um constituinte de um programa, tal como uma unidade de
programa, uma varivel com nome (varivel identificada por um nome named variable), constante com nome,
argumento mudo ou tipo derivado. As regras que governam os nomes so dadas em 3.2.1. Um designador
(designator) um nome seguido por zero ou mais seletores de componentes, seletores de seo de matriz, seletor de
elemento de matriz e seletor de substring.
Um designador de objeto (object designator) um designador de um objeto de dado. Um designador de
procedimento (procedure designator) um designador de um procedimento.
Nota 2.5
Um objeto com nome um caso especial de um designador de objeto
2.5.2 Palavra-chave
2.5.2 Keyword
O termo palavra-chave (keyword) usado em dois sentidos:
1. usado para descrever uma palavra que parte da sintaxe de uma instruo. Estas palavras no so
reservadas, isto , nomes que tenham a mesma grafia so permitidos. Nas regras de sintaxe as palavras-
chaves aparecem literalmente. Na descrio do texto, elas so identificadas pelo termo palavra-chave
(keyword) sem nenhuma modificao. Exemplos de palavras-chaves so: IF, READ, UNIT, KIND e
INTEGER
2. ela usada para identificar nomes que identificam termos em uma lista. Numa lista de argumentos reais,
lista de parmetro de tipo e construtor de estrutura, itens podem ser identificados por keyword= em vez de
sua posio dentro da lista. Uma palavra-chave argumento (argument keyword) o nome de um
argumento mudo na interface para o procedimento que est sendo referenciado, uma palavra-chave
parmetro de tipo (type parameter keyword) o nome do parmetro de tipo no tipo que est sendo
especificado e uma palavra-chave componente (component keyword) o nome do componente em um
construtor de estrutura
R215 keyword is name
Nota 2.6
O uso de palavras-chaves (keywords) em vez da posio para identificar itens em uma lista torna a lista muito mais
clara e permite que a lista seja reordenada. Esta caracterstica facilita a especificao de uma lista nos casos onde
itens opcionais so omitidos
2.5.3 Associao
2.5.3 Association
Associao (association) associao de nome (name association) (16.4.1), associao de ponteiro (pointer
association) (16.4.2), associao de armazenamento (storage association) (16.4.3) ou associao de herana
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 43
(inheritance association) (16.4.4). Associao de nome associao de argumento (argument association), associao
de hospedagem (host association), associao de uso (use association), associao de ligao (linkage association) ou
associao de construo (construct association).
Associao de armazenamento (storage association) faz com que entidades diferentes usem a mesma posio
de armazenamento (memria). Qualquer associao permite uma entidade ser identificada por diferentes nomes na
mesma unidade de escopo ou pelo mesmo nome ou nomes diferentes em diferentes unidades de escopo.
2.5.4 Declarao
2.5.4 Declaration
O termo declarao (declaration) refere-se a especificao de atributo para as vrias entidades do
programa. Frequentemente isto envolve especificar o tipo de um objeto com nome ou especificar a forma de um
objetos matricial com nome
2.5.5 Definio
2.5.5 Definition
O termo definio (definition) usado de duas formas:
1. ele refere-se a especificao de tipo derivado e procedimento
2. quando se fornece um valor vlido um objeto, dito que o objeto foi definido (defined). Isto
frequentemente feito pela execuo de uma instruo de atribuio ou instruo de entrada. Quando uma
varivel no possu um valor previsvel, ela dita se tornar indefinida (undefined). Similarmente, quando
um ponteiro est associado com um alvo ou nulificado, este estado (status) de associao do ponteiro dito
se tornar definido (defined). Quando o estado de associao do ponteiro no previsvel, o estado de
associao do ponteiro dito indefinido (undefined)
2.5.6 Referncia
2.5.6 Reference
Uma referncia de objeto de dado (data object reference) a apario (utilizao) de um designador de
objeto de dado em um contexto que requer seu valor naquele ponto durante a execuo.
Uma referncia de procedimento (procedure reference) a apario de um designador de procedimento,
smbolo de operador ou smbolo de atribuio em um contexto requerendo a execuo do procedimento naquele
ponto. Uma ocorrncia de entrada/sada tipo derivado definida pelo usurio (user-defined derived-type input/output)
(10.6.5) ou finalizao tipo derivado (derived-type finalization) (4.5.5.1) tambm uma referncia de procedimento.
A apario de um designador de objeto de dado ou designador de procedimento em uma lista de
argumentos reais no constitu uma referncia para aquele objeto de dado ou procedimento a menos que esta
referncia seja necessria para completar a especificao de um argumento real.
Uma referncia de mdulo (module reference) a apario do nome do mdulo em uma instruo USE.
2.5.7 Intrnseco
2.5.7 Intrinsic
O adjetivo intrnseco (intrinsic) tem o seguinte significado:
1. o qualificador significa que o termo ao qual ele est sendo aplicado definido no padro. Intrnseco aplica-
se a tipos, procedimentos, mdulos, instruo de atribuio e operadores. Todos os tipos intrnsecos,
procedimentos, atribuies e operadores podem ser usados em qualquer unidade de escopo sem que seja
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 44
necessrio qualquer definio ou especificao adicional. Mdulo intrnseco pode ser acessado em
qualquer unidade de escopo por associao de uso. Procedimentos intrnsecos e mdulos definidos no
padro so chamados procedimentos intrnsecos padro e mdulos intrnsecos padro, respectivamente
2. o qualificador aplica-se aos procedimentos e mdulos que so fornecidos por um processador mas no so
definidos neste padro (13, 14, 15.1). Tais procedimentos e mdulos so chamados de procedimentos
intrnsecos no padro e mdulos intrnsecos no padro, respectivamente
2.5.8 Operador
2.5.8 Operator
Um operador (operator) especifica um clculo que envolve um (operadores unrios) ou dois (operadores
binrios) valores de dados (operandos). O padro especifica uma quantidade de operadores intrnsecos (exemplo:
operadores aritmticos: +, , *, / e ** com operando numricos e operadores lgicos .AND., .OR., etc. com
operando lgicos). Operadores adicionais podem ser definidos dentro de um programa (7.1.3).
2.5.9 Sequncia
2.5.9 Sequence
Uma sequncia (sequence) um conjunto ordenado com uma correspondncia um-a-um (one-to-one) com
os nmeros 1, 2, at n. O nmero de elementos em uma sequncia n. Uma sequncia pode ser vazia e neste caso
ela no contm elementos.
Os elementos de uma sequncia no vazia so referenciados como o primeiro elemento, segundo elemento,
etc.. O ensimo (nth) elemento, onde n o nmero de elementos na sequncia chamado de ltimo elemento. Uma
sequncia vazia no tem ltimo elemento.
2.5.10 Processadores Associados
2.5.10 Companion processors
Um processador (processor) tem um ou mais processadores associados (companion processor). Um
processador associado (companion processor) um mecanismo dependente do processador pelo qual dados
globais e procedimentos podem ser referenciados ou definidos. Um processador associado pode ser um mecanismo
que referencia e define estas entidades por um meio diferente do Fortran (12.5.3), que pode ser um processador
Fortran ele mesmo ou pode ser outro processador Fortran. Se existir mais de um processador associado, os meios
pelo qual o processador Fortran escolhe qual deles usar dependente do processador.
Se um procedimento definido por meio de um processador associado que no seja um processador
Fortran em si, o padro refere-se a ele como funo C que define o procedimento, apesar do procedimento no ser
necessariamente definido por meio da linguagem de programao C.
Nota 2.7
Um processador associado pode ou pode no ser um mecanismo que seja conforme os requerimentos do padro
internacional C.
Por exemplo, um processador pode permitir que um procedimento definido por outra linguagem que no o Fortran
ou C seja conectado (linked) (12.5.3) com um procedimento Fortran se ele pode ser descrito por uma prottipo C
como definido no item 6.5.5.3 do padro internacional C.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 45
3. Caracteres, Totens Lxicos e Forma dos Cdigos Fontes
Section 3: Characters, lexical tokens, and source form
Esta seo descreve o conjunto de caracteres do Fortran e vrios totens (tokens) lxicos tais como nomes e
operadores. Esta seo tambm descreve as regras para as formas que um programa Fortran pode ter.
3.1 Conjunto de Caracteres do Processador
3.1 Processor character set
O conjunto de caracteres do processador (processor character set) dependente do processador. A estrutura
de um conjunto de caracteres do processador :
1. caracteres de controle
2. caracteres grficos
letras (3.1.1) (letters)
dgitos (3.1.2) (digits)
sublinha (3.1.3) (underscore)
caracteres especiais (3.1.4) (special characters)
outros caracteres (3.1.5) (others characters)
As letras, dgitos, sublinha e os caracteres especiais formam o conjunto de caracteres do Fortran (Fortran
character set).
R301 character is alphanumeric-character
or sepecial-character
R302 alphanumeric-character is letter
or digit
or underscore
Exceto pelo smbolo de moeda (currency symbol), os smbolos grficos usados para os caracteres so os
dados em usado 3.1.1, 3.1.2, 3.1.3 e 3.1.4. Entretanto o estilo de qualquer smbolo grfico especificado.
O tipo caractere default suporta um conjunto de caracteres que inclu o conjunto de caracteres do Fortran.
Ao suportar tipos caractere no default, o processador pode suportar conjuntos adicionais de caracteres. Os
caracteres disponveis no conjunto de caracteres ASCII e ISO 10646 so especificados pela ISO/IEC 646:1991
(International Reference Version) e ISO/IEC 10646-1:2000 UCS-4, respectivamente; os caracteres disponveis em
outros tipos no default no so especificados pelo padro Fortran, exceto que um caractere em cada tipo caractere
no default tem que ser designado como um caractere branco para ser usado como um caractere de preenchimento.
3.1.1 Letras
3.1.1 Letters
As vinte e seis letras so:
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
O conjunto de letras definem a classe sinttica letras. O conjunto de caracteres do processador pode incluir
letras minsculas e letras maisculas. A letra minscula equivale a correspondente letra maiscula numa unidade de
programa exceto em um contexto caractere (3.3).
Contexto caractere
contexto caractere so os caracteres que esto sendo empregados (usados) dentro de
constante literal caractere e/ou
dentro de um string que define um descritor de edio
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 46
Nota 3.1
As instrues que seguem so equivalentes:
CALL BIG_COMPLEX_OPERATION(NDATE)
call big_complex_operation(ndate)
Call Big_Complex_Operation(NDate)
3.1.2 Dgitos
3.1.2 Digits
Os dez dgitos so:
0 1 2 3 4 5 6 7 8 9
Os dez dgitos definem a classe sinttica dgitos.
3.1.3 Sublinha
3.1.3 Underscore
R303 underscore is _
A sublinha (underscore) pode ser usada como um caractere significativo em um nome.
o caractere sublinha utilizado como caractere significativo em um nome. Ele permite tornar os nomes
mais legveis, por exemplo: numero_de_carros no lugar de numerodecarros
A sublinha no pode ser usado como primeiro caractere de um nome, entretanto pode ser o ltimo.
A sublinha tambm usada para separar o valor do parmetro de tipo do valor da constante literal
( exemplo: 3.1459_dp )
3.1.4 Caracteres Especiais
3.1.4 Special characters
Os caracteres especiais so mostrados na tabela 3.1
Caractere Nome do caractere Caractere Nome do caractere
branco
;
ponto e vrgula
=
igual
!
ponto de exclamao
+
mais
"
aspas
-
menos
%
porcento
*
asterisco
&
e-comercial (ampersand)
/
barra
~
til
\
Barra invertida
<
menor que
(
abre parnteses
>
Maior que
)
fecha parnteses
?
ponto de interrogao
[
abre colchetes
'
apstrofo
]
fecha colchetes
`
acento grave
{
abre chaves
^
acento circunflexo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 47
}
fecha chaves
|
barra vertical
,
vrgula
$
smbolo de moeda
.
ponto decimal ou ponto final
#
smbolo numrico
:
dois pontos
@
arroba
Tabela 3.1 Caracteres Especiais
Os caracteres especiais definem a classe sinttica caracteres especiais. Alguns dos caracteres especiais so
usados para smbolos de operadores, limitadores (bracketing) e vrias formas de separadores e outros totens lxicos
delimitadores.
3.1.5 Outros Caracteres
3.1.5 Other characters
Caracteres adicionais podem ser representados em um processador, mas s podem aparecer em comentrios
(3.3.1.1, 3.3.2.1), constantes caractere (4.4.4), registros de entrada/sada (9.1.1) e descritores de edio de cadeia de
caractere (character string edit descriptors) (10.2.1).
Na prtica, pode-se considerar que os caracteres e smbolos que o compilador Fortran 2003 utiliza so os contidos
na tabela ASCII. Isto, entretanto, est mudando. O unicode (no lugar do ASCII) j est em uso em muitos
compiladores e ser efetivamente utilizado como padro num futuro muito prximo.
TABELA ASCII
baseada na tabela existente em:
http://www.hobbyprojects.com/ascii-table/ascii-table.html (acessado em 27/07/2010)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 48
3.2 Sintaxe de Baixo Nvel
3.2 Low-level syntax
Sintaxe de baixo nvel (low-level syntax) descreve os totens lxicos fundamentais de uma unidade de
programa. Totens lxicos (Lexical tokens) so sequncias de caracteres que constitui os blocos construtores de um
programa. Eles so palavras-chaves, nomes, constantes literais outras que constantes literais complexa, operadores,
rtulos (labels), delimitadores, vrgula, =, =>, :, ::, ; e %.
3.2.1 Nomes
3.2.1 Names
Nomes (names) so utilizados por vrias entidades tais como variveis, unidades de programa, argumento
mudos, constantes com nome e tipos derivados.
R304 name is letter [alphanumeric-character]...
C301(R304) O comprimento mximo de um nome de 63 caracteres
Nota 3.2
Exemplos de nomes:
A1
NAME_LENGTH (sublinha simples)
S_P_R_E_A_D__O_U_T (duas sublinhas consecutivas)
TRAILER_ (sublinha posterior)
Nota 3.3
A palavra nome sempre denota esta forma particular de sintaxe. A palavra identificador usada onde
entidades podem ser identificadas por outra forma sinttica ou por valores; o significado particular depende do
contexto na qual usado.
3.2.2 Constantes
3.2.2 Constants
R305 constant is literal-constant
or named-constant
R306 literal-constant is int-literal-constant
or real-literal-constant
or complex-literal-constant
or logical-literal-constant
or char-literal-constant
or boz-literal-constant
R307 named-constant is name
R308 int-constant is constant
C302(R308)int-constant tem que ser do tipo inteiro
R309 char-constant is constant
C303 (R309) char-constant tem que ser do tipo caractere
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 49
3.2.3 Operadores
3.2.3 Operators
R310 intrinsic-operator is power-op
or mult-op
or add-op
or concat-op
or rel-op
or not-op
or and-op
or or-op
or equiv-op
R707 power-op is **
R708 mult-op is *
or /
R709 add-op is +
or -
R711 concat-op is //
R713 rel-op is .EQ.
or .NE.
or .LT.
or .LE.
or .GT.
or .GE.
or ==
or /=
or <
or <=
or >
or >=
R718 not-op is .NOT.
R719 and-op is .AND.
R720 or-op is .OR.
R721 equiv-op is .EQV.
or .NEQV.
R311 defined-operator is defined-unary-op
or defined-binary-op
or extend-intrinsic-op
R703 defined-unary-op is letter [letter]...
R723 defined-binary-op is letter [letter]...
R312 extended-intrinsic-op is intrinsic-oprator
3.2.4 Rtulo de Instruo
3.2.4 Statement labels
Um rtulo de instruo (statement label) prov um meio de referencia uma instruo individual.
R313 label is digit[digit[digit[digit[digit]]]]]
C304 (R313) Ao menos um dgito no rtulo no pode ser zero
Se uma instruo (statement) rotulada, a instruo tem que conter um caractere no branco. O mesmo
rtulo (label) de instruo no pode ser usado em mais de uma instruo na mesma unidade de escopo. Zeros
antecedentes so no significativos na distino entre rtulos de instrues.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 50
Nota 3.4
Por exemplo:
99999
10
010
so todos rtulos de instruo. Os dois ltimos so equivalentes.
Existem 99999 rtulos de instruo nicos e o processador pode aceitar qualquer um deles como um rtulo de
instruo. Entretanto, um processador pode ter um limite de implementao no nmero total de rtulos de
instruo nicas em uma unidade de programa.
Qualquer instruo pode ter um rtulo de instruo, mas os rtulos so usados da seguinte maneira
1. o rtulo em uma instruo alvo de desvio (branch target statement) (8.2) usado para identificar esta
instruo como um possvel destino do desvio (branch)
2. o rtulo de uma instruo FORMAT (10.1.1) usada para identificar a instruo que uma especificao
de formato para uma instruo de transferncia de dados (9.5)
O uso da instruo FORMAT deve ser evitado. Isto uma tcnica dos padres anteriores. Use
constante com nome para guardar as especificaes dos formatos desejadas
3. em algumas formas da construo DO (8.1.6), o bloco da construo DO identificada por um rtulo na
ltima instruo
O uso desta caracterstica tambm uma tcnica dos padres anteriores. Evite o uso desta
tcnica, no seu lugar utilize a instruo end do
3.2.5 Delimitadores
3.2.5 Delimiters
( ... )
/ ... /
[ ... ]
(/ ... /)
3.3 Formas dos Cdigos Fontes
3.3 Source form
Uma unidade de programa Fortran uma sequncia de uma ou mais linhas, organizadas como instrues
Fortran, comentrios e linhas INCLUDE. Uma linha (line) uma sequncia de zero ou mais caracteres. Linhas
escritas depois da instruo END de uma unidade de programa no so partes da unidade de programa. Uma
instruo Fortran uma sequncia de um ou mais linhas completas ou parciais.
Um contexto caractere (character context) significa caracteres dentro de uma constante literal caractere
(4.4.4) ou dentro de um descritor de edio cadeia de caractere (character string edit descriptor) (10.2.1).
Um comentrio pode conter qualquer caractere que pode ser utilizado em qualquer contexto caractere.
Existem dois formatos para os cdigos fontes (two source forms): livre e fixo (free and fixed). Formato livre e
formato fixo no podem ser usados simultaneamente numa mesma unidade de programa. O mecanismo para especificar a forma do cdigo
fonte de uma unidade de programa dependente do processador.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 51
3.3.1 Cdigo Fonte Formato Livre
3.3.1 Free source form
Com o cdigo fonte no formato livre (free source form) no existe restrio onde uma instruo (ou parte
da instruo) pode aparecer dentro da linha. Uma linha pode conter zero caracteres. Se uma linha consiste
inteiramente de caracteres de tipo default (4.4.4), ela pode ter at 132 caracteres. Se a linha contm qualquer
caractere que do tipo no default, o nmero mximo de caracteres permitido numa linha dependente do
processador.
O caractere branco no pode aparecer dentro de totens lxicos que no estejam em um contexto caractere
ou em uma especificao de formato. Brancos podem ser inseridos livremente entre totens para aumentar a
legibilidade; por exemplo, brancos podem ocorrer entre totens que formam uma constante literal complexa. Uma
sequncia de caracteres brancos fora de um contexto caracteres equivalente a um nico caractere branco.
Um branco pode se usado para separar nomes, constantes ou rtulos de palavras chaves adjacentes, nomes,
constantes e rtulos.
Nota 3.5
Por exemplo, o branco depois de REAL, READ, 30 e DO so requeridos no que segue:
REAL X
READ 10
30 DO K=1,3
Um ou mais brancos podem ser usados para separar palavras chaves adjacentes exceto nos seguintes casos,
onde brancos so opcionais:
Palavras chaves onde brancos separando totens so opcionais
BLOCK DATA DOUBLE PRECISION
ELSE IF ELSE WHERE
END ASSOCIATE END BLOCK DATA
END DO END ENUM
END FILE END FORALL
END FUNCTION END IF
END INTERFACE END MODULE
END PROGRAM END SELECT
END SUBROUTINE END TYPE
END WHERE GO TO
IN OUT SELECT CASE
SELECT TYPE
3.3.1.1 Comentrio Formato Livre
3.3.1.1 Free form commentary
O caractere ! inicia um comentrio (comment) exceto quando aparece dentro de um contexto caractere.
O comentrio estende-se at o fim da linha. Se o primeiro caractere no branco em uma linha um ! a linha
uma linha de comentrio. Linhas contendo somente brancos ou sem conter caracteres so tambm linhas de
comentrios. Comentrios podem aparecer em qualquer local em uma unidade de programa e pode preceder a
primeira instruo da unidade de programa ou pode seguir a ultima instruo de uma unidade de programa.
Comentrios no tem efeito na interpretao do programa.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 52
Nota 3.6
O padro no restringe o nmero de linhas de comentrios consecutivos
3.3.1.2 Instruo de Continuao no Formato Livre
3.3.1.2 Free form statement continuation
O caractere & usado para indicar que a instruo corrente continua na prxima linha que no uma
linha de comentrio. Linhas de comentrios no podem ser continuadas; um & em uma linha de comentrio no
tem efeito. Comentrios podem ocorre dentro de uma instruo continuada. Quando usada para continuao, o
& no parte da instruo. Nenhuma linha pode conter somente um & como nico caractere no branco ou
como o nico caractere no branco antes de um ! que inicia um comentrio.
Se um contexto no caractere deve ser continuado, um & tem que ser o ltimo caractere no branco na
linha ou o ltimo caractere no branco antes de um ! . Depois tem que haver uma linha que no um
comentrio; a instruo continuada nesta prxima linha. Se o primeiro caractere no branco nesta linha um &
a instruo continua na prxima posio seguindo o & , caso contrrio, ela continua com na primeira posio
caractere desta linha.
Se um totem lxico dividido (partido) pelo fim de linha, o primeiro caractere no branco na primeira linha
no comentrio que segue tem que ser um & imediatamente seguido pelo caractere sucessivo do totem dividido.
Se um contexto caractere for dividido, um & tem que ser o ltimo caractere no branco nesta linha e
no pode ser seguido por comentrio. Tem que existir uma linha que segue que no seja um comentrio; um &
tem que ser o primeiro caractere no branco nesta prxima linha e a instruo continua com o prximo caractere
que segue este & .
3.3.1.3 Terminador de Instruo no Formato Livre
3.3.1.3 Free form statement termination
Se uma instruo no continuada, um comentrio ou um fim de linha termina a instruo.
Uma instruo pode alternativamente ser terminada por um caractere ; que aparece fora de um contexto
caractere ou em um comentrio. Este ; no parte da instruo. Depois de um terminador ; (terminator), outra
instruo pode aparecer na mesma linha ou iniciar nesta linha e ser continuada. Um : no pode aparecer como
primeiro caractere no branco em uma linha. Uma sequncia consistindo somente de zero ou mais brancos e um ou
mais terminadores ; , em qualquer ordem, equivalente a um nico terminador ; .
3.3.1.4 Instruo no Formato Livre
3.3.1.4 Free form statements
Um rtulo pode preceder qualquer instruo que no faa parte de oura instruo.
Nota 3.7
Nenhuma instruo Fortran inicia com um dgito.
Uma instruo Fortran no pode ter mais de 255 linhas de continuao.
3.3.2 Formato Fixo
3.3.2 Fixed source form
Com o cdigo fonte no formato fixo (fixed source form) existem restries onde uma instruo pode aparecer dentro de uma
linha. Se a linha de cdigo fonte contm somente caracteres do tipo default, ela pode conter exatamente 72 caracteres, caso contrrio o
nmero mximo de caracteres dependente do processador (processor dependent).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 53
Exceto no contexto caractere, brancos so no significativos e podem ser livremente usados dentro do programa.
3.3.2.1 Comentrio no Formato Fixo
3.3.2.1 Fixed form commentary
O caractere ! inicia um comentrio exceto quando ele aparece dentro de um contexto caractere ou na posio 6 (coluna 6 de uma
linha). O comentrio se estende at o fim da linha. Se o primeiro caractere no branco em uma linha um ! em qualquer posio de
caractere diferente da posio 6, a linha uma linha de comentrio. Linhas iniciando com um C ou um * na posio caractere 1 e linhas
contendo somente brancos so tambm linhas de comentrio. Comentrios podem aparecer em qualquer local em uma unidade de programa e
podem preceder a primeira instruo de uma unidade de programa ou podem seguir a ltima instruo da unidade de programa. Comentrios
no tm efeitos sobre a interpretao da unidade de programa.
Nota 3.8
O padro no restringe o nmero de linhas de comentrios consecutivas
3.3.2.2 Instruo de Continuao no Formato Fixo
3.3.2.2 Fixed form statement continuation
Exceto dentro de comentrios, a posio caractere 6 usada para indicar continuao. Se a posio 6 contm um branco ou zero, a
linha uma linha inicial de uma nova instruo que inicia na posio caractere 7. Se a posio caractere 6 contm qualquer caractere
diferente de branco ou zero, posies caractere 7 a 72 da linha constituem a continuao da linha precedente no comentrio.
Nota 3.9
Um ! ou ; na posio caractere 6 interpretado como um indicador de continuao a menos que eles apaream dentro de comentrios
indicados por um C ou um * na posio caractere 1 ou por um ! na posio caractere 1-5
Linhas de comentrio no podem ser continuadas. Linhas de comentrios podem ocorrer dentro de instrues continuadas.
3.3.2.3 Terminador de Instruo no Formato Fixo
3.3.2.3 Fixed form statement termination
Se uma instruo no continuada, um comentrio ou o fim de uma linha termina a instruo.
Uma instruo pode alternativamente ser terminada por um caractere ; que aparece fora de um contexto caractere, em um
comentrio ou na posio caractere 6. O ; no parte da instruo. Depois de um terminador ; outra instruo pode iniciar na mesma
linha ou iniciar nesta linha e ser continuada. Um ; no pode aparecer como primeiro caractere no branco na linha, exceto na posio
caractere 6. Uma sequncia consistindo somente de zero ou mais brancos e um ou mais terminadores ; em, qualquer ordem, equivalente a
um nico terminador.
3.3.2.4 Instrues no Formato Fixo
3.3.2.4 Fixed form statements
Um rtulo, se presente, tem que ocorrer nas posies caractere 1 at 5 da primeira linha de uma instruo, caso contrrio, as
posies 1 a 5 tem que conter brancos. Brancos podem aparecer em qualquer lugar dentro de rtulos. Uma instruo seguida por um ; na
mesma linha no pode ter um rtulo. Posies caractere 1 at 5 de quaisquer linhas de continuao tem que ser branco. Uma instruo no
pode ter mais de 255 linhas de continuao. A instruo END de uma unidade de programa no pode ser continuada. Uma instruo cuja
linha inicial aparece como instruo END de uma unidade de programa no pode ser continuada.
3.4 Incluindo Cdigo Fonte
3.4 Including source text
Texto adicional pode ser incorporado em um cdigo fonte de uma unidade de programa durante o
processamento. Isto realizado pela linha INCLUDE (INCLUDE line), que tem a forma:
INCLUDE char-literal-constant
O char-literal-constant no pode ter um valor de parmetro de tipo subtipo (kind type parameter) que
seja uma constante com nome.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 54
Uma linha INCLUDE no uma instruo Fortran.
Uma linha INCLUDE deve aparecer em uma nica linha onde uma instruo pode aparecer; ela tem que
ser o nico texto no branco nesta linha, diferente de um comentrio opcional que segue uma instruo. Portanto,
um rtulo no permitido.
O efeito de uma linha INCLUDE como se o texto referenciado trocasse fisicamente a linha INCLUDE
antes do programa ser processado. O texto includo pode conter, linhas INCLUDE adicionais; neste caso as linhas
INCLUDE so similarmente trocadas pelo texto especificado. O nmero mximo de profundidade de
encadeamento em qualquer linhas INCLUDE encadeadas dependente do processador (processor dependent). A
incluso do texto referenciado por uma linha INCLUDE no pode, em qualquer nvel de encadeamento, resultar na
incluso de uma texto j includo.
Quando uma linha INCLUDE includa, a primeira instruo includa no pode se uma linha de
continuao e a ltima linha includa no pode ser uma linha que esteja sendo continuada.
A interpretao do char-literal-constant dependente do processador (processor dependent). Um
exemplo de uma interpretao possivelmente vlida que char-literal-constant o nome do arquivo que
contm os cdigos fontes que sero includos.
Nota 3.10
Em algumas circunstncias, por exemplo, onde cdigo fonte mantido em um arquivo INCLUDE para uso em um programa cujo cdigo
fonte pode estar no formato fixo ou no formato livre, as seguintes regras permitem que o cdigo fonte seja usado em um dos dois formatos:
1. confine os rtulos nas posies 1 a 5 e as instrues nas posies caractere 7 a 72
2. trate brancos como significativos
3. use somente o smbolo de exclamao 1 para indicar um comentrio, mas no inicie o comentrio na posio caractere 6
4. para instrues continuadas, coloque um smbolo e-comercial (ampersand &) na posio caractere 73 e na posio caractere 6
da linha de continuao
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 55
4. Tipos
Section 4: Types
O Fortran prov um mecanismo de abstrao onde dados podem ser categorizados sem que dependam de
uma representao fsica particular. O significado desta abstrao o conceito de tipo.
Um tipo intrnseco aquele que definido pela linguagem. Os tipos intrnsecos so inteiro ( integer), real
(real), complexo (complex), caractere (character) e lgico (logical).
Um tipo derivado aquele definido por uma definio de tipo derivado (4.5.1).
Um tipo derivado pode ser usado somente onde sua definio acessvel (4.5.1.1). Um tipo intrnseco
sempre acessvel.
Um tipo especificado em vrios contextos por um especificador de tipo (type specifier).
R401 type-sepc is intrinsic-type-spec
or derived-type-spec
C401 (R401) O derived-type-spec no pode especificar um tipo abstrato
4.1 O conceito de Tipo
4.1 The concept of type
Um tipo tem um nome, um conjunto de valores vlidos, uma forma para representar estes valores
(constantes) e um conjunto de operaes para manipular os valores.
Nota 4.1
Por exemplo, o tipo lgico tem um conjuntos que possu dois valores, que so indicados pelos totens lxicos
.TRUE. e .FALSE. que so manipulados pelas operaes lgicas.
Um exemplo de um tipo menos restritivo o tipo inteiro. Este tipo tem um conjunto de valores inteiros
dependente do processador (processor dependent) em que cada um destes valores denotado por um sinal opcional
seguido por uma cadeia de dgitos e que podem ser manipulados pelos operadores aritmticos e relacionais.
4.1.1 Conjunto de valores
4.1.1 Set of values
Para cada tipo exite um conjunto de valores vlidos. O conjunto de valores vlidos pode ser completamente
determinado, como no caso do tipo lgico ou pode ser determinado por um mtodo dependente do processador,
como no caso do inteiro, caractere e real. Para o complexo, o conjunto de valores vlidos consiste da combinao
de valores dos componentes individuais. Para o tipo derivado, o conjunto de valores vlidos definido em 4.5.7.
4.1.2 Constantes
4.1.2 Constants
A sintaxe para uma constante literal de cada tipo intrnseco especificada em 4.4.
A sintaxe para representar um valor indica o tipo, os parmetros de tipo e o valor em si.
Uma constante pode ter um nome (5.1.2.10, 5.2.9).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 56
Um construtor de estrutura (structure constructor) (4.5.9) pode ser usado para construir um valor constante do
tipo derivado em uma sequncia apropriada expresso de expresses de inicializao (7.1.7). Este tipo de valor
constante considerado ser um escalar mesmo que entre os valores possa haver componentes que sejam matrizes.
4.1.3 Operaes
4.1.3 Operations
Para cada tipo intrnseco um conjunto de operaes e operadores correspondentes definido
intrinsecamente. Eles so definidos na seo 7. O conjunto intrnseco pode ser aumentado com operaes e
operadores definido por funes com a interface OPERATOR (12.3.2.1) Definio de operador so descritas nas
sees 7 e 12.
Para tipos derivados, no h operaes intrnsecas. Operaes sobre tipos derivados tem que ser definidos
pelo programa (4.5.10).
4.2 Parmetros de Tipo
4.2 Type parameters
Um tipo pode ser parametrizado. Neste caso, o conjunto de valores, a sintaxe para representar estes valores
e o conjunto de operaes sobre este valores de tipo dependem dos valores dos parmetros.
Os tipos intrnsecos so todos parametrizados. Tipos derivados podem ser definidos como parametrizados.
Informao Adicional
Aqui vale um acrscimo:
Processador Fortran ==> hardware + software
Um computador pode utilizar uma palavra de 8 bits, 16 bits, 32 bits, 64 bits, 128
bits, etc.. Atualmente a palavra dos computadores de 64 bits, mas 32 bits ainda
bastante utilizado.
Muitos softwares (ainda em uso) foram escritos para usar 32 bits, no 64 bits.
Computador 64 bits + software 32 bits ==> processador Fortran 32 bits
Computador 64 bits + software 64 bits ==> processador Fortran 64 bits
uma palavra de 32 bits tem a seguinte aparncia:
mostra-se o exemplo mais simples, mas o conceito pode ser facilmente
estendido para 64 bits
11000101100100110000000111001010 (palavra com 32 bits)
11000101 10010011 00000001 11001010 (mostrado separado para melhor visualizao)
32 bits = 4 octetos (ou 4 bytes)
Usando uma palavra de 32 bits os nmeros inteiros so representados assim:
primeiro bit ==> usado para o sinal (0 => positivo; 1 => negativo)
bits restantes ==> usados para o nmero
Ento: 01111111 11111111 11111111 11111111 => + 2147483647
11111111 11111111 11111111 11111111 => 2147483648
o que d um intervalo de 4294967295 nmeros inteiros possveis de serem
representados por uma palavra de 4 octetos (32 bits).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 57
caso se utilize:
1 octeto (8 bits ): 01111111 => + 127 => 256 nmeros
11111111 => 128
2 octetos(16 bits): 01111111 11111111 => + 32767 => 65536 nmeros
11111111 11111111 => 32768
3 octetos(24 bits): 01111111 11111111 11111111 => + 8388607 => 16777216 nmeros
11111111 11111111 11111111 => 8388608
A figura que segue mostra o nmero de octetos usados para representar os nmeros
inteiros.
O parmetro de subtipo (KIND PARAMETER) o mecanismo utilizado para selecionar
qual subtipo (KIND) est sendo usado.
Observe que o subtipo (KIND) usado com o tipo inteiro.
Portanto, o parmetro de subtipo (kind parameter) identifica o subtipo dentro de
um tipo (neste exemplo dentro do tipo inteiro).
Geralmente o parmetro de subtipo indica o nmero de octetos (bytes) usados para
representar o nmero (isto no imposto pelo padro Fortran, mas seguido pela
maioria dos compiladores Fortran).
Exemplos:
integer(kind=1)::massa ! inteiro massa pode assumir valores entre [-128, +127]
integer(kind=2)::massa ! pode assumir valores entre [-32768, +32767]
integer(kind=3)::massa ! pode assumir valores entre [-8388608, +8388607]
integer(kind=4)::massa ! pode assumir valores entre [-2147483648, +2147483647]
para o compilador gfortran (trabalhando com 32 bits) o subtipo 4 o valor
default, por isto pode-se escrever a definio da varivel massa assim:
integer(kind=4)::massa ! valores entre [-2147483648, +2147483647]
integer::massa ! valores entre [-2147483648, +2147483647]
para um processador de 64 bits a definio seria assim
integer::massa ! valores entre
! [-18.446.744.073.709.551.616, +18.446.744.073.709.551.615]
Porque o processador pode ser de 32 bits (caso ainda frequente), 64 bits (logo
ser o default), 128 bits (supercomputadores), etc., d para perceber que os valores
dos nmeros inteiros que podem ser representados depende do processador Fortran
usado (neste exemplo, inteiro, mas na realidade para todos os tipos: inteiros,
caracteres, reais, complexos e tipo derivado)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 58
Por exemplo, para o compilador GFORTRAN
KIND Type Parameters
O KIND type parameters suportado pelo compilador gfortran para os
tipos intrnsecos so:
INTEGER 1, 2, 4, 8*, 16*, default: 4 (1)
LOGICAL 1, 2, 4, 8*, 16*, default: 4 (1)
REAL 4, 8, 10**, 16**, default: 4 (2)
COMPLEX 4, 8, 10**, 16**, default: 4 (2)
CHARACTER 1, 4, default: 1
* = no disponvel para todos os sistemas
** = no disponvel para todos os sistemas; adicionalmente 10 e 16
nunca esto disponveis ao mesmo tempo
(1) a menos que a opo -fdefault-integer-8 seja usada
(2) a menos que a opo -fdefault-real-8 seja usada
Um parmetro de tipo um parmetro de tipo subtipo (kind type parameter) ou um parmetro de tipo
comprimento (length type parameter).
Um parmetro de tipo subtipo (kind type parameter) pode ser usado em uma expresso de inicializao e
especificao dentro de uma definio de tipo derivado (4.5.1) para o tipo. Ele participa na determinao genrica
(16.2.3). cada um dos tipos intrnsecos tem um parmetro de tipo chamado KIND, que usado para distinguir
representao mltiplas do tipo intrnseco.
Nota 4.2
Por projeto, o valor do parmetro de tipo subtipo (kind type parameter) conhecido no tempo de compilao.
Algumas parametrizaes que envolvem formas de representao mltiplas necessitam ser distinguveis quando
da compilao (at compile time) para implementao prtica e performance. Exemplos incluem as precises
mltiplas do tipo intrnseco real e os mltiplos conjuntos de caracteres para o tipo intrnseco caractere.
Um parmetro de tipo do tipo derivado pode ser especificado ser um parmetro de tipo kind (subtipo) de forma que
possibilite resoluo genrica (generic resolution) baseado neste parmetro. Isto permite que um nico genrico
incluir dois procedimentos especficos que possuem interfaces distinguveis somente pelo valor do parmetro de
tipo subtipo (kind type parameter) do argumento mudo. Genricos so projetados para serem diferenciados no
tempo de compilao.
Um parmetro de tipo comprimento (length type parameter) pode ser usado em uma expresso de
especificao dentro da definio de um tipo derivado para o tipo, mas ela no pode ser usada em uma expresso de
inicializao. O tipo caractere intrnseco tem um parmetro de tipo comprimento chamado de LEN, que o
comprimento do string.
Nota 4.3
O adjetivo comprimento (length) usado para parmetros de tipo diferente dos parmetros de tipo subtipo (kind
type parameters) porque eles frequentemente especificam um comprimento, como no tipo caractere intrnseco.
Entretanto, eles podem ser usados para outros propsitos. A diferena importante para os parmetros de tipos
que seus valores no necessitam ser conhecidos no tempo de compilao e podem mudar durante a execuo.
Um valor para o parmetro de tipo pode ser especificado dentro de uma especificao de tipo (4.4, 4.5.8).
R402 type-param-value is scalar-int-expr
or *
or :
C402 (R402) O type-param-value para um parmetro de tipo subtipo (kind type parameter) tem que ser uma
expresso inteira escalar constante
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 59
C403 (R402) O caractere dois pontos pode ser usado como um type-param-value somente em uma
declarao de uma entidade ou componente que possua o atributo POINTER ou ALLOCATABLE
Um parmetro de tipo postergado (deferred type parameter) um parmetro de tipo comprimento cujo
valor pode mudar durante a execuo do programa. Um caractere dois pontos em um type-param-value
especifica um parmetro de tipo postergado.
Os valores dos parmetros de tipo postergados de um objeto so determinados pela execuo bem sucedida
de uma instruo ALLOCATE (6.3.1), execuo de uma instruo de atribuio intrnseca (7.4.1.3), execuo de
uma instruo de atribuio de ponteiro (7.4.2) ou de associao de um argumento(12.4.1.2).
Nota 4.4
Parmetros de tipo postergado de funes, incluindo ponteiros de procedimento funo (function procedure pointers)
no possuem valores. Em vez disto, eles indicam que aqueles parmetros de tipo do resultado da funo ser
determinado pela execuo da funo se ela retornar um resultado de funo alocvel ou resultado associado a um
ponteiro.
Um parmetro de tipo assumido (assumed type parameter) um parmetro de tipo comprimento para um
argumento mudo que assume o valor do parmetro de tipo do argumento real correspondente; ele tambm usado
para um nome associado em uma construo SELECT TYPE que assume o valor do parmetro de tipo do seletor
correspondente. Um asterisco como type-param-value especifica um parmetro de tipo assumido.
4.3 Relacionamento entre Tipos e Valores dos Objetos
4.3 Relationship of types and values to objects
O nome do tipo serve como um especificador de tipo e pode ser usado para declarar objetos deste tipo.
Uma declarao especifica o tipo de um objeto com nome (named object um objeto identificado por um nome). Um
objeto de dado pode ser declarado explicitamente ou implicitamente. Objetos de dados podem possuir atributos em
adio ao seus tipos. A seo 5 descreve a maneira pela qual objetos de dados so declarados e como seus tipos e
outros atributos so especificados.
Dado escalar de qualquer tipo intrnseco ou tipo derivado pode ter colocado em uma forma retangular para
compor uma matriz de mesmo tipo e mesmo parmetro de tipo (same type and type parameters). Um objeto matricial
tem tipo e parmetros de tipo, da mesma forma que objetos escalares tm.
Uma varivel um objeto de dado. O tipo e parmetros de tipo de uma varivel determina quais valores a
varivel pode assumir. Atribuio prov uma forma de definir e redefinir o valor da varivel em qualquer tempo.
Atribuio definida intrinsecamente para todos os tipos onde o tipo, parmetros de tipo e forma (type, type
parameters, and shape) tanto para a varivel e o valor atribudo a ele so idnticos. Atribuio entre objetos de certos
tipos intrnsecos diferentes, parmetros de tipo e formas descrito na seo 7. Uma sub-rotina e uma interface
genrica (4.5.1, 12.3.2.1) cujo especificador genrico ASSIGNMENT (=) define uma atribuio que no
definida intrinsecamente ou redefine uma atribuio intrnseca para um tipo derivado.
Nota 4.5
Por exemplo, atribuio de um valor real em uma varivel inteira definida intrinsecamente
O tipo da varivel determina as operaes que podem ser utilizadas para manipular a varivel.
4.4 Tipos Intrnsecos
4.4 Intrinsic types
Os tipo intrnsecos so:
Tipos numricos inteiro, real e complexo
Tipos no numricos caractere e lgico
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 60
Os tipos numricos (numeric types) so providos para clculos numricos. As operaes aritmticas
normais, adio (+), subtrao (), multiplicao (*), diviso (/), exponenciao (**), identidade (unrio +) e
negao (unrio ) so definidas intrinsecamente para os tipos numricos.
R403 intrinsic-type-spec is INTEGER[kind-selector]
or REAL[kind-selector]
or DOUBLE PRECISION
or COMPLEX[kind-selector]
or CHARACTER[char-selector]
or LOGICAL[kind-selector]
R404 kind-selector is ([KIND=]scalar-int-initialization-expr)
C404 (R404) O valor da scalar-int-initialization-expr no pode ser negativo e tem que especificar
uma mtodo de representao que existe no processador
4.4.1 Tipo Inteiro
4.4.1 Integer type
O conjunto de valores para o tipo inteiro (integer type) um subconjunto dos nmeros inteiro
matemticos. O processador tem que prover um ou mais mtodos de representao (representation methods) que
definem os conjuntos de valores para os dados do tipo inteiro. Cada um destes mtodos caracterizado pelo valor
do parmetro de tipo chamado de parmetro de tipo subtipo (kind). O parmetro de tipo subtipo (kind type
parameter) de um mtodo de representao retornado pela funo inquisitria intrnseca KIND (13.7.59). O
intervalo do expoente decimal (decimal exponent range) de um mtodo de representao retornado pela funo
inquisitria intrnseca RANGE (13.7.96). A funo intrnseca SELECTED_INT_KIND (13.7.105) retorna o valor
do subtipo (kind value) baseado num intervalo decimal requerido. O tipo inteiro inclui um valor zero, que no
considerado negativo nem positivo. O valor de um inteiro zero com sinal o mesmo que o valor de um inteiro zero
sem sinal.
O especificador de tipo para o tipo inteiro a palavra-chave INTEGER.
Se o parmetro de tipo subtipo (kind type parameter) no especificado, o valor default do subtipo (kind)
igual a KIND(0) e o especificador de tipo inteiro default (default integer).
Qualquer valor inteiro pode ser representado por uma constante literal inteira com sinal (signed-int-literal-
constant).
R405 signed-int-literal-constant is [sign] int-literal-constant
R406 int-literal-constant is digit-string[_kind-param]
R407 kind-param is digit-string
or scalar-int-constant-name
R408 signed-digit-string is [sign]digit-string
R409 digit-string is digit [digit]...
R410 sign is +
or -
C405 (R407) O scalar-int-constant-name tem que ser uma constante com nome do tipo inteiro
C406 (R407) O valor de kind-param no pode ser negativo
C407 (R406) O valor de kind-param tem que especificar um mtodo de representao que existe no
processsador
O parmetro de tipo subtipo (kind type parameter) opcional que segue o digit-string especifica o
parmetro de tipo subtipo (kind type parameter) da constante inteira; se ele no for usado a constante ser do tipo
inteiro default.
Uma constante inteira interpretada como um valor decimal (isto , um nmero na base 10).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 61
Nota 4.6
Exemplos de constantes inteiras so:
473
+56
-101
21_2
21_SHORT
1976354279568241_8
onde SHORT uma constante com nome escalar inteira
R411 boz-literal-constant is binary-conatant
or octal-constant
or hex-constant
R412 binary-conatant is B ' digit[digit]...'
or B " digit[digit]..."
C408 (R412) digit tem que ser um dos valores 0 ou 1
R413 octal-conatant is O ' digit[digit]...'
or O " digit[digit]..."
C409 (R413) digit tem que ser um dos valores 0 at 7
R414 hex-conatant is Z ' digit[digit]...'
or Z " digit[digit]..."
R415 hex-digit is digit
or A
or B
or C
or D
or E
or F
Constantes binria, octal e hexadecimal so interpretada de acordo com seus respectivos sistemas
numricos. Os dgitos hexadecimais A at F representam os nmeros de dez a quinze, respectivamente; eles podem
ser representados pelas suas respectivas letras minsculas equivalentes.
C410 (R411) Uma boz-literal-constant s pode aparecer como uma instruo de dado constante (data-
stmt-constant), como valor de um argumento real associado com um argumento mudo A de uma das funo
numrica intrnseca DBLE, REAL ou INT ou como o argumento real associado com o argumento mudo X ou Y da
funo intrnseca CMPLX
4.4.2 Tipo Real
4.4.2 Real type
O tipo real (real type) possui valores que aproximam os nmeros reais matemticos. Um processador tem
que prover dois ou mais mtodos de aproximao (approximation methods) que definem os conjuntos de valores
para os dados do tipo real. Cada um destes mtodos tem um mtodo de representao e caracterizado pelo valor
do parmetro de tipo chamado de parmetro de subtipo (kind type parameter). O parmetro de tipo subtipo de um
mtodo de representao retornado pela funo inquisitria intrnseca KIND(13.7.59). A preciso decimal
(decimal precision) e o intervalo do expoente decimal (decimal exponent range) de um mtodo de aproximao so
retornados pelas funes intrnsecas PRECISION (13.7.90) e RANGE (13.7.96). A funo intrnseca
SELECTED_REAL_KIND (13.7.106) retorna o valor do subtipo (kind value) baseado na especificao da preciso
(precision) e no intervalo decimal requerido.
Nota 4.7
Veja C.1.2 para consideraes sobre seleo dos mtodos de aproximao
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 62
O tipo real inclui um valor zero. Processadores que distinguem entre zero positivo e zero negativo tem que
trat-los matematicamente equivalentes
1. em todas as operaes relacionais
2. como argumento real nos procedimentos intrnsecos que no especificam que zero negativo tem que ser
tratado diferentemente
3. como uma scalar-numeric-expr em um IF aritmtico
Nota 4.8
Nos processadores que distinguem 0.0 e 0.0
( X >= 0.0 )
resulta em verdadeiro (true) se X = 0.0 ou se X = 0.0
( X < 0.0 )
resulta em falso (false) para X = 0.0
IF(X) 1,2,3
causa a transferncia do controle para a instruo alvo desvio com o rtulo de instruo 2 para X = 0.0 e X = 0.0.
Para distinguir entre 0.0 e 0.0 o programa tem que usar a funo SIGN. SIGN(1.0, x) ir retornar -1.0 se
X< 0.0 ou se o processador distingue 0.0 e -0.0 e X tem valor -0.0
O especificador de tipo para o tipo real usa a palavra-chave REAL. A palavra-chave DOUBLE
PRECISION um especificador alternativo para um subtipo (kind) do tipo real.
D preferncia a no usar o DOUBLE PRECISION
Utilize uma constante com nome e a funo intrnseca SELECTED_INT_KIND(R) ou
SELECTED_REAL_KIND([P,R]) para definir preciso dupla, pois assim seus programa ficaro portteis. A
palavra-chave double precision foi introduzida com o padro FORTRAN77, na atualidade completamente
desnecessria
Se a palavra-chave REAL usada e o parmetro de tipo subtipo (kind type parameter) no especificado, o
valor do subtipo default KIND(0.0) e o tipo especificado real default (default real). Se a palavra-chave
DOUBLE PRECISION especificada, o valor do subtipo especificado por KIND (0.0D0) e o tipo especificado
real de preciso dupla (double precision real). A preciso decimal do mtodo de aproximao real preciso dupla
tem que ser maior que o mtodo real default.
R416 signed-real-literal-constant is [sign] real-literal-constant
R417 real-literal-constant is significant[exponent-letter exponent][_kind-param]
or digit-string exponent-letter exponent[_kind-param]
R418 significant is digit-string.[ digit-string]
or .digit-string
R419 exponent-letter is E
or D
R420 exponent is signed-digit-string
C411 (R417) Se o kind-param e a exponent-letter esto presentes, a exponent-letter tem que ser E
C412 (R417) O valor do kind-param tem que especificar um mtodo de aproximao que existe no
processador
Uma constante literal real (real literal constant) sem o parmetro de tipo subtipo (kind type parameter) uma
constante real default se ela no tem a parte exponencial ou tem a letra exponencial E e uma constante real de
preciso dupla (double precision real constant) se tem a letra exponencial D. Uma constante literal real escrita com o
parmetro de tipo subtipo (kind type parameter) uma constante real com o subtipo especificado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 63
O expoente representa a escala da potncia de dez que aplicada ao significando (significand) ou cadeia de
dgitos (digit string). A interpretao destas constantes a mesma da notao cientfica decimal.
O significando (significand) pode se escrito com mais dgitos do que aqueles que o processador ir usar para
aproximar o valor da constante.
Nota 4.9
Exemplos de constantes literal real com sinal so:
-12.78
+1.6E3
2.1
-16.E4_8
0.45D-4
10.93E7_QUAD
.123
3E4
onde QUAD uma constante com nome inteira escalar.
4.4.3 Tipo Complexo
4.4.3 Complex type
O tipo complexo (complex type) possui valores que aproximam os nmeros complexos matemticos. Os
valores de um tipo complexo so pares ordenados de valores reais. O primeiro valor chamado de parte real (real
part) enquanto o segundo valor chamado de parte imaginria (imaginary part).
Cada mtodo de aproximao usado para representar entidades de dados do tipo real deve estar disponvel
tanto para a parte real quanto para a parte imaginria da entidade do tipo complexo. O parmetro de tipo subtipo
(kind type parameter) pode ser especificado para uma entidade complexa e seleciona para ambas as partes o mtodo
de aproximao que ser usado tanto para parte real quanto para a parte imaginria. O parmetro de tipo subtipo do
mtodo retornado pela funo intrnseca KIND (13.7.59).
O especificador de tipo para o tipo complexo usa a palavra-chave COMPLEX. No existe para complexo
de preciso dupla. Se a palavra-chave COMPLEX especificada e o parmetro de tipo subtipo (kind type parameter)
no especificado, o valor do subtipo default o mesmo que o valor default real, o tipo de ambas as partes real
default e a especificao de tipo complexo default (default complex).
R421 complex-literal-constant is (real-part, imag-part)
R422 real-part is signed-int-literal-constant
or signed-real-literal-constant
or named-constant
R423 imag-part is signed-int-literal-constant
or signed-real-literal-constant
or named-constant
C413 (R421) Cada constante com nome em uma constante literal complexa tem que ser do tipo inteiro ou real
Se a parte real e a parte imaginria de uma constante literal complexa so ambas reais, o valor do parmetro
de tipo subtipo da constante literal complexa o valor do parmetro de tipo subtipo da parte com a maior preciso
decimal; se as precises so as mesmas, ele o valor do parmetro de tipo subtipo de um deles como determinado
pelo processador. Se uma parte tem valor de subtipo diferente daquela definido para a constante complexa, a parte
convertida para o mtodo de aproximao da constante literal complexa.
Se a parte real e a parte imaginria so inteiros, eles so convertidos para o mtodo de aproximao real
default e a constante complexa default. Se somente uma das partes um inteiro, ela convertida para o mtodo
de aproximao selecionado para a parte que real e o valor do parmetro de subtipo da constante literal complexa
o mesmo da parte real.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 64
Nota 4.10
Exemplos de constantes literais complexa so:
(1.0, -1.0)
(3, 3.1E6)
(4.0_4, 3.6E7_8)
(0.0, PI)
onde PI uma constante com nome real previamente declarada
4.4.4 Tipo Caractere
4.4.4 Character type
O tipo caractere (character type) tem um conjunto de valores composto de cadeias de caractere (character
strings). Uma cadeia de caracteres (character string) uma sequncia de caracteres, numerados da esquerda para a
direita 1, 2, 3, at o nmero de caracteres no string (na cadeia de caracteres). O nmero de caracteres em um
string (numa cadeia de caracteres) chamado de comprimento (length) do string (da cadeia de caracteres). O
comprimento um parmetro de tipo; seu valor maior que ou igual a zero. Strings (cadeias de caracteres) de
comprimentos diferentes so todos do tipo caractere.
O processador tem que prover um ou mais mtodos de representao (representation methods) que define
um conjunto de valores para os dados do tipo caractere. Cada um destes mtodos caracterizado pelo valor do
parmetro de tipo subtipo (kind type parameter). O parmetro de tipo subtipo do mtodo de representao
retornado pela funo inquisitria intrnseca KIND (13.7.59). A funo intrnseca SELECTED_CHAR_KIND
(13.7.104) retorna o valor do subtipo (kind value) baseado no nome do tipo de caractere. Qualquer caractere de um
mtodo de representao particular representvel no processador pode ser usado em um string de caracteres (numa
cadeia de caracteres) deste mtodo de representao.
O conjunto de caracteres especificado pela ISO/IEC 646:1991 (International Reference Version)
referenciado como conjunto de caracteres ASCII e seu mtodo de representao do tipo caractere ASCII. O
conjunto de caracteres UCS-4 como especificado na ISO/IEC 10646 referenciado como o conjunto de caracteres
ISO 10646 e seu mtodo de representao de tipo caractere ISO 10646 (ISO_10646 character kind).
4.4.4.1 Especificador Tipo Caractere
4.4.4.1 Character type specifier
O especificador de tipo (type specifier) para o tipo caractere usa a palavra-chave CHARACTER.
Se o parmetro de tipo subtipo (kind type parameter) no usado, o valor de subtipo default KIND('A') e o
tipo especificado e caractere default.
R424 char-selector is length-selector
or (LEN=type-param-value,
KIND=scalar-int-initialization-expr)
or (type-param-value,
KIND=scalar-int-initialization-expr)
or (KIND=scalar-int-initialization-expr
[,LEN=type-param-value])
R425 length-selector is (LEN=type-param-value)
or * char-length[,]
R426 char-length is (type-parm-value)
or scalar-int-literal-constant
C414 (R424) O valor da scalar-int-initialization-expr tem que ser no negativa e tem que
especificar um mtodo de representao que exista no processador
C415 (R426) A scalar-int-literal-constant no pode incluir um kind-param
C416 (R422) O type-parm-value de * pode ser usado somente nos seguintes casos:
1. para declarar um argumento mudo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 65
2. para declarar uma constante com nome
3. em uma type-spec de uma instruo ALLOCATE onde cada objeto alocvel um argumento mudo do
tipo caractere com um comprimento assumido
4. em uma funo externa, para declarar o parmetro de comprimento caractere de uma funo muda
C417 Uma nome de funo no pode ser declarada com um asterisco type-param-value a menos que seja do tipo
CHARACTER e seja o nome do resultado de uma funo externa ou o nome de uma funo muda
C418 O nome de uma funo declarada com um asterisco type-param-value no pode ser uma matriz, um ponteiro, recursiva ou pura
C419 (R425) A vrgula opcional em um length-selector permitida em uma declaration-type-spec em uma type-
declaration-stmt
C420 (R425) A vrgula em um length-selector permitido somente se o separador : : (double-colon) aparece na type-declaration-
stmt
C421 (R424) O especificador de comprimento para um funo instruo caractere (character statement function) ou para um argumento
mudo funo instruo (statement function dummy argument) do tipo caractere tem que ter uma expresso de inicializao
O char-selector em uma CHARACTER intrinsic-type-spec e o *char-length em uma entity-
decl ou uma definio de tipo especifica o comprimento do caractere. O *char-length em uma entity-decl ou
uma component-decl especifica um comprimento individual e sobrescreve o comprimento especificado em um
char-selector .se este existir. Se um *char-length no especificado em uma entity-decl ou uma
component-decl, o length-selector ou type-param-value especificado no char-selector o comprimento
do caractere. Se o comprimento no especificado em um char-selector ou um *char-length, o comprimento
igual a 1.
Se o valor do parmetro de tipo comprimento caractere (character length parameter value) calculado como
negativo, o comprimento da entidade declarada zero. O valor do parmetro de tipo comprimento caractere igual
ao caractere dois pontos ( : ) indica um parmetro de tipo postergado (deferred type parameter) (4.2). Um valor do
parmetro de tipo comprimento caractere igual a * tem o seguinte significado:
1. se usado para declarar um argumento mudo de um procedimento, o argumento mudo assume o
comprimento do argumento real
2. se usado para declarar uma constante com nome, o comprimento igual ao comprimento do valor da
constante
3. se usado numa especificao de tipo (type-spec) de uma instruo ALLOCATE, cada objeto alocado assume
o comprimento igual ao do argumento efetivo
4. se usado o parmetro de especificao de comprimento caractere de um resultado de funo, qualquer unidade de escopo
invocando a funo tem que declarar o nome da funo com o valor do parmetro de comprimento caractere diferente de * ou
acessar esta definio por associao de uso ou hospedagem.. Quando a funo invocada, o comprimento da varivel resultado na
funo assumido do valor do seu parmetro de tipo
4.4.4.2 Constante Literal Caractere
4.4.4.2 Character literal constant
Uma constante literal caractere (character literal constant) escrita como uma sequncia de caracteres,
delimitados por apstrofos ou aspas.
R427 char-literal-constant is [kind-param_]'[rep-char]...'
or [kind-param_]"[rep-char]..."
C422 (R427) O valor de kind-param tem que especificar um mtodo de representao que existe no processo
O parmetro de tipo subtipo opcional (optional kind type parameter) precedendo o delimitador inicial
especifica o parmetro de tipo subtipo da constante caractere; se ele no for usado, a constante uma constante
caractere tipo default.
Para o tipo caractere com subtipo kind-param, se presente, e para o tipo caractere default caso contrrio,
um caractere representvel (representable character), rep-char, definido como segue:
1. no formato livre, qualquer caractere grfico no conjunto de caracteres do processador
2. no formato fixo, ele qualquer caractere no conjunto de caracteres dependente do processador. Um processador pode restringir a
ocorrncia de alguns ou todos os caracteres de controle
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 66
Nota 4.11
O FORTRAN 77 permite qualquer caractere ocorrer em um contexto caractere. Este padro permite que os
cdigos fontes de um programa contenha caracteres de mais de um subtipo (kind). Alguns processadores podem
identificar caracteres de subtipo no default por caracteres de controle (chamado caracteres escape ou shift) .
difcil, se no impossvel, processar, editar e imprimir arquivos onde alguns caracteres de controle num contexto
tem uma interpretao e em outro contexto podem no ter a mesma interpretao. Quase todos os caracteres de
controle possuem usos ou efeitos que efetivamente impede seu uso em contextos caracteres e isto a causa do
porque o formato livre permite somente caracteres grficos como representao de caracteres. Entretanto, para
compatibilidade com o FORTRAN 77, caracteres de controle ainda so permitidos em princpio no formato fixo
O delimitador apstrofo ( ' ) ou a aspas delimitadora ( ) no so partes do valor da constante literal
caractere.
Um caractere apstrofo (apostrophe character) dentro de uma constante caractere delimitado por apstrofos
representado por dois apstrofos consecutivos (sem brancos entre eles); neste caso, os dois apstrofos so contados
como um nico caractere. Similarmente, o caractere aspas (quotation mark character) dentro de uma constante
caractere delimitado por aspas representada por duas aspas consecutivas (sem brancos entre eles) e as duas aspas
so contadas como um nico caractere.
Uma constante caractere de comprimento zero representada por dois apstrofos consecutivos (sem
brancos entre eles) ou por duas aspas consecutivas (sem brancos entre eles) fora do contexto caractere.
A operao intrnseca concatenao (concatenation) (//) definida entre duas entidades do tipo (7.2.2) com
o mesmo parmetro de subtipo (kind type parameter).
Nota 4.12
Exemplos de constantes literais complexa so:
"DON'T"
'DON''T' ambas possuem o valor DONT
''
que possu o string caractere de comprimento zero como seu valor
Nota 4.13
Um exemplo de uma constante literal caractere no default (nondefault character literal constant), onde o processador
possui o conjunto correspondente
:
onde NIHONGO uma constante com nome cujo valor o parmetro de tipo subtipo (kind type parameter) para os
caractere Nihongo (Japons).
O significado desta constante : Sem ela, nada possvel
(esta traduo foi obtida no rascunho do padro Fortran 2008)
4.4.4.3 Sequncia de Arrumao
4.4.4.3 Collating sequence
Sequncia de Arrumao Collating sequence
Ordem de arrumao Sequncia de arrumao Ordenao Ordem alfabtica (somente letras)
Cada implementao define uma sequncia de arrumao para o conjunto de caracteres (character set) de
cada subtipo de caracteres (each kind of character). A sequncia de arrumao (collating sequence) um
isomorfismo entre o conjunto de caracteres e o conjunto dos nmeros inteiros no negativos (one-to-one mapping of
the characters into the nonnegative integers), tal que cada caractere corresponde a um inteiro no negativo diferente
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 67
(different nonnegative integer). As funes intrnsecas CHAR (13.7.19) e ICHAR (13.7.50) provm converses entre
os caracteres e os inteiros de acordo com este mapa.
Nota 4.14
Por exemplo:
ICHAR( X )
retorna o valor inteiro do caractere X de acordo com a sequncia de arrumao do processador
Para o tipo caractere default, a nica restrio na sequncia de arrumao so as seguintes:
ichar('A')<ichar('B')<...<ichar('Z') para as 26 letras maisculas
ichar('0')<ichar('1')<...<ichar('9') para os 10 dgitos
ichar(' ')<ichar('0')<...<ichar('9')<ichar('A') ou
ichar(' ')<ichar('A')<ichar('Z') <ichar('0')
ichar('a')<ichar('b')<... <ichar('z') para as 26 letras minsculas
ichar(' ')<ichar('0')<ichar('9')<ichar('a') ou
ichar(' ')<ichar('a')<ichar('z')<ichar('0')
Exceto para o branco, no existe restrio quanto a localizao dos caracteres especiais e sublinha
(underscore) na sequncia de arrumao, nem existe qualquer relacionamento na sequncia de arrumao entre as
letras maisculas e letras minsculas.
A sequncia de arrumao para o conjunto de caracteres ASCII especificado na ISO/IEC 646:1991
(International Reference Version). Esta sequncia de arrumao chamada de sequncia de arrumao ASCII
(ASCII collating sequence) neste padro. A sequncia de arrumao para o conjunto de caracteres ISO 10646
especificada na ISO/IEC 10646-1:2000.
Nota 4.15
As funes intrnsecas ACHAR (13.7.2 ) e IACHAR (13.7.45) fazem a converso entre caracteres e os inteiros
correspondentes de acordo com a sequncia de arrumao ASCII
As funes intrnsecas LGT, LGE, LLE e LLT (13.7.63-13.7.66) permitem comparaes entre cadeias de
caracteres (strings) baseado na sequncia de arrumao ASCII. Portabilidade internacional garantida se o conjunto
de caracteres usado limitado ao conjunto de caracteres do Fortran
4.4.5 Tipo Lgico
4.4.5 Logical type
O tipo lgico (logical type) tem dois valores, que representam verdadeiro (true) e falso (false).
O processador tem que prover um ou mais de um mtodos de representao para os dados do tipo lgico.
Cada um destes mtodos caracterizado pelo valor (inteiro default) do parmetro de tipo subtipo (kind). O parmetro
de tipo subtipo de um mtodo de representao retornado pela funo inquisitria intrnseca KIND (13.7.59).
O especificador do tipo lgico usa a palavra-chave LOGICAL.
Se o parmetro de tipo subtipo no especificado, o valor default do subtipo (kind) KIND(.FALSE.) e o
tipo especificado lgico default (default logical).
R428 logical-literal-constant is .TRUE.[_kind-param]
or .FALSE.[_kind-param]
C423 (R428) O valor do parmetro de tipo subtipo (kind-param) tem que especificar um mtodo de
representao que existe no processo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 68
O parmetro de tipo subtipo opcional (optional kind type parameter) que segue o delimitador especifica o
parmetro de tipo subtipo da constante lgica; se ele no estiver presente a constante do tipo lgico default.
As operaes intrnsecas definidas para as entidades do tipo lgica so: negao (.NOT.), conjuno
(.AND.), disjuno inclusiva (.OR.), equivalncia lgica (.EQV.) e no equivalncia lgica (.NEQV.), como
descritas em 7.2.4. Existe, tambm, um conjunto intrnseco de operadores relacionais que compara valores de
entidades de dados de outros tipos e geram valores lgicos defaults. Estas operaes so descritas em 7.2.3.
4.5 Tipos Derivados
4.5 Derived types
Tipos adicionais podem ser derivados dos tipos intrnsecos e de outros tipos derivados. Uma definio de
tipo requerida para define o nome do tipo e os nomes e atributos de seus componentes e procedimentos ligado ao
tipo (type-bound procedures).
Um tipo derivado pode ser parametrizado por mltiplos parmetros de tipo, cada um deles definido como
sendo ou um parmetro de tipo subtipo (kind type parameter) ou um parmetro de tipo comprimento (length type
parameter) e pode ter valor default.
Os componentes ltimos (ultimate components) de um objeto de tipo derivado so componentes do tipo
intrnseco ou que possuem o atributo POINTER ou ALLOCATABLE, mais os componentes ltimos dos
componentes de objetos que so de tipo derivado e no possuem o atributo ALLOCATABLE nem o atributo
POINTER.
Nota 4.16
Os componentes ltimos de um objeto do tipo derivado kids definido a seguir so name, age e other_kids
type :: person
character(len=20) :: name
integer :: age
end type person
type :: kids
type(person) :: oldest_child
type(person), allocatable, dimension(:) :: other_kids
end type kids
Por default, nenhuma sequncia de armazenagem implicada pela ordem de definio dos componentes.
Entretanto, a ordem se armazenamento imposta para o tipo sequncia (sequence type) (4.5.1.2). Se o tipo derivado
tem o atributo BIND, a sequncia de armazenamento aquela requerida pelo processador associado ( companion
processor) (2.5.10, 15.2.3).
4.5.1 Definio de Tipo Derivado
4.5.1 Derived-type definition
R429 derived-type-def is derived-type-stmt
[type-param-def-stmt]...
[private-or-sequenca]...
[component-part]
[type-bound-procedure-part]
end-type-stmt
R430 derived-type-stmt is TYPE[[,type-attr-spec-list]::]type-name
[(type-param-name-list)]
R431 type-attr-spec is access-spec
or EXTENDS(parent-type-name)
or ABSTRACT
or BIND(C)
C424 (R430) Um tipo derivado type-name no pode ser DOUBLE PRECISION ou ter o mesmo nome de
qualquer tipo intrnseco
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 69
C425 (R430) O mesmo type-attr-spec no pode aparecer mais de uma vez em uma instruo de tipo
derivado (derived-type-stmt)
C426 (R431) Um parent-type-name tem que ser o nome de um tipo extensvel previamente definido (4.5.6)
C427 (R429) Se a definio de tipo contm ou herda (4.5.6.1) um procedimento postergado ligado (deferred
type-bound procedure), ABSTRACT tem que ser usado
C428 (R429) Se ABSTRACT aparece, o tipo tem que ser extensvel
C429 (R429) Se EXTENDS aparece, SEQUENCE no pode aparecer
R432 private-or-sequence is private-component-stmt
or sequence-stmt
C430 (R429) A mesma private-or-sequence no pode aparecer mais de uma vez em uma definio de tipo
derivada (derived-type-def)
R433 end-type-stmt is END TYPE[type-name]
C431 (R433) Se END TYPE seguido pelo type-name, o type-name tem que ser o mesmo usado na
instruo de tipo derivado correspondente
Tipos derivados com a tributo BIND esto sujeitos a restries adicionais como especificado em 15.2.3.
Nota 4.17
Um exemplo de definio de tipo derivado :
TYPE PERSON
INTEGER AGE
CHARACTER(LEN = 50) NAME
END TYPE PERSON
Um exemplo de declarao da varivel CHAIRMAN do tipo PERSON :
TYPE (PERSON) :: CHAIRMAN
4.5.1.1 Acessibilidade
4.5.1.1 Accessibility
Tipos que so definidos em um mdulo ou acessveis em mdulo por associao de uso ( use association)
possuem o atributo PUBLIC ou o atributo PRIVATE. Tipos para os quais a especificao de acesso (access-spec)
no explicitamente definido no mdulo tm o atributo de acessibilidade default do mdulo onde esto definidos.
O atributo de acessibilidade default de um mdulo PUBLIC a menos que seja mudado com o uso da instruo
PRIVATE (5.2.1). Somente os tipos que possuem o atributo PUBLIC neste mdulo podem ser acessados por meio
de associao de uso.
A acessibilidade do tipo no afeta e no afetada pela acessibilidade dos seus componentes e ligaes
(binding ligados vinculados conectados: its components and bindings).
Se uma definio de tipo particular (private), ento o nome do tipo e portanto o construtor de estrutura
(4.5.9) para o tipo s so acessveis dentro do mdulo contendo a definio.
Nota 4.18
Um exemplo de um tipo com um nome particular :
TYPE, PRIVATE :: AUXILIARY
LOGICAL :: DIAGNOSTIC
CHARACTER(LEN = 20) :: MESSAGE
END TYPE AUXILIARY
Este tipo s ser acessvel dentro do mdulo no qual definido
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 70
4.5.1.2 Tipo Sequncia
4.5.1.2 Sequence type
R434 sequence-stmt is SEQUENCE
C432 (R438) Se SEQUENCE aparece, todos os tipos derivados especificados nas definies dos componentes
so do tipo sequncia
C433 (R429) Se SEQUENCE aparece, um type-bound-procedure-part no pode aparecer
Se uma instruo SEQUENCE (SEQUENCE statement) aparece, o tipo um tipo sequncia (sequence
type). A ordem das definies dos componentes na especificao de um tipo sequncia especifica a sequncia de
armazenamento para objetos deste tipo. Se no existir parmetro de tipo e todos os componentes ltimos dos
objetos deste tipo so do tipo inteiro default, real default, preciso dupla default, complexo default ou lgico default
e no so ponteiros ou alocveis, o tipo um tipo sequncia numrica (numeric sequence type). Se no existirem
parmetros de tipo e todos os componentes ltimos dos objetos do tipo so do tipo default e no ponteiros ou
alocveis, o tipo tipo sequncia caractere (character sequence type).
Nota 4.19
Um exemplo de um tipo sequncia numrica :
TYPE NUMERIC_SEQ
SEQUENCE
INTEGER :: INT_VAL
REAL :: REAL_VAL
LOGICAL :: LOG_VAL
END TYPE NUMERIC_SEQ
Nota 4.20
Uma estrutura acaba numa sequncia de componentes, a menos que a estrutura contenha a instruo SEQUENCE,
o uso desta terminologia no se aplica queles componentes que esto guardados nesta, ou qualquer outra, ordem.
Nem existe qualquer requerimento para que memria contigu seja utilizada. A sequncia meramente refere-se ao
fato de que ao se escrever a definio haver necessariamente uma ordem na qual os componentes aparecem e ela
define a sequncia dos componentes. Esta ordem de significado limitado porque um componente de um objeto
do tipo derivado sempre ser acessado pelo nome do componente exceto no seguinte contexto: uma sequncia de
expresses em um construtor de valores do tipo derivado, atribuio intrnseca, obteno de valores de dados em
uma lista de nomes (namelist input data) e a incluso de uma estrutura em uma lista de entrada/sada de uma
transferncia de dados formatada onde ela expandida para a sua sequncia de componentes. Garantido que o
processador obedece a ordem definida nestes casos, ele livre para organizar a armazenagem dos componentes de
qualquer no estrutura no sequencial na memria que seja melhor adaptada para a sua arquitetura particular
4.5.1.3 Determinao dos Tipos Derivados
4.5.1.3 Determination of derived types
Definies de tipo derivado com o mesmo nome podem aparecer em diferentes unidades de escopo e neste
caso elas podem ser independentes e descrever diferentes tipos derivados ou eles podem descrever o mesmo tipo.
Duas entidades de dados tem o mesmo tipo se elas so declarados com referncia a mesma definio de
tipo derivado. A definio pode ser acessada em um mdulo ou de uma unidade de escopo hospedeira (host scoping
unit). Entidades de dados em unidades de escopo diferente tambm possuem o mesmo tipo se so declaradas com
referncia a diferentes definies de tipo derivada que especifica o mesmo nome de tipo, todas tendo a propriedade
SEQUENCE ou todas tendo o atributo BIND, no possui componentes com acessibilidade PRIVATE e possuem
seus parmetros de tipo e componentes concordando em ordem, nome e outros atributos. Caso contrrio, eles so
tipos derivados diferentes. Uma entidade de dado declarada com a propriedade SEQUENCE ou com o atributo
BIND no de mesmo tipo bem como uma entidade de tipo derivada declarada como PRIVATE ou que tenha
qualquer de seus componentes PRIVATE.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 71
Nota 4.21
Um exemplo de declarao de duas entidades com referncia mesma definio de tipo derivado :
TYPE POINT
REAL X, Y
END TYPE POINT
TYPE (POINT) :: X1
CALL SUB (X1)
...
CONTAINS
SUBROUTINE SUB (A)
TYPE (POINT) :: A
...
END SUBROUTINE SUB
A definio do tipo derivado POINT conhecida na sub-rotina SUB por associao de hospedagem (host
association). Porque a declarao de X1 e A so referncias a mesma definio de tipo derivado, X1 e A possuem o
mesmo tipo.
X1 e A tambm podem ter o mesmo tipo se a definio de tipo derivada for colocada em um mdulo e tanto a sub-
rotina e o unidade de programa fizer referncia ao mdulo (use association).
Nota 4.22
Um exemplo de entidade de dado, em unidades de escopo diferente, com mesmo tipo :
PROGRAM PGM
TYPE EMPLOYEE
SEQUENCE
INTEGER ID_NUMBER
CHARACTER(50) NAME
END TYPE EMPLOYEE
TYPE (EMPLOYEE) PROGRAMMER
CALL SUB (PROGRAMMER)
...
END PROGRAM PGM
SUBROUTINE SUB (POSITION)
TYPE EMPLOYEE
SEQUENCE
INTEGER ID_NUMBER
CHARACTER(50) NAME
END TYPE EMPLOYEE
TYPE (EMPLOYEE) POSITION
...
END SUBROUTINE SUB
O argumento real PROGRAMMER e o argumento mudo POSITION tem o mesmo tipo porque so declarados
com referncia definio de tipo derivado com o mesmo nome, atributo SEQUENCE e os componentes
concordam em ordem, nome a atributos.
Suponha que o nome do componente num ID NUMBER seja ID NUM na sub-rotina. Porque todos os nomes dos
componentes no so iguais aos nomes dos componentes do tipo derivado EMPLOYEE no programa principal, o
argumento real PROGRAMMER no ser do mesmo tipo que o argumento mudo POSITION . Ento, o programa
no um programa Fortran padro (standard-conforming).
Nota 4.23
O requerimento para que dois tipos tenham o mesmo nome aplica-se aos nomes do tipo (type-names) das
respectivas instrues de tipo derivado (derived-type-stmts) no aos nomes locais introduzidos via uma instruo de
uso com renomeao (renaming in USE statements).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 72
4.5.2 Parmetros de Tipo Derivado
4.5.2 Derived-type parameters
R435 type-param-def-stmt is INTEGER[kind-selector],type-param-attrr-spec::
type-param-decl-list
R436 type-param-decl is type-param-name[=scalar-int-constant-expr]
C434 (R435) Um type-param-name em uma type-param-def-stmt em uma derived-type-def tem
que ser um type-param-name numa derived-type-stmt deste derived-type-def
C435 (R435) Cada type-param-name em uma type-param-def-stmt em uma derived-type-def tem
que aparecer em um type-param-name numa derived-type-stmt deste derived-type-def
R437 type-param-attr-spec is KIND
or LEN
O tipo derivado parametrizado se a derived-type-stmt tem algum type-param-name.
Cada parmetro de tipo ele mesmo um tipo inteiro. Se seu seletor de subtipo (kind selector) omitido, o
parmetro de tipo subtipo (kind type parameter) inteiro default.
O especificador type-param-attr-sepc explicitamente especifica se o parmetro de tipo um parmetro
de tipo subtipo (kind parameter) ou um parmetro de tipo comprimento (length parameter).
Se type-param-decl possu scalar-int-constant-expr o parmetro de tipo tem o valor default que
especificado pela expresso. Se necessrio, o valor convertido de acordo com a regras de atribuio intrnseca
(7.4.1.3) para um valor de mesmo subtipo (kind) que o parmetro de tipo.
Um parmetro de tipo pode ser usado como uma primria em uma expresso de especificao (7.1.6) numa
definio de tipo derivado. Um parmetro de tipo subtipo (kind type parameter) tambm pode ser usado como uma
primria em uma expresso de inicializao (7.1.7) na definio de tipo derivado.
Nota 4.24
O seguinte exemplo usa parmetros de tipo derivado
TYPE humongous_matrix(k, d)
INTEGER, KIND :: k = kind(0.0)
INTEGER(selected_int_kind(12)), LEN :: d
!-- especifica um subtipo (kind) no default para d
REAL(k) :: element(d,d)
END TYPE
No exemplo que segue, dim declarado ser um parmetro de subtipo (kind parameter) permitindo sobrecarga de
procedimentos genricos (generic overloading of procedures) distinguveis somente pelo uso de dim
TYPE general_point(dim)
INTEGER, KIND :: dim
REAL :: coordinates(dim)
END TYPE
4.5.2.1 Ordem do Parmetro de Tipo
4.5.2.1 Type parameter order
A ordem do parmetro de tipo (Type parameter order) a ordem dos parmetros de tipos do tipo
derivado; ela usada para especificar os tipos derivados.
A ordem do parmetro de tipo de um tipo no extensvel a ordem da lista do parmetro de tipo na
definio do tipo derivado. A ordem do parmetro de tipo em um tipo extensvel consiste na ordem do parmetro
de tipo do tipo raiz (parent type) seguido pelos parmetros de tipo adicionais na ordem da lista dos parmetros de
tipo na definio do tipo derivado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 73
Nota 4.25
Dado
TYPE :: t1(k1,k2)
INTEGER,KIND :: k1,k2
REAL(k1) a(k2)
END TYPE
TYPE,EXTENDS(t1) :: t2(k3)
INTEGER,KIND :: k3
LOGICAL(k3) flag
END TYPE
a ordem do parmetro de tipo para o tipo t1 k1 depois k2 e a ordem de parmetro de tipo para o tipo t2 k1, k2
depois k3.
4.5.3 Componentes
4.5.3 Components
R438 component-part is [component-def-stmt] ...
R439 component-def-stmt is data-component-def-stmt
or proc-component-def-stmt
R440 data-component-def-stmt is declaration-type-spec[[,component-attr-spec-list]::]
component-decl -list
R441 component-attr-spec is POINTER
or DIMENSION ( component-array-spec )
or ALLOCATABLE
or access-spec
R442 component-decl is component-name[(component-array-spec)]
[*char-length][component-initialization]
R443 component-array-spec is explicit-shape-spec-list
or deferred-shape-spec-list
R444 component-initialization is = initialization-expr
or => null-init
C436(R440) Nenhuma component-attr-spec pode aparecer mais de uma vez em uma component-def-
stmt
C437(R440) Um componente declarado com a palavra-chave CLASS (5.1.1.2) tem que ter o atributo
ALLOCATABLE ou POINTER
C438(R440)Se o atributo POINTER no especificado para o componente, a declaration-type-spec na
component-def-stmt tem que especificar um tipo intrnseco ou um tipo derivado previamente definido
C439(R440) Se o atributo POINTER especificado para um componente, a declaration-type-spec em
component-def-stmt tem que especificar um tipo intrnseco ou qualquer tipo derivado acessvel incluindo o tipo
que est sendo definido
C440(R440)Se o atributo POINTER ou ALLOCATABLE especificado, cada component-array-spec tem que
ser uma deferred-shape-spec-list
C441(R440) Se nem o atributo POINTER nem o atributo ALLOCATABLE especificado, cada component-
array-spec tem que ser uma explicit-shape-spec-list
C442(R443) Cada limite em uma explicit-shape-spec tem que ser uma expresso de iniciao ou uma
expresso de especificao que no contenha referncias a funes de especificao ou qualquer designador de
objeto diferente de uma constante com nome ou subobjeto desta
C443(R440) Um componente no pode ter, ao mesmo tempo, o atributo ALLOCATABLE e POINTER
C444(R442) A opo *char-length permitida somente se a especificao do tipo for de um caractere
C445(R439) Cada type-param-value dentro de uma component-def-stmt tem que ter um :, ser uma
expresso de inicializao ou ser uma expresso de especificao que no contenha referncias nem a funes
de especificao nem a designadores de objetos diferentes de de uma constante com nome ou subobjeto desta
Nota 4.26
Porque um parmetro de tipo no um objeto, um valor de parmetro de tipo ou um limite ( bound) em uma
explicit-shape-spec pode conter um type-param-name
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 74
C446(R440) Se component-initialization aparece, um separador : : (double-colon separator) tem que aparecer antes
da component-decl-list
C447(R440) Se => aparece em component-initialization, POINTER tem que aparecer na component-
attr-spec-list. Se = aparece na component-initialization, POINTER ou ALLOCATABLE no pode
aparecer na component-attr-spec-list
R445 proc-component-def-stmt is PROCEDURE([proc-interface]),
proc-component-attr-spec-list::proc-decl-list
Nota 4.27
Veja 12.3.2.3 para definio de proc-interface e proc-decl
R446 proc-component-attr-spec is POINTER
or PASS[(arg-name)]
or NOPASS
or access-spec
C448(R445) O mesmo proc-component-attr-spec no pode aparecer mais de uma vez em uma dada
proc- component-def-stmt
C449(R445) POINTER tem que aparecer em cada proc-component-attr-spec-list
C450(R445) Se o componente ponteiro de procedimento tem uma interface implcita ou no tem argumentos,
NOPASS tem que ser especificada
C451(R445) Se PASS(arg-name) aparece, a interface tem que ter um argumento mudo chamado arg-name
C452(R445) PASS e NOPASS no podem aparecer na mesma proc-component-attr-spec-list
4.5.3.1 Componentes de Matriz
4.5.3.1 Array components
Um componente de dado (data component) uma matriz se a component-decl contm uma component-
array-spec ou sua data-component-def-stmt contm o atributo DIMENSION. Se a component-decl contm
uma component-array-spec isto especifica o nmero de dimenses (rank) da matriz e se a matriz tem forma
explicita (5.1.2.5.1) os limites da matriz; caso contrrio a component-array-spec no atributo DIMENSION
especifica a dimenso da matriz (rank) e se a matriz de forma explcita, os limites da matriz.
Nota 4.28
Um exemplo de definio de tipo derivado com um componente matricial :
TYPE LINE
REAL,DIMENSION(2,2)::COORD ! COORD(:,1) tem os valores (/X1, Y1/)
! COORD(:,2) tem os valores (/X2, Y2/)
REAL :: WIDTH ! comprimento da linha em centmetros
INTEGER :: PATTERN ! 1 para slido, 2 para vistoso, 3 para pontilhado
END TYPE LINE
Um exemplo de declarao da varivel LINE_SEGMENT do tipo LINE :
TYPE (LINE) :: LINE_SEGMENT
A varivel escalar LINE SEGMENT tem um componente que uma matriz. Neste caso, a matriz um subobjeto
de um escalar. O :: (double colon) na definio de COORD obrigatrio; o :: (double colon) na definio de WIDTH
PATTERN opcional.
OBSERVAO: uma boa abordagem, que permite eliminar os erros introduzidos pelo uso incorreto desta
tcnica, desconsiderar que ela opcional e sempre usar o :: nas definies.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 75
Nota 4.29
Um exemplo de definio de tipo derivado com componente alocvel :
TYPE STACK
INTEGER :: INDEX
INTEGER,ALLOCATABLE,DIMENSION(:)::CONTENTS
END TYPE STACK
Para cada varivel escalar do tipo STACK a forma (shape) do componente CONTENTS determinado pela
execuo de uma instruo ALLOCATE ou uma instruo de atribuio ou pela associao de argumento.
Nota 4.30
Inicializao default de um componente matricial de forma explcita pode ser especificada por uma expresso de
inicializao de um construtor de matriz (4.7) ou por um escalar que passa a ser o valor para cada elemento da
matriz.
4.5.3.2 Componentes de Ponteiro
4.5.3.2 Pointer components
Um componente um ponteiro (2.4.6) se sua component-attr-spec-list contm um atributo POINTER.
Um componente ponteiro pode ser um ponteiro de dado ou um ponteiro de procedimento.
Nota 4.31
Um exemplo de definio de tipo derivado com um componente ponteiro :
TYPE REFERENCE
INTEGER :: VOLUME, YEAR, PAGE
CHARACTER(LEN=50) :: TITLE
CHARACTER, DIMENSION(:),POINTER:: SYNOPSIS
END TYPE REFERENCE
Qualquer objeto do tipo REFERENCE ter quatro componentes no ponteiro VOLUME, YEAR, PAGE e TITLE
mais um ponteiro para uma matriz do tipo caractere SYNOPSIS. O tamanho deste alvo de matriz ser
determinado pelo comprimento da abstrao. O espao para o alvo (target) pode ser alocado (6.3.1) ou o
componente ponteiro pode ser associado com um alvo por uma instruo de atribuio (7.4.2)
4.5.3.3 Argumento Mudo Objeto passado
4.5.3.3 The passed-object dummy argument
Um argumento mudo objeto passado (passed-object dummy argument) um argumento mudo de um
componente ponteiro de procedimento (procedure pointer) ou procedimento ligado ao tipo (type-bound procedure).
Seu uso produz sobrecarga (overriding) (4.5.6.2) e associao de argumento (12.4.1.1).
Se NOPASS especificado, o componente procedimento ponteiro ou procedimento ligado ao tipo no tem
argumento mudo objeto passado.
Se nem PASS nem NOPASS so especificados ou PASS especificado sem arg-name, o primeiro
argumento mudo do componente ponteiro de procedimento (procedure pointer component) ou procedimento ligado ao
tipo o seu argumento mudo objeto passado.
Se PASS(arg-name) especificado, o argumento mudo denominado arg-name o argumento mudo objeto
passado do componente ponteiro de procedimento (procedure pointer component) ou um procedimento ligado ao tipo
com nome (named type-bound procedure).
C453 O argumento mudo objeto passado tem que ser um escalar, no ponteiro, no objeto de dado no alocvel
com o mesmo tipo declarado que o tipo que est sendo definido; todo os seus parmetros de tipo comprimentos
tem que ser assumidos; ele pode ser polimrfico (5.1.1.2) se e somente se o tipo que est sendo definido
extensvel (4.5.6)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 76
Nota 4.32
Se um procedimento ligado vrios tipos como um procedimento ligado ao tipo (type-bound procedure),
argumentos mudos diferentes tm que ser argumentos mudos objetos passados em diferentes contextos
4.5.3.4 Inicializao default para Componentes
4.5.3.4 Default initialization for components
Inicializao default prov um meio de componentes ponteiros inicializados automaticamente serem
desassociados e componentes ponteiros no alocveis terem um valor particular. Componentes alocveis so
sempre inicializados como no alocados.
Se null-init aparece para um componente ponteiro, este componente em qualquer objeto deste tipo tem
um estado inicial de inicializao desassociado (16.4.2.1) ou se torna desassociado como especificado em
16.4.2.1.2.
Se initialization-expr aparece para um componente no ponteiro este componente em qualquer objeto
deste tipo inicialmente definido (16.5.3) ou se torna definido como especificado em 16.5.5 com o valor
determinado por initialization-expr. Se necessrio, o valor convertido de acordo com as regras de atribuio
intrnseca (7.4.1.3) para um valor que concorda com o tipo, parmetro de tipo e forma do componente. Se o
componente do tipo para o qual inicializao default especificada para o componente, a inicializao default
especificada pelo initialization-expr sobrescreve a inicializao default especificada para o componente.
Quando uma inicializao sobrescreve (overrides) outra isto como se somente a inicializao que sobrescreve
fosse especificada (ver Note 4.34). Inicializao explcita em uma instruo de declarao (5.1) sobrescreve
inicializao default (ver Note 4.33). Diferentemente da inicializao explcita, inicializao default no implica
que o objeto tem o atributo SAVE.
Um subcomponente (subcomponent) (6.1.2) inicializado por default se e somente se o objeto do qual ele
um componente especifica inicializao default para aquele componente e o subcomponente no um subobjeto de
um objeto que inicializado por default ou explicitamente inicializado
Nota 4.33
No requerido que inicializao seja especificada para cada componente de um tipo derivado. Por exemplo:
TYPE DATE
INTEGER :: DAY
CHARACTER(LEN=5):: MONTH
INTEGER :: YEAR=1994 ! inicializao parcial default
END TYPE DATE
No exemplo que segue, o valor inicial default para o componente YEAR componente de TODAY sobrescrita
pela inicializao explcita na instruo de declarao do tipo:
TYPE(DATE),PARAMETER::TODAY=DATE(21,"Feb.",1995)
Nota 4.34
O valor inicial default de um componente tipo derivado pode ser sobrescrito por inicializao default especificada
em uma definio de tipo. Continuando o exemplo da Nota 4.33:
TYPE SINGLE_SCORE
TYPE(DATE) :: PLAY_DAY = TODAY
INTEGER :: SCORE
TYPE(SINGLE_SCORE), POINTER :: NEXT => NULL( )
END TYPE SINGLE_SCORE
TYPE(SINGLE_SCORE) :: SETUP
O componente PLAY_DAY de SETUP recebe seu valor inicial vindo de TODAY sobrescrevendo a inicializao
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 77
do componente YEAR.
Nota 4.35
Matrizes de estruturas podem ser declaradas com elementos que so parcialmente ou totalmente inicializados por
default. Continuando o exemplo da Nota4.34 :
TYPE MEMBER(NAME_LEN)
INTEGER, LEN :: NAME_LEN
CHARACTER(LEN=NAME_LEN) :: NAME = ''
INTEGER :: TEAM_NO, HANDICAP = 0
TYPE (SINGLE_SCORE),POINTER :: HISTORY => NULL( )
END TYPE MEMBER
TYPE(MEMBER(9)) :: LEAGUE (36) ! Matriz de elementos parcialmente inicializados
TYPE(MEMBER(9)) :: ORGANIZER = MEMBER("I. Manage",1,5,NULL ( ))
ORGANIZER inicializado explicitamente, sobrescrevendo a inicializao default de um objeto do tipo
MEMBER.
Objetos alocveis podem tambm se inicializados parcialmente ou totalmente. Por exemplo:
ALLOCATE(ORGANIZER%HISTORY)!um objeto parcialmente inicializado do tipo SINGLE_SCORE criado
Nota 4.36
Um componente ponteiro do tipo derivado pode ter como seu alvo um objeto do mesmo tipo derivado. A definio
do tipo derivado pode especificar que o objeto declarado seja deste mesmo tipo, este tipo de ponteiro
inicializado ou desassociado por default. Por exemplo:
TYPE NODE
INTEGER :: VALUE = 0
TYPE(NODE), POINTER :: NEXT_NODE => NULL( )
END TYPE
Um tipo como este pode ser usado para construir listas conectadas objetos do tipo NODE. Ver C.1.5 para um
exemplo.
4.5.3.5 Ordem dos Componentes
4.5.3.5 Component order
A ordem dos componentes (component order) a ordem dos componentes no raiz (nonparent components)
do tipo derivado; ela usada para entrada/sada intrinsecamente formatada e construtores de estrutura (onde
palavras chaves identificando componentes no so usadas). Componentes raiz (parent components) so excludas da
lista de componentes ordenados de um tipo estendido (4.5.6).
A ordem dos componentes de um tipo no estendido a ordem das declaraes dos componentes na
definio do tipo derivado. A ordem dos componentes de um tipo estendido consiste da ordem dos componentes do
tipo raiz seguido por qualquer componentes adicionais na ordem em que foram declarados na definio do tipo
derivado.
Nota 4.37
Dada a mesma definio de tipo como na Nota 4.25, a ordem do componente do tipo T1 justamente A (s existe
um componente) e a ordem dos componentes do tipo T2 A depois FLAG. O componente raiz (parente component)
(T1) no participa na ordem do componente
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 78
4.5.3.6 Acessibilidade do Componente
4.5.3.6 Component accessibility
R447 private-components-stmt is PRIVATE
C454 (R447) Uma private-components-stmt permitida somente se a definio de tipo est na parte de
especificao do mdulo
A acessibilidade default para um componente que declarado na components-part do tipo particular
(private) se a definio do tipo contm uma private-components-stmt e pblica em caso contrrio. A
acessibilidade de um componente pode ser explicitamente declarada por uma access-spec; caso contrrio sua
acessibilidade default para a definio do tipo na qual ele declarado.
Se o componente particular (private) o nome do componente acessvel somente dentro do mdulo
contendo a definio.
Nota 4.38
Parmetro de tipo no so componentes, eles so sempre pblicos
Nota 4.39
A acessibilidade dos componentes de um tipo independente da acessibilidade do nome do tipo. possvel ter
todas as quatro combinaes: um nome do tipo pblico com componente pblico, nome do tipo particular com
componente particular, um nome do tipo pblico com componente particular e um nome do tipo particular com
componente pblico
Nota 4.40
Um exemplo de um tipo com componentes particulares :

MODULE DEFINITIONS
TYPE POINT
PRIVATE
REAL :: X, Y
END TYPE POINT
END MODULE DEFINITIONS
Este tipo de definio acessvel em qualquer unidade de escopo acessando o mdulo via uma instruo USE;
entretanto os componentes X e Y so acessveis somente dentro do mdulo.
Nota 4.41
O exemplo a seguir ilustra o uso de uma especificao de componente individual (individual component access-spec)
que sobrescreve a acessibilidade default:
TYPE MIXED
PRIVATE
INTEGER:: I
INTEGER,PUBLIC:: J
END TYPE MIXED
TYPE(MIXED):: M
O componente M%J acessvel em qualquer unidade de escopo onde M acessvel; M%I acessvel somente
dentro do mdulo contendo a definio do tipo MIXED.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 79
4.5.4 Procedimentos Ligado ao Tipo
4.5.4 Type-bound procedures
R448 type-bound-procedure-part is contains-stmt
[binding-private-stmt]
proc-binding-stmt
[proc-binding-stmt] ...
R449 binding-private-stmt is PRIVATE
C455 (R448) Uma binding-private-stmt permitido somente se a definio de tipo est na parte de
especificao do mdulo
R450 proc-binding-stmt is specific-binding
or generic-binding
or final-binding
R451 specific-binding is PROCEDURE[(interface-name)]
[[, binding-attr-list]::]
binding-name[=>procedure-name]
C456 (R451) Se => procedure-name aparece, o separador : : (double-colon) tem que aparecer
C457 (R451) Se => procedure-name aparece, interface-name no pode aparecer
C458 (R451) O procedure-name tem que ser o nome de um procedimento mdulo acessvel ou um
procedimento externo que possu uma interface explicita
Se => procedure-name nem o interface-name aparecem, isto como se => procedure-name tivesse aparecido
com o nome do procedimento igual ao nome de ligao (binding name).
R452 generic-binding is GENERIC
[, access-spec] :: generic-spec => binding-name-list
C459 (R452) Dentro da specification-part de um mdulo, cada ligao genrica (generic-binding) tem que
especificar, implicitamente ou explicitamente, a mesma acessibilidade que cada ligao genrica (generic-binding)
com a generic-spec no mesmo tipo derivado
C460 (R452) Cada binding-name na binding-name-list tem que ser o nome de uma ligao especfica
para o tipo
C461 (R452) Se a generic-spec no um generic-name, cada uma das ligaes especficas tem que ter
um argumento mudo objeto passado (4.5.3.3)
C462 (R452) Se a generic-spec OPERATOR (operador definido), a interface de cada ligao tem que ser
especificada como em 12.3.2.1.1
C463 (R452) Se a generic-spec ASSIGNMENT( = ), a interface de cada ligao tem que se especificada
como em 12.3.2.1.2
C464 (R452) Se a generic-spec uma dtio-generic-spec, a interface de cada ligao tem que ser
especificada como especificado em 9.5.3.7. O tipo do argumento dtv tem que ser um type-name
R453 binding-attr is PASS[(arg-name)]
or NOPASS
or NON OVERRIDABLE
or DEFERRED
or access-spec
C465 (R453) A mesma binding-attr no pode aparecer mais de uma vez em uma dada binding-attr-
list
C466 (R451) Se a interface de uma ligao no tem argumento mudo do tipo que est sendo definido, NOPASS
tem que aparecer
C467 (R451) Se PASS(arg-name) aparece, a interface da ligao tem que ter um argumento mudo chamado
arg-name
C468 (R453) PASS e NOPASS no podem aparecer juntos na mesma binding-attr-list
C469 (R453) NON OVERRIDABLE e DEFERRED no podem aparecer juntos na mesma binding-attr-list
C470 (R453) DEFERRED tem que aparecer se e somente se um interface-name aparece
C471 (R451) Uma ligao sobrecarregada (overriding binding) (4.5.6.2) tem que ter o mesmo atributo DEFERRED
somente se a ligao sobrecarregada (overrides) postergada
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 80
C472 (R451) Uma ligao no pode sobrecarregar uma ligao herdada (4.5.6.1) que tem o atributo NON
OVERRIDABLE
Cada ligao em uma proc-binding-stmt especifica um procedimento ligado ao tipo (type-bound
procedure). Um procedimento ligado ao tipo pode ter um argumento mudo objeto passado (passed-object dummy
argument) (4.5.3.3). Uma ligao-genrica (generic-binding) especifica uma interface genrica ligado ao tipo (type-
bound generic interface) para suas ligaes especificadas. Uma ligao que especifica um atributo DEFERRED
uma ligao postegada (deferred binding). Uma ligao postegada s pode aparecer na definio de um tipo abstrato.
Um procedimento ligado ao tipo (type-bound procedure) pode ser identificado por um nome de ligao
(binding name ) no escopo da definio de tipo. Este nome o nome de ligao (binding-name) para uma ligao
especfica e o generic-name para a ligao genrica cuja generic-spec generic-name. Uma ligao final ou uma
ligao genrica cujo generic-spec no um generic-name no tem nome de ligao.
A interface de uma ligao genrica aquela do procedimento especificado pelo procedure-name ou a
interface especificada pelo interface-name.
Nota 4.42
Um exemplo de um tipo e de um procedimento ligado ao tipo (type-bound procedure) :
TYPE POINT
REAL :: X, Y
CONTAINS
PROCEDURE,PASS::LENGTH => POINT_LENGTH
END TYPE POINT
...
e na module-subprogram-part do mesmo mdulo:
REAL FUNCTION POINT_LENGTH (A, B)
CLASS(POINT),INTENT(IN) :: A, B
POINT_LENGTH = SQRT((A%X - B%X)**2 + (A%Y - B%Y)**2)
END FUNCTION POINT_LENGTH
A mesma generic-spec pode ser usada em vrias generic-bindings dentro de uma nica definio de
tipo derivado. Cada generic-binding com a mesma generic-spec estende a interface genrica.
Nota 4.43
Diferentemente da situao com nomes genricos de procedimentos, um nome do procedimento ligado ao tipo
genrico (generic type-bound procedure name) no pode ter o mesmo nome do procedimento ligado ao tipo
especfico no mesmo tipo (16.2)
A acessibilidade default para o procedimento ligado ao tipo particular se a definio do tipo contm uma
binding-private-stmt e pblica caso contrrio. A acessibilidade de um procedimento ligado pode ser
explicitamente declarada por uma access-spec; caso contrrio sua acessibilidade a default para a definio do
tipo na qual ele declarado
Um procedimento ligado ao tipo pblico acessvel via um objeto acessvel do tipo. Um procedimento
ligado ao tipo particular acessvel somente dentro do mdulo contendo a definio de tipo.
Nota 4.44
A acessibilidade de um procedimento ligado ao tipo no afetada por uma instruo PRIVATE na component-
part; a acessibilidade do componente de dado no afetada por uma instruo PRIVATE na type-bound-
procedure-part
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 81
4.5.5 Sub-rotinas Finais
4.5.5 Final subroutines
R454 final-binding is FINAL[::]final-subroutine-name-list
C473 (R454) Um final-subroutine-name tem que ser o nome de um procedimento mdulo com
exatamente um argumento mudo. Este argumento no pode ser opcional e tem que ser um no ponteiro, no
alocvel, varivel no polimrfica do tipo derivado que est sendo definida. Todos os parmetros de tipo
comprimento de um argumento mudo tem que ser assumidos. O argumento mudo no pode ter INTENT(OUT)
C474 (R454) O final-subroutine-name no pode ser um previamente especificado como uma sub-rotina
final para aquele tipo
C475 (R454) Uma sub-rotina final no pode ter um argumento mudo com os mesmos parmetros de subtipo
(kind type parameters) e rank (nmero de dimenses) que o argumento mudo de outra sub-rotina final deste tipo
A palavra-chave FINAL especifica uma lista de sub-rotinas finais (final subroutines). Uma sub-rotina final
pode ser executada quando uma entidade de dado deste tipo finalizada (4.5.5.1).
Um tipo derivado finalizvel (finalizable) se ele tem qualquer sub-rotina final ou qualquer no ponteiro,
componente no alocvel cujo tipo finalizvel. Uma entidade de dado no ponteiro finalizvel se seu tipo
finalizvel.
Nota 4.45
Sub-rotinas finais so efetivamente sempre acessveis. Elas so chamadas para entidades finais
independentemente da acessibilidade do tipo, seus outros procedimento ligado ao tipo ou do nome da sub-rotina
que tem
Nota 4.46
Sub-rotinas finais no so herdadas atravs de extenso de tipo e no podem ser sobrecarregadas (overridden). As
sub-rotinas finais de um tipo raiz (parent type) so chamadas depois de quaisquer sub-rotinas finais adicionais
terem sido chamadas
4.5.5.1 Processo de Finalizao
4.5.5.1 The finalization process
Somente entidades finalizveis so finalizadas. Quando uma entidade finalizada (finalized), os seguintes
passos so realizados em sequncia:
1. se um tipo dinmico de uma entidade tem uma sub-rotina final cujo argumento mudo tem os mesmos
parmetro de subtipo (kind type parameters) e rank (nmero de dimenses) que a entidade que est sendo
finalizada, ela chamada com a entidade como argumento real. Caso contrrio, se existe uma sub-rotina
final elementar cujo argumento mudo tem o mesmo parmetro de subtipo (kind type parameters) que a
entidade sendo finalizada, ela chamada com a entidade como argumento real. Caso contrrio, nenhuma
sub-rotina chamada neste ponto
2. Cada componente finalizvel que aparece em uma definio de tipo finalizada. Se a entidade que est
sendo finalizada uma matriz, cada componente finalizvel de cada elemento desta entidade finalizada
separadamente
3. se a entidade do tipo extensvel e o tipo raiz (parent type) finalizvel, o componente raiz finalizado
Se vrias entidades so para serem finalizadas como consequncia de um evento especificado em 4.5.5.2, a
ordem na qual eles so finalizados dependente do processador. Uma sub-rotina final no pode ser referenciar ou
definir um objeto que j foi finalizado.
Se um objeto no est finalizado, ele retm seus estados de definio e no se torna indefinido.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 82
4.5.5.2 Quando Finalizao Ocorre
4.5.5.2 When finalization occurs
Quando um ponteiro desalocado (deallocated) seu alvo finalizado. Quando uma entidade alocvel
desalocada, ela finalizada.
Um objeto no ponteiro, no alocvel que no um argumento mudo ou resultado de funo finalizado
imediatamente antes que possa se tornar indefinido devido a execuo da instruo RETURN ou END (16.5.6, item
(3)). Se o objeto definido em um mdulo e no h mais quaisquer procedimentos ativos referenciando o mdulo,
dependente do processador se ele finalizado.
Se uma construo executvel referencia uma funo, o resultado finalizado depois da execuo das
construes mais internas contendo a referncia.
Se uma construo executvel referencia um construtor de estrutura, a entidade criada pelo construtor de
estrutura finalizada depois da execuo das construes mais internas contendo a referncia.
Se uma expresso de especificao em uma unidade de escopo refere-se a uma funo, o resultado
finalizado antes da execuo da primeira instruo executvel na unidade de escopo.
Quando o procedimento invocado, um objeto no ponteiro, no alocvel que um argumento real
associado com um argumento mudo INTENT(OUT) finalizado.
Quando uma instruo de atribuio intrnseca executada, varivel finalizada depois da avaliao de
expr e antes da definio da varivel.
Nota 4.47
Se a finalizao usada para manejar armazenamento, ela frequentemente necessita ser combinada com uma
atribuio definida
Se um objeto alocado via uma alocao de ponteiro e depois se torna incansvel devido a todos os
ponteiros daquele objeto terem seus estado de associao mudados, dependente do processador (processor
dependent) se ele finalizado. Se ele finalizado, dependente do processador quando as sub-rotinas finais so
chamadas.
4.5.5.3 Entidades que no foram Finalizadas
4.5.5.3 Entities that are not finalized
Se a execuo de um programa terminada, por um erro (ex., falha de alocao) ou pela execuo da
instruo STOP ou END PROGRAM, entidades existindo imediatamente antes do trmino no so finalizadas.
Nota 4.48
Um objeto no ponteiro, no alocvel que tem o atributo SAVE ou que ocorre em um programa principal nunca
finalizada como consequncia direta de uma instruo RETURN ou END.
Uma varivel em um mdulo no finalizada se ela mantm sua definio e valor, mesmo quando no h
procedimento ativo referenciando o mdulo
4.5.6 Extenso de Tipo
4.5.6 Type extension
Um tipo derivado no sequncia que no tem o atributo BIND um tipo extensvel (extensible type).
Um tipo extensvel que no tem o atributo EXTENDS um tipo base (base type). Um tipo que tem o
atributo EXTENDS um tipo extensvel (extended type). O tipo raiz (parent type) de um tipo extensvel o tipo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 83
nomeado na especificao do atributo EXTENDS.
Nota 4.49
O nome do tipo raiz (parent type) pode ser um nome local introduzido via renomeao em uma instruo USE
Um tipo base (base type) um tipo estendido (extension type) somente de si prprio. Um tipo estendido
uma extenso de si prprio e de todos os tipos para os quais seu tipo raiz uma extenso.
Um tipo abstrato um tipo que tem o atributo ABSTRACT.
Nota 4.50
Uma ligao postegada (4.5.4) postega a implementao do procedimentos ligado ao tipo (type-bound procedures)
que estende o tipo; ela s pode aparecer em um tipo abstrato. O tipo dinmico de um objeto no pode abstrato;
portanto, uma ligao postegada no pode ser invocada. Uma extenso de um tipo abstrato no necessita ser
abstrata se ela no tem ligaes postegadas. Um pequeno exemplo de um tipo abstrato :
TYPE, ABSTRACT :: FILE_HANDLE
CONTAINS
PROCEDURE(OPEN_FILE), DEFERRED, PASS(HANDLE) :: OPEN
...
END TYPE
Para um mais elaborado veja C.1.4
4.5.6.1 Herana
4.5.6.1 Inheritance
Um tipo estendido inclu todos os parmetros de tipo, todos os componentes e procedimentos no finais
no sobrecarregveis (4.5.6.2) ligados ao seu tipo raiz. Eles so ditos herdados (inherited) pela extenso do tipo
raiz. Eles mantm todos os atributos existentes no tipo raiz. Adicionalmente, os parmetros de tipo, componentes e
procedimentos ligados podem ser declarados em uma definio de tipo derivado de um tipo extensvel.
Nota 4.51
Componentes inacessveis e ligados ao tipo raiz so tambm herdados, mas eles mantem-se inacessveis no tipo
estendido, Entidades inacessveis ocorrem se o tipo que est sendo estendido acessado via associao de uso e
tem uma entidade particular
Nota 4.52
Um tipo base no requerido ter quaisquer componentes, ligaes ou parmetros; um tipo extensvel no tem que
ter mais componentes, ligaes ou parmetros que seu tipo raiz
Um tipo extensvel tem um componente raiz escalar, no ponteiro, no alocvel com o tipo e parmetros de
tipo do tipo raiz. O nome deste componente o nome do tipo raiz. Ele tem a acessibilidade do tipo raiz.
Componentes do componente raiz so associados por herana (16.4.4) com os componentes correspondentes
herdados do tipo raiz. Um componente ancestral de um tipo o componente raiz do tipo ou um componente
ancestral do componente raiz.
Nota 4.53
Um componente ou parmetro de tipo declarado em um tipo extensvel no pode ter o mesmo nome que qualquer
componente acessvel ou parmetro de tipo de seu tipo raiz
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 84
Nota 4.54
Exemplos:
TYPE POINT ! um tipo base
REAL :: X, Y
END TYPE POINT
TYPE, EXTENDS(POINT) :: COLOR_POINT ! uma extenso de TYPE(POINT)
! componentes X e Y e componentes nome POINT herdados do raiz
INTEGER :: COLOR
END TYPE COLOR_POINT
4.5.6.2 Sobrecarga de Procedimento Ligado ao Tipo
4.5.6.2 Type-bound procedure overriding
overriding sobrecarga
Se uma ligao no genrica especificada em uma definio de tipo tem o mesmo nome que a ligao num
tipo raiz ento a ligao especificada na definio de tipo sobrecarrega (overrides) aquela do tipo raiz.
A ligao que sobrecarrega e a ligao que foi sobrecarregada tem que satisfazer as seguintes condies:
1. as duas tem que ter um argumento mudo objeto passado ou nenhuma pode ter
2. se a ligao sobrecarregada pura a ligao sobrecarregada tambm tem que ser pura
3. ambas tem que ser elementar ou nenhuma delas
4. elas tem que ter o mesma nmero de argumentos mudos
5. argumentos mudos objeto passado, se existir, tem que corresponder em nome e posio
6. argumentos mudos que corresponde por posio tem que ter os mesmos nomes e caratersticas, exceto
para os tipo argumentos mudos objeto passado
7. ambas tm que ser sub-rotinas ou ambas tem que ser funes que possuem as mesmas caractersticas no
resultado (12.2.2)
8. se a ligao sobrecarregada PUBLIC ento a ligao sobrecarregada no pode ser PRIVATE
Nota 4.55
O que segue um exemplo de sobrecarga de procedimento, expandindo o exemplo da nota 4.42
TYPE, EXTENDS(POINT) :: POINT_3D
REAL :: Z
CONTAINS
PROCEDURE, PASS :: LENGTH => POINT_3D_LENGTH
END TYPE POINT_3D
...
e na module-subprogram-part do mesmo mdulo
REAL FUNCTION POINT_3D_LENGTH( A, B )
CLASS(POINT_3D), INTENT(IN) :: A
CLASS(POINT), INTENT(IN) :: B
SELECT TYPE(B)
CLASS IS(POINT_3D)
POINT_3D_LENGTH = SQRT( (A%X-B%X)**2 + (A%Y-B%Y)**2 + (A%Z-B%Z)**2 )
RETURN
END SELECT
PRINT*, In POINT_3D_LENGTH, dynamic type of argument is incorrect.
STOP
END FUNCTION POINT_3D_LENGTH
Se uma ligao genrica (generic binding) especificada em uma definio de tipo derivado tem a mesma
generic-spec que em uma ligao herdada, ela estende a interface genrica e tem que satisfazer os requerimentos
especificados em 16.2.3.
Se uma ligao genrica em uma definio de tipo tem a mesma dtio-generic-spec que aquela herdada
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 85
de uma raiz, ela estende a interface genrica ligado ao tipo (type-bound generic interface) para a dtio-generic-spec
e tem que satisfazer os requerimentos especificados em 16.2.3.
Uma ligao de um tipo e uma ligao de uma extenso deste tipo so ditas corresponderem se uma ligao
posterior a mesma ligao que a anterior, sobrecarrega a ligao correspondente ou uma ligao correspondente
herdada.
4.5.7 Valores Tipo Derivado
4.5.7 Derived-type values
Um valor para um componente (component value) de
1. um componente de ponteiro sua associao ponteiro
2. um componente alocvel seu estado de alocao e, se ele alocado, seu tipo dinmico e parmetros de
tipo e valores
3. um componente no alocvel no ponteiro seu valor
O conjunto de valores de um tipo derivado particular consiste de todas as possibilidade dos valores de seus
componentes.
4.5.8 Especificador de Tipo Derivado
4.5.8 Derived-type specifier
Um especificador de tipo derivado usado em vrios contextos para especificar um tipo derivado particular
e parmetros de tipo
R455 derived-type-spec is type-name[(type-param-spec-list)]
R456 type-param-spec is [keyword=]type-param-value
C476 (R455) Um type-name tem que ser o nome de um tipo derivado acessvel
C477 (R455) Uma type-param-spec-list s pode aparecer se o tipo parametrizado
C478 (R455) Tem que existir ao menos uma type-param-spec correspondendo a cada parmetro do tipo. Se
o parmetro de tipo no possu um valor default, tem que existir uma type-param-spec correspondendo a este
parmetro de tipo
C479 (R456) A keyword= pode ser omitida em uma type-param-spec somente se a keyword= foi omitida
em cada type-param-spec precedente na type-param-spec-list
C480 (R456) Cada palavra-chave tem que ser o nome de um parmetro de tipo
C481 (R456) Um asterisco pode ser usado como um type-param-value em uma type-param-spec
somente na declarao de um argumento mudo ou nome associado na alocao de um argumento mudo
Valores de parmetros de tipo que no possu especificadores de palavra-chave de parmetro de tipo
corresponde a parmetro de tipo na ordem dos parmetros de tipo ((4.5.2.1). Se uma palavra-chave parmetro de
tipo (type parameter keyword) est presente, o valor atribudo ao parmetro de tipo nomeado pela palavra-chave. Se
necessrio, o valor convertido pela regra de atribuio intrnseca (7.4.1.3) para um valor do mesmo subtipo ( kind)
que o parmetro de tipo.
O valor de um parmetro de tipo para o qual nenhum type-param-value foi especificado seu valor
default.
4.5.9 Construo de Valores do Tipo Derivado
4.5.9 Construction of derived-type values
A definio de tipo derivado define um construtor de estrutura (structure constructor) correspondente
que permite construir valores (entrar valores construction of values) para este tipo derivado. O tipo e parmetro de
tipo de um valor construdo (constructed value) so especificados por um especificador de tipo derivado
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 86
R457 structure-constructor is derived-type-spec([component-spec-list])
R458 component-spec is [keyword=]component-data-source
R459 component-data-source is expr
or data-target
or proc-target
C482 (R457) Uma derived-type-spec no pode especificar um tipo abstrato (4.5.6)
C483 (R457) No mximo uma component-spec tem que ser provido para um componente
C484 (R457) Se uma component-spec provida para um componente, nenhuma component-spec pode ser
usada para qualquer componente para o qual ela associao por herana
C485 (R457) Uma component-spec tem que ser provido para um componente a menos que ele possua
inicializao default ou associao herdada de outro componente com uma component-spec ou que tenha
inicializao default
C486 (R458) A keyword= pode ser omitida da component-spec somente se a keyword= foi omitida em cada
component-spec precedente no construtor
C487 (R458) Cada palavra-chave tem que ser o nome de um componente do tipo
C488 (R457) O nome do tipo e todos os componentes do tipo para o qual uma component-spec aparece tem
que ser acessvel em uma unidade de escopo contendo o construtor de estrutura
C489 (R457) Se a derived-type-spec um nome de tipo que o mesmo que um nome genrico, a
component- spec-list no pode ser uma actual-arg-spec-list vlida para a referncia da funo que
resolvida como uma referncia genrica (12.4.4.1)
C490 (R459) Um data-target tem que corresponder a um componente ponteiro no procedimento; um
proc-target corresponde a um componente ponteiro de procedimento
C491 (R459) Um data-target tem que ter o mesmo nmero de dimenses (rank) que seu componente
correspondente
Nota 4.56
A forma name(...) interpretada como uma referncia de funo genrica (generic function-reference) se possvel;
ela interpretada como um construtor de estrutura somente se ela no puder ser interpretada como uma referncia
de funo genrica.
Na ausncia de uma palavra-chave do componente, cada component-data-source atribudo ao
correspondente componente na ordem dos componentes (4.5.3.5). Se a palavra-chave de um componente aparece, a
expr atribuda ao componente nomeado pela palavra-chave. Para um componente no ponteiro, o tipo declarado e
parmetros de tipo do componente e expr tem que ser conforme da mesma maneira para um avarivel e expr em
uma instruo de atribuio intrnseca (7.4.1.2), como especificado na Tabela 7.8. Se necessrio, cada valor valor
do tipo intrnseco convertido de acordo com as regras de atribuio intrnseca (7.4.1.3) para um valor que
concorda em tipo e parmetros de tipo com o componente correspondente do tipo derivado. Para um componente
no ponteiro no alocvel, a forma da expresso tem que ser conforma com a forma do componente.
Se um componente com inicializao default no tem correspondente component-data-source, ento a
inicializao aplicada a este componente.
Nota 4.57
Porque componentes razes (no parent components) no aparece na ordem dos componentes, um valor para um
componente raiz (parent component) pode ser especificado somente com a palavra-chave do componente. Exemplo
de valores equivalentes usando tipos definidos na Nota 4.54:
! Cria valores com componentes x = 1.0, y = 2.0, color = 3.
TYPE(POINT):: PV = POINT(1.0, 2.0) ! assume que componentes do tipo TYPE(POINT)
! so acessveis aqui
...
COLOR_POINT( point=point(1,2), color=3) ! valor para componente raiz
COLOR_POINT( point=PV, color=3) ! disponveis mesmo que TYPE(point)
! tenha componentes particulares
COLOR_POINT( 1, 2, 3) ! Todos os componentes TYPE(point)
! necessitam ser acessveis
Um construtor de estrutura no pode aparecer antes do tipo referenciado ser definido.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 87
Nota 4.58
Este exemplo ilustra uma expresso constante do tipo derivado usando i, tipo derivado definido na Nota 4.17:
PERSON (21, JOHN SMITH)
Isto pode ser escrito como:
PERSON (NAME=JOHN SMITH, AGE=21)
Nota 4.59
Um exemplo de construtor usando um tipo derivado GENERAL POINT definido na Nota 4.24
general_point(dim=3)( (/ 1., 2., 3. /) )
Para um componente ponteiro, o correspondente component-data-source tem que ser um data-target
possvel ou um proc-target para este ponteiro em uma instruo de atribuio de ponteiro (7.4.2). Se o
componente que a fonte do dado (component data source ) um ponteiro, a associao do componente a deste
ponteiro; caso contrrio, o componente associado pelo ponteiro (pointer associated) com o componente que a
fonte do dado.
Nota 4.60
Por exemplo, se a varivel TEXT foi declarada (5.1) ser
CHARACTER, DIMENSION(1:400), TARGET :: TEXT
e BIBLIO foi declarada usando a definio de tipo derivado REFERENCE na Nota 4.31
TYPE(REFERENCE) :: BIBLIO
a instruo
BIBLIO = REFERENCE(1, 1987, 1, "This is the title of the referenced paper", TEXT)
vlida e associa o componente ponteiro SYNOPSIS do objeto BIBLIO com o objeto alvo TEXT.
Se um componente de um tipo derivado alocvel, a expresso construtora correspondente tem que ser
uma referncia a uma funo intrnseca NULL sem argumento, uma entidade alocvel de mesmo rank (nmero de
dimenses) ou tem que ser avaliada para uma entidade de mesmo rank. Se a expresso uma referncia funo
intrnseca NULL, o componente correspondente do construtor tem um estado de no alocado. Se a expresso uma
entidade alocvel, o componente correspondente do construtor tem o mesmo estado de alocao daquela entidade
alocvel e, se ele alocvel, o mesmo tipo dinmico, limites e valor; se o parmetro de comprimento do
componente postergado, seu valor o mesmo do correspondente parmetro da expresso. Caso contrrio, o
componente correspondente do construtor tem um estado de alocao de alocado e tem os mesmos limites e valor
que a expresso.
Nota 4.61
Quando o construtor um argumento real (actual argument) o estado de alocao do componente alocvel
disponvel atravs do argumento mudo associado.
4.5.10 Atribuio e Operaes com Tipo Derivado
4.5.10 Derived-type operations and assignment
Atribuio intrnseca de entidades do tipo derivado descrito em 7.4.1. O Fortran no especifica qualquer
operao intrnseca sobre entidades do tipo derivado. Qualquer operao intrnseca sobre entidades do tipo
derivado ou atribuio definida (7.4.1.4) para entidade de tipo derivado tem que ser definida explicitamente por
uma funo ou uma sub-rotina e uma interface genrica (4.5.1, 12.3.2.1).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 88
4.6 Enumerao e Enumeradores
4.6 Enumerations and enumerators
Uma enumerao (enumeration) um conjunto de enumeradores (enumerators). Um enumerador uma
constante inteira com nome (named integer constant). Uma definio de enumerao especifica a enumerao e seu
conjunto de enumeradores com subtipo inteiro correspondente.
R460 enum-def is enum-def-stmt
enumerator-def-stmt
[enumerator-def-stmt] ...
end-enum-stmt
R461 enum-def-stmt is ENUM, BIND(C)
R462 enumerator-def-stmt is ENUMERATOR[::]enumerator-list
R463 enumerator is named-constant[=scalar-int-initialization-expr]
R464 end-enum-stmt is END ENUM
C492 (R462) Se = aparece em um enumerador, um separador : : (double-colon) tem que aparecer antes da
enumerator-list
Para um enumerao, o tipo selecionado tal que um tipo inteiro daquele subtipo (kind) interopervel
(interoperable) (15.2.1) com o tipo enumerador correspondente C.
O tipo enumerao C correspondente o tipo que ser declarado em um especificador enumerao C
(6.7.2.2 do padro C) que especifica enumerao C constantes com os mesmos valores que aqueles especificados
por uma enum-def, na mesma ordem que especificado na enum-def.
Uma processador associado (companion processor) (2.5.10) tem que ser um que usa a mesma representao
para os tipos declarados por todas os especificadores enumerao C que especificam os mesmos valores na mesma
ordem.
Nota 4.62
Se um processador associado usada um tipo sem sinal (unsigned type) para representar um dados tipo enumerao,
o processador Fortran ir usar o tipo inteiro sinalizado de mesmo comprimento para o enumerador, mesmo que
alguns valores do enumerador no possam ser representados neste tipo inteiro com sinal. Os valores de qualquer
destes enumeradores sero interoperveis com os valores declarados no enumerador C
Nota 4.63
O padro C garante que constantes enumerao ajustam-se em um int C ((6.7.2.2 do padro C). Portanto, o
processador Fortran pode calcular todos os valores do enumerador usando tipo inteiro com o parmetro de subtipo
(kind parameter) C_INT e ento determinar o tipo inteiro que interopervel com o tipo enumerador C
correspondentes
Nota 4.64
O padro C especifica que dois tipos enumerao so compatveis somente se eles especificam constantes
enumerao com os mesmos nomes e mesmos valores na mesma ordem. Este padro tambm requer que o
processador C que ser o processador associado (companion processor) do processador Fortran use a mesma
representao para dois tipos enumerao se ambos especificam enumerao constantes com os mesmos valores
na mesma ordem, mesmo que os nomes sejam diferentes
Um enumerador tratado como se fosse explicitamente declarado com o atributo PARAMETER. O
enumerador definido de acordo com as regras de atribuio intrnseca (7.4) com os valores determinado como
segue:
1. se uma scalar-int-initialization-expr especificada, o valor do enumerador o resultado da
scalar-int-initialization-expr
2. se a scalar-int-initialization-expr no especificada e o enumerador o primeiro enumerador na
enum-def, o enumerador tem o valor 0
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 89
3. se a scalar-int-initialization-expr no especificadas e o enumerador no o primeiro enumerador
na enum-def, seu valor o resultado da adio de 1 ao valor do enumerador que imediatamente precede ele
na enum-def
Nota 4.65
Um exemplo de definio de enumerao :
ENUM, BIND(C)
ENUMERATOR :: RED = 4, BLUE = 9
ENUMERATOR YELLOW
END ENUM
O parmetro de subtipo (kind type parameter) para este enumerador dependente do processador, mas o
processador requerido selecionar um subtipo (kind) suficiente para representar os valores 4, 9 e 10 que so os
valores de seus enumeradores. As declaraes que seguem podem ser equivalentes a definio do enumerador
acima.
INTEGER(SELECTED_INT_KIND(2)), PARAMETER :: RED = 4, BLUE = 9, YELLOW = 10
Uma entidade de mesmo valor de parmetro de subtipo (kind type parameter) pode ser declarada usando a funo
intrnseca KIND com um dos enumeradores como seu argumento, por exemplo:
INTEGER(KIND(RED)) :: X
Nota 4.66
No h diferena no efeito de declarar o enumerador em uma declarao mltipla ENUMERATOR ou em uma
instruo nica ENUMERATOR. A ordem na qual o enumerador em uma definio de enumerao so
declaradas significante, mas o nmero de instrues ENUMERATOR no
4.7 Construo de Valores da Matriz
4.7 Construction of array values
Um construtor de matriz (array constructor) definido para uma sequncia de valores escalares e
interpretado como uma matriz unidimensional (rank-one array) onde os valores dos elementos so aqueles
especificados na sequncia.
R465 array-constructor is (/ ac-spec /)
or left-square-bracket ac-spec right-square-bracket
R466 ac-spec is type-spec ::
or [type-spec ::] ac-value-list
R467 left-square-bracket is [
R468 right-square-bracket is ]
R469 ac-value is expr
or ac-implied-do
R470 ac-implied-do is ( ac-value-list , ac-implied-do-control )
R471 ac-implied-do-control is ac-do-variable = scalar-int-expr , scalar-int-expr
[, scalar-int-expr]
R472 ac-do-variable is scalar-int-variable
C493 (R472) ac-do-variable tem que ser uma varivel com nome
C494 (R466) Se type-spec omitido, cada expresso ac-value no array-constructor tem que ter
mesmo tipo e parmetros de tipo subtipo (kind type parameters)
C495 (R466) Se type-spec especifica um tipo intrnseco, cada expresso ac-value no array-
constructor tem que ser um tipo intrnseco que conforme em tipo com a varivel do tipo type-spec como
especificado na tabela 7.8
C496 (R466) Se type-spec especifica um tipo derivado, todas as expresses ac-value no construtor de
matriz tem que ser deste tipo derivado e tem que ter o mesmo parmetro de tipo subtipo (kind type parameters) que
foi especificado por type-spec
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 90
C497 (R470) A ac-do-variable de um ac-implied-do que outro ac-implied-do no pode aparecer
como um ac-do-variable de um ac-implied-do
Se type-spec omitido, o tipo e parmetros de tipo do construtor de matriz so aqueles da expresso ac-
value.
Se type-spec aparece, ele especifica o tipo e parmetros de tipo do construtor de matriz. Cada expresso
ac-value no construtor de matriz tem que ser compatvel com a atribuio intrnseca para uma varivel deste tipo
e parmetros de tipo. Cada valor convertido para os parmetros de tipo do construtor de matriz de acordo com as
regras de atribuio intrnseca (7.4.1.3).
O comprimento de caractere de um valor ac-value em um ac-implied-do cujo contador de iterao
zero, no pode depender do valor da ac-do-variable e no pode depender do valor de uma expresso que no
seja uma expresso de inicializao .
Se o ac-value uma expresso escalar, seu valor especifica um elemento do construtor de matriz. Se o
ac-value uma expresso matricial, os valores da expresso, na ordem dos elementos da matriz (6.2.2.2),
especifica a sequncia correspondendo aos elementos do construtor de matriz. Se o ac-value um ac-implied-
do, ele expandido para formar uma sequncia de elementos sobre controle da ac-do-variable, como em um
construtor DO (8.1.6.4).
Para um ac-implied-do, o a inicializao do loop e execuo o mesmo para o construtor DO.
Uma sequncia vazia forma uma matriz unidimensional de tamanho zero.
Nota 4.67
Uma matriz unidimensional pode ser reformatada (reshaped mudada sua forma) em qualquer matriz que tenha sua
forma (shape) definida previamente, usando a funo intrnseca RESHAPE (13.7.99). Um exemplo :
X = (/ 3.2, 4.01, 6.5 /)
Y = RESHAPE (SOURCE = [ 2.0, [ 4.5, 4.5 ], X ], SHAPE = [ 3, 2 ])
Isto resulta em Y sendo uma matriz 3 2 com valores:
2.0 3.2
4.5 4.01
4.5 6.5
Nota 4.68
Exemplos de construtor de matrizes contendo DO implcito so:
(/ (I, I = 1, 1075) /)
e
[ 3.6, (3.6 / I, I = 1, N) ]
Nota 4.69
Usando o tipo definido por PERSON na Nota 4.17 um exemplo de construo de uma matriz tipo derivado :
(/ PERSON (40, SMITH), PERSON (20, JONES) /)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 91
Nota 4.70
Usando a definio de tipo derivado LINE na Nota 4.28, um exemplo de construo com valor escalar tipo
derivado com componentes de uma matriz de rank 2 (nmero de dimenses 2) :
LINE(RESHAPE((/ 0.0, 0.0, 1.0, 2.0 /),(/ 2, 2 /)), 0.1, 1)
A funo intrnseca RESHAPE usada para construir um valor que representa uma linha slida de (0, 0) at (1, 2)
de largura 0.1 centmetros.
Nota 4.71
Exemplo de um construtor de matriz de tamanho zero so:
(/ INTEGER :: /)
(/ ( I, I = 1, 0) /)
Nota 4.72
Um exemplo de um construtor de matriz que especifica um parmetro de tipo comprimento:
(/ CHARACTER(LEN=7) :: Takata, Tanaka, Hayashi /)
Neste construtor, sem a especificao de tipo, seria necessrio especificar todas as constantes com o mesmo
comprimento caractere.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 92
5. Declarao e Especificaes de Objeto de Dados
Section 5: Data object declaration and specifications
Cada objeto de dado tem um tipo e um rank (nmero de dimenses) e pode ter parmetros de tipo e outros
atributos que determina o uso do objeto. Coletivamente, estas propriedades so os atributos (attributes) do objeto.
O tipo de um objeto com nome (objeto identificado por um nome) especificado explicitamente em uma instruo de
especificao de tipo ou determinado implicitamente pela primeira letra do seu nome (5.3). Todos estes atributos
podem ser includos em uma instruo de especificao ou pode ser especificado individualmente em uma
instruo separada de especificao.
Nota 5.1
Por exemplo:
INTEGER :: INCOME, EXPENDITURE
declara dois objetos de dados nomeados INCOME e EXPENDITURE como sendo do tipo inteiro.
REAL, DIMENSION (-5:+5) :: X, Y, Z
declara trs objetos de dados com os nomes X, Y e Z. Todos eles so do tipo real default e so tem sua forma
explicitamente declaradas, sendo matrizes de rank um (matrizes unidimensionais) com o limite inferior em 5 e
limite superior em +5 e portanto tm tamanhos iguais a 11.
5.1 Instrues de Declarao de Tipo
5.1 Type declaration statements
R501type-declaration-stmt is declaration-type-spec[[,attr-spec]...:]entity-decl-list
R502 declaration-type-spec is intrinsic-type-spec
or TYPE( derived-type-spec )
or CLASS( derived-type-spec )
or CLASS( * )
C501 (R502) Em uma declaration-type-spec cada type-param-value que no um dois pontos (colon)
ou um asterisco tem que ser uma specification-expr
C502 (R502) Em uma declaration-type-spec que usa a palavra-chave CLASS, derived-type-spec
especifica um tipo extensvel
Nota 5.2
A declaration-type-spec usada em uma instruo no executvel; uma type-spec usada em um
construtor de matriz, um construtor SELECT TYPE ou uma instruo ALLOCATE.
C503 (R502) O TYPE(derived-type-spec) no pode especificar um tipo abstrato (4.5.6)
R503 attr-spec is access-spec
or ALLOCATABLE
or ASYNCHRONOUS
or DIMENSION ( array-spec )
or EXTERNAL
or INTENT ( intent-spec )
or INTENT ( intent-spec )
or INTRINSIC
or language-binding-spec
or OPTIONAL
or PARAMETER
or POINTER
or PROTECTED
or SAVE
or TARGET
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 93
or VALUE
or VOLATILE
R504 entity-decl is object-name[(array-spec)][*char-length][initialization]
or function-name[*char-length]
C504 (R504) Se um type-param-value em um char-length em um entity-decl no um dois pontos
(colon) ou um asterisco, ele tem que se uma specification-expr
R505 object-name is name
C505 (R505) O object-name tem que ser o nome de um objeto de dado
R506 initialization is = initialization-expr
or => null-init
R507 null-init is function-reference
C506 (R507) A function-reference tem que ser uma referncia da funo intrnseca NULL sem argumentos
C507 (R501) O mesmo attr-spec no pode aparecer mais de uma vez em uma dada type-declaration-
stmt
C508 Uma entidade no pode explicitamente usar qualquer atributo mais de uma vez em uma unidade de escopo
C509 (R501) Uma entidade declarada com a palavra-chave CLASS tem que ser um argumento mudo ou ter o
atributo ALLOCATABLE ou POINTER
C510 (R501) Uma matriz que tem o atributo POINTER ou ALLOCATABLE tem que ser especificada com um
array-spec que uma deferred-shape-spec-list (5.1.2.5.3)
C511 (R501) Uma array-spec para um object-name que um resultado de funo que no tem o atributo
ALLOCATABLE ou POINTER tem que ter uma explicit-shape-spec-list
C512 (R501) Se um atributo POINTER especificado, o atributo ALLOCATABLE, TARGET, EXTERNAL ou
INTRINSIC no pode ser especificado
C513 (R501) Se o atributo TARGET especificado, o atributo POINTER, EXTERNAL, INTRINSIC ou PARAMETER
no pode ser especificado
C514 (R501) O atributo PARAMETER no pode ser especificado em um argumento mudo, um ponteiro, uma
entidade alocvel, uma funo ou um objeto em um bloco comum
C515 (R501) Os atributos INTENT, VALUE e OPTIONAL s podem ser especificado argumentos mudos
C516 (R501) O atributo INTENT no pode especificar um procedimento mudo sem um atributo ponteiro
C517 (R501) O atributo SAVE no pode ser especificado para um objeto que est em um bloco comum, um
argumento mudo, um procedimento, um resultado de funo um objeto de dado automtico ou um objeto com o
atributo PARAMETER
C518 Uma entidade no pode ter o atributo EXTERNAL e INTRINSIC ao mesmo tempo
C519 (R501) Uma entidade em um entity-decl-list no pode ter um atributo EXTERNAL ou INTRINSIC
especificado amenos que seja uma funo
C520 (R504) A opo *char-length permitida somente se o tipo especificado do tipo caractere
C521 (R504) A function-name tem que ser o nome de uma funo externa, uma funo intrnseca, uma
funo procedimento mudo ou uma funo instruo
C522 (R501) A inicializao pode aparecer se a instruo contm um atributo PARAMETER (5.1.2.10)
C523 (R501) Se inicializao aparece, um separador : : tem que ser usado antes da entity-decl-list
C524 (R504) Inicializao no pode aparece se object-name um argumento mudo, um resultado de funo,
um objeto em uma bloco comum com nome (named common block) amenos que a declarao de tipo esteja em
uma unidade de programa dados em bloco, um objeto em um comum sem nome, uma varivel alocvel, um nome
esterno, um nome intrnseco ou um objeto automtico
C525 (R504) Se => aparece em uma inicializao, o objeto tem que ter o atributo POINTER. Se = aparece em
uma inicializao, o objeto no pode ter o atributo POINTER
C526 (R501) Se o atributo VOLATILE especificado, o atributo PARAMETER, INTRINSIC, EXTERNAL ou
INTENT(IN) no pode se especificado
C527 (R501) Se o atributo VALUE especificado o atributo PARAMETER, EXTERNAL, POINTER,
ALLOCATABLE, DIMENSION, VOLATILE, INTENT(INOUT) ou INTENT(OUT) no pode se especificado
C528 (R501) Se o atributo VALUE especificado para um argumento mudo do tipo caractere, o parmetro de
comprimento pode ser omitido ou pode ser especificado por uma expresso de inicializao com o valor um
C529 (R501) O atributo VALUE no pode ser especificado para um procedimento mudo
C530 (R501) O atributo ALLOCATABLE, POINTER ou OPTIONAL no pode ser especificado para um
procedimento mudo de um procedimento que tem uma proc-language-binding-spec
C531 (R503) Uma language-binding-spec s pode aparecer em uma parte de especificao de um mdulo
C532 (R501) Se uma language-binding-spec especificada, a entidade declarada pode ser uma varivel
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 94
interopervel (15.2)
C533 (R501) Se uma language-binding-spec com um especificador NAME= aparece, a entity-decl-
list tem que consistir de um nica entity-decl
C534 (R503) O atributo PROTECTED permitido somente na parte de especificao de um mdulo
C535 (R501) O atributo PROTECTED permitido somente para um procedimento ponteiro ou varivel com
nome que no esteja em um bloco comum
C536 (R501) Se o atributo PROTECTED especificado, o atributo EXTERNAL, INTRINSIC ou PARAMETER no
pode ser especificado
C537 Um objeto no ponteiro que tem o atributo PROTECTED e acessado por uma associao de uso no pode
aparecer em um contexto de definio de varivel (16.5.7) ou como um data-target ou proc-target em uma
pointer-assignment-stmt
C538 Um objeto ponteiro que tem o atributo PROTECTED e acessada por uma associao de uso no pode
aparecer como
(1) um pointer-object em uma pointer-assignment-stmt ou nullify-stmt
(2) um allocate-object em uma allocate-stmt ou deallocate-stmt
(3) um argumento real em uma referncia a um procedimento se o argumento mudo associado um ponteiro com
o atributo INTENT(OUT) ou INTENT(INOUT)
Um nome que identifica uma funo intrnseca em uma unidade de escopo tem o tipo como especificado
em 13.6. Uma instruo de declarao de tipo explcita no requerida; entretanto, ela permitida. Especificar um
tipo para o nome de uma funo intrnseca genrica em uma instruo de declarao de tipo no suficiente, por si
s, para renomear as propriedade genricas para esta funo.
O resultado de funo pode ser declarado como tendo o atributo POINTER ou ALLOCATABLE.
Uma specification-expr em uma array-spec, em um type-param-value em uma declaration-type-
spec correspondendo a um parmetro de tipo comprimento ou em uma char-length em uma entity-decl tem
que ser uma expresso de inicializao a menos que ela esteja no corpo de uma interface (12.3.2.1), na parte de
especificao de um subprograma ou na declaration-type-spec de uma instruo FUNCTION (12.5.2.1). Se o
objeto de dado sendo declarado depende do valor de uma specification-expr que no uma expresso de
inicializao e no um argumento mudo este tipo de objeto chamado de objeto de dado automtico.
Nota 5.3
Um objeto automtico no pode aparecer em uma instruo SAVE ou DATA nem ser declarada com o atributo
SAVE nem ser definida inicialmente por uma inicializao
Se um parmetro de tipo em uma declaration-type-spec ou em uma char-length em uma entity-
decl definido por uma expresso que no uma expresso de inicializao, o valor do parmetro de tipo
estabelecido na entrada do procedimento e no afetado por qualquer redefinio ou indefinio das variveis em
uma expresso de definio durante a execuo do procedimento.
Se uma entity-decl contm uma inicializao e o object-name no tem o atributo PARAMETER a
entidade uma varivel com uma inicializao explcita. Inicializao explcita alternativamente pode ser
especificada em uma instruo DATA a menos que a varivel seja do tipo derivado para a qual inicializao default
especificada. Se inicializao =initialization-expr, o object-name inicialmente definido com o valor
especificado pela initialization-expr; se necessrio, o valor convertido de acordo com as regras de atribuio
intrnsecas (7.4.1.3) para um valor que concorde em tipo, parmetro de tipo e forma com o object-name. Uma
varivel ou parte da varivel no pode se inicializada explicitamente mais de uma vez em um programa. Se a
varivel uma matriz, ela pode ter sua forma especificada em uma instruo de declarao ou numa instruo de
especificao de atributo prvia na mesma unidade de escopo.
Se a inicializao =>null-init, object-name tem que ser um ponteiro e seu estado inicial de associao
desassociado.
A presena de inicializao implica que o object-name salvo, exceto para um object-name em um
named common block ou um object-name com o atributo PARAMETER. O atributo implcito SAVE pode se
reafirmado por um atributo SAVE na instruo de declarao de tipo, pela incluso do object-name na instruo
SAVE (5.2.12) ou pelo uso da instruo SAVE sem uma saved-entity-list em uma mesma unidade de escopo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 95
Nota 5.4
Exemplo de instruo de declarao de tipo so:
REAL A (10)
LOGICAL, DIMENSION (5, 5) :: MASK1, MASK2
COMPLEX :: CUBE_ROOT = (-0.5, 0.866)
INTEGER, PARAMETER :: SHORT = SELECTED_INT_KIND(4)
INTEGER(SHORT) :: K ! intervalo de no mnimo -9999 at 9999
REAL(KIND (0.0D0)) :: A
REAL(KIND = 2) :: B
COMPLEX(KIND = KIND(0.0D0)) :: C
CHARACTER(LEN = 10, KIND = 2) :: A
CHARACTER B, C*20
TYPE(PERSON) :: CHAIRMAN
TYPE(NODE), POINTER :: HEAD => NULL( )
TYPE (humongous_matrix(k=8, d=1000)) :: mat
(A ltima linha usa a definio de tipo na Note 4.24.)
5.1.1 Especificadores de Declarao de Tipo
5.1.1 Declaration type specifiers
Uma declaration-type-spec em uma instruo de declarao de tipo especifica o tipo da entidade de
uma lista de entidades. Esta declarao explicita de tipo pode sobrescrever ou confirmar o tipo implcito que possa
ser indicado pela primeira letra de uma entidade com nome (5.3).
Uma intrinsic-type-spec em uma instruo de declarao de tipo usada para declarar entidades de
tipo intrnseco.
5.1.1.1 Tipo
5.1.1.1 TYPE
Um especificador de tipo TYPE usado para declarar entidades do tipo derivado.
Aonde uma entidade de dado declarada explicitamente pelo uso de um especificador TYPE, o tipo
derivado especificado tem que ter sido definido previamente em uma unidade de escopo ou estar acessvel pela
associao de uso ou associao de hospedagem (use or host association). Se a entidade de dado o resultado de
funo, o tipo derivado pode ser especificado na instruo FUNCTION desde que o tipo derivado seja definido
dentro do corpo da funo ou acessvel l por associao de uso ou hospedagem. Se o tipo derivado especificado
na instruo FUNCTION e definido dentro do corpo da funo, isto como se a varivel resultado da funo
tivesse sido declarada com aquele tipo derivado imediatamente seguindo a derived-type-def do tipo derivado
especificado.
Uma entidade escalar do tipo derivado uma estrutura (structure). Se o tipo derivado tem a propriedade
SEQUENCE, a entidade escalar deste tipo uma estrutura sequncia (sequence structure).
5.1.1.2 Classe
5.1.1.2 CLASS
Uma entidade polimrfica (polymorphic) uma entidade de dado que capaz de se transformar em tipos
diferentes durante a execuo do programa. O tipo da entidade de dado num ponto particular durante a execuo do
programa o seu tipo dinmico (dynamic type). O tipo declarado (declared type) de uma entidade de dado o
tipo que declarado que ela tem, implcita ou explicitamente.
Um especificador de tipo CLASS usado para declarar objetos polimrficos. O tipo declarado do objeto
polimrfico o tipo especificado se o especificador de tipo CLASS contem um nome de tipo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 96
Um objeto declarado com o especificador CLASS(*) um objeto polimrfico ilimitado (unlimited
polymorphic). Uma entidade polimrfica ilimitada no declarada como tendo um tipo. Ela no considerada ter o
mesmo tipo declarado que qualquer outra entidade, incluindo outra entidade polimrfica ilimitada.
Uma entidade no polimrfica compatvel em tipo (type compatible) s com entidades de mesmo tipo.
Para uma entidade polimrfica, a compatibilidade de tipo baseada na sua declarao de tipo. Uma entidade
polimrfica que no uma entidade polimrfica ilimitada compatvel em tipo com entidades do mesmo tipo ou
qualquer uma de suas extenses. Mesmo que uma entidade polimrfica ilimitada no seja considerada como tendo
uma declarao de tipo, ela compatvel em tipo com todas as entidades. Uma entidade dita ser compatvel com
um tipo se seu tipo compatvel com entidades daquele tipo.
Duas entidades so incompatveis em tipo (type incompatible) se uma no compatvel com a outra.
Uma entidade compatvel em tipo, subtipo (kind) e nmero de dimenses (rank) ou compatvel TKR (TKR
compatible) com outra entidade se a primeira entidade compatvel em tipo com a segunda, os parmetros de tipo
subtipo (kind type parameters) da primeira entidade tm os mesmos valores dos valores dos parmetros de tipo
subtipo correspondentes da segunda e ambas tem o mesmo nmero de dimenses (rank).
Um objeto alocvel polimrfico pode ser alocado como sendo de qualquer tipo com o qual compatvel.
Um ponteiro polimrfico ou argumento mudo pode, durante a execuo do programa, ser associado com objetos
com os quais so compatveis em tipo.
O tipo dinmico de um objeto polimrfico alocvel alocado o tipo com o qual ele foi alocado. O tipo
dinmico de um ponteiro polimrfico associado o tipo dinmico de seu alvo. O tipo dinmico de um argumento
mudo polimrfico no ponteiro no alocvel o tipo dinmico de seu argumento real associado. O tipo dinmico
de um alocvel no alocado ou um ponteiro desassociado o mesmo que o seu tipo declarado. O tipo dinmico de
uma entidade identificada por um nome associado (8.1.4) o tipo dinmico do seletor com o qual ele est
associado. O tipo dinmico de um objeto que no polimrfico o seu tipo declarado.
Nota 5.5
Somente componentes de um tipo declarado de um objeto polimrfico pode ser designado por seleo de
componente (6.1.2).
5.1.2 Atributos
5.1.2 Attributes
Os atributos adicionais que podem aparecer em uma especificao de atributo de uma instruo de
declarao adicionalmente especifica a natureza das entidades que esto sendo declaradas ou especifica restries
no seu uso no programa.
5.1.2.1 Acessibilidade do Atributo
5.1.2.1 Accessibility attribute
O atributo de acessibilidade (accessibility attribute) especifica a acessibilidade da entidade via um
identificador particular.
R508 access-spec is PUBLIC
or PRIVATE
C539 (R508) Um access-spec s pode aparecer na specification-part de um mdulo
Identificadores que so especificados em um mdulo ou acessveis no mdulo por associao de uso tm o
atributo PUBLIC ou PRIVATE. Identificadores para os quais uma access-spec no explicitamente especificada
neste mdulo possuem o atributo de acessibilidade default do mdulo. O atributo de acessibilidade default para um
mdulo PUBLIC a menos que tenha sido mudado com a instruo PRIVATE (5.2.1). Somente identificadores que
possuem o atributo PUBLIC no mdulo so disponveis para ser acessado no mdulo por associao de uso.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 97
Nota 5.6
Para que um identificador seja acessado por associao de uso, ele tem que ter o atributo PUBLIC no mdulo em
que acessado. Entretanto ele pode ter o atributo PRIVATE no mdulo em que est sendo acessado por
associao de uso e neste caso no ser acessvel por associao de uso no mdulo onde ele PRIVATE
Nota 5.7
Um exemplo de especificao de a cessibilidade :
REAL, PRIVATE :: X, Y, Z
5.1.2.2 Atributo Alocvel
5.1.2.2 ALLOCATABLE attribute
Um objeto com a atributo alocvel (ALLOCATABLE attribute) um objeto para o qual espao alocado por
uma instruo ALLOCATE (6.3.1) ou por uma instruo de atribuio intrnseca tipo derivada (7.4.1.3).
5.1.2.3 Atributo Assncrono
5.1.2.3 ASYNCHRONOUS attribute
O atributo assncrono (ASYNCHRONOUS attribute) especifica que a varivel pode estar sujeita a
entrada/sada assncrona.
O objeto base da varivel pode ter o atributo ASYNCHRONOUS em uma unidade de escopo se:
1. a varivel aparece em uma instruo executvel ou expresso de especificao nesta unidade de escopo
2. qualquer instruo da unidade de escopo executada enquanto a varivel um apontador da sequncia de
armazenamento de E/S pendente (pending I/O storage sequence affector)
affector apontador
apontador, indicador, atado, ligado a
aquilo que liga um pedao com o todo
O atributo ASYNCHRONOUS pode ser consultado (conferred) implicitamente pelo uso de uma varivel em
uma instruo de entrada/sada assncrona (9.5.1.4).
Um objeto pode ter o atributo ASYNCHRONOUS em uma unidade particular de escopo sem que
necessariamente o seja em outras unidades de escopo. Se um objeto tem o atributo ASYNCHRONOUS, ento
todos os subobjetos tambm tm o atributo ASYNCHRONOUS.
Nota 5.8
O atributo ASYNCHRONOUS especifica as variveis que podem ser associadas com uma sequncia de
armazenamento de entrada/sada pendente (a localizao real de memria na qual a entrada/sada assncrona est
sendo realizada) enquanto o unidade de escopo est em execuo. Esta informao pode ser usada pelo
compilador para desabilitar certos cdigos de movimento otimizados.
O atributo ASYNCHRONOUS similar ao atributo VOLATILE. Ele intenciona facilitar a tradicional otimizao
de movimento de cdigos na presena de entrada/sada assncrona.
5.1.2.4 Atributo Ligado para Entidades de Dado
5.1.2.4 BIND attribute for data entities
O atributo BIND para um varivel ou bloco comum (common block) especifica que ela capaz de
interoperar com uma varivel C que tem uma ligao externa (15.3).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 98
Interoperability interoperabilidade (inter-operate) interoperar
a propriedade referente a habilidade de sistemas diferentes trabalharem juntos
R509 language-binding-spec is BIND(C[,NAME=scalar-char-initialization-expr])
C540 (R509) A scalar-char-initialization-expr tem que ser caractere subtipo default (default character
kind)
Nota 5.9
O padro C prov facilidades para criar identificadores C cujos caracteres no esto restritos ao conjunto de
caracteres bsico do C. Este tipo de identificador C referido como um nome caractere universal (universal
character name) (6.4.3 do padro C). O nome para este tipo de identificador C pode incluir caracteres que no so
parte do mtodo de representao usado pelo processador para o tipo caractere default. Se isto acontece, a
entidade C no pode ser ligada (12.5.3, 15.3.1) com uma entidade Fortran .
Este padro no requer que um processador disponibilize um mecanismo para ligar entidades Fortran com
entidades C cujos nomes so especificados usando a facilidade nome caractere universal (universal character name
facility)
O atributo BIND implica no atributo SAVE, que pode ser confirmado com uma especificao explcita.
Nota 5.10
Especificar o atributo BIND para um entidade pode no ter efeito discernvel para o processador que o seu
prprio processador associado (companion processor)
5.1.2.5 Atributo Dimenso
5.1.2.5 DIMENSION attribute
O atributo dimenso (DIMENSION attribute) especifica que uma entidade uma matriz. O rank ou rank e
shape (nmero de dimenses ou nmero de dimenses e forma) especificado por uma array-spec, se existe uma, em
uma entity-decl, ou pela array-spec em uma DIMENSION attr-spec caso contrrio. Para especificar que uma
entidade uma matriz em uma instruo de declarao de tipo, a DIMENSION attr-spec deve aparecer ou ento
uma array-spec deve aparecer em uma entity-decl. A apario de uma array-spec em uma entity-decl
especifica o atributo DIMENSION para a entidade. O atributo DIMENSION alternativamente pode ser
especificado em uma instruo de especificao DIMENSION, ALLOCATABLE, POINTER, TARGET ou
COMMON.
R510 array-spec is explicit-shape-spec-list
or assumed-shape-spec-list
or deferred-shape-spec-list
or assumed-size-spec
C541 (R510) O nmero de dimenses (rank) mximo sete
Nota 5.11
Exemplos de especificao do atributo DIMENSION so:
SUBROUTINE EX(N,A,B)
REAL, DIMENSION(N,10) :: W ! matriz automtica de forma explcita
REAL A(:), B(0:) ! matrizes de forma assumida
REAL, POINTER :: D(:,:) ! matriz ponteiro
REAL, DIMENSION(:), POINTER :: P ! ponteiro matricial
REAL, ALLOCATABLE, DIMENSION(:) :: E ! matriz alocvel
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 99
5.1.2.5.1 Matriz de Forma Explcita
5.1.2.5.1 Explicit-shape array
Uma matriz de forma explcita (explicit-shape array) uma matriz com nome que declarada em uma
explicit-shape-spec-list. Isto especifica valores explcitos para os limites (bounds) em cada dimenso da
matriz.
R511 explicit-shape-spec is [lower-bound:]upper-bound
R512 lower-bound is specification-expr
R513 upper-bound is specification-expr
C542 (R511) Uma matriz de forma explcita cujos limites no so expresses de inicializao tem que ser um
argumento mudo, um resultado de funo ou uma matriz automtica de um procedimento
Uma matriz automtica (automatic array) uma matriz de forma explcita que declarada em um
subprograma, no um argumento mudo e tem limites que no so expresses de inicializao.
Se uma matriz de forma explcita tem limites que no so expresses de inicializao, os limites, e por isso
a forma, so determinados na entrada do procedimento pela avaliao das expresses dos limites. Os limites deste
tipo de matriz no so afetados pela redefinio ou indefinio de qualquer varivel durante a execuo do
procedimento.
Os valores de cada limite inferior e limite superior determina os limites da matriz numa dimenso em
particular e por isso a extenso da matriz nesta dimenso. O valor de um limite inferior ou um limite superior pode
ser positivo, negativo ou zero. O intervalo do subscrito nesta matriz o conjunto de valores inteiros entre e
incluindo os limites inferiores e superiores, garantido que o limite superior no menor que o limite inferior. Se o
limite superior menor que o limite inferior, o intervalo vazio, a extenso nesta dimenso zero e a matriz tem
tamanho zero. Se o limite inferior omitido, o valor default 1. O numero de conjuntos de limites especificados
o rank (nmero de dimenses).
5.1.2.5.2 Matriz de Forma Assumida
5.1.2.5.2 Assumed-shape array
Uma matriz de forma assumida (assumed-shape array) um argumento mudo no ponteiro que pega a
sua forma do argumento matricial real associado.
R514 assumed-shape-spec is [lower-bound]:
O nmero de dimenses (rank) igual ao nmero de : (colons) na assumed-shape-spec-list.
A extenso de uma dimenso de um argumento mudo matricial de forma assumida a extenso da
dimenso correspondente do argumento real matricial associado. Se o valor do limite inferior d e a extenso da
dimenso correspondente do argumento real matricial associado s, ento o valor do limite superior s+d-1. O
limite inferior lower-bound, se presente, e 1 em caso contrrio.
5.1.2.5.3 Matriz de Forma Postergada
5.1.2.5.3 Deferred-shape array
Uma matriz de forma postergada (deferred-shape array) uma matriz alocvel ou uma matriz ponteiro.
Uma matriz alocvel uma matriz que tem o atributo ALLOCATABLE e um nmero de dimenses
especificado (and a specified rank) mas seus limites, e ento a forma, so determinadas por alocao ou associao
de argumentos.
Uma matriz com o atributo ALLOCATABLE tem que ser declarada numa deferred-shape-spec-list.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 100
Uma matriz ponteiro (array pointer) uma matriz com o atributo POINTER e um rank especificado (nmero
de dimenses especificado).Seus limites, e por isso sua forma, so determinados quando ela associada com um
alvo. Uma matriz com o atributo POINTER tem que ser declarada numa deferred-shape-spec-list.
R515 deferred-shape-spec is :
O rank igual ao nmero de : (colons) na deferred-shape-spec-list.
O tamanho, limites e forma (size, bounds, and shape) de uma matriz alocvel no alocada ou uma matriz
ponteiro desassociada so indefinidas. Nenhuma parte desta matriz pode ser referenciada ou definida; entretanto, a
matriz pode aparecer em um argumento de uma funo intrnseca inquisitria como especificado em 13.1.
Os limites em cada dimenso de uma matriz alocvel so aqueles especificados quando a matriz alocada.
Os limites de cada dimenso de uma matriz ponteiro podem ser especificados de duas forma:
1. em uma instruo ALLOCATE (6.3.1) quando o alvo alocado
2. por atribuio de ponteiro (pointer assignment) (7.4.2)
Os limites de um alvo matricial ou matriz alocvel no so afetados por qualquer redefinio subsequente
ou indefinio das variveis envolvidas na expresso de especificao dos limites.
5.1.2.5.4 Matriz de Tamanho Assumido
5.1.2.5.4 Assumed-size array
Uma matriz de tamanho assumido (assumed-size array) uma matriz argumento mudo cujo tamanho
assumido do tamanho do argumento real associado. O nmero de dimenses (rank) e a extenso pode diferir entre o
argumento real e o argumento mudo; somente o tamanho da matriz assumido pelo argumento mudo. Uma matriz
de tamanho assumido declarada com o assumed-size-spec.
R516 assumed-size-spec is [explicit-shape-spec-list,][lower-bound:]*
C543 Uma assumed-size-spec no pode aparecer como uma declarao dos limites de uma matriz de um
argumento mudo
C544 Um matriz de tamanho assumido com INTENT (OUT) no pode pode ser um tipo para o qual inicializao
especificada
O tamanho da matriz de tamanho assumida determinada pelo seguinte:
1. se o argumento real associado com a matriz de tamanho assumido uma matriz de qualquer tipo diferente
de caractere default, o tamanho o da matriz real
2. se o argumento real associado com a matriz de tamanho assumido um elemento de matriz de qualquer
tipo diferente de caractere default com um valor de ordem de subscrito de r (6.2.2.2) em uma matriz de
tamanho x, o tamanho da matriz muda x r + 1.
3. se o argumento real uma matriz caractere default, o elemento matricial caractere default ou o elemento
substring caractere default (6.1.1) e se ele inicia em uma unidade de armazenamento caractere de uma
matriz com c unidades de armazenamento caracteres, o tamanho da matriz muda MAX (INT ((c t +
1)/e), 0), onde e o comprimento de um elemento da matriz caractere muda
4. se o argumento real do tipo escalar caractere default e um escalar que no um elemento de matriz ou um
designador de substring elemento de matriz, o tamanho da matriz muda MAX (INT (l/e), 0), onde e o
comprimento de um elemento na matriz caractere muda e l o comprimento do argumento real
O nmero de dimenses (rank) iguala um mais o nmero de explicit-shape-specs.
Uma matriz de tamanho assumida no tem limite superior na sua ltima dimenso e portanto no tem
extenso na sua ltima dimenso e no tem forma. O nome de uma matriz de tamanho assumida no pode ser
escrita como uma referencia uma matriz inteira (whole array) de um argumento real em uma referncia
procedimento para a qual a forma no requerida.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 101
Os limites das primeira n-1 dimenses so aquelas especificadas em uma explicit-shape-spec-list, se
presente, em uma assumed-size-spec. O limite inferior da ltima dimenso lower-bound, se presente e 1 caso
contrrio. Uma matriz de tamanho assumida pode ser indexada (subscripted) ou seccionada (6.2.2.3). O limite
superior no pode ser omitido em um subscrito tripleto (um tripleto subscript triplet) na ltima dimenso.
Se uma matriz de tamanho assumido tem limites que no so expresses de inicializao, os limites so
determinados na entrada do procedimento. Os limites deste tipo de matriz no so afetados pela redefinio ou
indefinio de qualquer varivel durante a execuo do procedimento.
5.1.2.6 Atributo Externo
5.1.2.6 EXTERNAL attribute
Um atributo EXTERNAL (EXTERNAL attribute) especifica que uma entidade um procedimento externo,
um procedimento mudo, um procedimento ponteiro ou um subprograma bloco de dados. Este atributo pode
tambm ser especificado por uma instruo EXTERNAL (12.3.2.2), uma procedure-declaration-stmt
(12.3.2.3) ou um corpo de interface (interface body) que no uma interface bloco abstrata ( abstract interface block)
(12.3.2.1).
Se um procedimento externo ou procedimento mudo usado como um argumento real ou o alvo de uma
atribuio ponteiro de procedimento (procedure pointer assignment), ele tem que ser declarado com o atributo
EXTERNAL
Um procedimento que tem o atributo EXTERNAL e POINTER um ponteiro de procedimento ( procedure
pointer).
5.1.2.7 Atributo Inteno
5.1.2.7 INTENT attribute
Um atributo INTENT (INTENT attribute ) especifica a inteno de um argumento mudo.
R517 intent-spec is IN
or OUT
or INOUT
C545 (R517) Um objeto no ponteiro com o atributo INTENT(IN) no pode aparecer em um contexto de
definio de varivel(16.5.7)
C546 (R517) Um objeto ponteiro com o atributo INTENT(IN)no pode aparecer como
(1) um objeto ponteiro em uma pointer-assignment-stmt ou uma nullify-stmt
(2) um allocate-object em uma allocate-stmt ou uma deallocate-stmt
(3) um argumento real em uma referncia a um procedimento se o argumento mudo um ponteiro com o atributo
INTENT(OUT) ou INTENT(INOUT)
O atributo INTENT(IN) para um argumento mudo no ponteiro especifica que ele no pode ser definido
nem se tornar indefinido durante a execuo de procedimento. O atributo INTENT(IN) para um argumento mudo
ponteiro especifica que durante a execuo do procedimento sua associao no pode ser mudada exceto que ele
pode tornar-se indefinido se o alvo desalocado por outro meio que no um ponteiro (16.4.2.1.3).
O atributo INTENT(OUT) para um argumento mudo no ponteiro especifica que ele tem que ser definido
antes que referncia um argumento mudo seja feita dentro do procedimento e qualquer argumento real que se
torne associado com este argumento mudo tem que estar definido. Na invocao do procedimento este argumento
mudo se torna indefinido exceto para os componentes de um objeto do tipo derivado para os quais inicializao
default foi especificada. O atributo INTENT(OUT) para um argumento mudo ponteiro especifica que na invocao
do procedimento o estado da associao do ponteiro do argumento mudo se torna indefinido. Qualquer argumento
real associado com este tipo de ponteiro mudo tem que ser uma varivel ponteiro.
O atributo INTENT(INOUT) para o argumento mudo no ponteiro especifica que sua inteno de uso o de
receber dados e para retornar dados unidade de escopo que invocou o procedimento. Este tipo de argumento
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 102
mudo pode ser referenciado ou definido. Qualquer argumento real que se torna associado com este tipo de
argumento mudo tem que ser definvel. O atributo INTENT(INOUT) para um argumento mudo ponteiro especifica
que sua inteno usada para receber uma associao ponteiro e para retornar uma associao ponteiro unidade
de escopo que invocou. Qualquer associao de argumento real com este tipo de ponteiro mudo tem que ser uma
varivel ponteiro.
Se nenhum atributo INTENT especificado para um argumento mudo, seu uso est sujeito as limitaes de
associao do argumento real associado (12.4.1.2, 12.4.1.3, 12.4.1.4).
Nota 5.12
Um exemplo de especificao de INTENT :
SUBROUTINE MOVE(FROM, TO)
USE PERSON_MODULE
TYPE(PERSON), INTENT(IN) :: FROM
TYPE(PERSON), INTENT(OUT) :: TO
Se um objeto tem o atributo INTENT ento todos os seus subobjetos tem o mesmo atributo INTENT.
Nota 5.13
Se um argumento mudo um objeto do tipo derivado com um componente ponteiro, ento o ponteiro como um
ponteiro um subobjeto do argumento mudo, mas o alvo do ponteiro no . Portanto, as restries nos subobjetos
do objeto mudo aplicam-se ao ponteiro no contexto onde ele usado como um ponteiro, mas no no contexto
onde ele desrefernciado para indicar seu alvo. Por exemplo, se X um argumento mudo do tipo derivado com
um componente inteiro do tipo ponteiro P e X tem INTENT(IN), ento a instruo
X%P => NEW_TARGET
proibida, mas
X%P = 0
permitida (garantido que X%P est associado com um alvo definido).
Analogamente, as restries de INTENT sobre argumentos mudo ponteiro aplicam-se somente a associao de
argumentos mudos; elas no restringem as operaes permitidas sobre seu alvo
Acessar o valor referenciado pela referncia chama-se "desrefernciar".
Esta expresso muito utilizada com ponteiros
Nota 5.14
Especificaes de inteno de argumento servem para vrios propsitos em adio documentao da inteno de
uso do argumento mudo. Um processador pode verificar se um argumento mudo com INTENT(IN) usado de
uma forma que ele pode ser redefinido. Um processador levemente mais sofisticado pode verificar se o argumento
mudo com INTENT(OUT) pode ser referenciado antes de ser definido. Se a interface do procedimento explcita,
o processador tambm pode verificar se os argumento reais correspondentes aos argumentos mudos com as
intenes INTENT(OUT) ou INTENT(INOUT) so definveis. Um processador mais sofisticado pode usar esta
informao para otimizar a translao da unidade de escopo referenciada tirando vantagem do fato que
argumentos reais correspondentes aos argumentos mudos com INTENT(IN) no podem ser alterados e que
qualquer valor de um argumento real correspondente a um argumento mudo com inteno INTENT(OUT) no
pode ser referenciado e pode ento ser descartado.
INTENT(OUT) significa que o valor do argumento depois da invocao do procedimento inteiramente o
resultado da execuo do procedimento. Se existir qualquer possibilidade que um argumento possa reter seu valor
atual em vez de ser redefinido, INTENT (INOUT) tem que ser usado em vez de INTENT(OUT), mesmo que no
haja referncia explcita ao valor do argumento mudo. Porque uma varivel INTENT(OUT) considerada
indefinida na entrada do procedimento, qualquer inicializao default especificada para este tipo ser aplicada.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 103
INTENT(INOUT) no equivalente a omitir o atributo INTENT. O argumento correspondendo a uma argumento
mudo INTENT(INOUT) sempre ser definvel, enquanto um argumento correspondendo a um argumento mudo
sem o atributo INTENT necessita ser definvel somente se o argumento mudo realmente redefinido
5.1.2.8 Atributo Intrnseco
5.1.2.8 INTRINSIC attribute
Um atributo INTRINSIC (INTRINSIC attribute) confirma que o nome um nome especfico (13.6) ou um
nome genrico (13.5) de um procedimento intrnseco. O atributo INTRINSIC permite especificar um nome de um
procedimento intrnseco que listado em 13.6 e no est marcado com um ponto lista (bullet) () ser usado como
um argumento real (12.4).
Declarao explicita de que o nome de um procedimento intrnseco genrico tem o atributo INTRINSIC
no produz a perda da sua propriedade genrica.
Se o nome especifico de um procedimento intrnseco (13.6) usado como um argumento real, o nome tem
que ser explicitamente especificado como tendo o atributo INTRINSIC.
C547 (R503) (R1216) Se o nome de um procedimento intrnseco genrico explicitamente declarado como
tendo o atributo INTRINSIC e ele tambm um nome genrico em uma ou mais interfaces genricas(12.3.2.1)
acessvel na mesma unidade de escopo, os procedimentos nas interfaces e os procedimentos intrnsecos
especficos tem todos que serem funes ou todos sub-rotinas e as caractersticas dos procedimentos intrnsecos
especficos e dos procedimentos nas interfaces tm que diferir como especificado em 16.2.3
5.1.2.9 Atributo Opcional
5.1.2.9 OPTIONAL attribute
Um atributo OPTIONAL (OPTIONAL attribute) especifica que o argumento mudo no necessita estar
associado com um argumento real em uma referncia do procedimento (12.4.1.6). A funo intrnseca PRESENT
pode ser usada para determinar quando um argumento real foi associado com o argumento mudo que tem o atributo
OPTIONAL.
5.1.2.10 Atributo Parmetro
5.1.2.10 PARAMETER attribute
Um atributo PARAMETER (PARAMETER attribute) especifica entidades que so constantes com nome
(named constants). O nome do objeto (object-name) tem o valor especificado pela initialization-expr que
aparece do lado direito do sinal de igual; se necessrio, o valor convertido de acordo com as regras de atribuio
intrnsecas (7.4.1.3) para um valor que concorde em tipo, parmetros de tipo e forma com o object-name.
Uma constante com nome no pode ser referenciada a menos que tenha sido previamente definida na
mesma instruo, definida numa instruo anterior ou feita acessvel por associao de uso ou hospedagem.
Nota 5.15
Exemplos de declaraes com o atributo PARAMETER so:
REAL, PARAMETER :: ONE = 1.0, Y = 4.1 / 3.0
INTEGER, DIMENSION(3), PARAMETER :: ORDER = (/ 1, 2, 3 /)
TYPE(NODE), PARAMETER :: DEFAULT = NODE(0, NULL ( ))
5.1.2.11 Atributo Ponteiro
5.1.2.11 POINTER attribute
Entidades com o atributo POINTER (POINTER attribute ) podem ser associadas com diferentes objetos de
dados ou procedimentos durante a execuo do programa. Um ponteiro um ponteiro de dado ( data pointer) ou um
ponteiro de procedimento (procedure pointer). Ponteiros de procedimentos so descritos em 12.3.2.3.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 104
Um ponteiro de dado no pode ser referenciado nem definido a menos que ele seja associado com um
objeto alvo que pode ser referenciado ou definido.
Se um ponteiro est associado, os valores de seus parmetros de tipo postergados so os mesmo valores dos
parmetros de tipo correspondentes dos seus alvos.
Um ponteiro de procedimento (procedure pointer) no pode ser referenciado a menos que esteja associado
com um procedimento alvo.
Nota 5.16
Exemplos de especificao do atributo POINTER so:
TYPE(NODE), POINTER :: CURRENT, TAIL
REAL, DIMENSION(:, :), POINTER :: IN, OUT, SWAP
Para exemplo mais elaborado veja C.2.1.
5.1.2.12 Atributo Protegido
5.1.2.12 PROTECTED attribute
Um atributo PROTECTED (PROTECTED attribute) impe limitaes no uso das entidades do mdulo.
Diferentes daquelas do mdulo na qual a entidade recebe o atributo PROTECTED,
1. se ela um objeto ponteiro, se ela no definvel e
2. se ela um ponteiro, seu estado de associao no pode ser mudado exceto que ele pode se tornar
indefinido se seu alvo for desalocado por outra forma que no um ponteiro (16.4.2.1.3) ou se seu alvo se
tornar indefinido pela execuo da instruo RETURN ou END
Se um objeto tem o atributo PROTECTED, todos os seus subobjetos tm o atributo PROTECTED.
Nota 5.17
Um exemplo de atributo PROTECTED:
MODULE temperature
REAL, PROTECTED :: temp_c, temp_f
CONTAINS
SUBROUTINE set_temperature_c(c)
REAL, INTENT(IN) :: c
temp_c = c
temp_f = temp_c*(9.0/5.0) + 32
END SUBROUTINE
END MODULE
O atributo PROTECTED garante que as variveis temp_c e temp_f no podem ser modificadas por qualquer meio
diferente do procedimento set_temperature_c, ento mantendo-os consistente uma com a outra
5.1.2.13 Atributo Salvo
5.1.2.13 SAVE attribute
Uma entidade com o atributo SAVE (SAVE attribute), no escopo da unidade de um subprograma, retm seu
estado de associao, estado de alocao e valor depois da execuo da instruo RETURN ou END a menos que
ela seja um ponteiro e seu alvo se torne indefinido (16.4.2.1.3(4)). Ela compartilhada por todas as instncias
(12.5.2.3) do subprograma.
Uma entidade com o atributo SAVE, declarada em uma unidade de escopo de um mdulo, retm seu estado
de associao, estado de alocao, estado de definio e valor depois da instruo RETURN ou END ter sido
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 105
executada em um procedimento que acessa o mdulo a menos que seja um ponteiro e seu alvo se torne indefinido.
Uma entidade salva (saved) uma entidade que tem o atributo SAVE. Uma entidade no salva (unsaved)
uma entidade que no tem o atributo SAVE.
Um atributo SAVE pode aparecer em declaraes em um programa principal e no tem efeito.
5.1.2.14 Atributo Alvo
5.1.2.14 TARGET attribute
Uma objeto com o atributo ALVO (TARGET attribute) pode ter um ponteiro associado com ele (7.4.2). Um
objeto sem o atributo alvo (TARGET attribute) no pode ter um ponteiro associado com ele.
Nota 5.18
Adicionalmente as variveis explicitamente declaradas com o atributo TARGET, os objetos criados por uma
alocao de ponteiro (6.3.1.2) possuem o atributo TARGET
Um objeto tem o atributo TARGET, ento todos os seus subobjetos no ponteiros tambm tm o atributo
TARGET.
Nota 5.19
Exemplos de especificao de atributo TARGET so:
TYPE(NODE), TARGET :: HEAD
REAL, DIMENSION(1000, 1000), TARGET :: A, B
Para exemplos mais elaborado seja C.2.2.
Nota 5.20
Cada designador de objeto que usa um objeto alvo ir ter o atributo TARGET ou POINTER. Se ponteiros so
envolvidos, o designador no precisa ser necessariamente um subobjeto do objeto alvo original, mas porque
ponteiros s podem apontar para alvos, no h forma de terminar em um no ponteiro que no seja um alvo
5.1.2.15 Atributo Valor
5.1.2.15 VALUE attribute
O atributo VALUE (VALUE attribute) especifica um tipo de associao de argumento (12.4.1.2) para o
argumento mudo.
5.1.2.16 Atributo Voltil
5.1.2.16 VOLATILE attribute
O atributo VOLATILE (VOLATILE attribute) especifica que um objeto pode ser referenciado, definido ou
se tornar indefinido por meio no especificados em um programa.
Um objeto pode ter o atributo VOLATILE em uma unidade de escopo particular sem que necessariamente
o tenha em outra unidade de escopo. Se um objeto tem o atributo VOLATILE, ento todos os seus subobjetos
tambm possuem o atributo VOLATILE.
Nota 5.21
O processador Fortran pode usar as definies mais recentes de objeto voltil quando um valor requerido.
Igualmente, ele deve usar a definio Fortran mais recente disponvel. de responsabilidade do programador
manejar as interaes com os processos no Fortran
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 106
Um ponteiro com o atributo VOLATILE pode adicionalmente ter seu estado de associao e limites de
matriz mudados por meios no especificados pelo programa.
Nota 5.22
Se o alvo de um ponteiro referenciado, definido ou se torna indefinido por meios no especificados pelo
programa, enquanto o ponteiro est associado com um alvo, ento o ponteiro tem que ter o atributo VOLATILE.
Usualmente um ponteiro tem que ter o atributo VOLATILE se seu alvo tem o atributo VOLATILE. Similarmente,
todos os membros de um grupo EQUIVALENCE tm que ter o atributo VOLATILE se um membro tem o atributo
VOLATILE
Um objeto alocvel com o atributo VOLATILE pode adicionalmente ter seu estado de alocao, tipo
dinmico e parmetros de tipo e limites da matriz mudados por meios no especificado pelo programa.
5.2 Instrues de Especificao de Atributos
5.2 Attribute specification statements
Todos os atributos (diferentes de tipo) podem ser especificados para entidades, independentemente do tipo,
por instrues de especificao de atributo separadas. A combinao de atributos que so especificados para uma
entidade em particular est sujeita as mesmas restries da instruo de declarao de tipo indiferentemente do
mtodo usado na sua especificao. Isto tambm se aplica as instrues PROCEDURE, EXTERNAL e
INTRINSIC.
5.2.1. Instruo Acessibilidade
5.2.1 Accessibility statements
R518 access-stmt is access-spec[[::]access-id-list]
R519 access-id is use-name
or generic-spec
C548 (R518) Uma access-stmt s pode aparecer na specification-part de um mdulo. Somente uma
instruo de acessibilidade com uma access-id-list omitida permitida na specification-part de um
mdulo
C549 (R519) Cada use-name tem que ser o nome de uma varivel com nome, procedimento, tipo derivado,
constante com nome ou grupo de lista de nome (namelist group)
Uma access-stmt com uma access-id-list especifica o atributo de acessibilidade (5.1.2.1), PUBLIC ou
PRIVATE, para cada access-id na lista. Um access-stmt sem uma lista de access-id especifica uma
acessibilidade default que se aplica a todos os identificadores na specification-part do mdulo. A instruo
PUBLIC
especifica uma acessibilidade default. A instruo
PRIVATE
especifica uma acessibilidade default privada. Se esta instruo no aparece num mdulo, a acessibilidade default
publica.
Nota 5.23
Exemplo de instruo de acessibilidade so:
MODULE EX
PRIVATE
PUBLIC :: A, B, C, ASSIGNMENT (=), OPERATOR (+)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 107
5.2.2. Instruo Alocvel
5.2.2 ALLOCATABLE statement
R520 allocatable-stmt is ALLOCATABLE[::]
object-name[(deferred-shape-spec-list)]
[,object-name[(deferred-shape-spec-list)]] ...
Esta instruo especifica um atributo ALLOCATABLE (5.1.2.2) para uma lista de objetos.
Nota 5.24
Um exemplo de instruo ALLOCATABLE :
REAL A, B(:), SCALAR
ALLOCATABLE :: A(:,:), B, SCALAR
5.2.3. Instruo de Assncrona
5.2.3 ASYNCHRONOUS statement
R521 asynchronous-stmt is ASYNCHRONOUS[::]object-name-list
Uma instruo ASYNCHRONOUS especifica um atributo ASYNCHRONOUS (5.1.2.3) para a lista de
objetos.
5.2.4. Instruo BIND
5.2.4 BIND statement
R522 bind-stmt is language-binding-spec[::]bind-entity-list
R523 bind-entity is entity-name
or / common-block-name /
C550 (R522) Se qualquer bind-entity em uma bind-stmt um entity-name, a bind-stmt tem que
aparecer na parte de especificao de um mdulo e a entidade ser uma varivel interoperacional (interoperable
variable) (15.2.4, 15.2.5)
C551 (R522) Se a language-binding-spec tem um especificador NAME=, a bind-entity-list tem que
consistir de uma nica bind-entity
C552 (R522) Se a bind-entity um bloco comum, cada varivel do bloco comum tem que se interopervel
(15.2.4, 15.2.5)
Uma instruo BIND especifica um atributo BIND (5.1.2.4) para a lista de variveis e blocos comuns
(common blocks).
5.2.5 Instruo DATA
5.2.5 DATA statement
R524 data-stmt is DATA data-stmt-set[[,]data-stmt-set]...
Esta instruo usada para especificar inicializao explicita (5.1).
Uma varivel, ou parte de uma varivel, no pode ser inicializada mais de um a vez em um programa. Se
um objeto no ponteiro foi especificado com inicializao default em uma definio de tipo, ele no pode aparecer
em uma data-stmt-object-list.
Uma varivel que aparece em uma instruo DATA e no foi previamente especificada quanto ao tipo pode
aparecer numa declarao de tipo subsequente somente se esta declarao confirma o tipo implcito. Um nome de
matriz, seo de matriz ou elemento de matriz que aparecer em uma instruo DATA tem que ter tido suas
propriedades matriciais estabelecida em uma instruo prvia de especificao.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 108
Exceto para variveis em blocos comuns (common blocks), uma varivel com nome (named variable) tem o
atributo SAVE se qualquer parte dela inicializada em uma instruo DATA e isto pode ser confirmado com a
instruo SAVE ou uma declarao de tipo contendo o atributo SAVE.
R525 data-stmt-set is data-stmt-object-list / data-stmt-value-list /
R526 data-stmt-object is variable
or data-implied-do
R527 data-implied-do is (data-i-do-object-list,data-i-do-variable=
scalar-int-expr,scalar-int-expr[,scalar-int-expr])
R528 data-i-do-object is array-element
or scalar-structure-component
or data-implied-do
R529 data-i-do-variable is scalar-int-variable
C553 (R526) Em uma varivel que um data-stmt-object, qualquer subscrito, seo de subscrito, ponto
inicial de substring e ponto final de subscrito tem que ser uma expresso de inicializao
C554 (R526) Uma varivel cujo designador includo em uma data-stmt-object-list ou uma data-i-
do-object-list no pode ser: um argumento mudo, feito acessvel por associao de uso ou associao de
hospedagem, em um bloco comum com nome a menos que a instruo DATA esteja em uma unidade de
programa boco de dados, em um bloco de dados sem nome, um nome de funo, um nome de resultado de
funo, um objeto automtico ou uma varivel alocvel
C555 (R526) Um data-i-do-object ou uma varivel que aparece como um data-stmt-object no pode
ser um designador de objeto na qual um ponteiro aparece e no a parte inteira mais a direita de part-ref
C556 (R529) A data-i-do-variable no pode ser uma varivel com nome
C557 (R527) Uma scalar-int-expr de um data-implied-do tem que envolver primariamente s
constantes, subobjetos constantes ou variveis do DO dos data-implied-dos e cada operao tem que ser
intrnseca
C558 (R528) O array-element tem que ser uma varivel
C559 (R528) O scalar-structure-component tem que ser uma varivel
C560 (R528) O scalar-structure-component tem que conter ao menos uma part-ref que contenha uma
subscript-list
C561 (R528) Em um array-element ou um scalar-structure-component que um data-i-do-
object, qualquer subscrito tem que ser uma expresso cujas primrias so constantes, subobjetos de
constantes ou variveis DO deste data-implied-do ou os data-implied-dos contidos e cada operao tem
que ser intrnseca
R530 data-stmt-value is [data-stmt-repeat*]data-stmt-constant
R531 data-stmt-repeat is scalar-int-constant
or scalar-int-constant-subobject
C562 (R531) O data-stmt-repeat tem que ser positivo ou zero. Se uma data-stmt-repeat uma
constante com nome, ela tem que ter sido declarada previamente em uma unidade de escopo ou feita acessvel
por associao de uso ou associao de hospedagem
R532 data-stmt-constant is scalar-constant
or scalar-constant-subobject
or signed-int-literal-constant
or signed-real-literal-constant
or null-init
or structure-constructor
C563 (R532) Se um valor constante em uma instruo DATA uma constante com nome ou um construtor de
matriz, a constante com nome ou o tipo derivado tem que ter sido declarado previamente na unidade de escopo ou
tornada acessvel por associao de uso ou associao de hospedagem
C564 (R532) Se uma data-stmt-constant um structure-constructor, ela tem que ser uma
expresso de inicializao
R533 int-constant-subobject is constant-subobject
C565 (R533) int-constant-subobject shall be of type integer
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 109
R534 constant-subobject is designator
C566 (R534) constant-subobject tem que ser um subobjeto de uma constante
C567 (R534) Qualquer subscrito, ponto inicial de subscrito ou ponto final de subscrito tem que ser uma
expresso de inicializao
A data-stmt-object-list expandida para formar uma sequncia de ponteiros e variveis escalares,
referenciada como sequncia de variveis no texto que segue. Uma matriz no ponteiro cujos nomes no
qualificados aparece em uma data-stmt-object-list equivalente a uma sequncia completa de seus elementos
de matriz na ordem dos elementos da matriz (6.2.2.2). Uma seo de matriz equivalente a uma sequncia de seus
elementos de matriz na ordem dos elementos da matriz. Um data-implied-do expandido para formar uma
sequncia de elementos de matriz e componentes de estrutura sob controle da data-i-do-variable, como em um
construtor DO (8.1.6.4).
Uma data-stmt-value-list expandida para formar uma sequncia de data-stmt-constants. Uma
data-stmt-repeat indica que o nmero de vezes que a data-stmt-constant que segue includa na sequncia;
omisso do data-stmt-repeat tem o efeito do fator de repetio ser igual a 1.
Uma matriz de tamanho zero ou um data-implied-do com um contador de iterao igual a zero no
contribu com variveis para a sequncia de expanso, mas uma varivel caractere escalar de comprimento zero
contribu com uma varivel para a a sequncia de expanso. Uma data-stmt-constant com um fator de repetio
zero no contribu com data-stmt-constants para a sequncia escalar expandida de data-stmt-constants.
As sequncias expandidas de variveis e as data-stmt-constants so uma correspondncia um a um.
Cada data-stmt-constant especifica o valor inicial ou null-init para a varivel correspondente. Os
comprimentos de duas sequncias expandidas tm que ser os mesmos.
Uma data-stmt-constant tem que ser uma null-init se e somente se o correspondente data-stmt-
object tem o atributo POINTER. O estado de associao inicial de um data-stmt-object ponteiro
desassociado. Uma data-stmt-constant diferente de null-init tem que ser compatvel com a varivel
correspondente de acordo com as regras de atribuio intrnsecas (7.4.1.2). A varivel inicialmente definida com o
valor especificado pela data-stmt-constant; se necessrio, o valor correspondente convertido de acordo com as
regras de atribuio intrnsecas (7.4.1.3) para um valor que concorde com o tipo, parmetros de tipo e forma da
varivel.
Se uma data-stmt-constant uma boz-literal-constant a varivel correspondente tem que ser do
tipo inteira. A boz-literal-constant tratada como se ela fosse uma int-literal-constant com o kind-
param que especifica o mtodo de representao com o maior intervalo de expoente decimal suportado pelo
processador.
Nota 5.25
Exemplos de instrues DATA so:
CHARACTER(LEN = 10) NAME
INTEGER, DIMENSION(0:9) :: MILES
REAL, DIMENSION(100, 100) :: SKEW
TYPE(NODE), POINTER :: HEAD_OF_LIST
TYPE(PERSON) MYNAME, YOURNAME
DATA NAME / JOHN DOE /, MILES / 10 * 0 /
DATA((SKEW(K, J), J = 1, K), K = 1, 100) / 5050 * 0.0 /
DATA((SKEW(K, J), J = K + 1, 100), K = 1, 99) / 4950 * 1.0 /
DATA HEAD_OF_LIST / NULL() /
DATA MYNAME / PERSON (21, JOHN SMITH) /
DATA YOURNAME%AGE, YOURNAME%NAME / 35, FRED BROWN /
A varivel caractere NAME inicializada com o valor JOHN DOE completado a direita porque o comprimento da
constante menor que o comprimento da varivel. Todos os dez elementos da matriz inteira MILES so
inicializados com zero. A matriz bidimensional SKEW inicializada de forma que o tringulo inferior de SKEW
zero e o tringulo superior um. As estruturas MYNAME e YOURNAME so declaradas usando o tipo derivado
PERSON da nota 4.17. O ponteiro HEAD_OF_LIST declarado usando o tipo derivado NODE da nota 4.36; ele
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 110
inicialmente est desassociado. MYNAME inicializado por uma construtor de estrutura. YOURNAME
inicializado fornecendo-se separadamente os valores de cada componente
5.2.6. Instruo Dimenso
5.2.6 DIMENSION statement
R535 dimension-stmt is DIMENSION[::]array-name(array-spec)
[,array-name(array-spec)]...
Esta instruo especifica um atributo DIMENSION (5.1.2.5) e as propriedades da matriz para cada objeto
com nome.
Nota 5.26
Um exemplo da instruo DIMENSION :
DIMENSION A(10), B(10,70), C(:)
5.2.7. Instruo Inteno
5.2.7 INTENT statement
R536 intent-stmt is INTENT (intent-spec)[::]dummy-arg-name-list
Esta instruo especifica a inteno do atributo (5.1.2.7) para os argumentos mudos da lista.
Nota 5.27
Um exemplo de instruo INTENT :
SUBROUTINE EX(A, B)
INTENT(INOUT) :: A, B
5.2.8. Instruo Opcional
5.2.8 OPTIONAL statement
R537 optional-stmt is OPTIONAL[::]dummy-arg-name-list
Esta instruo especifica o atributo OPTIONAL (5.1.2.9) para um argumento mudo na lista.
Nota 5.28
Um exemplo de instruo OPTIONAL :
SUBROUTINE EX(A, B)
OPTIONAL :: B
5.2.9. Instruo Parmetro
5.2.9 PARAMETER statement
A instruo PARAMETER (PARAMETER statement) especifica o atributo PARAMETER (5.1.2.10) e os
valores para as constantes com nome na lista.
R538 parameter-stmt is PARAMETER(named-constant-def-list)
R539 named-constant-def is named-constant = initialization-expr
Uma constante com nome tem seu tipo, parmetros de tipo e forma especificada em uma especificao
especificada antes da specification-part ou implicitamente declarada (5.3). Se a constante com nome tem seu
tipo especificado implicitamente, sua apario em qualquer especificao subsequente na specification-part
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 111
deve confirmar seu tipo implcito e os valores de quaisquer parmetros de tipo implcitos.
O valor de cada constante com nome aquele especificado pela correspondente expresso de inicializao;
se necessrio, o valor convertido de acordo com as regras de atribuio intrnsecas (7.4.1.3) para um valor que
concorde com o tipo, parmetros de tipo e forma da constante com nome.
Nota 5.29
Um exemplo de instruo PARAMETER :
PARAMETER(MODULUS = MOD(28,3), NUMBER_OF_SENATORS = 100)
5.2.10. Instruo Ponteiro
5.2.10 POINTER statement
R540 pointer-stmt is POINTER[::]pointer-decl -list
R541 pointer-decl is object-name[(deferred-shape-spec-list)]
or proc-entity-name
C568 (R541) Um proc-entity-name tambm tem que ser declarado em uma procedure-declaration-
stmt
Esta instruo especifica um atributo POINTER (5.1.2.11) para uma lista de objetos e entidades
procedimento.
Nota 5.30
Um exemplo de instruo POINTER :
TYPE(NODE) :: CURRENT
POINTER :: CURRENT, A(:,:)
5.2.11. Instruo Protegido
5.2.11 PROTECTED statement
R542 protected-stmt is PROTECTED[::]entity-name-list
A instruo PROTECTED (PROTECTED statement) especifica o atributo PROTECTED (5.1.2.12) para
uma lista de entidades.
5.2.12. Instruo Salvo
5.2.12 SAVE statement
R543 save-stmt is SAVE[[::]saved-entity-list]
R544 saved-entity is object-name
or proc-pointer-name
or / common-block-name /
R545 proc-pointer-name is name
C569 (R545) Um proc-pointer-name tem que ser o nome de um procedimento ponteiro
C570 (R543) Se a instruo SAVE com uma lista de entidades salvas entidade omitida ocorre em uma unidade
de escopo, nenhuma ocorrncia explcita da atributo SAVE ou instruo SAVE permitido na mesma unidade de
escopo
Uma instruo SAVE com a lista de entidades salva especifica o atributo SAVE (5.1.2.13) para todas as
entidades nomeadas na lista ou includas dentro de um bloco comum com nome ( common block named) na lista. A
instruo SAVE sem a lista de entidades salva tratada como se ela contivesse os nomes de todos os itens na
mesma unidade de escopo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 112
Se um bloco comum com nome particular especificado em qualquer unidade de escopo de um programa
diferente de um programa principal, ele tem que ser especificado numa instruo SAVE em cada unidade de escopo
na qual o bloco comum aparece exceto no escopo da unidade de programa principal. Para um bloco comum
declarado com a instruo SAVE, os valores na sequncia de armazenamento do bloco comum (5.5.2.1), no tempo
em que uma instruo RETURN ou END executada so feitos disponveis para a prxima unidade de escopo na
sequncia de execuo do programa que especifica o nome do bloco comum ou acessa o bloco comum. Se um
bloco comum com nome (named common block) especificado na unidade de escopo de um programa principal, os
valores atuais da sequncia de armazenamento do bloco comum so feitos disponveis para cada unidade de escopo
que especifica o bloco comum com nome. O estado de definio de cada objeto em uma sequncia de
armazenamento do bloco comum depende da associao que foi estabelecida para a sequncia de armazenamento
do bloco comum.
Uma instruo SAVE pode aparecer na parte de especificao de um programa principal e no tem efeito.
Nota 5.31
Um exemplo de instruo SAVE :
SAVE A, B, C, / BLOCKA /, D
5.2.13. Instruo Alvo
5.2.13 TARGET statement
R546 target-stmt is TARGET[::]object-name[(array-spec)]
[,object-name[(array-spec)]]...
Esta instruo especifica o atributo TARGET (5.1.2.14) para uma lista de objetos.
Nota 5.32
Um exemplo de instruo TARGET :
TARGET::A(1000,1000), B
5.2.14. Instruo Valor
5.2.14 VALUE statement
R547 value-stmt is VALUE[::]dummy-arg-name-list
A instruo VALUE especifica o atributo VALUE (5.1.2.15) para uma lista de argumentos mudos.
5.2.15. Instruo Voltil
5.2.15 VOLATILE statement
R548 volatile-stmt is VOLATILE[::]object-name-list
A instruo VOLATILE especifica o atributo VOLATILE (5.1.2.16) para uma lista de objetos.
5.3 Instruo Implcita
5.3 IMPLICIT statement
Em uma unidade de escopo, uma instruo IMPLICIT especifica o tipo, e possivelmente os parmetros de
tipo, para todas as entidades de dado implicitamente declaradas cujos nomes iniciam com uma das letras
especificadas na instruo. Alternativamente, ela pode indicar que nenhuma regra de tipo implcito aplicvel em
uma unidade de escopo em particular.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 113
R549 implicit-stmt is IMPLICIT implicit-spec-list
or IMPLICIT NONE
R550 implicit-spec is declaration-type-spec(letter-spec-list)
R551 letter-spec is letter[letter]
C571 (R549) Se IMPLICIT NONE especificado em uma unidade de escopo, ela tem que preceder qualquer
instruo PARAMETER que aparece na unidade de escopo e no pode haver outra instruo IMPLICIT na
unidade de escopo
C572 (R551) Se o menos e a segunda letra aparece, a segunda letra tem que seguir a primeira letra
alfabeticamente
Uma letter-spec consistindo de duas letras separadas por um sinal de menos equivalente a escrever a
lista contendo todas as letras, na ordem alfabtica, na sequncia alfabtica da primeira letra at a segunda letra. Por
exemplo, AC equivalente a A, B, C. A mesma letra no pode aparecer como uma letra isolada ou ser includa em
um intervalo de letras mais de uma vez em todas as instrues IMPLICIT numa unidade de escopo.
Em cada unidade de escopo, existe um mapeamento, que pode ser vazio, entre cada letra A, B, , Z e um
tipo (e parmetros de tipo). Uma instruo IMPLICIT especifica o mapeamento para as letras na sua letter-spec-
list. IMPLICIT NONE especifica um mapeamento vazio para todas as letras. Se o mapeamento no
especificado para a letra, o default para uma unidade de programa ou corpo de interface ( interface body) inteiro
default se a letra I, J, ... ou N e real default nos outros casos e o default para um procedimento interno ou mdulo
o mapeamento da unidade de escopo hospedeira.
Qualquer entidade de dado que no explicitamente declarada por uma instruo de declarao de tipo,
no uma funo intrnseca e no feita acessvel por associao de uso ou associao de hospedagem declarada
implicitamente ser do tipo (e dos parmetros de tipo) mapeado pela primeira letra de seu nome, garantido que o
mapeamento no vazio. O mapeamento para a primeira letra de uma entidade de dado tem que ter sido
estabelecida anteriormente por uma instruo IMPLICIT ou pelo mapeamento default para a letra. O mapeamento
pode ser aplicado a um tipo derivado que inacessvel no escopo local se o tipo derivado acessvel para o escopo
hospedeiro. A entidade de dado tratada como se ela tivesse sido declarada em uma declarao explcita de tipo na
unidade de escopo mais externa na qual ela aparece. Uma especificao explcita de tipo em uma instruo
FUNCTION sobrescreve uma instruo IMPLICIT para o nome do resultado da funo deste subprograma funo.
Nota 5.33
Os exemplos que segue so exemplos do uso da instruo IMPLICIT:
MODULE EXAMPLE_MODULE
IMPLICIT NONE
...
INTERFACE
FUNCTION FUN(I) ! nem todas as entidades de dados necessitam
INTEGER FUN ! ser declaradas explicitamente
END FUNCTION FUN
END INTERFACE
CONTAINS
FUNCTION JFUN(J) ! todas as entidades de dados necessitam
INTEGER JFUN, J ! ser declaradas explicitamente
...
END FUNCTION JFUN
END MODULE EXAMPLE_MODULE
SUBROUTINE SUB
IMPLICIT COMPLEX(C)
C = (3.0, 2.0) ! C implicitamente declarada COMPLEX
...
CONTAINS
SUBROUTINE SUB1
IMPLICIT INTEGER(A, C)
C = (0.0, 0.0) ! C est associada por hospedagem e
! do tipo complexa
Z = 1.0 ! Z implicitamente declarada REAL
A = 2 ! A implicitamente declarada INTEGER
CC = 1 ! CC implicitamente declarada INTEGER
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 114
...
END SUBROUTINE SUB1
SUBROUTINE SUB2
Z = 2.0 ! Z implicitamente declarada REAL e
! diferente da varivel
! com mesmo nome em SUB1
. . .
END SUBROUTINE SUB2

SUBROUTINE SUB3
USE EXAMPLE_MODULE ! acessa a funo inteira FUN
! por associao de uso
Q = FUN (K) ! Q declarada implicitamente REAL e
... ! K declarada implicitamente INTEGER
END SUBROUTINE SUB3
END SUBROUTINE SUB
Nota 5.34
Uma instruo IMPLICIT pode especificar uma declaration-type-spec do tipo derivado.
Por exemplo, dada a instruo IMPLICIT e um tipo definido como segue:
IMPLICIT TYPE (POSN) (A-B, W-Z), INTEGER (C-V)
TYPE POSN
REAL X, Y
INTEGER Z
END TYPE POSN
variveis iniciando com as letras A, B, W, X, Y e Z so tipo implcitos do tipo POSN e as variveis restantes so
tipo implcitos do tipo INTEGER
Nota 5.35
O que segue um exemplo de mapeamento para um tipo derivado que inacessvel no escopo local:
PROGRAM MAIN
IMPLICIT TYPE(BLOB) (A)
TYPE BLOB
INTEGER :: I
END TYPE BLOB
TYPE(BLOB) :: B
CALL STEVE
CONTAINS
SUBROUTINE STEVE
INTEGER :: BLOB
..
AA = B
..
END SUBROUTINE STEVE
END PROGRAM MAIN
Na sub-rotina STEVE no possvel explicitamente declarar uma varivel do tipo BLOB porque para BLOB foi
dado um significado diferente, mas mapeamento implcito para a letra A continua mapeando o tipo BLOB ento
AA do tipo BLOB
5.4 Instruo NAMELIST
5.4 NAMELIST statement
Uma instruo lista de nomes (NAMELIST statement) especifica um grupo de objetos de dados com nome
que pode ser referenciado por um nico nome para o propsito de transferncia de dados (9.5, 10.10).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 115
R552 namelist-stmt is NAMELIST
/ namelist-group-name / namelist-group-object-list
[[,]/ namelist-group-name /
namelist-group-object-list]...
C573 (R552) O namelist-group-name no pode ser o nome tornado acessvel por associao de uso
R553 namelist-group-object is variable-name
C574 (R553) Um namelist-group-object no pode ser uma matriz de tamanho assumido
C575 (R552) Um namelist-group-object no pode ter o atributo PRIVATE se o namelist-group-name
tem o atributo PUBLIC
A ordem na qual as variveis so especificadas na instruo NAMELIST determina a ordem na qual os
valores aparecem na sada.
Qualquer namelist-group-name pode ocorrer mais de uma vez na instruo NAMELIST em uma unidade
de escopo. Uma namelist-group-object-list seguindo cada apario sucessiva do mesmo namelist-group-
name em uma unidade de escopo tratada como a continuao da lista para aquele namelist-group-name.
Um objeto no grupo lista de nomes (namelist group object) pode ser um membro de mais de um grupo lista
de nomes.
Um objeto no grupo lista de nomes (namelist group object) pode ser acessado por associao de uso ou
hospedagem ou ter seus tipos e parmetros de tipo e forma especificados por instrues de especificao prvias ou
um cabealho de procedimento (procedure heading) na mesma unidade de escopo ou por pela regra de tipo implcito
em efeito para a unidade de escopo. Se um objeto no grupo lista de nomes tem seu tipo definido pelas regras de tipo
implcito, sua apario em qualquer instruo de declarao de tipo tem que confirmar o tipo implcito e parmetros
de tipo.
Nota 5.36
Um exemplo de instruo NAMELIST :
NAMELIST /NLIST/ A, B, C
5.5 Associao de Armazenamento e Objetos de Dado
5.5 Storage association of data objects
Em geral, uma unidade de armazenamento fsico ou ordem de armazenamento para objetos de dados no
especificado. Entretanto, as instrues EQUIVALENCE, COMMON e SEQUENCE e BIND(C) type-attr-spec
so utilizadas para controle da ordem e configurao (layout) das unidades de armazenamento. O mecanismo geral
de associao de armazenamento descrito em 16.4.3.
As instrues EQUIVALENCE, COMMON e na maioria da vezes SEQUENCE devem ser evitadas.
Estas instrues possibilitam que o programador tenha algum controle sobre o armazenamento dos dados
(memria armazenamento). Isto uma tcnica til em alguns momentos, mas na maioria das vezes
completamente desnecessria. Alm disto, seu uso, na quase totalidade das vezes, faz com que os
programas fiquem muito complexos e sujeitos a erros, portanto: Evite, o uso destas instrues.
Deixe para aqueles casos em que elas forem realmente necessrias.
5.5.1 Instruo Equivalncia
5.5.1 EQUIVALENCE statement
Uma instruo EQUIVALENCE (EQUIVALENCE statement) usada para especificar o compartilhamento
de unidades de armazenamento por dois ou mais objetos em uma unidade de escopo. Isto produz uma associao de
armazenamento dos objetos que compartilham as unidades de armazenamento (memria).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 116
Se os objetos equivalentes tem tipos diferente ou parmetros de tipo, a instruo EQUIVALENCE no faz a
converso de tipo ou impe equivalncia matemtica. Se um escalar e uma matriz so feitos equivalentes, o escalar
no ter as propriedades da matriz e a matriz no ter as propriedades do escalar.
R554 equivalence-stmt is EQUIVALENCE equivalence-set-list
R555 equivalence-set is (equivalence-object,equivalence-object-list)
R556 quivalence-object is variable-name
or array-element
or substring
C576 (R556) Um equivalence-object no pode ser um designador com um objeto base que um
argumento mudo, um ponteiro, uma varivel alocvel, um objeto tipo derivado que tem um componente ltimo
alocvel, um objeto de um tipo derivado no sequencial, um objeto do tipo derivado que um ponteiro em
qualquer nvel de seleo de componente, um objeto automtico, um nome de funo, um nome entry, um nome
resultado, uma varivel com o atributo a BIND, uma varivel em um bloco comum que tem o atributo BIND ou uma
constante com nome
C577 (R556) Um equivalence-object no pode ser um designador que tem mais de uma part-ref
C578 (R556) Um equivalence-object no pode ter o atributo TARGET
C579 (R556) Cada subscrito ou expresso de intervalo de subscrito em uma equivalence-object tem que
ser uma expresso de inicializao(7.1.7)
C580 (R555) Se um equivalence-object um inteiro do tipo default, real default, real de preciso dupla,
complexo default, lgico default ou tipo numrico sequncia, todos os objetos no conjunto equivalente tem que ser
destas tipos
C581 (R555) Se um equivalence-object do tipo caractere default ou tipo sequncia caractere, todos os
objetos no conjunto equivalente tem que ser destas tipos
C582 (R555) Se um equivalence-object tipo derivado sequncia que no uma sequncia numrica ou
tipo sequncia caractere, todos os objetos no conjunto equivalente tem que ser do mesmo tipo com os mesmos
valores de parmetros de tipo
C583 (R555) Se um equivalence-object do tipo intrnseco diferente de inteiro default, real default, real
preciso dupla, complexo default, lgico default ou caractere default, todos os objetos no conjunto equivalente tem
que ser do mesmo tipo com os mesmos valores de parmetros de tipo
C584 (R556) Se um equivalence-object tem o atributo PROTECTED, todos os objetos no conjunto
equivalente tem que ter o atributo PROTECTED
C585 (R556) O nome de um equivalence-object no pode ser um nome feito acessvel por associao de
uso
C586 (R556) Um substring no pode ter comprimento zero
Nota 5.37
A instruo EQUIVALENCE permite a equivalncia de estruturas sequncia (sequence structures ) e a equivalncia
de objetos do tipo intrnseco com parmetros de tipo no default, mas existe, regras claras sobre a apario destes
objetos em uma instruo EQUIVALENCE.
A estrutura que aparece em uma instruo EQUIVALENCE tem que ser uma estrutura sequncia (sequence
structure ). Se a estrutura sequncia no um tipo sequncia numrica ou tipo sequncia caractere, ela ser
equivalente somente com os objetos com mesmo tipo com os mesmos valores de parmetros de tipo.
A estrutura de um tipo sequncia numrica pode ser equivalente outro estrutura do tipo sequncia numrica, um
objeto do tipo inteiro default, tipo real default, tipo real preciso dupla, tipo complexo default ou tipo lgico
default tal que os componentes ltimos da estrutura se tornem associados somente com objetos destes tipos.
Uma estrutura de um tipo sequncia caractere pode ser equivalente a um objeto do tipo caractere default ou outra
estrutura do tipo sequncia caractere.
Um objeto do tipo intrnseco com parmetros de subtipo no default (nondefault kind type parameters) pode ser
equivalente somente com objetos do mesmo tipo e parmetros de subtipo.
Mais regras sobre a interpretao da instruo EQUIVALENCE e inicializao default so dadas em 16.4.3.3
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 117
5.5.1.1 Associao de Equivalncia
5.5.1.1 Equivalence association
Uma instruo EQUIVALENCE especifica que as sequncias de armazenamento (16.4.3.1) de objetos de
dados em um equivalence-set so associadas por armazenamento. Todos as sequncias de tamanho no zero em
um equivalence-set, se existir, tem a mesma primeira unidade de armazenamento e todas as sequncias de
tamanho zero em um equivalence-set, se existir, so associadas por armazenamento umas com as outras e com a
primeira unidade de armazenamento de quaisquer sequncias de tamanho no zero. Isto causa a associao por
armazenamento dos objetos de dados em um equivalence-set e pode fazer associao por armazenamento de
outros objetos de dados.
5.5.1.2 Equivalncia de Objetos Caractere default
5.5.1.2 Equivalence of default character objects
Um objeto de dado do tipo caractere default pode ser equivalente somente com outros objetos do tipo
caractere default. Os comprimentos dos objetos equivalentes no necessitam serem os mesmos
Uma instruo EQUIVALENCE especifica que as sequncias de armazenamento de todos os objetos de
dados caractere default especificados em um equivalence-set esto associados por armazenamento. Todas as
sequncias de tamanho no zero em um equivalence-set, se existir, esto associados por armazenamento umas
com as outras e com a primeira unidade de armazenamento caractere de quaisquer sequncias de tamanho no zero.
Isto causa a associao por armazenamento dos objetos de dados em um equivalence-set e pode causar a
associao por armazenamento de outros objetos de dados.
Nota 5.38
Por exemplo, usando as declaraes:
CHARACTER(LEN = 4) :: A, B
CHARACTER(LEN = 3) :: C (2)
EQUIVALENCE(A, C (1)), (B, C (2))
a associao de A, B e C podem ser ilustrada graficamente assim:

1 2 3 4 5 6 7
|--- --- A --- ---|
|--- --- B --- ---|
|--- C(1) ---| |--- C(2) ---|
5.5.1.3 Nomes de Matrizes e Designadores de Elementos de Matriz
5.5.1.3 Array names and array element designators
Para uma matriz de tamanho no zero, o uso de um nome de matriz no qualificado por uma lista de
subscritos em uma instruo EQUIVALENCE tem o mesmo efeito que usar um designador de elemento de matriz
que identifica o primeiro elemento da matriz.
5.5.1.4 Restries nas Instrues de Equivalncia
5.5.1.4 Restrictions on EQUIVALENCE statements
Uma instruo EQUIVALENCE no pode especificar que a mesma unidade de armazenamento pode
ocorrer mais de uma vez na sequncia de armazenamento.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 118
Nota 5.39
Por exemplo:
REAL, DIMENSION(2) :: A
REAL :: B
EQUIVALENCE(A(1),B),(A(2),B) ! no est conforme o padro
proibida, porque ela irpa especificar a mesma unidade de armazenamento para A (1) e A(2)
Uma instruo EQUIVALENCE no pode especificar que unidades de armazenamentos consecutivas so
no consecutivas.
Nota 5.40
Por exemplo, o seguinte proibido:
REAL A(2)
DOUBLE PRECISION D(2)
EQUIVALENCE (A(1),D(1)),(A(2),D(2)) ! No est conforme o padro
5.5.2 Instruo Comum
5.5.2 COMMON statement
Uma instruo comum (COMMON statement) especifica blocos de armazenamento fsicos, chamados de
blocos comuns (common blocks), que podem ser acessados por qualquer unidades de escopo em um programa.
Ento, a instruo COMMON prov dados globais (forma de acesso) baseado na associao de armazenamento
(16.4.3).
Evite o uso da instruo COMMON. Na maioria das vezes ela completamente dispensvel, portanto pode
e deve ser evitada.
Coloque o que necessitar dentro de mdulos, na maioria esmagadora das vezes isto suficiente.
Use common somente quando for indispensvel.
Os blocos comuns (common blocks) especificados pela instruo COMMON podem ser nomeados (receber
nomes) e so chamados de blocos comuns com nome (named common blocks) ou podem ficar sem nome
(unnamed) e so chamados blocos comuns sem nomes (blank common).
R557 common-stmt is COMMON
[/[common-block-name]/]common-block-object-list
[[,]/[common-block-name]/
common-block-object-list]...
R558 common-block-object is variable-name[(explicit-shape-spec-list)]
or proc-pointer-name
C587 (R558) Somente uma apario de um dado variable-name ou proc-pointer-name permitido em
todos as common-block-object-lists dentro de uma unidade de escopo
C588 (R558) Um common-block-object no pode ser um argumento mudo, uma varivel alocvel, um objeto
tipo derivado com um componente ltimo que seja alocvel, um objeto automtico, o nome de uma funo, um
nome entry, uma varivel com o atributo BIND ou um nome relutado
C589 (R558) Se um common-block-object do tipo derivado, tem que ser um tipo sequncia (4.5.1) ou um
tipo com o atributo BIND e no pode ter inicializao default
C590 (R558) Um variable-name ou um proc-pointer-name no pode ser um nome feito acessvel por
associao de uso
Em cada instruo COMMON, os objetos de dados cujos nomes aparecem em uma lista de objetos bloco
comum seguindo o nome do bloco comum so declarados estar neste bloco comum. Se o primeiro bloco comum
omitido, todos os objetos de dados cujos nomes aparecem na primeira lista de objetos bloco comum so
especificados estarem em um bloco com nome sem nome (blank common). Alternativamente, a utilizao de duas
barras inclinadas (two slashes) sem o nome do bloco comum entre elas declara objetos de dados cujos nomes
aparecem na lista de objetos do bloco comum que segue como um bloco comum sem nome (blank common).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 119
Qualquer nome de bloco comum ou um nome de bloco comum omitido para um bloco comum sem nome
pode ocorrer mais de uma vez em uma ou mais instrues COMMON em uma unidade de escopo. A lista do bloco
comum seguindo cada apario sucessiva do mesmo nome de bloco comum em uma unidade de escopo tratada
como uma continuao da lista para este bloco comum com nome. Similarmente, cada lista de objetos do bloco
comum sem nome em uma unidade de escopo tratada como a continuao do bloco comum sem nome.
A forma variable-name(explicit-shape-spec-list) declara a variable-name como tendo o atributo
DIMENSION e especifica as propriedades da matriz usada. Se objetos do tipo derivado de tipo sequncia numrica
(4.5.1) ou tipo sequncia caractere (4.5.1) aparece em um comum, isto como se os componentes individuais
fossem enumerados diretamente na lista comum.
Nota 5.41
Exemplos de instrues COMMON so:
COMMON /BLOCKA/ A, B, D(10,30)
COMMON I, J, K
5.5.2.1 Sequncia de Armazenamento Bloco Comum
5.5.2.1 Common block storage sequence
Para cada bloco comum (common block) em uma unidade de escopo, uma sequncia de armazenamento
bloco comum (common block storage sequence ) formada como segue:
1. uma sequncia de armazenamento formada por uma sequncia de unidades de armazenamento nas
sequencias de armazenamento (16.4.3.1) de todos os objetos de dados nas listas de objetos bloco comum. A
ordem das sequncias de armazenamento a mesma ordem que a ordem de apario das listas de objetos
do bloco comum na unidade de escopo
2. a sequncia de armazenamento formada no item 1 estendida para incluir todas as unidades de
armazenamento de qualquer sequncia de armazenamento associada com ela por associao de
equivalncia. A sequncia pode ser estendida somente pela adio de unidade de armazenamento depois da
ltima unidade de armazenamento. Objetos de dados associados com uma entidade em um bloco comum
so considerados estar neste bloco comum
Somente instruo COMMON e instruo EQUIVALENCE aparecendo em uma unidade de escopo
contribuem para as sequncias de armazenamento bloco comum formadas nesta unidade
5.5.2.2 Tamanho do Bloco Comum
5.5.2.2 Size of a common block
O tamanho de um bloco comum (size of a common block) o tamanho da sequncia de armazenagem
bloco comum, incluindo quaisquer extenses resultante do uso de associao equivalncia.
5.5.2.3 Associao Comum
5.5.2.3 Common association
Dentro de um programa, sequncias de armazenagem bloco comum de todos os blocos comuns de tamanho
no zero com os mesmos nomes tem a mesma primeira unidade de armazenamento e sequncias de armazenamento
bloco comum de tamanho zero com os mesmos nomes so associadas por armazenamento umas com as outras.
Dentro de um programa, sequncias de armazenagem bloco comum toda de blocos comuns sem nome de tamanho
no zero esto associados umas com as outras e com a primeira unidade de armazenamento de quaisquer blocos
comuns sem nomes com tamanho no zero. Isto resulta na associao de objetos em diferentes unidades de escopo.
Associao de uso e associao de hospedagem podem fazer com que estes objetos associados se tornarem
acessveis na mesma unidade de escopo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 120
Um objeto no ponteiro do tipo inteiro default, tipo real default, tipo real preciso dupla, tipo complexo
default, tipo lgico default ou tipo sequncia numrica s pode ser associado com objetos no ponteiros destes
tipos.
Um objeto no ponteiro do tipo caractere default ou tipo sequncia caractere tem que ser associado somente
com objetos no ponteiro destes tipos.
Um objeto no ponteiro do tipo derivado que no uma sequncia numrica ou tipo sequncia caractere
tem que ser associado somente com objetos no ponteiro do mesmo tipo com os mesmos valores de parmetros de
tipo.
Um objeto no ponteiro do tipo intrnseco diferente do inteiro default, real default, real preciso dupla,
complexo default, lgico default ou caractere default tem que ser associado somente com objetos no ponteiro do
mesmo tipo e parmetros de tipo.
Um ponteiro de dado pode estar associado por armazenamento somente com ponteiros de dados do mesmo
tipo e rank (nmero de dimenses). Ponteiros de dados que so esto associados por armazenamento tem que ter
postegado os mesmos parmetros de tipo; parmetros de tipo no postergados correspondentes tem que ter o
mesmo valor. Um ponteiro de procedimento pode estar associao por armazenamento somente com outros
ponteiros procedimentos; as duas interfaces tm que ser explcitas ou as duas interfaces tm que ser implcitas, as
duas tm que ser sub-rotinas ou as duas tm que ser funes com o mesmo tipo e parmetros de tipo.
Um objeto com o atributo TARGET pode ser uma associao de armazenamento somente com outro objeto
que tem o atributo TARGET e o mesmo tipo e parmetros de tipo.
Nota 5.42
Um bloco comum permitido conter sequncias diferentes de unidades de armazenamento, garantido que cada
unidade que acessa o bloco comum especifica uma sequncia idntica de unidades de armazenamento para o
bloco comum. Por exemplo, isto permite um nico bloco comum conter unidades de armazenamento numrica e
caractere.
Associao em diferentes unidades de escopo entre objetos do tipo default, objetos do tipo real preciso dupla e
estruturas sequenciais so permitidos de acordo com as regras de objetos equivalentes (5.5.1)
5.5.2.4 Diferenas entre Bloco Comum com Nome e Bloco Comum sem Nome
5.5.2.4 Differences between named common and blank common
Um bloco comum sem nome (blank common block) tem as mesmas propriedades que um bloco comum com
nome (named common block) exceto para o seguinte:
1. execuo da instruo RETURN ou END pode causar objetos de dados em um bloco comum com nome se
tornar indefinido a menos que o bloco comum com nome tenha sido declarado em uma instruo SAVE,
mas nunca causa objetos de dados em um bloco comum sem nome se tornarem indefinidos(16.5.6)
2. bloco comum com nome com o mesmo nome tem que ter o mesmo tamanho em todas as unidades de
escopo de um programa em que eles aparecem, mas blocos comuns sem nome podem ter diferentes
tamanhos
3. Objeto de dado em um bloco comum com nome pode estar inicialmente definido por meio de uma
instruo DATA ou instruo de declarao de tipo em uma unidade de programa bloco comum (11.3), mas
objetos em um bloco comum sem nome no podem inicialmente estar definido
5.5.2.5 Restries sobre Comum e Equivalncia
5.5.2.5 Restrictions on common and equivalence
Uma instruo EQUIVALENCE no pode causar a associao de sequncias de armazenamento de dois
blocos comuns diferente.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 121
Associao de equivalncia no pode causar a extenso de uma sequncia de armazenamento bloco comum
pela adio de unidades de armazenamento precedendo a primeira unidade de armazenamento do primeiro objeto
especificado na instruo COMMON para o bloco comum.
Nota 5.43
Por exemplo, o seguinte no permitido:
COMMON /X/ A
REAL B(2)
EQUIVALENCE(A, B(2)) ! no est conforme o padro
Associao equivalncia no pode causar a associao de um objeto tipo derivado com inicializao default
com um objeto num bloco comum.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 122
6. Uso de Objetos de Dados
Section 6: Use of data objects
A apario (utilizao) de um designador de objeto de dado em um contexto que requer seu valor chamado
de referncia. Uma referncia permitida somente se o objeto de dado definido. Uma referncia a um ponteiro
permitida somente se o ponteiro est associado com um objeto alvo que est definido. Um objeto de dado se torna
definido com um valor quando eventos descritos em 16.5.5 ocorrem.
R601 variable is designator
C601 (R601) designador no pode ser uma constante ou subobjeto de uma constante
R602 variable-name is name
C602 (R602) Um variable-name tem que ser o nome de uma varivel
R603 designator is object-name
or array-element
or array-section
or structure-component
or substring
R604 logical-variable is variable
C603 (R604) logical-variable tem que ser do tipo lgico
R605 default-logical-variable is variable
C604 (R605) default-logical-variable tem que ser do tipo lgico default
R606 char-variable is variable
C605 (R606) char-variable tem que ser do tipo caractere
R607 default-char-variable is variable
C606 (R607) default-char-variable tem que ser do tipo caractere default
R608 int-variable is variable
C607 (R608) int-variable tem que ser do tipo inteiro
Nota 6.1
Por exemplo, dado as declaraes:
CHARACTER(10) A, B(10)
TYPE(PERSON) P ! veja nota 4.17
ento A, B, B (1), B (1:5), P % AGE e A (1:1) so todas variveis
Uma constante (3.2.2) uma constante literal (literal constant) ou constante com nome (named constant).
Uma constante literal um escalar escrito com uma forma sinttica que indica seu tipo, parmetros de tipo e valor.
Uma constante com nome uma constante que possu um nome; o nome tem o atributo PARAMETER (5.1.2.10,
5.2.9). Uma referncia a uma constante sempre permitida; redefinio de constante nunca permitido.
6.1 Escalares
6.1 Scalars
Um escalar (scalar) (2.4.4) uma entidade de dado (data entity) que pode ser representada ou um valor
nico do tipo e que no uma matriz (6.2). Seu valor, se definido, um nico elemento do conjunto de valores que
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 123
caracteriza o tipo.
Nota 6.2
Um objeto escalar do tipo derivado tem um nico valor que consiste dos valores de seus componentes (4.5.7)
Um escalar tem rank zero (nmero de dimenses zero).
6.1.1 Subcadeias
6.1.1 Substrings
string cadeia de
substring subcadeia de
character string cadeia de caracteres
character substring subcadeia de caracteres
muito comum o uso de string e substring no lugar de cadeia de e subcadeia de
tambm muito comum o uso de string significando character string e de
substring significando character substring, entretanto o padro no faz isto.
importante lembrar que o termo string em ingls um termo geral, e deve ser
entendido como uma cadeia de, uma corrente de, uma sequncia de coisas, que
pode ser qualquer coisa alm de caracteres.
Um substring (subcadeia substring) uma poro contgua de uma cadeia de caracteres (character string)
(4.4.4). As seguintes regras definem as formas de um substring:
R609 substring is parent-string(substring-range)
R610 parent-string is scalar-variable-name
or array-element
or scalar-structure-component
or scalar-constant
R611 substring-range is [scalar-int-expr]:[scalar-int-expr]
C608 (R610) parent-string tem que ser do tipo caractere
O valor do primeiro scalar-int-expr em substring-range chamado de ponto inicial (starting point) e
o valor do segundo chamado de ponto final (ending point). O comprimento do substring o nmero de caracteres
no substring e calculado por MAX (l f + 1, 0), onde f e l so os pontos inicial e final, respectivamente.
Com os caracteres no string raiz (parent string) numerados 1, 2, 3, ..., n, onde n o comprimento do string
raiz. Ento os caracteres no substring so aqueles do string raiz, iniciando no ponto inicial e prosseguindo em
sequncia at e incluindo o ponto final. Tanto o ponto inicial e o ponto final tem que estar dentro do intervalo
1, 2, ..., n a menos que o ponto inicial exceda o ponto final e neste caso o substring tem comprimento zero. Se o
ponto inicial no especificado, o valor default 1.
Se o ponto final no especificado, o valor default n. Se o raiz uma varivel, o substring tambm uma
varivel.
Nota 6.3
Exemplos de substrings caractere so:
B(1)(1:5) elemento de matriz como string raiz
P%NAME(1:1) componente de estrutura como string raiz
ID(4:9) varivel com nome escalar como string raiz
0123456789(N:N) constante caractere como string raiz
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 124
6.1.2 Componentes de uma Estrutura
6.1.2 Structure components
Um componente da estrutura (structure component) parte de um objeto tipo derivado; ele pode ser
referenciado por um designador de objeto. Um componente da estrutura pode ser um escalar ou uma matriz.
R612 data-ref is part-ref[%part-ref]...
R613 part-ref is part-name[(section-subscript-list)]
C609 (R612) Cada part-name exceto a mais a direita tem que ser do tipo derivado
C610 (R612) Cada part-name exceto a mais a esquerda tem que ser o nome de um componente do tipo
declarado na parte part-name precedente
C611 (R612) Se o part-name mais a direita um tipo abstrato, data-ref tem que ser polimrfico
C612 (R612) O part-name mais a esquerda tem que ser o nome de um objeto de dado
C613 (R613) Se a section-subscript-list aparece, o nmero de section-subscripts tem que ser
igual ao nmero de dimenses de part-name
O nmero de dimenses (rank) de part-ref da forma part-name o nmero de dimenses de part-name. O
nmero de dimenses de part-ref que tem a lista de subscrito das sees o nmero de subscrito tripletos
(subscript triplets) e subscritos vetor (vector subscripts) na lista.
C614 (R612) No pode haver mais de uma part-ref com nmero de dimenses no zero. O part-name a
direita da part-ref com nmero de dimenses no zero no pode ter o atributo ALLOCATABLE ou POINTER
O rank de data-ref o rank de part-ref com rank no zero, se existir; caso contrrio, o rank zero. O
objeto base da data-ref o objeto de dado cujo nome o nome mais a esquerda na part-name.
Uma data-ref com mais de uma part-ref um subobjeto de seu objeto base se nenhum dos part-names,
exceto por possivelmente os mais a direita, so ponteiros. Se o part-name mais a direita o nico ponteiro, ento a
data-ref um subobjeto de seu objeto base em um contexto que pertence ao estado de associao de ponteiro mas
no em quaisquer outros contextos.
Nota 6.4
Se X um objeto do tipo derivado com um componente ponteiro P, ento o ponteiro X%P um subobjeto de X
quando considerado como um ponteiro, isto , em um contexto onde ele no desreferenciado (dereferenced)
Entretanto o alvo de X%P no um subobjeto de X. Ento, em contextos onde X%P desreferenciado
(dereferenced) para referenciar um alvo, ele no um subobjeto de X
R614 structure-component is data-ref
C615 (R614) Existe mais de uma part-ref e a part-ref shall mais a direita tem que ter a forma part-
name
Um componente de estrutura no pode ser referenciado nem definido antes da declarao do objeto base.
Um componente da estrutura um ponteiro somente se o nome na parte mais a direita (rightmost part name)
definida com o atributo POINTER.
Nota 6.5
Exemplos de componentes de estrutura so:
SCALAR_PARENT%SCALAR_FIELD componente escalar de um escalar raiz (scalar parent)
ARRAY_PARENT(J)%SCALAR_FIELD componente de elemento de matriz raiz (array element parent)
ARRAY_PARENT(1:N)%SCALAR_FIELD componente de seo de matriz raiz (array section parent)
Para um exemplo mais elaborado veja C.3.1.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 125
Nota 6.6
As regras de sintaxe so estruturadas de tal forma que uma data-ref que termine em um nome de componente
sem uma lista de subscrito um componente da estrutura, mesmo quando outros nomes de componentes na data-
ref so seguidos por uma lista de subscrito. Uma data-ref que termina em um nome de componente com uma
lista de subscrito um elemento de matriz ou uma seo de matriz. Uma data-ref de rank no zero (nmero de
dimenses no zero) que termina com um substring-range uma seo de matriz. Uma data-ref de rank zero
que termina com um substring-range um substring.
Um subcomponente de um objeto do tipo derivado um componente deste objeto ou um subobjeto deste
objeto.
6.1.3 Inquisio de Parmetro de Tipo
6.1.3 Type parameter inquiry
Uma inquisio de parmetro de tipo (type parameter inquiry) usada para inquirir sobre o parmetro de
tipo de um objeto de dado. Ela aplica-se a tipos intrnsecos e tipos derivados.
R615 type-param-inquiry is designator%type-param-name
C616 (R615) O type-param-name tem que ser o nome de um parmetro de tipo do tipo declarado do objeto
designado pelo designador
Um parmetro de tipo postergado de um ponteiro (deferred type parameter of a pointer ) que no est
associado ou uma varivel no alocada no pode ser inquerida.
Nota 6.7
Uma inquisio de type-param-inquiry tem a sintaxe similar a referncia de um componente de estrutura, mas
no suporta a mesma semntica. Ela no uma varivel e portanto nunca no pode ter atribudo um valor a ela.
Ela pode ser utilizada somente como uma primria em uma expresso. Ela escalar, mesmo que seu designador
seja uma matriz.
Os parmetros de tipo intrnsecos tambm podem ser inquiridos pelo uso das funes intrnsecas KIND e LEN
Nota 6.8
O que segue so exemplos de inquisio de parmetro de tipo:
a%kind !-- A real. Mesmo valor que KIND(a)
s%len !-- S caractere. Mesmo valor que LEN(s)
b(10)%kind !-- inquisio sobre um elemento de matriz
p%dim !-- P um tipo derivado general_point
Veja a nota 4.24 para a definio do tipo general_point usado no ltimo exemplo acima
6.2 Matrizes
6.2 Arrays
Uma matriz (array) um conjunto de dados escalares, todos do mesmo tipo e parmetros de tipo, cujos
elementos individuais so arranjados em uma forma retangular. O dado escalar que constri uma matriz so os
elementos da matriz (array elements).
Nenhuma ordem de referncia dos elementos da matriz indicada pela aparncia do designador de matriz,
exceto onde ordenamento de elementos de matriz (6.2.2.2) especificado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 126
6.2.1 Matrizes Inteiras
6.2.1 Whole arrays
Uma matriz inteira (whole array) uma matriz com nome (matriz identificada por um nome named array),
que pode ser uma constante com nome (5.1.2.10, 5.2.9) ou uma varivel; nenhuma lista de subscrito anexado ao
nome (appended to the name).
A utilizao de uma varivel matriz inteira em um construtor executvel especifica todos os elementos da
matriz (2.4.5). Uma matriz de tamanho assumido (assumed-size array) permitida aparecer como uma matriz inteira
em um construtor executvel somente se um argumento real em uma referncia de procedimento no requer a
forma.
Se a utilizao do nome da matriz inteira em uma instruo no executvel especifica a matriz inteira
exceto pela utilizao do nome a matriz inteira em um conjunto equivalente (5.5.1.3).
6.2.2 Elementos de Matriz e Sees de Matriz
6.2.2 Array elements and array sections
R616 array-element is data-ref
C617 (R616) Cada part-ref tem que ter nmero de dimenses (rank) zero e a ltima part-ref tem que
conter uma subscript-list
R617 array-section is data-ref[(substring-range)]
C618 (R617) Exatamente uma part-ref tem que ter nmero de dimenses no zero e ou a parte final de
part-ref tem que ter uma section-subscript-list com nmero de dimenses no zero ou outra part-
ref tem que ter nmero de dimenses no zero
C619 (R617) Se um substring-range aparece, o part-name mais a direita tem que ser do tipo caractere
R618 subscript is scalar-int-expr
R619 section-subscript is subscript
or subscript-triplet
or vector-subscript
R620 subscript-triplet is [subscript]:[subscript][:stride]
R621 stride is scalar-int-expr
R622 vector-subscript is int-expr
C620 (R622) Um vector-subscript tem que ser uma expresso matricial inteira de nmero de dimenses
(rank) um
C621 (R620) O segundo subscrito no pode ser omitido em um subscript-triplet na ltima dimenso de
uma matriz de tamanho assumido
Um elemento de matriz um escalar. Uma seo de matriz uma matriz. De um substring-range est
presente em uma array-section, cada elemento o substring designado do correspondente elemento da seo de
matriz.
Nota 6.9
Por exemplo, com as declaraes:
REAL A(10,10)
CHARACTER(LEN=10) B(5,5,5)
A(1,2) um elemento de matriz, A(1:N:2,M) uma seo de matriz unidimensional e B(:,:,:)(2:3) uma
matriz de forma (5,5,5) cujos elementos so substrings de comprimento 2 dos elementos correspondentes de B
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 127
Nota 6.10
A menos que especificado de outra forma um elemento de matriz ou seo de matriz no tem um atributo da
matriz inteira. Em particular, um elemento de matriz ou uma seo de matriz no tem o atributo POINTER ou
ALLOCATABLE.
Exemplos de elementos de matriz e sees de matriz so:
ARRAY_A(1:N:2)%ARRAY_B(I,J)%STRING(K)(:) seo de matriz
SCALAR_PARENT%ARRAY_FIELD(J) elemento de matriz
SCALAR_PARENT%ARRAY_FIELD(1:N) seo de matriz
SCALAR_PARENT%ARRAY_FIELD(1:N)%SCALAR_FIELD seo de matriz
6.2.2.1 Elementos de Matriz
6.2.2.1 Array elements
O valor de um subscrito em um elemento de matriz tem estar dentro dos limites da matriz.
6.2.2.2 Ordem dos Elementos da Matriz
6.2.2.2 Array element order
Os elementos de uma matriz formam uma sequncia conhecida como ordem dos elementos da matriz
(array element order). A posio de um elemento da matriz nesta sequncia determinada pela lista de valores do
subscrito designando o elemento. O valor ordem do subscrito calculado pelo uso das frmulas da tabela Tabela
6.1.
Rank
Limites do
subscrito
Lista de
subscrito
Valor ordem do subscrito
(subscript order value)
1 j
1
: k
1
s
1
1+( s
1
j
1
)
2 j
1
: k
1
, j
2
: k
2
s
1,
s
2
1+( s
1
j
1
)
+( s
2
j
2
)d
1
3 j
1
: k
1
, j
2
: k
2
, j
3
: k
3
s
1,
s
2,
s
3
1+( s
1
j
1
)
+( s
2
j
2
)d
1
+( s
3
j
3
)d
2
d
1

7 j
1
: k
1
,, j
7
: k
7
s
1,
, s
7
1+( s
1
j
1
)
+( s
2
j
2
)d
1
+
+( s
7
j
7
)d
6
d
5
d
1
Nota:
1) d
j
=max (k
i
j
i
+1,0) o tamanho da dimenso i
2) se o tamanho da matriz diferente de zero, j
i
<s
i
<k
i
para todo
i=1,2 ,., 7
Tabela 6.1 Valor ordem do subscrito (subscript order value)
6.2.2.3 Sees de Matriz
6.2.2.3 Array sections
Uma seo de matriz (array section) um subobjeto matricial opcionalmente seguido por um intervalo de
substring (substring range).
Em uma seo de matriz que tem uma section-subscript-list, cada subscript-triplet e vector-
subscript em uma lista de subscrito da seo indica uma sequncia de subscritos, que podem ser vazia. Cada
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 128
subscrito nesta sequncia tem que estar dentro dos limites para a sua dimenso a menos que a sequncia seja vazia.
A seo de matriz o conjunto de elementos da matriz determinada por todas as possveis listas de subscritos
obtida de subscritos nicos ou sequncia de subscritos especificados por cada subscrito de seo.
Em uma seo de matriz sem section-subscript-list, o rank e a forma da matriz o rank e forma da
part-ref com rank no zero; caso contrrio, o rank da seo de matriz o nmero de subscritos tripletos (subscript
triplets) e subscritos vetor (vector subscripts) na lista de subscritos da seo. A forma uma matriz unidimensional
cujo isimo (ith) elemento o nmero de valores inteiros na sequncia indicada pelo isimo subscrito tripleto ou
subscrito vetor. Se qualquer dessas sequncias vazia, a seo de matriz tem tamanho zero. A ordem do subscrito
dos elementos da seo de matriz a do objeto de dado matricial que a seo de matriz representa.
6.2.2.3.1 Subscrito Tripleto
6.2.2.3.1 Subscript triplet
Um subscrito tripleto (subscript triplet) designa uma sequncia regular de subscritos consistindo de zero ou
mais valores. A terceira expresso no subscrito tripleto o incremento entre os valores do subscrito e chamado de
passo (stride). Os subscritos e o passo de um subscrito tripleto so opcionais. Um primeiro subscrito omitido em
um subscrito tripleto equivalente a um subscrito cujo valor o limite inferior para a matriz e um segundo subscrito
omitido equivalente ao limite superior. Um passo (stride) omitido equivalente a um passo igual a 1.
O passo no pode se zero.
Quando o passo positivo, os subscritos especificados pelo tripleto forma uma sequncia espaada
regularmente de inteiros iniciando no primeiro subscrito e prosseguindo em incrementos iguais ao passo at o
maior valor inteiro no maior que o segundo subscrito; a sequncia vazia se o primeiro subscrito maior que o
segundo.
Nota 6.12
Por exemplo, suponha que uma matriz declarada com A(5,4,3).
A seo A(3:5,2,1:2) uma matriz de forma (3,2)
A(3,2,1) A(3,2,2)
A(4,2,1) A(4,2,2)
A(5,2,1) A(5,2,2)
Quando um passo negativo, a sequncia inicia no primeiro subscrito e prossegue em incrementos do
passo para baixo at o menor inteiro igual ou maior que o segundo subscrito; a sequncia vazia se o segundo
subscrito maior que o primeiro.
Nota 6.13
Por exemplo, se uma matriz declarada como B(10), a seo B(9:1:2) uma matriz com a forma (5) cujos
elementos so B(9), B(7), B(5), B(3) e B(1), nesta ordem
Nota 6.14
Um subscrito em um subscrito tripleto no necessita estar dentro dos limites para a dimenso se todos os valores
usados na seleo dos elementos da matriz esto dentro dos limites declarados.
Por exemplo, se uma matriz declarada como B(10), a seo de matriz B(3:11:7) a matriz de forma (2)
consistindo dos elementos B(3) e B(10), nesta ordem
6.2.2.3.2 Subscrito Vetor
6.2.2.3.2 Vector subscript
Um subscrito vetor (vector subscript) designa uma sequncia de subscritos correspondendo a valores dos
elementos de uma expresso. Cada elemento da expresso tem que estar definido. Uma seo matriz
unidimensional uma seo de matriz com um subscrito vetor tendo dois ou mais elementos com o mesmo valor.
Uma seo matriz unidimensional no pode aparecer no lado esquerdo de uma instruo de atribuio nem como
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 129
um item de entrada em uma instruo READ.

Uma seo matriz com um subscrito vetor no pode ser associada como argumento com uma matriz muda
que est definida ou redefinida. Uma seo de matriz com subscrito vetor no pode ser o alvo de uma instruo de
atribuio de ponteiro. Uma seo de matriz com subscrito vetor no pode ser um arquivo interno.
Nota 6.15
Por exemplo, suponha Z uma matriz bidimensional de forma (5,7) e U e V matrizes unidimensionais de forma (3)
e (4), respectivamente. Assuma que os valores de U e V so:
U = (/ 1, 3, 2 /)
V = (/ 2, 1, 1, 3 /)
Ento Z (3,V) consiste dos elementos da terceira linha de Z na ordem:
Z(3,2) Z(3,1) Z(3,1) Z(3,3)
e Z (U, 2) consiste dos elementos da coluna:
Z(1,2) Z(3,2) Z(2,2)
e Z(U,V) consiste dos elementos:
Z(1,2) Z(1,1) Z(1,1) Z(1,3)
Z(3,2) Z(3,1) Z(3,1) Z(3,3)
Z(2,2) Z(2,1) Z(2,1) Z(2,3)
Porque Z(3,V) e Z(U,V) contm elementos duplicados de Z, as sees Z(3,V) e Z(U,V) no podem ser redefinidas
como sees
6.3 Associao Dinmica
6.3 Dynamic association
Controle dinmico sobre a alocao, associao e desalocao de alvos de ponteiros provido pelas
instrues ALLOCATE, NULLIFY e DEALLOCATE e atribuio de ponteiro. ALLOCATE (6.3.1) cria alvos para
ponteiros; atribuio de ponteiros (7.4.2) associa ponteiros com alvos existentes; NULLIFY (6.3.2) desassocia
ponteiros de alvos e DEALLOCATE (6.3.3) desassocia alvos. Associao dinmica aplica-se a escalares e matrizes
de qualquer tipo.
As instrues ALLOCATE e DEALLOCATE tambm so usadas para criar e desalocar variveis com o
atributo ALLOCATABLE.
Nota 6.16
Detalhes sobre ponteiros e associao dinmica em C.3.3
6.3.1 Instruo Alocao
6.3.1 ALLOCATE statement
A instruo ALLOCATE (ALLOCATE statement) cria, dinamicamente, alvos para ponteiros e variveis
alocveis.
R623 allocate-stmt is ALLOCATE([type-spec::]allocation-list
[,alloc-opt-list])
R624 alloc-opt is STAT = stat-variable
or ERRMSG = errmsg-variable
or SOURCE = source-expr
R625 stat-variable is scalar-int-variable
R626 errmsg-variable is scalar-default-char-variable
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 130
R627 source-expr is expr
R628 allocation is allocate-object[(allocate-shape-spec-list)]
R629 allocate-object is variable-name
or structure-component
R630 allocate-shape-spec is [lower-bound-expr:]upper-bound-expr
R631 lower-bound-expr is scalar-int-expr
R632 upper-bound-expr is scalar-int-expr
C622 (R629) Cada allocate-object tem que ser um ponteiro no procedimento ou uma varivel alocvel
C623 (R623) Se algum allocate-object na instruo tem parmetro de tipo postergado, ou type-spec ou
SOURCE= tem que aparecer
C624 (R623) Se uma type-spec aparece, ela especifica um tipo no qual cada allocate-object
compatvel com o tipo
C625 (R623) Se qualquer allocate-object polimrfico ilimitado, ou type-spec ou SOURCE= tem que
aparecer
C626 (R623) Um type-param-value em uma type-spec tem que ser um asterisco se e somente se cada
allocate-object um argumento mudo para o qual o parmetro de tipo correspondente assumido
C627 (R623) Se uma type-spec aparece, os valores dos parmetros de subtipo de cada allocate-object
tem que ser os mesmos valores do parmetro de tipo correspondente da type-spec
C628 (R628) Uma allocate-shape-spec-list tem que aparecer se e somente se o allocate-object
uma matriz
C629 (R628) O nmero de allocate-shape-specs em uma allocate-shape-spec-list tem que ser o
mesmo que o nmero de dimenses (rank) do allocate-object
C630 (R624) Nenhuma alloc-opt pode aparecer mais de um vez em uma dada alloc-opt-list
C631 (R623) Se SOURCE= aparece, type-spec no pode aparecer e allocation-list s contm um
allocate-object, que tem que ser compatvel em tipo (5.1.1.2) com a source-expr
C632 (R623) A source-expr tem que ser um escalar ou ter o mesmo nmero de dimenses (rank) que
allocate-object
C633 (R623) Parmetros de subtipo de allocate-object e source-expr tem que ter os mesmos valores
Um allocate-object ou um limite ou parmetro de tipo de uma allocate-object no pode depender do
valor de stat-variable, o valor de errmsg-variable ou do valor, limites, parmetros de tipo comprimento,
estado de alocao ou estado de associao de qualquer allocate-object na mesma instruo ALLOCATE.
Nem stat-variable, source-expr nem errmsg-variable podem ser alocada dentro da instruo
ALLOCATE na qual aparece; nem eles podem depender do valor, limites parmetros de tipo comprimento, estado
de alocao ou estado de associao de qualquer allocate-object na mesma instruo ALLOCATE.
A especificao opcional type-spec especifica o tipo dinmico e parmetros de tipo dos objetos que sero
alocados. Se o type-spec especificado, alocao de objetos polimrficos aloca um objeto com o tipo dinmico
especificado; se a source-expr especificado, a alocao aloca um objeto cujo tipo dinmico e parmetros de tipo
so os mesmos que aqueles da source-expr; caso contrrio ela aloca um objeto com um tipo dinmico igual ao do
tipo declarado.
Quando uma instruo ALLOCATE tendo uma type-spec executada, qualquer type-param-values na
type-spec especifica os parmetros de tipo. Se o valor especificado para um parmetro de tipo difere do
correspondente valor do parmetro de tipo no postergado especificado na declarao de qualquer dos allocate-
objects ento uma condio de erro ocorre.
Se um type-param-value em uma type-spec em uma instruo ALLOCATE um asterisco, isto denota
que o valor atual do parmetro de tipo assumido. Se ele uma expresso, redefinies e indefinies subsequentes
de qualquer entidade na expresso no afeta o valor do parmetro de tipo.
Nota 6.17
Um exemplo de uma instruo ALLOCATE :
ALLOCATE(X(N), B(-3:M,0:9), STAT=IERR_ALLOC)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 131
Quando uma instruo ALLOCATE executada para uma matriz, os valores das expresses do valor limite
inferior e limite superior determina os limites da matriz. Redefinies e indefinies subsequentes de quaisquer
entidades nas expresses limites no afetam os limites da matriz. Se o limite inferior omitido, o valor default 1.
Se o limite superior menor que o limite inferior, a extenso nesta dimenso zero e a matriz tem tamanho zero.
Nota 6.18
Um allocate-object pode ser do tipo caractere com comprimento zero
Se SOURCE= aparece, source-expr tem que ser conforme (2.4.5) com a alocao. Se o valor de um
parmetro de tipo comprimento no postergado de um allocate-object diferente do valor da source-expr do
parmetro de tipo correspondente, uma condio de erro ocorre. Se a alocao bem sucedida, o valor do
allocate-object se torna igual ao da source-expr.
Nota 6.19
Um exemplo de instruo ALLOCATE na qual o valor e o tipo dinmico so determinados por referncia a outro
objeto :
CLASS(*),ALLOCATABLE :: NEW
CLASS(*),POINTER :: OLD
! ...
ALLOCATE(NEW,SOURCE=OLD) ! aloca NEW com o valor e tipo dinmico de OLD
Um exemplo mais abrangente dado em C.3.2.
Se o especificador STAT= aparece, execuo bem sucedida da instruo ALLOCATE faz com que a stat-
variable se torne definida com o valor zero. Se uma condio de erro ocorre durante a execuo da instruo
ALLOCATE a stat-variable se torna definida com um valor inteiro dependente do processador e cada
allocate-object ir ter um estado dependente do processador; cada allocate-object que foi alocado com
sucesso tem um estado de alocado ou um estado de associao ponteiro associado; cada allocate-object que no
foi alocado com sucesso retem seu estado de alocao ou estado se associao ponteiro anterior.
Se uma condio de erro ocorre durante uma instruo ALLOCATE que no contm um especificador
STAT= , faz com que a execuo do programa termine.
O especificador ERRMSG= descrito em 6.3.1.3.
6.3.1.1 Alocao de Variveis Alocveis
6.3.1.1 Allocation of allocatable variables
O estado de alocao de uma entidade alocvel um dos seguinte, durante a execuo do programa:
1. o estado de uma varivel alocvel se torna alocada (allocated) se ela alocada por uma instruo
ALLOCATE, se ela alocada durante atribuio ou se ela recebe este estado por um procedimento
transferncia de alocao (13.5.16). Uma varivel alocvel com este estado pode ser referenciada, definida
ou desalocada; alocao dela produz uma condio de erro na instruo ALLOCATE. A funo intrnseca
ALLOCATED (13.7.9) retorna verdade (true) para este tipo de varivel
2. uma varivel alocvel tem um estado de no alocada (unallocated) se ela no est alocada. O estado de
uma varivel alocvel se torna desalocada se ela desalocada (6.3.3) ou se ela recebe este estado por um
procedimento transferncia de alocao. Uma varivel alocvel com este estado no pode ser referenciada
ou definida. Ela no pode usada como um argumento real correspondendo a um argumento mudo no
alocvel, exceto para certas funes intrnsecas inquisitrias. Ela pode ser alocada com a instruo
ALLOCATE. Desalocar ela produz uma condio de erro na instruo DEALLOCATE. A funo intrnseca
ALLOCATED (13.7.9) retorna falso (false) para este tipo de varivel
No incio da execuo de um programa, variveis alocveis esto no alocadas.
Um objeto alocvel salvo tem um estado inicial de no alocado. O estado muda durante a execuo do
programa.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 132
Quando o estado de alocao da varivel muda, o estado de alocao de qualquer varivel alocvel
associado muda de acordo. Alocao de uma varivel alocvel estabelece valores para os parmetros de tipo
postergados de todas as variveis alocveis associadas.
Um objeto alocvel no salvo que um avarivel local de um procedimento tem o estado de no alocado
no incio de cada invocao do procedimento. O estado pode variar durante a execuo do procedimento. Um
objeto alocvel no salvo que um avarivel local de um mdulo ou um subobjeto l tem um estado inicial de no
alocado. O estado pode variar durante a execuo do programa.
Quando um objeto do tipo derivado criado por uma instruo ALLOCATE, qualquer componente ltimo
alocvel tem um estado de alocao de no alocado.
6.3.1.2 Alocao de Alvos de Ponteiros
6.3.1.2 Allocation of pointer targets
Alocao de um ponteiro cria um objeto que implicitamente possu o atributo TARGET. Seguindo a
execuo bem sucedida de uma instruo ALLOCATE para um ponteiro, o ponteiro associado com o alvo e pode
ser usado para referenciar ou definir o alvo. Ponteiros adicionais podem se tornar associados com o alvo do
ponteiro ou parte do alvo do ponteiro por atribuio de ponteiro. No um erro alocar um ponteiro que j est
associado com um alvo. Neste caso, um novo alvo de ponteiro criado como requerido pelos atributos do ponteiro
e qualquer limites de matriz, tipo e parmetros de tipo especificado pela instruo ALLOCATE. O ponteiro ento
associado com este novo alvo. Qualquer associao prvia do ponteiro com o alvo quebrada. Se o alvo prvio foi
criado por alocao, ele se trona inacessvel a menos que outros ponteiros estejam associados com ele. A funo
intrnseca ASSOCIATED (13.7.13) pode sere usada para determinar quando um ponteiro que no teve seu estado
de associao indefinido est associado.
No incio da execuo de uma funo cujo resultado um ponteiro, o estado de associao do resultado
ponteiro indefinido. Antes desta funo retornar, ela tem que associar o alvo com este ponteiro ou fazer o estado
de associao deste ponteiro ficar definido como desassociado.
6.3.1.3 Especificador ERRMSG=
6.3.1.3 ERRMSG= specifier
Se uma condio de erro acontecer durante a execuo de uma instruo ALLOCATE ou DEALLOCATE,
o processador tem que atribuir uma mensagem explicativa para errmsg-variable. Se esta condio no acontecer,
o processador no pode mudar o valor de errmsg-variable.
6.3.2 Instruo de Nulificao
6.3.2 NULLIFY statement
A instruo NULLIFY (NULLIFY statement ) faz com que ponteiros seja desassociados.
R633 nullify-stmt is NULLIFY(pointer-object-list)
R634 pointer-object is variable-name
or structure-component
or proc-pointer-name
C634 (R634) Cada pointer-object temque ter o atributo POINTER
Um pointer-object no pode depender do valor, limites ou estado de associao de outro pointer-
object na mesma instruo NULLIFY.
Nota 6.20
Quando uma instruo NULLIFY aplicada a um ponteiro polimrfico (5.1.1.2), seu tipo dinmico se torna o tipo
declarado
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 133
6.3.3 Instruo de Desalocao
6.3.3 DEALLOCATE statement
A instruo DEALLOCATE (DEALLOCATE statement) causa variveis alocveis se tornarem
desalocadas; ela faz com que alvos de ponteiros seja desalocados e os ponteiros desassociados.
R635 deallocate-stmt is DEALLOCATE(allocate-object-list[,dealloc-opt-list])
C635 (R635) cada allocate-object tem que ser um ponteiro no procedimento ou uma varivel alocvel
R636 dealloc-opt is STAT = stat-variable
or ERRMSG = errmsg-variable
C636 (R636) Nenhuma dealloc-opt pode aparecer mais de uma vez em uma dada dealloc-opt-list
Um allocate-object no pode depender do valor, limites ou estado de associao de outro allocate-
object na mesma instruo DEALLOCATE; ele tambm no pode depender do valor da stat-variable ou
errmsg-variable na mesma instruo DEALLOCATE.
Nem stat-variable nem errmsg-variable pode ser desalocada dentro da mesma instruo
DEALLOCATE; elas tambm no podem depender do valor, limites ou estado de associao de outro allocate-
object na mesma instruo DEALLOCATE.
Se o especificador STAT= aparece, execuo bem sucedida da instruo DEALLOCATE causa a stat-
variable se tornar definida com o valor zero. Se uma condio de erro acontecer durante a execuo da instruo
DEALLOCATE, a stat-variable se torna definida com um valor inteiro positivo dependente do processador e
cada allocate-object que foi desalocado corretamente tem um estado de alocao desalocado ou um estado de
associao de ponteiro de desassociado. Cada allocate-object que no foi corretamente desalocado retm seu
estado de alocao prvio ou estado de associao ponteiro.
Nota 6.21
O estado dos objetos que no foram bem sucedido na desalocao podem ser individualmente verificados com as
funes intrnsecas ALLOCATED ou ASSOCIATED
Se uma condio de erro ocorre durante a execuo da instruo DEALLOCATE que no contm o
especificador STAT=, faz com que a execuo do programa termine.
O especificador ERRMSG= descrito em 6.3.1.3.
Nota 6.22
Um exemplo de instruo DEALLOCATE :
DEALLOCATE(X, B)
6.3.3.1 Desalocao de Variveis Alocadas
6.3.3.1 Deallocation of allocatable variables
Desalocao de uma varivel alocvel no alocada causa uma condio de erro na instruo
DEALLOCATE. Desalocao de uma varivel alocvel com o atributo TARGET causa o estado de associao do
ponteiro de qualquer ponteiro associado com ele se tornar indefinido.
Quando a execuo de um procedimento terminada pela execuo da instruo RETURN ou END, uma
varivel alocada que uma varivel com nome local do procedimento mantm sua alocao e estado de definio
se ela tem o atributo SAVE ou a varivel resultado da funo ou um subobjeto; caso contrrio, ela desalocada.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 134
Nota 6.23
A funo intrnseca ALLOCATED pode ser usada para determinar quando uma varivel est alocada ou
desalocada
Se um objeto alocvel no salvo uma varivel local de um mdulo e ele est alocado quando a execuo
da instruo RETURN ou END isto resulta em nenhuma unidade de escopo ativa acessando o mdulo,
dependente do processador se o objeto retm seu estado de alocao ou desalocado.
Nota 6.24
O exemplo que segue ilustra o efeito de SAVE no estado de alocao.
MODULE MOD1
TYPE INITIALIZED_TYPE
INTEGER::I=1 ! inicializao default
END TYPE INITIALIZED_TYPE
SAVE::SAVED1, SAVED2
INTEGER::SAVED1, UNSAVED1
TYPE(INITIALIZED_TYPE)::SAVED2,UNSAVED2
ALLOCATABLE::SAVED1(:),SAVED2(:),UNSAVED1(:),UNSAVED2(:)
END MODULE MOD1
PROGRAM MAIN
CALL SUB1 ! os valores retornados pela chamada intrnseca ALLOCATED
! na instruo PRINT so:
! .FALSE., .FALSE., .FALSE. e .FALSE.
! Mdulo MOD1 usado e sua variveis esto alocadas
! Depois do retorno vindo da sub-rotina, se as variveis
! que no foram especificadas com o atributo SAVE
! retm seus estados de alocao isto dependente do processasor
CALL SUB1 ! Os valores retornados pelas primeiras duas chamada intrnsecas ALLOCATED
! na instruo PRINT so:
! .TRUE., .TRUE.
! Os valores retornados pelas segundas duas chamadas intrnsecas ALLOCATED
! na instruo PRINT so
! dependente do processador e cada uma delas pode ser
! .TRUE. ou .FALSE.
CONTAINS
SUBROUTINE SUB1
USE MOD1 ! traz variveis salvas e no salvas
PRINT*, ALLOCATED(SAVED1),ALLOCATED(SAVED2),ALLOCATED(UNSAVED1),ALLOCATED(UNSAVED2)
IF(.NOT. ALLOCATED(SAVED1)) ALLOCATE(SAVED1(10))
IF(.NOT. ALLOCATED(SAVED2)) ALLOCATE(SAVED2(10))
IF(.NOT. ALLOCATED(UNSAVED1)) ALLOCATE(UNSAVED1(10))
IF(.NOT. ALLOCATED(UNSAVED2)) ALLOCATE(UNSAVED2(10))
END SUBROUTINE SUB1
END PROGRAM MAIN
Se uma construo executvel referencia uma funo cujo resultado alocvel ou uma estrutura com um
subobjeto que alocvel e a referncia da funo executada, um resultado alocvel e qualquer subobjeto que uma
entidade alocvel alocada no resultado retornado pelo funo desalocada depois da execuo das construes
executveis mais internas contendo a referncia.

Se uma expresso de especificao em uma unidade de escopo referencia uma funo cujo resultado
alocvel ou uma estrutura com um subobjeto que alocvel e a referncia da funo executada, um resultado
alocvel e qualquer subobjeto que uma entidade alocvel alocada no resultado retornado pelo funo desalocada
antes da execuo da primeira instruo executvel na unidade de escopo.
Quando um procedimento invocado, qualquer objeto alocvel alocado que um argumento real associado
com um argumento mudo alocvel com inteno INTENT(OUT) desalocado; qualquer objeto alocvel alocado
que um subobjeto de um argumento real associado com um argumento mudo com INTENT(OUT) desalocado.
Quando uma instruo intrnseca de atribuio (7.4.1.3) executada, qualquer subobjeto alocvel alocado
de uma varivel desalocada antes da atribuio ser efetuada.
Quando uma varivel do tipo definido desalocado, qualquer subobjeto alocvel alocado desalocado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 135
Se um componente alocvel um subobjeto de um objeto finalizvel, este objeto finalizado antes do
componente ser automaticamente desalocado.
O efeito de um desalocao automtico o mesmo que o da instruo DEALLOCATE sem a dealloc-
opt-list.
Nota 6.25
No exemplo que segue:
SUBROUTINE PROCESS
REAL, ALLOCATABLE :: TEMP(:)
REAL, ALLOCATABLE, SAVE :: X(:)
...
END SUBROUTINE PROCESS
ao retornar da sub-rotina PROCESS, o estado de associao de X preservado porque X tem o atributo SAVE.
TEMP no tem o atributo SAVE, ento ele ser desalocado. Na prxima invocao de PROCESS, TEMP ir ter
um estado de alocao de no alocado
6.3.3.2 Desalocao os Alvos de Ponteiros
6.3.3.2 Deallocation of pointer targets
Se um ponteiro aparece em uma instruo DEALLOCATE, seu estado de associao tem que estar
definido. Desalocao de um ponteiro que est desassociado ou cujo alvo no foi criado por uma instruo
ALLOCATE causa uma condio de erro na declarao DEALLOCATE. Se um ponteiro est associado com uma
entidade alocvel, o ponteiro no pode ser desalocado.
Se o ponteiro aparece em uma instruo DEALLOCATE, ele tem que estar associado com o total de um
objeto que foi criado por alocao. Desalocao de um alvo de ponteiro causa o estado de associao do ponteiro
de qualquer outro ponteiro que est associado com o alvo ou parte do alvo se tornar indefinido.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 136
7. Expresses e Atribuio
Section 7: Expressions and assignment
Esta seo descreve a formao, interpretao e regras de avaliao para expresses intrnsecas e atribuio
definida, atribuio de ponteiro, atribuio de matriz mascarada (masked array assignment) (WHERE) e FORALL.
7.1 Expresses
7.1 Expressions
Uma expresso (expression) representa um referncia dados ou um clculo e seu valor um escalar ou
uma matriz. Uma expresso formada por operandos, operadores e parnteses.
Um operando um escalar ou uma matriz. Uma operao intrnseca ou definida (7.2). Expresses mais
complicadas podem ser formadas usando os operandos que so por si prprio expresses.
A avaliao de uma expresso produz um valor, que tem um tipo, parmetros de tipo (se apropriado) e uma
forma (7.1.4).
7.1.1 Forma de uma Expresso
7.1.1 Form of an expression
Uma expresso definida em termos de vrias categorias: primria, expresso nvel-1, expresso nvel-2,
expresso nvel-3, expresso nvel-4, expresso nvel-5.
Estas categorias esto relacionadas com nveis diferentes de precedncia dos operadores, em geral, so
definidas em termos de outras categorias. A forma mais simples para cada categoria de expresso a primria. As
regras fornecidas a seguir especifica a sintaxe de uma expresso. As semnticas so especificadas em 7.2.
7.1.1.1 Primria
7.1.1.1 Primary
R701 primary is constant
or designator
or array-constructor
or structure-constructor
or function-reference
or type-param-inquiry
or type-param-name
or ( expr )
C701 (R701) O type-param-name tem que ser o nome de um parmetro de tipo
C702 (R701) O designador no pode se uma matriz inteira de tamanho assumido
Nota 7.1
Exemplo de primrias so:
Exemplo Classe sinttica
1.0 constante
ABCDEFGHIJKLMNOPQRSTUVWXYZ(I:I) subobjeto constante
A varivel
(/ 1.0, 2.0 /) construtor de matriz
PERSON(12,Jones) construtor de estrutura
F(X, Y) referncia de funo
(S + T) ( expr )
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 137
7.1.1.2 Expresses nvel-1
7.1.1.2 Level-1 expressions
Operadores unrios definidos tm a mais alta precedncia (tabela 7.7). Expresses de nvel-1 so primrias
opcionalmente operadas pelos operadores unrios definidos:
R702 level-1-expr is [defined-unary-op]primary
R703 defined-unary-op is . letter[letter]... .
C703 (R703) Um defined-unary-op no pode conter mais de 63 letras e no pode ser o mesmo que
qualquer intrinsic-operator ou logical-literal-constant
Nota 7.2
Exemplos simples de uma expresses nvel-1 so:
Ex emplo Classe sinttica
A primria (R701)
.INVERSE. B level-1-expr (R702)
Um exemplo mais complicado de expresso nvel-1 :
.INVERSE. (A + B)
7.1.1.3 Expresses nvel-2
7.1.1.3 Level-2 expressions
Expresses de nvel-2 so expresses de nvel-1 opcionalmente envolvendo os operadores numricos
potenciao (power-op), multiplicao (mult-op) e adio (add-op).
R704 mult-operand is level-1-expr[power-op mult-operand]
R705 add-operand is [add-operand mult-op]mult-operand
R706 level-2-expr is [[level-2-expr]add-op]add-operand
R707 power-op is **
R708 mult-op is *
or /
R709 add-op is +
or -
Nota 7.3
Exemplos simples de expresses de nvel-2 so:
Ex emp los Classe sinttica Comentrio
A primary (R701) A um primria (R702)
B**C level-1-expr (R702) B um level-1-expr, ** um power-op
e C um mult-operand (R704)
D*E add-operand D um add-operand, * um mult-op
e E um mult-operand (R705)
+1 level-2-expr + um add-op
e 1 um add-operand (R706)
F - I level-2-expr F um level-2-expr, um add-op
e I um add-operand (R706)
Um exemplo mais complicado de expresso nvel-2 :
- A + D * E + B ** C
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 138
7.1.1.4 Expresses nvel-3
7.1.1.4 Level-3 expressions
Expresses de nvel-3 so expresses de nvel-2 opcionalmente envolvendo o operador caractere
concatenao.
R710 level-3-expr is [level-3-expr concat-op]level-2-expr
R711 concat-op is //
Nota 7.4
Exemplos simples de expresses nvel-3 so:
Ex emp lo Classe sinttica
A level-2-expr (R706)
B // C level-3-expr (R710)
Um exemplo mais complicado de expresso nvel-3 :
X // Y // ABCD
7.1.1.5 Expresses nvel-4
7.1.1.5 Level-4 expressions
Expresses de nvel-4 so expresses de nvel-3 opcionalmente envolvendo operadores relacionais.
R712 level-4-expr is [level-3-expr rel-op]level-3-expr
R713 rel-op is .EQ.
or .NE.
or .LT.
or .LE.
or .GT.
or .GE.
or ==
or /=
or <
or <=
or >
or >=
Nota 7.5
Exemplos simples de expresses nvel-4 so:
Ex empl o Classe sinttica
A level-3-expr (R710)
B == C level-4-expr (R712)
D < E level-4-expr (R712)
Um exemplo mais complicado de expresso nvel-4 :
(A + B) /= C
7.1.1.6 Expresses nvel-5
7.1.1.6 Level-5 expressions
Expresses de nvel-5 so expresses de nvel-4 opcionalmente envolvendo operadores lgicos not-op,
and-op e equiv-op.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 139
R714 and-operand is [not-op]level-4-expr
R715 or-operand is [or-operand and-op]and-operand
R716 equiv-operand is [equiv-operand or-op]or-operand
R717 level-5-expr is [level-5-expr equiv-op]equiv-operand
R718 not-op is .NOT.
R719 and-op is .AND.
R720 or-op is .OR.
R721 equiv-op is .EQV.
or .NEQV.
Nota 7.6
Exemplos simples de expresses nvel-5 so:
Ex empl o Classe sinttica
A level-4-expr (R712)
.NOT. B and-operand (R714)
C .AND. D or-operand (R715)
E .OR. F equiv-operand (R716)
G .EQV. H level-5-expr (R717)
S .NEQV. T level-5-expr (R717)
Um exemplo mais complicado de expresso nvel-5 :
A .AND. B .EQV. .NOT. C
7.1.1.7 Forma Geral de uma Expresso
7.1.1.7 General form of an expression
So expresses de nvel-5 opcionalmente envolvendo operadores binrios definidos. Operadores binrios
definidos tem a menor precedncia entre os operadores (tabela 7.7).
R722 expr is [expr defined-binary-op]level-5-expr
R723 defined-binary-op is . letter[letter]... .
C704 (R723) Um defined-binary-op no pode conter mais de 63 letras e no pode ser o meso que qualquer
intrinsic-operator ou logical-literal-constant
Nota 7.7
Exemplos simples de uma expresso so:
Ex empl o Classe sinttica
A level-5-expr (R717)
B.UNION.C expr (R722)
Exemplos mais complicados de expresses so:
(B .INTERSECT. C) .UNION. (X - Y)
A + B == C * D
.INVERSE. (A + B)
A + B .AND. C * D
E // G == H (1:10)
7.1.2 Operaes Intrnsecas
7.1.2 Intrinsic operations
Uma operao intrnseca (intrinsic operation) uma operao intrnseca unria ou uma operao
intrnseca binria. Uma operao intrnseca unria (intrinsic unary operation) uma operao da forma
intrinsic-operator x
2
onde x
2
um dos tipos intrnsecos (4.4) listado na tabela 7.1 para o operador
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 140
intrnseco unrio.
Uma operao intrnseca binria uma operao da forma x
1
intrinsic-operator x
2
onde x
1
e
x
2
so dos tipos intrnsecos (4.4) listado na tabela 7.1 para o operador intrnseco binrio e so conforme na
forma(7.1.5).
Tabela 7.1 Tipo de operandos e resultados para os operadores intrnsecos
Operador intrnseco op Tipo de x
1
Tipo de x
2
Tipo de x
1
| op x
2
Unrio +, I, R Z I, R, Z
Binrio +, , *, /, ** I
R
Z
I, R Z
I, R Z
I, R Z
I, R Z
R, R, Z
Z, Z, Z
/ / C C C
.EQ. , .NE. , = = , /= I
R
Z
C
I, R Z
I, R Z
I, R Z
C
L, L, L
L, L, L
L, L, L
L
.GT. , .GE. , .LT. , .LE. ,
>, >=, <, <=
I
R
C
I, R
I, R
C
L, L
L, L
L
.NOT. L L
.AND. , .OR. , .EQV. ,
.NEQV.
L L L
Nota:
Os smbolos I, R, Z, C e L representam os tipos inteiros, real, complexo, caractere e lgico, respectivamente.
Onde mais de um tipo fornecido, o tipo do resultado da operao dado na mesma posio relativa na prxima
coluna. Para os operadores intrnsecos que requerem operandos do tipo caractere, o parmetro de tipo do
operandos tm que ser os mesmos
Uma operao intrnseca numrica (numeric intrinsic operation) uma operao intrnseca na qual um
intrinsic-operator um operador numrico (+, , , / ou ). Um operador intrnseco numrico um
operador em uma operao intrnseca numrica.
Para as operaes intrnsecas numricas binrias, os dois operandos podem ser de tipos numricos
diferentes ou diferente parmetros de tipo subtipo (kind type parameters). Exceto para os valores elevados a uma
potncia inteira, se o operador tem tipos diferentes ou parmetro de tipo diferente daqueles, o resultado
convertido para o tipo e parmetro de tipo do resultado antes da antes da operao ser realizada. Quando o valor de
tipo real ou complexo elevado a uma potncia inteira, o operando inteiro no necessita ser convertido.
Uma operao intrnseca caractere (character intrinsic operation), operao intrnseca relaciona
(relational intrinsic operation) e operao intrnseca lgica (logical intrinsic operation) so similarmente definidas
e,termos do operador intrnseco caractere (character intrinsic operator) (//), operador intrnseco relacional
(relational intrinsic operator) (.EQ., .NE., .GT., .GE., .LT., .LE., ==, /=, >, >=, < e <=) e operador intrnseco
lgico (logical intrinsic operator) (.AND., .OR., .NOT., .EQV., and .NEQV.), respectivamente. Para operadores
intrnsecos relacionais com operandos caractere, os parmetros de tipo subtipo (kind type parameters) tm que serem
os mesmos.
Uma operao intrnseca numrica relacional (numeric relational intrinsic operation) uma operao
intrnseco relacional quando os operandos so do tipo numrico. Uma operao intrnseca caractere relacional
(character relational intrinsic operation) uma operao intrnseco relacional quando os operandos so do tipo
caractere.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 141
7.1.3 Operaes Definidas
7.1.3 Defined operations
Uma operao definida (defined operation) uma operao unria ou uma operao definida binria. Uma
operao definida unria uma operao que tem a foram defined-unary-op x
2
ou intrinsic-operator
x
2
e definida por uma funo e uma interface genrica (4.5.1, 12.3.2.1).
A funo define a operao unria op x
2
se
1. a funo especificada co, uma instruo FUNCTION (12.5.2.1) ou ENTRY (12.5.2.4) que especifica um
argumento mudo d
2

2. um dos seguintes casos
(a) uma interface genrica (12.3.2.1) prov a funo com uma generic-spec OPERATOR (op) ou
(b) existe uma ligao genrica (generic binding) (4.5.1) no tipo declarado
x
2
com uma generic-spec
OPERATOR (op) e existe uma ligao correspondendo a funo no tipo dinmico
x
2
3. o tipo de d
2
compatvel com o tipo dinmico de
x
2
,
4. os parmetros de tipo. Se existirem, de d
2
concordam com os correspondentes parmetros de tipo de
x
2
e
5. um dos seguintes casos
(a) o rank de
x
2
concorda com o de d
2
ou
(b) a funo elementar e no existe outra funo que define a operao
Se d
2
uma matriz, a forma de
x
2
tem que concordar com a forma de d
2
.
Uma operao binria definida (defined binary operation) uma operao que tem a forma x
1
defined-binary-op x
2
ou x
1
intrinsic-operator x
2
e definido por uma funo e uma interface
genrica
Uma funo define uma operao binria x
1
op x
2
se
1. a funo especificada com a instruo FUNCTION (12.5.2.1) ou ENTRY (12.5.2.4) que especifica dois
argumentos mudos d
1
e d
2

2. um dos seguintes casos
(a) uma interface genrica (12.3.2.1) prov a funo com uma generic-spec do OPERATOR (op) ou
(b) existe uma ligao genrica (generic binding) (4.5.1) na declarao de tipo de x
1
ou x
2
com uma
generic- spec do OPERATOR (op) e existe uma ligao correspondendo a uma funo no tipo
dinmico x
1
ou x
2
, respectivamente
3. os tipos de
d
1
e
d
2
so compatveis com os tipos dinmicos de
x
1
e
x
2
, respectivamente
4. os parmetros de tipo, se existirem, de
d
1
e
d
2
concordam com os parmetros de tipo de
x
1
e
x
2
,
respectivamente
5. um dos seguintes casos
(a) os ranks (nmeros de dimenses) de x
1
e x
2
concordam com os de d
1
e d
2
ou
(b) a funo elementar, x
1
e x
2
so conformes e no existe outra funo que define a operao
Se d
1
ou d
2
uma matriz, as formas de x
1
e x
2
tem que concordarem com as formas de d
1
e
d
2
, respectivamente
Nota 7.8
Um operador intrnseco pode ser usado como um operador em uma operao definida. Neste caso as propriedades
genricas do operador so estendidas
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 142
Uma operao estendida (extension operation) uma operao definida na qual o operador est na forma
defined-unary-op ou defined-binary-op. Este tipo de operador chamado de operador extenso (extension
operator). O operador usado na operao extenso pode ser tal que a interface genrica do operador pode
especificar mais de uma funo.
Uma operao elementar definida (defined elemental operation) a uma operao para a qual a funo
elementar(12.7).
7.1.4 Tipo, Parmetros de Tipo e Forma de uma Expresso
7.1.4 Type, type parameters, and shape of an expression
O tipo, parmetros de tipo e forma de uma expresso depende dos operadores e dos tipos e parmetros de
tipo e formas das primrias usadas na expresso e so determinados recursivamente da forma sinttica da
expresso. O tipo de uma expresso um dos tipos intrnsecos (4.4) ou um tipo derivado (4.5).
Se uma expresso uma primria polimrfico ou operao definida, os parmetros de tipo e os tipos
dinmicos declarados da expresso so os mesmos das primrias ou operaes definidas. Caso contrrio, os
parmetros de tipo e tipos dinmicos da expresso so os mesmos que os tipos e parmetros de tipo declarados; eles
so referenciados simplesmente como o tipo e parmetros de tipo da expresso.
R724 logical-expr is expr
C705 (R724) logical-expr tem que ser lgico
R725 char-expr is expr
C706 (R725) char-expr tem que ser caractere
R726 default-char-expr is expr
C707 (R726) default-char-expr tem que ser tipo default caractere
R727 int-expr is expr
C708 (R727) int-expr shall tem que ser tipo inteiro
R728 numeric-expr is expr
C709 (R728) numeric-expr tem que ser tipo inteiro, real ou complexo
7.1.4.1 Tipo, Parmetros de Tipo e Forma de uma Primria
7.1.4.1 Type, type parameters, and shape of a primary
O tipo, parmetros tipo e forma de uma primria so determinados conforme a primria constante,
varivel, construtor de matriz, construtor de estrutura, referncia de funo, inquisio de parmetro de tipo, nome
de parmetro de tipo ou expresso parametrizada. Se a primria constante, seu tipo e parmetros de tipo so
descritos em 4.5.9. Se um construtor de matriz, seu tipo, parmetros de tipo e forma so descritos em 4.7. Se
uma varivel ou referncia de funo, seu tipo, parmetros de tipo e forma so descritos em (5.1.1, 5.1.2) ou a
referncia de funo (12.4.2), respectivamente. Se a referncia de funo genrica (12.3.2.1, 13.5) ento seu tipo,
parmetros de tipo e forma aqueles especificados pela funo referenciadas que determinada pelo tipo,
parmetros de tipo e rank (nmero de dimenses) de seus argumentos reais como especificado em 16.2.3. Se uma
inquisio de parmetro de tipo ou nome do parmetro de tipo, ela um inteiro escalar com o subtipo ( kind) do
parmetro de tipo.
Se uma primria uma expresso com parnteses, seu tipo, parmetros de tipo e forma so aquelas da
expresso.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 143
Se um ponteiro aparece em uma das seguinte, o objeto alvo do ponteiro associado referenciado:
1. Uma primria em uma operao intrnseca ou definida
2. uma expr de uma primria parametrizada
3. uma nica primria no lado direito de uma instruo de atribuio intrnseca
O tipo , parmetros de tipo e forma de uma primria so aquelas do alvo associado (current target). Se o
ponteiro no est associado com um alvo, ele pode aparecer com uma primria somente como um argumento real
em uma referncia de um procedimento cujo correspondente argumento mudo declarado como um sendo um
ponteiro ou como um alvo em uma instruo de atribuio de ponteiro.
Um ponteiro matriz desassociado ou uma matriz alocvel no alocada no tem forma, mas tem nmero de
dimenses (rank). O tipo , parmetros de tipo e rank do resultado de uma funo intrnseca NULL depende do
contexto (13.7.88).
7.1.4.2 Tipo, Parmetros de Tipo e Forma do Resultado de uma Operao
7.1.4.2 Type, type parameters, and shape of the result of an operation
O tipo do resultado de uma operao intrnseca x
1
| op x
2
especificado na tabela 7.1. A forma do
resultado da operao intrnseca a forma de x
2
se op unrio ou se x
1
escalar e da forma de x
1
caso
contrrio.
O tipo, parmetros de tipo e forma do resultado de uma operao definida x
1
| op x
2
especificado
pela funo definindo a operao (7.2).
Uma expresso de um tipo intrnseco tem o tipo e parmetro de tipo subtipo (kind type parameter). Uma
expresso do tipo caractere tambm tem um parmetro de comprimento.
Os parmetros de tipo do resultado de uma operao intrnseca so os seguintes:
1. para uma expresso
x
1
// x
2
onde // o operador intrnseco caractere e
x
1
e
x
2
so do tipo
caractere, o parmetro do comprimento caractere a soma dos comprimentos dos operandos e o parmetro
de subtipo o parmetro de tipo subtipo de x
1
, que tem que ser igual ao parmetro de tipo de x
2
2. para uma expresso
op x
2
onde op operador intrnseco unrio e
x
2
do tipo inteiro, real, complexo
ou lgico, o parmetro de tipo subtipo da expresso igual ao do operando
3. para uma expresso
x
1
op x
2
onde op um operador intrnseco binrio com um dos operandos do tipo
inteiro e os outros do tipo real ou complexo o parmetro de tipo subtipo da expresso igual ao operando
do operando do tipo complexo ou real
4. para uma expresso
x
1
op x
2
onde op um operador numrico intrnseco binrio com ambos operandos
de mesmo tipo e parmetro de tipo subtipo ou com um real e outro complexo com o mesmo parmetro de
tipo subtipo, o parmetro de tipo subtipo da expresso idntico ao de cada operando. No caso em que os
dois operandos so inteiros com parmetro de tipo subtipo diferentes, o parmetro de tipo subtipo da
expresso igual ao do operando com o maior intervalo de expoente decimal se os intervalos de expoente
decimal so diferentes; se os intervalos de expoente decimal so os mesmos, o parmetro de tipo subtipo da
expresso dependente do processador, mas igual ao de um dos operandos. No caso em que os dois
operandos so de qualquer tipo real ou complexo com diferentes parmetros de tipo subtipo, o parmetro
de tipo subtipo da expresso igual ao do operando com maior preciso decimal se as precises decimais
so diferentes; se as precises decimais so iguais, o parmetro de tipo subtipo da expresso dependente
do processador se os operandos tm a mesma preciso decimal, mas igual ao de um dos operandos
5. para uma expresso
x
1
op x
2
onde op um operador intrnseco binrio lgico com ambos operandos de
mesmo parmetro de tipo subtipo, o parmetro de tipo subtipo da expresso idntica quela de cada
operando. No caso onde os dois operandos so do tipo lgico com parmetros de tipo diferentes, o
parmetro de tipo subtipo da expresso dependente do processador, mas igual ao de um dos operandos
6. para uma expresso
x
1
op x
2
onde op um operador intrnseco relacional a expresso tem parmetro de
tipo subtipo lgico default
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 144
7.1.5 Regras de Conformidade para Operaes Elementares
7.1.5 Conformability rules for elemental operations
Uma operao elementar (elemental operation) uma operao intrnseca ou uma operao elementar
definida. Duas entidades so conformes na forma (shape conformance) se ambos so matrizes possuindo mesma
forma ou uma ou ambas so escalares.
Para todas as operaes binrias elementar os dois operandos tm que ser conformes. No caso de um deles
ser um escalar e o outro uma matriz, o escalar tratado como se fosse uma matriz de mesma forma que o operando
matriz com cada elemento, se existir, igual ao valor do escalar.
7.1.6 Expresso de Especificao
7.1.6 Specification expression
Uma expresso de especificao (specification expression) uma expresso com limitaes que a fazem
adequadas para uso em especificaes tais como parmetros de comprimento (C501) e limites de matriz (R512,
R513).
R729 specification-expr is scalar-int-expr
C710 (R729) A scalar-int-expr tem que ser uma expresso restrita
Uma expresso restrita em uma expresso na qual cada operao intrnseca e cada primria
1. uma constante ou um subobjeto de uma constante
2. um designador de objeto com um objeto base que um argumento mudo que no possu o atributo
OPTIONAL nem o INTENT (OUT)
3. um designador de objeto com um objeto base que um bloco comum (common block)
4. um designador de objeto com um objeto base que um tornado acessvel por associao de uso ou
associao de hospedagem
5. um construtor de matriz onde cada elemento e cada scalar-int-expr de cada ac-implied-do-control
uma expresso restrita
6. um construtor de estrutura onde cada componente uma expresso restrita
7. Uma inquisio de especificao onde cada designador ou argumento de funo
(a) uma expresso restrita
(b) uma varivel cujas propriedades inquiridas no
(i) dependem do limite superior da ltima dimenso de uma matriz de tamanho assumido
(ii) postergado
(iii) definida por uma expresso que no uma expresso restrita
8. uma referncia a qualquer outra funo intrnseca padro onde cada argumento uma expresso restrita
9. uma referncia a uma funo de especificao onde cada argumento uma expresso restrita
10. um parmetro de tipo de um tipo derivado que est sendo definido
11. uma ac-do-variable dentro de um construtor de matriz onde cada scalar-int-expr do correspondente
ac-implied-do-control uma expresso restrita
12. uma expresso restrita envolvida por parnteses
onde cada subscrito., seo subscrito, ponto inicial de substring, ponto final de substring e valor do parmetro de
tipo uma expresso restrita e onde qualquer sub-rotina final que est envolvida pura.
Uma inquisio de especificao (specification inquiry) uma referncia a
1. uma funo inquisitria matriz (13.5.7)
2. a funo inquisitria BIT SIZE
3. a funo inquisitria caractere LEN
4. a funo inquisitria KIND
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 145
5. a funo inquisitria caractere NEW LINE
6. uma funo inquisitria numrica (13.5.6)
7. uma inquisio de parmetro de tipo (6.1.3)
8. uma funo inquisitria IEEE (14.9.1)
Uma funo uma funo de especificao (specification function) se ela uma funo pura, no uma
funo intrnseca padro, no uma funo interna, no uma funo instruo e no possu argumento mudo
procedimento.
Avaliao de uma expresso de especificao no pode direta ou indiretamente causar a definio de um
procedimento por um subprograma na qual ele aparece ser invocada.
Nota 7.9
Funes especificao so funes no intrnsecas que podem ser usadas em expresses de especificao para
determinar os atributos de objetos de dados. A requisio de que elas sejam puras garante que elas no podem ter
efeitos colaterais (side effects) que possam afetar outros objetos sendo declarados na mesma specification-part.
O requerimento que elas no sejam internas garante que elas no podem inquerir, via associao de hospedagem
sobre outros objetos sendo declarados na mesma specification-part. A proibio para recurso evita a criao
de novas instncias de um procedimento enquanto a construo de um est em progresso
Uma varivel em uma expresso de especificao tem que ter o mesmo tipo e parmetros de tipo, se existir,
especificado por uma declarao prvia na mesma unidade de escopo, pelas regras implcitas de tipo em efeito para
a unidade de escopo ou por associao de hospedagem ou associao de uso. Se a varivel em uma expresso de
especificao tipada (tem seu tipo definido) por regras implcitas de tipo, sua apario em qualquer declarao de
tipo subsequente tem que confirmar o tipo implcito e parmetros de tipo.
Se uma expresso de especificao inclu uma especificao de inquisio que depende de um parmetro
de tipo ou um limite de matriz de uma entidade especificada na mesma specification-part, o parmetro de tipo
ou limite de matriz tem que ser especificado em uma especificao anterior na specification-part. A
especificao anterior tem que estar a esquerda da inquisio de especificao na mesma instruo, mas no pode
estar dentro da mesma entity-decl. Se a expresso de especificao inclu referncia a um valor de um elemento
de uma matriz especificada na mesma specification-part, a matriz tem que estar completamente especificada
em declaraes anteriores.
Nota 7.10
O que segue so exemplos de expresses de especificao:
LBOUND(B, 1) + 5 !B uma matriz muda de forma assumida
M + LEN(C) !M e C so argumentos mudos
2 * PRECISION(A) !A uma varivel real feita acessvel por uma instruo USE
7.1.7 Expresso de Inicializao
7.1.7 Initialization expression
Uma expresso de inicializao (initialization expression) uma expresso com limitaes que fazem que
ela seja adequada para ser usada como um parmetro de tipo subtipo, inicializao ou constante com nome. Ela
uma expresso na qual cada operao intrnseca e cada primria
1. uma constante ou um subobjeto de uma constante
2. um construtor de matriz onde cada elemento e cada scalar-int-expr de cada ac-implied-do-control
uma expresso de inicializao
3. um construtor de estrutura onde cada component-spec correspondendo a um componente alocvel uma
referncia a uma funo intrnseca transformacional NULL e cada outra component-spec uma expresso
de inicializao
4. a referncia a uma funo intrnseca padro, onde cada argumento uma expresso de inicializao
5. a referncia a uma funo intrnseca padro transformacional diferente de NULL, onde cada argumento
uma expresso de inicializao
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 146
6. uma referncia a uma funo intrnseca transformacional NULL que no tem um argumento com um
parmetro de tipo que assumido ou definido por uma expresso que no uma expresso de
inicializao
7. uma referncia a funo transformacional IEEE SELECTED_REAL_KIND existente no mdulo intrnseco
IEEE_ARITHMETIC (14), onde cada argumento uma expresso de inicializao
8. uma inquisio de especificao onde cada designador ou argumento funo
(a) uma expresso de inicializao
(b) uma varivel cujas propriedades inquiridas no so
(i) assumidas
(ii) postergadas
(iii) definidas por uma expresso que no uma expresso de inicializao
9. um parmetro de tipo subtipo de um tipo derivado sendo definido
10. uma ac-do-variable dentro de um construtor de matriz onde cada scalar-int-expr do correspondente
ac-implied-do-control uma expresso de inicializao
11. uma expresso de inicializao envolvida em parnteses
e onde cada subscrito, subscrito de seo, ponto inicial de subtring, ponto final de substring e valor do parmetro de
tipo uma expresso de inicializao
R730 initialization-expr is expr
C711 (R730) initialization-expr tem que ser uma expresso de inicializao
R731 char-initialization-expr is char-expr
C712 (R731) char-initialization-expr tem que ser uma expresso de inicializao
R732 int-initialization-expr is int-expr
C713 (R732) int-initialization-expr tem que ser uma expresso de inicializao
R733 logical-initialization-expr is logical-expr
C714 (R733) logical-initialization-expr tem que ser uma expresso de inicializao
Se uma expresso de inicializao inclu uma inquisio de especificao que depende de um parmetro de
tipo ou um limite de matriz de uma entidade especificada na mesma specification-part, o parmetro de tipo ou
limite de matriz tem que ser especificado em uma especificao anterior da specification-part. A especificao
anterior pode estar a esquerda da inquisio de especificao na mesma instruo, mas no pode estar dentro da
mesma entity-decl.
Nota 7.11
Os exemplos que seguem so exemplos de expresses de inicializao:
3
-3 + 4
AB
AB // CD
(AB // CD) // EF
SIZE (A)
DIGITS (X) + 4
4.0 * atan(1.0)
ceiling(number_of_decimal_digits / log10(radix(0.0)))
onde A uma matriz de forma assumida com limites constantes e X do tipo realddefault
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 147
7.1.8 Avaliao de Operaes
7.1.8 Evaluation of operations
Uma operao intrnseca requer a avaliao de seus operandos.
A execuo de qualquer operao numrica cujo resultado no definido pela aritmtica usada pelo
processador proibida. Elevar uma expresso primria negativa do tipo real a uma potncia real proibido.
A avaliao de uma referncia de funo no pode afetar nem ser afetada pela avaliao de qualquer outra
entidade dentro da instruo. Se uma referncia de funo produz a definio ou indefinio de um argumento real
de uma funo, o argumento ou qualquer entidade associada no pode aparecer em qualquer parte da mesma
instruo. Entretanto execuo de uma referncia em uma expresso lgica em uma instruo IF (8.1.2.4), uma
expresso mscara (mask expression) em uma instruo WHERE (7.4.3.1) ou os subscritos e passos em uma instruo
FORALL (7.4.4) permitida definir variveis em uma declarao que condicionalmente executada.
Nota 7.12
Poe exemplo, as instrues
A (I) = F (I)
Y = G (X) + X
so proibidas se a referncia a F define ou torna indefinido I ou a referncia a G define ou torna indefinido X.
Entretanto, nas instrues
IF (F (X)) A = X
WHERE (G (X)) B = X
F ou G podem definir X
O tipo declarado de uma expresso onde uma referncia de funo aparece no pode afetar e no afetada
pela avaliao do argumento real da funo.
Execuo de uma referncia de elemento de matriz requer a avaliao se seu subscritos. O tipo da
expresso onde a referncia do elemento de matriz aparece no pode afetar e no afetada pela avaliao dos seus
subscritos. Execuo de uma referncia de seo de matriz requer a avaliao dos subscritos da seo. O tipo de
uma expresso na qual uma seo de matriz aparece no afeta e no afetado pela avaliao do subscritos da seo
da matriz. Execuo de uma referncia a substring requer a avaliao das expresses subsctring. O tipo de uma
expresso na qual um substring aparece no afeta e no afetado pela avaliao da expresso substring. No
necessrio para um processador avaliar qualquer expresso subscrito ou expresso substring para uma matriz de
tamanho zero ou entidade caractere de comprimento zero.
A utilizao de um construtor de matriz requer a avaliao de cada scalar-int-expr do ac-implied-do-
control em qualquer ac-implied-do que ele contenha. O tipo de uma expresso na qual um construtor de matriz
aparece no afeta e no afetado pela avaliao dos limites e expresso do passos .
Quando uma operao elementar binria aplicada a um escalar e uma matriz ou a duas matrizes de mesma
forma, a operao realizada elemento a elemento nos elementos correspondentes das matrizes que so os
operandos. O processador pode realizar as operaes elemento a elemento em qualquer ordem.
Nota 7.13
Por exemplo, a expresso matricial
A + B
produz uma matriz de mesma forma que A e B. Os elementos individuais do resultado temos valores do primeiro
elemento de A somados com o primeiro elemento de B, o segundo elemento de A somado com o segundo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 148
elemento de B, etc
Quando um operador unrio elementar opera sobre uma matriz a operao realizada elemento a elemento,
em qualquer ordem, e o resultado tem a mesma forma que o operando.
7.1.8.1 Avaliao de Operandos
7.1.8.1 Evaluation of operands
No necessrio que o processador avalie todos os operandos de uma expresso ou avalie inteiramente
cada operando, se o valor da expresso pode ser determinada de outra forma.
Nota 7.14
Este princpio mais frequentemente aplicado a expresses lgicas, matrizes de tamanho zero e strings de
comprimento zero , mas ele aplica-se a expresses.
Poe exemplo, na avaliao da expresso
X > Y .OR. L(Z)
onde X, Y e Z so reais e L uma funo do tipo lgica, a referncia funo L(Z) no necessita ser avaliada se X
maior que Y. Similarmente, na expresso
W(Z) + A
onde A tem o tamanho zero e W uma funo, a referncia funo W (Z) no necessita ser avaliada
Se uma instruo contm uma referencia de funo em uma parte da expresso que no necessita ser
avaliada, todas as entidades que devem ficar definidas na execuo daquela referncia se torna indefinida na
complexo da avaliao da expresso contendo a referncia de funo.
Nota 7.15
No exemplo da nota 7.14, se L ou W define seus argumentos, avaliao de expresses sob as condies
especificadas faz com que Z se torne indefinido, no importando se L(Z) ou W(Z) so avaliados ou no
7.1.8.2 Integridade dos Parnteses
7.1.8.2 Integrity of parentheses
As sees que seguem estabelecem certas condies sob as quais o processador pode calcular uma
expresso que diferente daquela especificada pela aplicao das regras dadas em 7.1.1 e 7.2. Entretanto qualquer
expresso entre parntese tem que ser tratada como uma entidade de dado.
Nota 7.16
Por exemplo, na avaliao da expresso A + (B C) onde A, B e C so tipos numricos, a diferena de B e C tem
que ser calculada antes que a operao de adio primeiro seja realizada; o processador no pode calcular a
expresso matemtica equivalente (A + B) C
7.1.8.3 Avaliao de Operaes Intrnsecas Numricas
7.1.8.3 Evaluation of numeric intrinsic operations
As regras apresentadas em 7.2.1 especificam a interpretao das operaes intrnsecas numricas. Uma vez
que a interpretao foi estabelecida de acordo com estas regras, o processador pode avaliar qualquer expresso
matematicamente equivalente, garantido que a integridade dos parnteses no violada.
Duas expresses do tipo numrico so matematicamente equivalentes se, para todos os valores possveis de
suas primrias, os valores matemticos so iguais. Entretanto, expresses matematicamente equivalentes do tipo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 149
numrico podem produzir resultados computacionais diferentes.
Nota 7.17
Qualquer diferena entre valores da expresso (1./3.)3. e 1. uma diferena computacional, no uma diferena
matemtica. A diferena entre os valores das expresses 5/2 e 5./2. uma diferena matemtica, no uma
diferena computacional
A definio matemtica de diviso inteira dada em 7.2.1.1
Nota 7.18
O que segue so exemplos de expresses que permitem formas alternativas que podem ser utilizadas pelo
processador no clculo delas. A, B e C representam reais arbitrrios ou operandos complexos. I e J representam
operandos inteiros arbitrrios; e X, Y e Z representam operandos arbitrrios do tipo numrico
Ex presso Allowable alternative form
X+Y Y+X
X*Y Y*X
-X + Y Y-X
X+Y+Z X + (Y + Z)
X-Y+Z X - (Y - Z)
X*A/Z X * (A / Z)
X*Y-X*Z X * (Y - Z)
A/B/C A / (B * C)
A / 5.0 0.2 * A
O que segue so exemplos de expresses que no admitem forma alternativas e no podem ser utilizadas pelo
processador no clculo delas.
Ex presso For mas alternativas proibidas
I/2 0.5 * I
X*I/J X * (I / J)
I/J/A I / (J * A)
(X + Y) + Z X + (Y + Z)
(X * Y) - (X * Z) X * (Y - Z)
X * (Y - Z) X*Y-X*Z
Em adio aos parnteses requeridos para estabelecer a interpretao desejada, parntese podem se includos para
restringir as formas alternativas que podem ser utilizadas pelo processador na avaliao da expresso. Isto til
para controlar a magnitude e a acurcia dos valores intermedirios calculados durante a avaliao da expresso.
Nota 7.19
Por exemplo, na expresso
A + (B - C)
a expresso definida usando os parnteses (B C) tem que ser avaliada e ento adicionada a A.
A incluso dos parnteses podem mudar o valor matemtico de uma expresso. Por exemplo, as duas expresses
A * I / J
A * (I / J)
podem ter valores matemticos diferentes se I e J so do tipo inteiro
Cada operando em uma operao intrnseca numrica tem um tipo de dado que pode depender da ordem de
avaliao usada pelo processador.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 150
Nota 7.20
Por exemplo, no clculo da expresso
Z + R + I
onde Z, R e I representam objetos de dados complexos, real e inteiro, respectivamente, o tipo do operando que
adicionado a I pode ser complexo ou real, dependendo de qual par de operandos adicionada primeiro (Z e R, R e
I ou Z e I)
7.1.8.4 Avaliao de Operaes Intrnsecas Caractere
7.1.8.4 Evaluation of the character intrinsic operation
As regras dadas em 7.2.2 especificam a interpretao das operaes intrnsecas caractere. Um processador
somente obrigado a calcular as operaes intrnsecas caractere quando requerida pelo contexto na qual a
expresso aparece.
Nota 7.21
Por exemplo, as declaraes
CHARACTER(LEN = 2) C1, C2, C3, CF
C1 = C2 // CF (C3)
no requerem que a funo CF seja avaliada porque somente o valor de C2 necessrio para determinar o valor
de C1 porque C1 e C2 ambas tm o comprimento 2
7.1.8.5 Avaliao de Operaes Intrnsecas Relacionais
7.1.8.5 Evaluation of relational intrinsic operations
As regras dadas em 7.2.3 especificam a interpretao das operaes intrnsecas relacional. Uma vez que a
interpretao de uma expresso tenha sido relacionada de acordo com estas regras, o processador pode avaliar
qualquer outra expresso relacional equivalente, garantido que a integridade dos parnteses no foi violada.
Nota 7.22
Por exemplo, o processador pode escolher calcular a expresso
I > J
onde I e J so variveis inteiras como
J - I < 0
Duas operaes intrnsecas relacionais so relacionalmente equivalentes se seus valores lgicos so iguais
para todos os valores de suas primitivas.
7.1.8.6 Avaliao de Operaes Intrnsecas Lgicas
7.1.8.6 Evaluation of logical intrinsic operations
As regras dadas em 7.2.4 especificam a interpretao das operaes intrnsecas lgicas. Uma vez que a
interpretao de uma expresso tenha sido relacionada de acordo com estas regras, o processador pode calcular
qualquer outra expresso lgica equivalente, garantido que a integridade dos parnteses no foi violada.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 151
Nota 7.23
Por exemplo, para as variveis L1, L2 e L3 do tipo lgica, o processador pode escolher avaliar a expresso
L1 .AND. L2 .AND. L3
como
L1 .AND. (L2 .AND. L3)
Duas operaes intrnsecas lgicas so logicamente equivalentes se seus valores so iguais para todos os
valores de suas primitivas.
7.1.8.7 Avaliao de Operao Definida
7.1.8.7 Evaluation of a defined operation
As regras dadas em 7.2 especificam a interpretao das operaes definidas. Uma vez que a interpretao
de uma expresso tenha sido relacionada de acordo com estas regras, o processador pode calcular qualquer outra
expresso equivalente, garantido que a integridade dos parnteses no foi violada.
Duas operaes derivadas so equivalentes se seus valores so iguais para todos os valores de suas
primitivas.
7.2 Interpretao de Operaes
7.2 Interpretation of operations
Operaes intrnsecas so aquelas definidas em 7.1.2. Estas operaes so divididas nas seguintes
categorias: numrica, caractere, relacional e lgica. As interpretaes definidas nas sees que seguem aplicam-se
tanto aos escalares quento as matrizes; a interpretao para as matrizes so obtidas aplicando-se a interpretao dos
escalares elemento a elemento.
A interpretao de uma operao definida provida pela funo que define a operao. O tipo, parmetros
de tipo e interpretao de uma expresso que consiste de um intrnseco ou operao definida so independentes do
o tipo e parmetros de tipo do contexto ou qualquer expresso maior na qual ela aparece.
Nota 7.24
Por exemplo, se X do tipo real, J do tipo inteiro e INT a funo intrnseca de converso real para inteiro, a
expresso INT (X + J) uma expresso inteira e X + J uma expresso real
Os operadores <, <=, >, >=, == e /= sempre possuem as mesmas interpretaes que os operadores
.LT., .LE., .GT., .GE., .EQ. e .NE., respectivamente.
7.2.1 Operaes Intrnsecas Numricas
7.2.1 Numeric intrinsic operations
Uma operao numrica utilizada para expressar um clculo numrico. Avaliao de uma operao
numrica produz um valor numrico. Os tipos de dados permitidos como operandos de operaes intrnsecas
numricas so definidos em 7.1.2.
Os operadores numricos e suas interpretaes em expresses dada na tabela 7.2, onde
x
1
representa o
operando a esquerda do operador e x
2
representa o operando a direita do operador.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 152
Operador Representando Uso do operador Interpretao
** exponenciao x
1
** x
2
x
1
Elevado a potncia x
2
/ diviso x
1
/ x
2
x
1
Dividido por x
2
* multiplicao x
1
x
2
x
1
Multiplicado por x
2
- subtrao x
1
x
2
x
2
Subtrado de x
1
- negao x
2
Negativo de x
2
+ adio x
1
+x
2
x
1
Adicionado a x
2
+ identidade + x
2
Mesmo que x
2
Tabela 7.2 Interpretao dos operadores intrnsecos numricos
A interpretao da operao de diviso depende do tipo de dado dos operandos (7.2.1.1).
Se x
1
e x
2
so do tipo inteiro e x
2
tem um valor negativo, a interpretao de x1** x2 a mesma
interpretao de 1/( x1**ABS( x2)) e est sujeita as regras da diviso inteira (7.2.1.1).
Nota 7.25
Por exemplo, 2 * (3) tem o valor de 1/(2 * 3) que zero
7.2.1.1 Diviso Inteira
7.2.1.1 Integer division
Um operando do tipo inteiro pode ser dividido por outro operando do tipo inteiro. Apesar do quociente
matemtico de dois inteiro no ser necessariamente inteiro, a tabela 7.1 especifica que uma expresso envolvendo o
operador diviso com dois operandos do tipo inteiro interpretada como uma expresso do tipo inteiro. O
resultado deste tipo de operao o inteiro mais prximo do quociente matemtico e entre zero e o quociente
matemtico inclusive.
Nota 7.26
Por exemplo, a expresso (8) / 3 tem o valor (2)
7.2.1.2 Exponenciao Complexa
7.2.1.2 Complex exponentiation
No caso de um valor complexo ser elevado a uma potncia complexa, o valor da operao
x
1
** x
2
o
valor do principal de x
1
x
2
.
7.2.2 Operao Intrnseca Caractere
7.2.2 Character intrinsic operation
O operador intrnseco caractere // utilizado para concatenar dois operandos do tipo caractere com o
mesmo parmetro de tipo subtipo. Avaliao da operao intrnseca caractere produz um resultado do tipo
caractere.
A interpretao do operador intrnseco caractere // quando utilizado para formar expresso dado na tabela
7.3 onde x
1
representa o operando a esquerda do operador e x
2
representa o operando a direita do operador.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 153
Operador Representando Uso do operador Interpretao
/ / concatenao x
1
// x
2
x
1
Concatenado com x
2
Tabela 7.3 Interpretao do operador intrnseco caractere
O resultado da operao caractere intrnseca // uma cadeia de caracteres ( string) cujo valor o valor de
x
1
concatenao a direita com o valor x
2
e cujo comprimento a soma dos comprimentos de x
1
e x
2
.
parnteses usados para especificar a ordem da avaliao no tem efeito no valor da expresso caractere.
Nota 7.27
Por exemplo, o valor de ('AB' // 'CDE') // 'F' o string 'ABCDEF'. Tambm o valor de 'AB' // (CDE' // 'F') o
string 'ABCDEF'
7.2.3 Operaes Intrnsecas Relacionais
7.2.3 Relational intrinsic operations
Uma operao intrnseca relacional utilizada para comparar os valores de dois operandos usando os
operadores intrnsecos relacionais .LT., .LE., .GT., .GE., .EQ., .NE., <, <=, >, >=, == e /=. Os tipos
permitidos para os operandos dos operadores intrnsecos relacionais so aqueles especificados em 7.1.2.
Nota 7.28
Como mostrado na tabela 7.1, um operador intrnseco relacional no pode ser utilizado para comparar o valor de
uma expresso do tipo numrico com um valor do tipo caractere ou lgico. Tambm dois operandos do tipo lgico
no podem ser comparados , um operando complexo pode ser comparado com outro operando numrico somente
quando o operador .EQ., .NE., == ou /=, e dois operandos caractere no podem ser comparados a menos
que eles possuam o mesmo valor de parmetro de tipo subtipo

Avaliao de uma operao intrnseca relacional produz um resultado do tipo lgico default.
A interpretao dos operadores intrnsecos relacional dada na tabela 7.4, onde x
1
representa o operando
a esquerda do operador e x
2
representa o operando a direita do operador.
Operador Representando Uso do operador Interpretao
.LT. menor que x
1
.LT. x
2
x
1
menor que x
2
< menor que x
1
x
2
x
1
menor que x
2
.LE. menor que ou igual a x
1
.LE. x
2
x
1
menor ou igual a x
2
menor que ou igual a x
1
<x
2
x
1
menor ou igual a x
2
.GT. maior que x
1
.GT. x
2
x
1
maior que x
2
> maior que x
1
>x
2
x
1
maior que x
2
.GE. maior que ou igual a x
1
.GE. x
2
x
1
maior ou igual a x
2
maior que ou igual a x
1
x
2
x
1
maior ou igual a x
2
.EQ. igual a x
1
.EQ. x
2
x
1
igual a x
2
= = igual a x
1
= = x
2
x
1
igual a x
2
.NE. no igual a x
1
.NE. x
2
x
1
diferente de x
2
/ = no igual a x
1
/ = x
2
x
1
diferente de x
2
Tabela 7.4 Interpretao dos operadores intrnsecos relacionais
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 154
Uma operao intrnseca relacional numrica interpretada como tendo um valor lgico verdadeiro (true)
se os valores dos operandos satisfazem a relao especificada pelo operador. Uma operao intrnseca relacional
numrica interpretada como tendo um valor lgico verdadeiro (false) se os valores dos operandos no satisfazem a
relao especificada pelo operador.
Em uma operao relacional numrica
x
1
rel-op x
2
se o tipo ou parmetro de tipo subtipo de
x
1
e
x
2
diferem, seus valores so convertidos para o tipo e parmetro
de tipo da expresso
x
1
+x
2
antes da avaliao.
Uma operao intrnseca relacional caractere interpretada como tendo um valor lgico verdadeiro (true)
se os valores dos operandos satisfazem a relao especificada pelo operador. Uma operao intrnseca relacional
numrica interpretada como tendo um valor lgico verdadeiro (false) se os valores dos operandos no satisfazem a
relao especificada pelo operador.
Para uma operao intrnseca relacional caractere, os operadores so comparados um caractere por vez na
ordem, iniciando com o primeiro caractere de cada operando caractere. Se os operandos so desiguais em
comprimento, o operando menor tratado como se ele tivesse sido estendido a direita com brancos at o
comprimento do operando maior. Se ambos,
x
1
e
x
2
, tem comprimentos zero, x
1
igual a x
2
. Se cada
caractere de x
1
o mesmo caractere, na correspondente posio de x
2
, x
1
igual a x
2
. Caso contrrio,
na primeira posio onde os operandos caracteres diferem, o operando x
1
considerado ser menor que
x
2
se o
valor do caractere de x
1
nesta posio precede o valor de x
2
na sequncia de arrumao (collating sequence
4.4.4.3), x
1
maior que x
2
se valor do caractere de x
1
nesta posio segue o valor de x
2
na sequncia de
arrumao.
Nota 7.29
A sequncia de arrumao depende parcialmente do processador, entretanto o resultado do uso dos operadores
.EQ., .NE., == e /= no dependem da sequncia de arrumao.
Para caracteres do tipo no default, o preenchimento de brancos dependente do processador
7.2.4 Operaes Intrnsecas Lgicas
7.2.4 Logical intrinsic operations
Uma operao lgica utilizada para expressar um clculo lgico. Avaliao de uma operao lgica
produz um resultado do tipo lgico. Os tipos de dados permitidos como operandos de operaes intrnsecas lgicas
so definidos em 7.1.2.
Os operadores lgicos e suas interpretaes em expresses dada na tabela 7.5, onde
x
1
representa o
operando a esquerda do operador e x
2
representa o operando a direita do operador.
Operador Representando Uso do operador Interpretao
.NOT. negao lgica .NOT. x
2
verdadeiro se x
2
falso
.AND. conjuno lgica x
1
.AND. x
2
verdadeiro se x
1
e x
2
so
ambos verdadeiros
.OR. disjuno inclusiva lgica x
1
.OR. x
2
verdadeiro se x
1
e / ou x
2
so
verdadeiros
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 155
.NEQV. no equivalncia lgica x
1
.NEQV. x
2
verdadeiro se x
1
ou x
2
so
verdadeiros, mas no ambos
.EQV. equivalncia lgica x
1
.EQV. x
2
verdadeiro se x
1
e x
2
so
ambos verdadeiros, ou ambos falsos
Tabela 7.5 Interpretao dos operadores lgicos intrnsecos
Os valores das operaes lgicas intrnsecas so mostrados na tabela 7.6.
x
1
x
2
.NOT. x
2
x
1
.AND. x
2
x
1
.OR. x
2
x
1
.EQV. x
2
x
1
.NEQV. x
2
VERDADEIRO VERDADEIRO FALSO VERDADEIRO VERDADEIRO VERDADEIRO FALSO
VERDADEIRO FALSO VERDADEIRO FALSO VERDADEIRO FALSO VERDADEIRO
FALSO VERDADEIRO FALSO FALSO VERDADEIRO FALSO VERDADEIRO
FALSO FALSO VERDADEIRO FALSO FALSO VERDADEIRO FALSO
Tabela 7.6 Valores das operaes envolvendo operadores lgicos intrnsecos
7.3 Precedncia dos Operadores
7.3 Precedence of operators
Existe uma precedncia entre as operaes intrnsecas e extenses correspondendo a forma de expresses
especificadas em 7.1.1, que depende da ordem na qual os operandos so combinados a menos que a ordem seja
mudada pelo uso de parnteses. Esta ordem de precedncia sumarizada na tabela 7.7.
categoria da operao operadores precedncia
extenso defined-unary-op maior
numrica ** .
numrica * ou / .
numrica + ou - unrio .
numrica + ou - binrio .
caractere // .
relacional
.EQ., .NE., .LT., .LE., .GT., .GE.,
==, /=, <, <=, >, >=
.
logical .NOT. .
logical .AND> .
logical .OR. .
logical .EQV. Ou .NEQV. .
extenso defined-binary-op menor
Tabela 7.7 Categorias das operaes e precedncia relativa
A precedncia da operao definida a mesma do seu operador.
Nota 7.30
Por exemplo, na expresso
-A ** 2
o operador exponenciao () tem precedncia sobre o operador negao (), ento, os operandos do operador
exponenciao so combinados para formar uma expresso que utilizada como um operando para o operador
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 156
negao. A interpretao da expresso acima a mesma que a a interpretao da expresso
- (A ** 2)
A forma geral de uma expresso (7.1.1) tambm estabelece a precedncia entre os operadores na mesma
classe sinttica. Esta precedncia determina a ordem na qual os operandos so combinados na determinao da
interpretao da expresso a menos que a ordem seja mudada pelo uso de parntese.
Nota 7.31
Na interpretao de uma level-2-expr contendo dois ou mais operadores binrios + ou , cada operando (add-
operand) combinado da esquerda para a direita. Similarmente, a mesma interpretao esquerda-para-direita para
uma mult-operand em uma add-operand, bem como para todos os outros tipos de expresses, uma
consequncia da forma geral. Entretanto, para interpretar uma expresso mult-operand quando dois ou mais
operadores exponenciais ** combinam operandos level-1-expr, cada level-1-expr combinada da direita para
a esquerda
Por exemplo, as expresses
2.1 + 3.4 + 4.9
2.1 * 3.4 * 4.9
2.1 / 3.4 / 4.9
2 ** 3 ** 4
AB // CD // EF
tem as mesmas interpretaes que as expresses
(2.1 + 3.4) + 4.9
(2.1 * 3.4) * 4.9
(2.1 / 3.4) / 4.9
2 ** (3 ** 4)
(AB // CD) // EF
como consequncia da forma geral (7.1.1), somente o primeiro add-operand do level-2-expr pode ter
precedncia sobre o operador identidade (+) ou o operador negao (). Estas regras de formao no permitem
expresses contendo duas operaes numricas consecutivas tal como A B ou A + B. Entretanto,
expresses tal como A (B) e A + (B) so permitidas. As regras permitem um operador binrio ou um
operador intrnseco unrio ser seguido por um operador unrio definido. Tal como:
A * .INVERSE. B
.INVERSE. (B)
Como outro exemplo, na
A .OR. B .AND. C
a forma geral implica que a maior precedncia para o operador .AND. do que para o operador .OR.; portanto a
interpretao da expresso acima a mesma que a interpretao da expresso
A .OR. (B .AND. C)
Nota 7.32
Uma expresso pode conter mais de uma categoria de operadores. A expresso lgica
L .OR. A + B >= C
onde A, B e C so do tipo real e L do tipo lgico contm um operador numrico, um operador relacional e um
operador lgico. Esta expresso ser interpretada como sendo a mesma que a expresso
L .OR. ((A + B) >= C)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 157
Nota 7.33
Se
(1) o operador ** estendido a um tipo lgico
(2) o operador .STARSTAR. definido para duplicar a funo de ** sobre os tipos reais
(3) .MINUS. definido para duplicar o operador unrio
(4) L1 e L2 so tipos lgicos e X e Y so tipos reais
ento na precedncia: L1 L2 maior que X Y; X Y maior que X .STARSTAR. Y; e .MINUS. X
maior que X
7.4 Atribuio
7.4 Assignment
Execuo de uma instruo de atribuio faz com que uma varivel se tornar definida ou redefinida.
Execuo de uma instruo de atribuio de ponteiro faz com que um ponteiro fique associado com um alvo ou faz
com que o estado de associao do ponteiro seja desassociado ou indefinido. Execuo da instruo WHERE ou
execuo da construo mscara WHERE avalia as expresses e atribui os valores em uma instruo de atribuio
de matriz de acordo com o valore da expresso matricial lgica. Execuo da instruo FORALL ou construtor
FORALL controla a atribuio dos elementos de matriz usando o conjunto de variveis ndice e a expresso
mscara (mask expression).
7.4.1 Instruo de Atribuio
7.4.1 Assignment statement
Uma varivel pode ser definida ou redefinida pela execuo de uma instruo de atribuio.
7.4.1.1.Forma Geral
7.4.1.1 General form
R734 assignment-stmt is variable = expr
C715 (R734) A varivel em uma assignment-stmt no pode ser uma matriz de tamanho assumido
Nota 7.34
Exemplos de instrues de atribuio so:
A = 3.5 + X * Y
I = INT (A)
Uma assignment-stmt tem que satisfazer os requerimentos de uma instruo de atribuio definida ou
instruo de atribuio intrnseca.
7.4.1.2.Instruo de Atribuio Intrnseca
7.4.1.2 Intrinsic assignment statement
Uma instruo de atribuio intrnseca (intrinsic assignment statement) uma instruo de atribuio
que no uma instruo definida (7.4.1.4). Em uma instruo de atribuio intrnseca, a varivel no pode ser
politrpica e
1. se expr uma matriz ento a varivel tambm tem que ser uma matriz
2. a varivel tem que ser uma matriz alocvel de mesmo rank (nmeros de dimenses) que expr ou as formas
da varivel e expr tem que ser conformes
3. os tipos declarados da varivel e expr tem que ser como especificado na tabela 7.8
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 158
Tipo de varivel Tipo de expr
inteiro inteiro, real, complexo
real inteiro, real, complexo
complexo inteiro, real, complexo
ISO 10646, ASCII ou caractere default ISO 10646, ASCII ou caractere default
Outro caractere caractere do mesmo parmetro de tipo subtipo (kind type parameter)
que a varivel
lgico lgica
tipo derivado mesmo tipo derivado e parmetro de tipo subtipo que a varivel;
cada valor do parmetro de tipo comprimento tem que ser o mesmo
a menos que a varivel seja alocvel e seu correspondente
parmetro de tipo seja postergado
Tabela 7.8 Tipos conformes para instruo intrnseca de atribuio
Uma instruo de atribuio intrnseca numrica (numeric intrinsic assignment statement) uma
instruo de atribuio intrnseca para a qual varivel e expr so do tipo numrico. Uma instruo de atribuio
intrnseca caractere (character intrinsic assignment statement) uma instruo de atribuio intrnseca para a qual
varivel e expr so do tipo caractere. Uma instruo de atribuio intrnseca lgica (logical intrinsic assignment
statement) uma instruo de atribuio intrnseca para a qual varivel e expr so do tipo lgico. Uma instruo
de atribuio intrnseca tipo derivado (derived-type intrinsic assignment statement) uma instruo de atribuio
intrnseca para a qual varivel e expr so do tipo tipo derivado.
Uma instruo de atribuio intrnseca matriz (array intrinsic assignment statement) uma instruo de
atribuio intrnseca para a qual varivel uma matriz. A varivel no pode ser uma seo de matriz muitas-para-
uma (many-one array section) (6.2.2.3.2).
Se a varivel um ponteiro, ela tem que estar associada com um alvo definido tal que o tipo, parmetros de
tipo e forma do alvo e expr sejam conforma.
7.4.1.3.Interpretao da Atribuio Intrnseca
7.4.1.3 Interpretation of intrinsic assignments
Execuo de uma instruo intrnseca de atribuio produz, em efeito, a avaliao da expresso expr e
todas as expresses contidas em varivel (7.1.8), a possvel converso de expr para o tipo e parmetros de tipo de
varivel (tabela 7.9) e a definio de varivel com o valor resultado. A execuo da atribuio tem o mesmo efeito
como se a avaliao de todas operaes em expr e varivel existentes antes de qualquer poro da varivel estar
definida pela atribuio. A avaliao da expresso contidas dentro da varivel no pode afetar nem ser afetada pela
avaliao de expr. Nenhum valor atribudo varivel se varivel do tipo caractere e tem comprimento zero ou
uma matriz de comprimento zero.
Se varivel um ponteiro, o valor de expr atribudo ao alvo da varivel.
Se varivel uma varivel alocvel alocada, ela desalocada se expr uma matriz de forma diferente ou
se qualquer correspondente valor de parmetro de tipo comprimento e expr diferem. Se varivel ou se torna uma
varivel alocvel no alocada ento ela alocada com cada parmetro de tipo postergado ao correspondente
parmetro de tipo de expr, com a forma de expr e com cada limite inferior igual ao correspondente elemento de
LBOUND(expr).
Nota 7.35
Por exemplo, dada a declarao
CHARACTER(:),ALLOCATABLE :: NAME
ento depois da instruo de atribuio
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 159
NAME = Dr. //FIRST_NAME// //SURNAME
NAME ter o comprimento LEN(FIRST NAME)+LEN(SURNAME)+5, mesmo que ele tenha sido previamente
no alocado ou alocado com um comprimento diferente. Entretanto, para a instruo de atribuio
NAME(:) = Dr. //FIRST_NAME// //SURNAME
NAME (obrigatoriamente) tem que ter sido alocado quando da atribuio; o valor atribudo truncado ou branco
so usados como preenchimento para o comprimento alocado previamente para NAME
Tanto varivel quanto expr podem conter referncias a qualquer parte da varivel.
Nota 7.36
Por exemplo, na instruo de atribuio intrnseca caractere:
STRING (2:5) = STRING (1:4)
a atribuio do primeiro caractere de STRING para o segundo caractere no afeta a avaliao de STRING (1:4).
Se o valor de STRING antes da atribuio era ABCDEF, o valor depois a atribuio AABCDF.
Se expr em um escalar e varivel uma matriz, a expr tratada como se fosse uma matriz de mesma
forma que a varivel com cada elemento da matriz igual ao valor de escalar de expr.
Se a varivel uma matriz, a atribuio realizada elemento a elemento sobre os elementos
correspondentes da matriz de varivel e expr.
Nota 7.37
Por exemplo, se A e B so matrizes de mesma forma, a atribuio intrnseca de matriz
A = B
atribui os elementos correspondentes de B aos de A, isto , o primeiro elemento de B atribudo ao primeiro
elemento de A, o segundo elemento de B atribudo ao segundo elemento de A e assim por diante
Se C uma matriz alocvel de rank 1 (nmeros de dimenses 1), ento
C = PACK(ARRAY,ARRAY>0)
far com que C contenha todos os elementos positivos ARRAY na ordem dos elementos da matriz; se C no est
alocado ou est alocada com um tamanho errado, ela ser realocada para o tamanho correto para conter o
resultado de PACK.
O processador pode realizar a atribuio elemento a elemento em qualquer ordem.
Nota 7.38
Por exemplo, o segmento de programa que segue resulta nos valores dos elementos da matriz X na ordem reversa:
REAL X(10)
...
X(1:10) = X(10:1:-1)
Para a instruo de atribuio intrnseca numrica , varivel e expr podem ter tipos numricos diferentes ou
parmetros de tipo subtipo, e neste caso o valor expr convertido para o tipo e parmetro de tipo subtipo da
varivel de acordo com as regras da tabela 7.9.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 160
Tipo da varivel Valor atribudo
Inteiro INT (expr , KIND = KIND (variable))
Real REAL (expr , KIND = KIND (variable))
Complexo CMPLX (expr , KIND = KIND (variable))
Nota: As funes INT, REAL, CMPLX e KIND so funes genricas
definidas em 13.7.
Tabela 7.9 Converso numrica e instruo de atribuio
Para uma instruo de atribuio intrnseca lgica, varivel e expr podem ter parmetros de tipo diferentes
e neste caso o valor de expr convertido para o parmetro de tipo subtipo de varivel.
Para uma instruo de atribuio intrnseca caractere, varivel e expr podem ter parmetros de tipo
comprimento diferentes e neste caso a converso de expr para o comprimento de varivel se faz como descrito a
seguir:
1. se o comprimento de varivel menor que o de expr, o valor de expr truncado a direita at que tenha o
mesmo comprimento que varivel
2. se o comprimento de varivel maior que o de expr, o valor de expr estendido a direita at ser o mesmo
de varivel
Se varivel e expr tm diferentes parmetros de tipo subtipo, cada caractere c em expr convertido para
ao parmetro de subtipo da varivel por ACHAR(IACHAR(c),KIND(variable)).
Nota 7.39
Para tipos caractere no default o caractere branco de preenchimento dependente do processador. Quando se
atribu uma expresso caractere uma varivel de subtipo diferente (different kind), cada caractere da expresso que
no representvel no subtipo da varivel trocada por um caractere dependente do processador
Uma atribuio intrnseca tipo derivado realizada como se cada componente da varivel fosse atribuda
vindo do componente correspondente de expr usando uma atribuio de ponteiro (7.4.2) para cada componente
ponteiro, atribuio definida para cada componente no alocvel no ponteiro de um tipo que tem uma atribuio
definida lidado ao tipo consistente com o componente e uma atribuio intrnseca para cada componente no
alocvel no ponteiro. Para um componente alocvel a seguinte sequncia de operaes aplicada:
1. se o componente da varivel est alocado, ele desalocado
2. se o componente de expr est alocado, o componente correspondente da varivel alocado com o mesmo
tipo dinmico e parmetros de tipo que o componente de expr. Se ele uma matriz, ele alocado com os
mesmos limites. O valor do componente de expr ento atribudo ao componente correspondente da
varivel usando atribuio definida se o tipo declarado do componente tem uma atribuio definida ligada
ao tipo consistente com o componente e uma atribuio intrnseca para o tipo dinmico deste componente
em caso contrario
O processador pode realizar uma atribuio componente a componente em qualquer ordem ou por outro
meio que tenha o mesmo efeito.
Nota 7.40
Para um exemplo de instruo de atribuio intrnseca tipo derivada, se C e D so do mesmo tipo derivado com
um componente ponteiro P e componente no ponteiros S, T, U e V do tipo inteiro, lgico, caractere e outro tipo
derivado, respectivamente, a intrnseca
C = D
D%P para C%P. Ela atribu D%S para C%S, D%T para C%T e D%U para C%U usando atribuio intrnseca. Ela
atribu D%V para C%V usando atribuio definida se objetos deste tipo tem uma atribuio definida ligado ao
tipo compatvel (compatible type-bound defined assignment) e atribuio intrnseca, caso contrario
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 161
Nota 7.41
Se um componente alocvel de expr no est alocado, o componente correspondente da varivel tem o estado de
alocao no alocado depois da execuo da atribuio
Quando a varivel um subobjeto, a atribuio no afeta o estado de definio ou valor de outras partes do
objeto. Por exemplo,se a varivel uma seo de matriz, a atribuio no afeta o estado de definio ou valor dos
elementos da matriz no especificado na seo da matriz.
7.4.1.4.Instruo de Atribuio Definida
7.4.1.4 Defined assignment statement
Uma instruo de atribuio definida (defined assignment statement) uma instruo de atribuio que
definida por uma sub-rotina e uma interface genrica (4.5.1, 12.3.2.1.2) que especifica ASSIGNMENT (=). Uma
instruo de atribuio definida elementar (defined elemental assignment statement) uma instruo de
atribuio definida na qual a sub-rotina elementar (12.7).
Uma sub-rotina define uma atribuio definida x
1
=x
2
se
1. a sub-rotina especificada com uma instruo SUBROUTINE (12.5.2.2) ou ENTRY (12.5.2.4) que
especifica dois argumentos mudos, d
1
e d
2

2. um dos seguintes casos
(a) uma interface genrica (12.3.2.1) prov a sub-rotina com uma generic-spec de ASSIGNMENT (=)
(b) existe uma ligao genrica (4.5.1) na declarao do tipo de x
1
ou x
2
com uma generic-spec de
ASSIGNMENT (=) e existe uma ligao correspondente a uma sub-rotina nos tipo dinmicos x
1
ou
x
2
, respectivamente
3. Os tipos de
d
1
e
d
2
so compatveis com os tipo dinmicos
x
1
ou
x
2
, respectivamente
4. Os parmetros de tipo, se existirem,
d
1
e
d
2
so os mesmos que os parmetros de tipo de
x
1
ou
x
2
, respectivamente
5. um dos seguintes casos
(a) os nmeros de dimenses (ranks) de x
1
ou x
2
so os mesmos de d
1
e d
2
(b) a sub-rotina elementar, x
1
ou x
2
so conformes e no h outra sub-rotina que define a operao
Se d
1
ou d
2
uma matriz, as formas de x
1
ou x
2
tem que serem as mesmas que as formas de
d
1
e d
2
, respectivamente.
7.4.1.5.Interpretao da Instruo de Atribuio Definida
7.4.1.5 Interpretation of defined assignment statements
A interpretao de uma atribuio definida definida pela sub-rotina que define a atribuio.
Se a atribuio definida uma atribuio elementar e a varivel na atribuio uma matriz, a atribuio
definida realizada elemento a elemento, em qualquer ordem, nos elementos correspondentes da varivel e expr.
Se expr um escalar, ela tratada como se ela fosse uma matriz de mesma forma que a varivel com cada
elemento da matriz igual ao valor escalar de expr.
Nota 7.42
As regras de atribuio definidas (12.3.2.1.2), referncia de procedimento (12.4), referncia de sub-rotinas
(12.4.3) e argumentos de sub-rotinas elementar (12.7.3) garantem que a atribuio definida tem o mesmo efeito
como se a avaliao de todas as operaes em x
2
e x
1
ocorressem antes de qualquer poro de x
1
ser
definida
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 162
7.4.2 Atribuio de Ponteiro
7.4.2 Pointer assignment
Atribuio de ponteiro faz com que o ponteiro se torne associado com um alvo ou faz com que seu estado
de associao fique desassociado ou indefinido. Qualquer associao prvia entre o ponteiro e o alvo quebrada.
Atribuio de ponteiro para um componente ponteiro de uma estrutura pode tambm ser feita pela
execuo de uma instruo de atribuio intrnseca tipo derivado(7.4.1.3).
Um ponteiro pode tambm se tornar associado com um alvo pela associao de ponteiro.
R735 pointer-assignment-stmt is data-pointer-object[(bounds-spec-list)]=>data-target
or data-pointer-object(bounds-remapping-list)=>data-target
or proc-pointer-object=>proc-target
R736 data-pointer-object is variable-name
or variable%data-pointer-component-name
C716 (R735) Se data-target no polimrfico ilimitado, data-pointer-object tem que compatvel em
tipo (5.1.1.2) com ele e os correspondentes parmetros de tipo tem que ser iguais
C717 (R735) Se data-target polimrfico ilimitado, data-pointer-object tem que ser polimrfico
ilimitado, de um tipo derivado sequencial ou de tipo com o atributo BIND
C718 (R735) Se bounds-spec-list especificado, o nmero de bounds-specs tem que ser igual ao rank
de data-pointer-object
C719 (R735) Se bounds-remapping-list especificado, o nmero de bounds-remappings tem que ser
igual ao nmero de dimenses de data-pointer-object
C720 (R735) Se bounds-remapping-list especificado, data-target tem que ter nmero de dimenses
(rank) um; caso contrrio, os nmeros de dimenses de data-pointer-object e data-target tem que ser
iguais
C721 (R736) Um variable-name tem que ter o atributo POINTER
C722 (R736) Um data-pointer-component-name tem que ter o nome de um componente da varivel que
um ponteiro dado
R737 bounds-spec is lower-bound-expr:
R738 bounds-remapping is lower-bound-expr:upper-bound-expr
R739 data-target is variable
or expr
C723 (R739) Uma varivel tem que ter o atributo TARGET ou POINTER e no pode ser uma seo de matriz
com um subscrito vetor
C724 (R739) Uma expr tem que ser uma referncia a um funo cujo resultado um ponteiro dado
R740 proc-pointer-object is proc-pointer-name
or proc-component-ref
R741 proc-component-ref is variable % procedure-component-name
C725 (R741) O procedure-component-name tem que ser o nome de um componente ponteiro de
procedimento (procedure pointer) de uma varivel de tipo declarada
R742 proc-target is expr
or procedure-name
or proc-component-ref
C726 (R742) Uma expr tem que ser uma referncia a uma funo cujo resultado um ponteiro de
procedimento
C727 (R742) Um procedure-name tem que ser o nome de uma externa, mdulo ou procedimento mudo, uma
funo intrnseca especificada na em 13.6 e no marcada por um ponto lista () ou um ponteiro de procedimento
C728 (R742) O proc-target no pode ser um procedimento elementar no intrnseco
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 163
7.4.2.1 Atribuio de Ponteiro de Dado
7.4.2.1 Data pointer assignment
Se data-pointer-object no polimrfica e data-target polimrfica com tipo dinmico que difere do
seu tipo declarado, a atribuio do alvo o componente ancestral de data-target que tem o tipo data-pointer-
object. Caso contrrio, o alvo atribudo data-target.
Se data-target no um ponteiro, data-pointer-object se torna um ponteiro associado com o alvo
atribudo. Caso contrrio, o estado de associao do ponteiro de data-pointer-object se torna aquele do data-
target; se data-target associado com um objeto, data-pointer-object se torna associado com o alvo
atribuido. Se data-target alocvel, ele tem que estar alocado.
Se data-pointer-object polimrfico (5.1.1.2), ele assume o tipo dinmico de data-target. Se data-
pointer-object do tipo derivado sequncia oi um tipo com o atributo BIND, o tipo dinmico de data-target
tem que ser o do tipo derivado.
Se data-target um ponteiro desassociado, todos os parmetros de tipo no postergados do tipo
declarado de data-pointer-object que correspondem aos parmetros de tipo de data-target tem que ter os
mesmos valores que os parmetros de tipo correspondentes de data-target. Caso contrrio, todos os parmetros
de tipo no postergados do tipo declarado de data-pointer-object tem que ter os mesmos valores de dos
parmetros de tipo correspondentes de data-target.
Se data-pointer-object tem parmetros de tipo no postergados que correspondem a parmetros de tipo
postergados de data-target, data-target nopode ser um ponteiro com estado de associao indefinido.
Se bounds-remapping-list especificado, data-target no pode ser um ponteiro desassociado ou
indefinido e o tamanho de data-target no pode ser menor que o tamanho de data-pointer-object. Os
elementos do alvo de data-pointer-object, na ordem doa elementos da matriz(6.2.2.2), so os primeiros
SIZE(data-pointer-object) elementos de data-target.
Se na bounds-remapping-list especificada, a extenso da dimenso de data-pointer-object a
extenso da correspondente dimenso de data-target. Se a bounds-spec-list aparece, ela especifica os limites
inferiores; caso contrrio, o limite inferior de cada dimenso o resultado da funo intrnseca LBOUND (13.7.60)
aplicada a correspondente dimenso de data-target. O limite superior de cada dimenso um a menos que a
soma do limite inferior e a extenso
7.4.2.2 Atribuio de Ponteiro de Procedimento
7.4.2.2 Procedure pointer assignment
Se o proc-target no um ponteiro, proc-pointer-object se torna um ponteiro associado com proc-
target. Caso contrrio, o estado de associao de ponteiro de proc-pointer-object torna-se aquele de proc-
target; se proc-target est associado com um procedimento, proc-pointer-object se torna associado com o
mesmo procedimento.
Se proc-pointer-object tem um interface explcita, suas caractersticas tem que ser as mesmas de proc-
target exceto que proc-target pode ser pura mesmo se proc-pointer-object no pura e proc-target pode
ser um procedimento intrnseco elementar mesmo se proc-pointer-object no elementar.
Se as caractersticas de proc-pointer-object ou proc-target so tais que uma interface explcita
requerida, para proc-pointer-object e proc-target tem que ter uma interface explcita.
Se proc-pointer-object tem uma interface implcita e tem seu tipo definido explicitamente ou
referenciado como um funo , proc-target tem que ser uma funo. Se proc-pointer-object tem interface
implcita e referenciado como um sub-rotina, proc-target tem que ser uma sub-rotina.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 164
Se proc-target e proc-pointer-object so funes, eles tem que ter o mesmo tipo; parmetros de tipo
correspondentes tm que ser ambos postergados ou ambos de mesmo valor.
Se procedure-name um nome de procedimento que tambm um nome genrico, somente o
procedimento especfico associado com pointer-object.
7.4.2.3 Exemplos
7.4.2.3 Examples
Nota 7.43
O que segue so exemplos de instrues de atribuio de ponteiros (veja nota 12.14 para a declarao de P e
BESSEL)
NEW_NODE%LEFT => CURRENT_NODE
SIMPLE_NAME => TARGET_STRUCTURE%SUBSTRUCT%COMPONENT
PTR => NULL( )
ROW => MAT2D(N, :)
WINDOW => MAT2D(I-1:I+1, J-1:J+1)
POINTER_OBJECT => POINTER_FUNCTION(ARG_1, ARG_2)
EVERY_OTHER => VECTOR(1:N:2)
WINDOW2(0:, 0:) => MAT2D(ML:MU, NL:NU)
! P um ponteiro de procedimento (procedure pointer) e BESSEL um procedimento com uma
! interface compatvel
P => BESSEL
! o mesmo para um componente de estrutura
STRUCT % COMPONENT => BESSEL
Nota 7.44
possvel obter vistas de rank maior de (high-rank views) objetos unidimensionais (rank-one objects) pela
especificao de limites superiores em instrues de atribuio de ponteiro. Considere exemplo qual matrix
trabalhado. A matrix guardada em um objeto unidimensional em MYDATA porque sua diagonal necessria por
alguma razo. a diagonal no pode ser obtida como um objeto simples da representao bidimensional (rank-two
representation). A matrix representada como um vista bidimensional (rank-two view) de MYDATA.
real, target :: MYDATA ( NR*NC ) ! matriz automtica
real, pointer :: MATRIX ( :, : ) ! uma vista bidimensional de MYDATA
real, pointer :: VIEW_DIAG ( : )
MATRIX( 1:NR, 1:NC ) => MYDATA ! uma vista MATRIX dos dados
VIEW_DIAG => MYDATA( 1::NR+1 ) ! a diagonal de MATRIX
Linhas, colunas e blocos de matrix podem ser acessadas como sees de MATRIX
7.4.3 Atribuio de Matriz Mascarada WHERE
7.4.3 Masked array assignment WHERE
Uma atribuio de matriz mascarada usada para mascarar a avaliao de expresses e atribuies de
valores em uma instruo de atribuio matricial, de acordo com o valor de uma expresso matricial lgica.
7.4.3.1 Forma Geral de uma Atribuio de Matriz Mascarada
7.4.3.1 General form of the masked array assignment
Uma atribuio de matriz mascarada (masked array assignment) uma instruo WHERE (WHERE
statement ) ou um construtor WHERE (WHERE construct).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 165
R743 where-stmt is WHERE(mask-expr)where-assignment-stmt
R744 where-construct is where-construct-stmt
[where-body-construct] ...
[masked-elsewhere-stmt
[where-body-construct] ... ] ...
[elsewhere-stmt
[where-body-construct] ... ]
end-where-stmt
R745 where-construct-stmt is [where-construct-name:]WHERE(mask-expr)
R746 where-body-construct is where-assignment-stmt
or where-stmt
or where-construct
R747 where-assignment-stmt is assignment-stmt
R748 mask-expr is logical-expr
R749 masked-elsewhere-stmt is ELSEWHERE(mask-expr)[where-construct-name]
R750 elsewhere-stmt is ELSEWHERE[where-construct-name]
R751 end-where-stmt is END WHERE[where-construct-name]
C729 (R747) Uma where-assignment-stmt que uma atribuio definida tem que ser elementar
C730 (R744) Se a where-construct-stmt identificada por um where-construct-name, o
correspondente end-where-stmt tem que especificar o mesmo where-construct-name. Se a where-
construct-stmt no identificada por um where-construct-name, o correspondente end-where-stmt
no pode especificar um where-construct-name. Se uma elsewhere-stmt ou uma masked-elsewhere-
stmt identificada por um where-construct-name, a correspondente where-construct-stmt tem que
especificar o mesmo where-construct-name
C731 (R746) Uma instruo que parte de uma where-body-construct no pode ser uma instruo alvo de
desvio (branch target statement)
Se um where-construct contm uma where-stmt, a masked-elsewhere-stmt ou outro where-
construct ento cada mask-expr dentro do where-construct tem que ter a mesma forma. Em acada where-
assignment-stmt, a mask-expr e a varivel sendo definida tm que ser matrizes de mesma forma
Nota 7.45
Exemplos de uma matriz mascarada so:
WHERE(TEMP > 100.0) TEMP = TEMP - REDUCE_TEMP
WHERE(PRESSURE <= 1.0)
PRESSURE = PRESSURE + INC_PRESSURE
TEMP = TEMP - 5.0
ELSEWHERE
RAINING = .TRUE.
END WHERE
7.4.3.2 Interpretao da Atribuio de Matriz Mascarada
7.4.3.2 Interpretation of masked array assignments
Quando uma instruo WHERE ou uma where-construct-stmt executada, uma mscara de controle
(control mask) estabelecida. Em adio, quando uma instruo construtor WHERE executada, uma mscara de
controle pendente estabelecida. Se a instruo no aparece como parte de um where-body-construct, a mask-
expr da instruo avaliada e a mscara de controle criada com o valor de mask-expr. A mscara de controle
pendente estabelecida com o valor .NOT.mask-expr at a execuo da instruo construtor WHERE que no
aparece como parte de um where-body-construct. A mask-expr avaliada somente uma vez.
Cada instruo em um construtor WHERE executada em sequncia.
Na execuo de uma masked-elsewhere-stmt as seguintes aes ocorrem em sequncia:
1. a mscara de controle
m
c
criada com o valor da mscara de controle pendente
2. a mscara de controle pendente criada com o valor
m
c
.AND. (.NOT. mask-expr)
3. a mscara de controle
m
c
criada com o valor
m
c
.AND. mask-expr
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 166
A mask-expr avaliada ao menos uma vez.
Na execuo da instruo ELSEWHERE a mscara de controle estabelecida com o valor da mscara de
controle pendente. Nenhuma nova mscara de controle criada. Na execuo de uma instruo ELSEWHERE a
mscara de controle e a mscara de controle pendente so estabelecidas para conter os valores que tinham antes da
execuo da correspondente instruo construtor WHERE. Depois da execuo da instruo WHERE que aparece
como um where-body-construct a mscara de controle estabelecida com o valor que tinha antes da execuo da
instruo WHERE.
Nota 7.46
O estabelecimento das mascaras de controle e das mascaras de controles pendentes ilustrado no exemplo que
segue:
HERE(cond1) ! instruo 1
. . .
ELSEWHERE(cond2) ! instruo 2
. . .
ELSEWHERE ! instruo 3
. . .
END WHERE
Seguindo a execuo da instruo 1, a mascara de controle tem o valor cond1 e a mscara de controle pendente
tem o valor .NOT. cond1 . Seguindo a execuo da instruo 2, a mascara de controle tem o valor
(.NOT. cond1).AND. cond2 e a mscara de controle pendente tem o valor
(.NOT. cond1) .AND. (.NOT. cond2) . Seguindo a execuo da instruo 3 a mascara de controle tem o valor
(.NOT. cond1) .AND. (.NOT. cond2) . Os valores das condies falsas so propagados pela execuo da
instruo ELSEWHERE mascarada
Na execuo de uma instruo construo WHERE que parte de um where-body-construct, a mscara
de controle pendente estabelecida com o valor .AND.(.NOT.mask-expr) . A mscara de controle ento
estabelecida com o valor m
c
.AND.mask-expr . A mask-expr avaliada somente um vez.
Na execuo de uma instruo WHERE que parte de um where-body-construct, a mscara de controle
estabelecida com o valor m
c
.AND.mask-expr . A mascara de controle pendente no alterada.
Se uma referncia de funo no elementar ocorre em expr ou uma varivel de uma where-assignment-
stmt ou em uma mask-expr, a funo avaliada sem nenhum controle da mscara, isto , todos as expresses
argumentos so completamente calculadas e a funo completamente calculada. Se o resultado uma matriz e a
referncia no est dentro da lista de argumento de uma funo no elementar, os elementos correspondentes ao
valores verdadeiros na mscara de controle so selecionados para uso na avaliao de expr, variable ou mask-
expr.
Se uma operao elementar ou referncia de funo ocorre em expr ou variable de uma where-
assignment-stmt ou em uma mask-expr e no est dentro da lista de argumentos de uma referncia de funo no
elementar, a operao realizada ou a funo avaliada somente para os elementos correspondentes ao valor
verdadeiro da mscara de controle.
Se um construtor de matriz aparece em uma where-assignment-stmt ou em uma mask-expr, o construtor
de matriz avaliado sem qualquer controle da mscara de controle e ento a where-assignment-stmt executada
ou a mask-expr avaliada.
Quando uma where-assignment-stmt executada o valor de expr que corresponde aos valores
verdadeiros da mscara de controle so atribudos aos elementos correspondentes de varivel.
O valor da mscara de controle estabelecido pela execuo da instruo WHERE, de uma instruo de
construo WHERE, uma instruo ELSEWHERE, uma instruo ENLSEWHERE mascarada ou uma instruo
ENDWHERE . Mudanas subsequentes do valor da entidade em uma mask-expr no tem efeito no valor da
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 167
mscara de controle. A execuo de uma referncia de funo em uma expresso mscara de uma instruo
WHERE pode afetar entidades na instruo de atribuio.
Nota 7.47
Exemplos de referncia de funo em uma atribuio mascarada de matriz so:
WHERE (A > 0.0)
A = LOG (A) ! LOG invocada somente para elementos positivos
A = A / SUM (LOG (A)) ! LOG invocada para todos os elementos
! porque SUM transformacional
END WHERE
7.4.4 Para Todos
7.4.4 FORALL
Construes FORALL e instrues so usadas para executar atribuio e instrues de atribuies de
ponteiro com seleo por um conjunto de valores de ndice e uma expresso mascarada opcional.
7.4.4.1 O Construtor FORALL
7.4.4.1 The FORALL Construct
Uma construo FORALL permite atribuies mltiplas, atribuies de matriz mascarada (WHERE) e
construes e instrues FORALL aninhadas controladas por um nico forall-triplet-spec-list e scalar-
mask- expr.
R752 forall-construct is forall-construct-stmt
[forall-body-construct ] ...
end-forall-stmt
R753 forall-construct-stmt is [forall-construct-name:]FORALL forall-header
R754 forall-header is (forall-triplet-spec-list[,scalar-mask-expr])
R755 forall-triplet-spec is index-name=subscript:subscript[:stride]
R618 subscript is scalar-int-expr
R621 stride is scalar-int-expr
R756 forall-body-construct is forall-assignment-stmt
or where-stmt
or where-construct
or forall-construct
or forall-stmt
R757 forall-assignment-stmt is assignment-stmt
or pointer-assignment-stmt
R758 end-forall-stmt is END FORALL[forall-construct-name]
C732 (R758) Se a forall-construct-stmt tem um forall-construct-name, a end-forall-stmt tem
que ter o mesmos forall-construct-name. Se a end-forall-stmt tem um forall-construct-name, a
forall-construct-stmt tem que ter o mesmo forall-construct-name
C733 (R754) A scalar-mask-expr tem que ser escalar e do tipo lgico
C734 (R754) Qualquer procedimento referenciado em uma scalar-mask-expr, incluindo uma referncia a um
operao definida, tem que ser um procedimento puro(12.6)
C735 (R755) Um index-name tem que ser um varivel escalar com nome do tipo inteiro
C736 (R755) Um subscrito ou passo em uma forall-triplet-spec no pode conter um referncia a
qualquer index-name em uma forall-triplet-spec-list na qual ele aparece
C737 (R756) Uma instruo em uma forall-body-construct no pode definir um index-name de uma
forall-construct
C738 (R756) Qualquer procedimento referenciado em um forall-body-construct, incluindo aquele
referenciado por uma operao definida, atribuio ou finalizao, tem que ser um procedimento puro
C739 (R756) Uma forall-body-construct no pode ser o alvo de um desvio
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 168
Nota 7.48
Um exemplo de construo FORALL :
REAL :: A(10,10), B(10,10)=1.0
. . .
FORALL(I=1:10,J=1:10,B(I,J)/=0.0)
A(I,J) = REAL (I + J - 2)
B(I,J) = A(I,J) + B(I,J) * REAL(I*J)
END FORALL
Nota 7.49
Uma instruo de atribuio que o corpo de uma construo FORRALL pode ser uma atribuio escalar ou
matricial ou uma instruo de atribuio definida. A varivel definida normalmente usar cada ndice na forall-
triplet-spec-list. Por exemplo:
FORALL(I=1:N,J=1:N)
A(:,I,:,J)=1.0/REAL(I+J-1)
END FORALL
distribui os valores escalares em submatrizes bidimensionais de A
Nota 7.50
Um exemplo de uma construo FORALL contendo uma declarao de atribuio de ponteiro :
TYPE ELEMENT
REAL ELEMENT_WT
CHARACTER(32), POINTER :: NAME
END TYPE ELEMENT
TYPE(ELEMENT) CHART(200)
REAL WEIGHTS(1000)
CHARACTER(32), TARGET :: NAMES(1000)
. . .
FORALL(I=1:200, EIGHTS(I+N-1)>.5)
CHART(I)%ELEMENT_WT = WEIGHTS(I+N1)
CHART(I)%NAME => NAMES(I+N-1)
END FORALL
O resultado desta construo FORALL no pode alcanado com a construo WHERE porque a instruo de
atribuio de ponteiro no permitida em uma construo WHERE
Um index-name de uma construo forall tem o escopo da construo (16.3). Ele uma varivel escalar
que tem o tipo e parmetros de tipo que teria se el fosse o nome de uma varivel na unidade de escopo que inclui o
FORALL e seu tipo tem que ser inteiro; ele no tem outros atributos.
Nota 7.51
O uso de variveis index-name em uma construo FORALL no afeta variveis de mesmo nome, por exemplo:
INTEGER :: X=-1
REAL A(5,4)
J = 100
. . .
FORALL(X=1:5,J=1:4)
A(X,J)=J
END FORALL
depois da execuo do FORALL as variveis X e J tem os valores -1 e 100 e A tem os valores
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 169
7.4.4.2 Execuo de um Construtor FORALL
7.4.4.2 Execution of the FORALL construct
Existe trs estgios na execuo da construo FORALL:
1. determinao dos valores das variveis index-name
2. avaliao da scalar-mask-expr
3. Execuo dos corpos dos construtores FORALL
7.4.4.2.1 Determinao dos Valores das Variveis ndice
7.4.4.2.1 Determination of the values for index variables
O subscrito e expresses do passo em uma forall-triplet-spec-list so avaliados. Estas expresses
podem ser avalizadas em qualquer ordem. O conjunto de valores que a um varivel index-name particular assume
determinado como segue:
1. o limite inferior
m
1
, o limite superior
m
2
e o passo
m
3
so tipo inteiro com o mesmo tipo e
parmetro de tipo subtipo que o index-name. Seus valores so determinados pela avaliao das expresses
do primeiro subscrito, segundo subscrito e do passo , respectivamente, incluindo, se necessrio, a
converso de parmetro de tipo subtipo do index-name de acordo com as regras de converso numrica
(tabela 7.9). Se o passo no utilizado , m
3
tem o valor 1. O valor m
3
no pode ser zero
2. O valor de max
m
2
m
1
+m
3
m
3
. Se max<0 para algum index-name a execuo da construo est
completa, caso contrria o conjunto de valores para index-name
m
1
+(k1)m
3
onde k=1, 2, 3, , max
O conjunto de combinaes dos valores index-name o produto cartesiano dos conjuntos definidos por
cada especificao tripleto (triplet specification). Um index-name torna-se definido quando este conjunto calculado.
Nota 7.52
O passo pode ser positivo ou negativo; o corpo da construo FORALL executado enquanto max>0. Para o
tripleto do forall (forall-triplet-spec)
I = 10:1:-1
max tem o valor10
7.4.4.2.2 Avaliao de uma Expresso Mscara
7.4.4.2.2 Evaluation of the mask expression
Uma scalar-mask-expr, se existir, avaliada para cada combinao dos valores do index-name. Se a
scalar-mask-expr no est presente, como se ela estivesse presente com o valor verdadeiro (true). A varivel
index-name pode ser uma expresso primria na scalar-mask-expr.
A combinao ativa (active combination) de valores index-name definido como sendo o subconjunto de
todos os valores possvel da combinao (7.4.4.2.1) onde a scalar-mask-expr tem o valor verdadeiro (true).
Nota 7.53
A varivel index-name pode aparecer em uma mscara, por exemplo:
FORALL(I=1:10,J=1:10,A(I)>0.0.AND.B(J)<1.0)
. . .
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 170
7.4.4.2.3 Execuo do Corpo das Construes FORALL
7.4.4.2.3 Execution of the FORALL body constructs
As forall-body-constructs so executados na ordem em que aparecem. Cada construo executada
para todos as combinaes ativas dos valores do ndice (index-name values) com as seguintes interpretaes:
Execuo de uma forall-assignment-stmt que uma assignment-stmt produz a avaliao de expr e
todas as expresses dentro da varivel para todas as combinaes ativas dos valores do ndex (index-name). Essas
avaliaes podem ser feitas em qualquer ordem. Depois de todas as avaliaes terem sido feitas, cada valor expr
atribudo varivel correspondente. A atribuio pode ocorrer em qualquer ordem.
Execuo de uma forall-assignment-stmt que uma pointer-assignment-stmt produz a avaliao de
todas as expresses entre dentro de data-target e data-pointer-object ou proc-target e proc-pointer-
object, a determinao de quaisquer ponteiros dentro de data-pointer-object ou proc-pointer-object e a
determinao do alvo para todas as combinaes ativas de valores index-name. Estas avaliaes terem sidos feitas,
cada data-pointer-object ou proc-pointer-object associado com o correspondente alvo. Estas associaes
podem ocorre em qualquer ordem.
Em uma forall-assignment-stmt, uma sub-rotina de atribuio definida no pode referenciar qualquer
varivel que se tornou definida por uma instruo.
Nota 7.54
A construo FORALL que segue contm duas instrues de atribuio. A atribuio da matriz B usa os valores
da matriz A calculados em uma declarao prvia, no os valores que A tinham antes da execuo do FORALL.
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)=1.0/A(I,J)
END FORALL
Clculos que, por outro lado, podem causar condies de erro podem ser evitados assumindo uma scalar-mask-
expr apropriada que limite as combinaes ativas dos valores index-name. Por exemplo:
FORALL(I=1:N,Y(I)/=0.0)
X(I)=1.0/Y(I)
END FORALL
Cada instruo em uma construo WHERE (7.4.3) dentro de uma construo forall executada em
sequncia. Quando uma where-stmt, where-construct-stmt ou masked-elsewhere-stmt executada, a mask-
expr da instruo avaliada para todas as combinaes ativas dos valores do index-name como determinado pela
construo forall externa, mascarada por qualquer mscara de controle correspondente aos construtores externos
Qualquer where-assignment-stmt executado para todas as combinaes ativas dos valores do ndice
(index-name values), mascarada pela mscara de controle em efeito para a where-assignment-stmt.
Nota 7.55
Esta construo FORALL contm uma instruo WHERE e uma instruo de atribuio.
INTEGER A(5,4),B(5,4)
FORALL(I = 1:5)
WHERE(A(I,:).EQ.0) A(I,:)=I
B(I,:)=I/A(I,:)
END FORALL
Quando executado com a matriz
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 171
0 0 0 0
1 1 1 0
A = 2 2 0 2
1 0 2 3
0 0 0 0
o resultado ser
1 1 1 1 1 1 1 1
1 1 1 2 2 2 2 1
A = 2 2 3 2 B = 1 1 1 1
1 4 2 3 4 1 2 1
5 5 5 5 1 1 1 1
Para um exemplo de um construtor FORALL contendo uma construo WHERE com uma instruo
ELSEWHERE , veja C.4.5
Execuo de uma forall-stmt ou uma forall-construct produz a avaliao das expresses dos
subscritos e passos na forall-triplet-spec-list de todas as combinaes ativas nos valores dos ndices de
todos as construes FORALL externas. O conjunto de combinaes dos valores do ndice para todas os FORALL
internos a unio dos conjuntos definidos por estes linites e passos para cada combinao ativa dos valores de
ndices externos. Eles tambm incluem os valores dos ndices externos. As scalar-mask-expr so ento avaliadas
para todas as combinaes dos valores de ndices na construo interna para produzir o conjunto de combinaes
ativas para a construo interna. Se no h uma scalar-mask-expr eles so avaliados como se o valor .TRUE.
estivesse presente. Cada instruo em um FORALL interno ento executado para cada combinao ativa para os
valores de ndice.
Nota 7.56
Esta construo FORALL contm uma construo FORALL aninhada. Ela atribu a transposta da matriz
triangular inferior A (a seo debaixo da diagonal principal) ao tringulo superior de A.
INTEGER A(3, 3)
FORALL(I=1:N-1)
FORALL(J=I+1:N)
A(I,J)=A(J,I)
END FORALL
END FORALL
Se antes da execuo N = 3 e
0 3 6
A = 1 4 7
2 5 8
ento depois da execuo
0 1 2
A = 1 4 5
2 5 8
7.4.4.3 A Instruo FORALL
7.4.4.3 The FORALL statement
A instruo FORALL permite que uma nica instruo de atribuio ou atribuio de ponteiro seja
controlada por um conjunto de valores ndices e uma expresso mscara opcional.
R759 forall-stmt is FORALL forall-header forall-assignment-stmt
Uma instruo FORALL equivalente a uma construo FORALL contendo somente um nico forall-
body-construct que um forall-assignment-stmt.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 172
O escopo de um nome de ndice (index-name) em uma forall-stmt a instruo em si mesma (16.3).
Nota 7.57
Exemplos de instruo FORALL so:
FORALL(I=1:N) A(I,I)=X(I)
Esta instruo atribui os elementos do vetor X aos elementos da diagonal principal da matriz A
FORALL(I=1:N,J=1:N)
X(I,J)=1.0/REAL(I+J-1)
O elemento X(I,J) da matriz X atribudo o valor (1.0 / REAL (I+J-1)) para todos os valores de I e J entre 1 e N,
inclusive
FORALL(I=1:N,J=1:N,Y(I,J)/=0.AND.I/=J)
X(I,J)=1.0/Y(I,J)
Esta instruo pega o recproco de cada elemento no zero fora da diagonal da matriz Y, Y(1:N, 1:N), e atribui ao
correspondente elemento da matriz X. Elementos de Y que so zero ou esto sobre a diagonal no participam e
no so atribudos aos correspondentes elementos de X. Os resultados da execuo do exemplo na nota 7.56 pode
ser obtido com uma nica instruo FORALL:
FORALL ( I = 1:N-1, J=1:N, J > I )
A(I,J) = A(J,I)
Para mais exemplos de instruo FORALL, veja C.4.6
7.4.4.4 Restries para as Instrues e Construes FORALL
7.4.4.4 Restrictions on FORALL constructs and statements
Uma atribuio vrias-para-um (many-to-one assignment) mais do que uma atribuio para o mesmo objeto
ou associao de mais que um alvo com o mesmo ponteiro, onde o objeto referenciado diretamente ou
indiretamente por meio de um ponteiro. Uma atribuio vrias-para-um no pode ocorrer dentro de uma instruo
nica em uma construo ou instruo FORALL. possvel atribuir ou atribuir um ponteiro ao mesmo objeto em
diferentes instrues de atribuio em uma construo FORALL.
Nota 7.58
A utilizao de cada nome de ndice (index-name) na identificao no lado esquerdo de uma instruo de atribuio
til para eliminar atribuies vrias-para-um, mas no suficiente para garantir que no exite nenhuma. Por
exemplo, o seguinte permitido
FORALL(I=1:10)
A(INDEX(I))=B(I)
END FORALL
se e somente se INDEX(1:10) no contm valores repetidos
Dentro do escopo de uma construo FORALL, instrues FORALL encadeadas (nested FORALL statement)
ou construo FORALL no pode ter o mesmo nome de ndice (index-name). A expresses forall-header dentro
de FORALL encadeados podem depender dos valores das variveis nome de ndice (index-name) externos.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 173
8. Controle de Execuo
Section 8: Execution control
A sequncia de execuo pode ser controlada por construes contendo blocos e por certas instrues
executveis que so usadas para altera a sequncia de execuo.
8.1 Construes Executveis Contendo Blocos
8.1 Executable constructs containing blocks
O que segue so construes executveis que contm blocos:
1. construo ASSOCIATE
2. construo CASE
3. construo DO
4. construo IF
5. construo IF SELECT TYPE
Existe tambm uma forma no bloco da construo DO.
Um bloco (block) uma sequncia de construes executveis que tratada como um unidade.
R801 block is [execution-part-construct]...
Construes executveis podem ser usadas para controlar quais blocos dentro do programa so executados
ou quantas vezes um bloco executado. Blocos so sempre cercados (limitados) por instrues que so particular
para a construo em que eles so colocados; entretanto, em algumas formas de construo DO, uma sequncia de construes
executveis sem uma instruo limitadora obedecem a todas as regras governando o bloco (8.1.1).
Nota 8.1
Um bloco no necessita conter qualquer construo executveis. Execuo destes blocos no tem efeito
Qualquer destas construes podem ter nomes. Se uma construo recebe um nome ( nomeada), o nome
tem que ser o primeiro totem lxico da primeira instruo da construo e o ltimo totem lxico da construo. Para
a forma fixa, o nome precedendo a construo tem que ser colocada depois da posio 6.
A instruo pertence (belongs) a construo mais interna na qual aparece a menos que ela contenha um
nome de construo, e neste caso ele pertence construo nomeada.
Nota 8.2
Um exemplo de uma construo contendo um bloco :
IF (A > 0.0) THEN
B = SQRT (A) ! estas duas instrues
C = LOG (A) ! formam um bloco
END IF
8.1.1 Regras para os Blocos
8.1.1 Rules governing blocks
8.1.1.1 Construes Executveis dentro de Blocos
8.1.1.1 Executable constructs in blocks
Se um bloco contm uma construo executvel, a construo executvel tem que estar inteiramente dentro
do bloco.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 174
8.1.1.2 Controle de Fluxo dentro de Blocos
8.1.1.2 Control flow in blocks
Transferncia de controle para o interior de um de bloco proibido. Transferncia dentro de um bloco e
transferncia do interior de um bloco para fora do bloco pode ocorrer.
Sub-rotinas e referncias de funo (12.4.2, 12.4.3) podem aparecer dentro de um bloco.
8.1.1.3 Execuo de um Bloco
8.1.1.3 Execution of a block
Execuo de um bloco inicia com a execuo da primeira construo executvel dentro do bloco. A
execuo de um bloco concluda quando a ltima construo executvel executada ou quando um desvio para
fora do bloco ocorre.
Nota 8.3
A ao que ocorre na fonteira terminal depende da construo em particular e do bloco dentro da construo.
Usualmente uma transferncia de controle
8.1.2 Construo IF
8.1.2 IF construct
A construo IF (IF construct) seleciona para ao menos um dos seus blocos constituintes. A seleo
baseada na sequncia de expresses lgicas. Uma instruo IF (IF statement) controla a execuo de uma nica
instruo (8.1.2.4) baseada em uma nica expresso lgica.
8.1.2.1 Forma da Construo IF
8.1.2.1 Form of the IF construct
R802 if-construct is if-then-stmt
block
[else-if-stmt
block ] ...
[else-stmt
block ]
end-if-stmt
R803 if-then-stmt is [if-construct-name:]IF(scalar-logical-expr)THEN
R804 else-if-stmt is ELSE IF(scalar-logical-expr)THEN[if-construct-name]
R805 else-stmt is ELSE[if-construct-name]
R806 end-if-stmt is END IF[if-construct-name]
C801 (R802) Se a if-then-stmt de uma if-construct especifica um if-construct-name, a
correspondente end-if-stmt tem que especificar o mesmo if-construct-name. Se a if-then-stmt de
uma if-construct no especifica um if-construct-name, a correspondente end-if-stmt no pode
especificar um if-construct-name. Se a else-if-stmt ou a else-stmt especifica uma if-construct-
name, a correspondente if-then-stmt tem que especificar o mesmo if-construct-name
8.1.2.2 Execuo de uma Construo IF
8.1.2.2 Execution of an IF construct
No mais de um dos blocos de uma construo IF executada. Se existe uma instruo ELSE na
construo, exatamente um dos blocos na construo ser executada. As expresses lgica escalar so avaliadas na
ordem em que aparecem na construo at que um valor verdadeiro encontrado ou uma instruo ELSE ou uma
instruo ELSE IF encontrada. Se um valor verdadeiro ou uma instruo ELSE encontrada, o bloco
imediatamente seguinte executado e isto completa a execuo do construtor, A expresso lgica escalar em
qualquer das instrues restantes ELSE IF no so avaliadas. Se nenhuma das expresses avaliadas verdadeira e
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 175
se no existe a instruo ELSE, a execuo do construtor completada sem a execuo de qualquer bloco dentro do
construtor.
Uma instruo ELSE IF ou uma instruo ELSE no pode ser uma instruo alvo de desvio. permitido
desviar para uma instruo END IF somente de dentro de sua construo IF. Execuo de uma instruo END IF
no tem efeito.
8.1.2.3 Exemplos de Construes IF
8.1.2.3 Examples of IF constructs
Nota 8.4
IF(CVAR == RESET) THEN
I=0; J=0; K=0
END IF
PROOF_DONE: IF(PROP) THEN
WRITE(3,(QED))
STOP
ELSE
PROP=NEXTPROP
END IF PROOF_DONE
IF (A > 0) THEN
B=C/A
IF(B>0) THEN
D=1.0
END IF
ELSEIF(C>0) THEN
B=A/C
D=-1.0
ELSE
B=ABS(MAX(A,C))
D=0
END IF
8.1.2.4 Instruo IF
8.1.2.4 IF statement
A instruo IF controla uma nica instruo de ao (R214).
R807 if-stmt is IF(scalar-logical-expr)action-stmt
C802 (R807) Uma action-stmt em uma if-stmt no pode ser uma if-stmt, end-program-stmt, end-
function-stmt, ou end-subroutine-stmt
Execuo de uma instruo IF produz a avaliao da expresso escalar lgica. Se o valor da expresso
verdadeiro, a instruo ao executada. Se o valor falso, a instruo ao no executada e a execuo
continua.
A execuo de uma referncia de funo na expresso escalar lgica pode afetar entidades na instruo
ao.
Nota 8.5
Um exemplo de uma instruo IF :
IF(A>0.0) A=LOG(A)
8.1.3 Construo Caso
8.1.3 CASE construct
Uma construo caso (CASE construct) seleciona para execuo no mximo um dos seus blocos
constituintes. A seleo baseada no valor de uma expresso.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 176
8.1.3.1 Forma de uma Construo Caso
8.1.3.1 Form of the CASE construct
R808 case-construct is select-case-stmt
[case-stmt
block] ...
end-select-stmt
R809 select-case-stmt is [case-construct-name:]SELECT CASE(case-expr)
R810 case-stmt is CASE case-selector[case-construct-name]
R811 end-select-stmt is END SELECT[case-construct-name]
C803 (R808) Se uma select-case-stmt de um case-construct especifica um case-construct-name,
a correspondente end-select-stmt tem que especificar o mesmo case-construct-name. E a select-
case-stmt de uma case-construct no especifica um case-construct-name, a correspondente end-
select-stmt shall no especifica um case-construct-name. Se uma case-stmt especifica um case-
construct-name, a correspondente select-case-stmt tem que especificar o mesmo case-construct-
name
R812 case-expr is scalar-int-expr
or scalar-char-expr
or scalar-logical-expr
R813 case-selector is ( case-value-range-list )
or DEFAULT
C804 (R808) No mais de um seletor de uma instruo CASE pode ser DEFAULT
R814 case-value-range is case-value
or case-value:
or case-value
or case-value:case-value
R815 case-value is scalar-int-initialization-expr
or scalar-char-initialization-expr
or scalar-logical-initialization-expr
C805 (R808) Para um dado case-construct, cada case-value tem que ter o mesmo tipo de case-expr.
Para o tipo caractere, os parmetros de tipo subtipo tm que ser os mesmos; caracteres de comprimentos
diferentes so permitidos
C806 (R808) Um case-value-range usando dois pontos no pode ser usado se case-expr do tipo lgico
C807 (R808) Para um dado case-construct, o case-value-ranges no pode sobrepor-se, isto , no h
possveis valores de case-expr que sejam igual a mais de um case-value-range
8.1.3.2 Execuo de uma Construo Caso
8.1.3.2 Execution of a CASE construct
A execuo da instruo SELECT CASE faz com que a expresso case seja avaliada. O valor resultante
chamado de ndice do caso (case index). Para um intervalo na lista de valores, uma ocorrncia acontece se o ndice
do caso igual a algum valor do intervalo a lista. Para o caso do ndice do caso com o valor c, uma ocorrncia
determinada assim:
1. se o intervalo de valores no caso contm um nico valor v sem o dois pontos, uma ocorrncia (match)
acontece para tipo lgico se a expresso c. EQV. v verdadeira e uma ocorrncia acontece para tipo
inteiro ou caractere se a expresso c == v verdadeira
2. se o intervalo de valores da forma low:high uma ocorrncia acontece se a expresso
lowc .AND. chigh verdadeira
3. se o intervalo de valores da forma low: uma ocorrncia acontece se a expresso low <= c
verdadeira
4. se o intervalo de valores da forma : high uma ocorrncia acontece se a expresso chigh
verdadeira
5. se nenhum outro seletor ocorre e um seletor DEFAULT existe, ele a ocorrncia do ndice do caso
6. se nenhum outro seletor ocorre e um seletor DEFAULT no existe, no h ocorrncia
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 177
O bloco seguindo a instruo CASE contendo o seletor com a ocorrncia, se existir, executado. Isto
completa a execuo do construo.
No mximo um dos blocos da construo CASE executada.
Uma instruo CASE no pode ser o alvo de um desvio. permitido ser o alvo de um desvio para uma
end-select-stmt somente dentro da prpria construo CASE.
8.1.3.3 Exemplos das Construes Caso
8.1.3.3 Examples of CASE constructs
Nota 8.6
A funo inteira signum:
INTEGER FUNCTION SIGNUM(N)
SELECT CASE(N)
CASE(:-1)
SIGNUM = -1
CASE(0)
SIGNUM = 0
CASE(1:)
SIGNUM = 1
END SELECT
END
Nota 8.7
Um fragmento de cdigo para verificar pelo fechamento de parnteses:
CHARACTER(80) :: LINE
...
LEVEL = 0
SCAN_LINE: DO I = 1, 80
CHECK_PARENS: SELECT CASE(LINE (I:I))
CASE(()
LEVEL = LEVEL + 1
CASE())
LEVEL = LEVEL - 1
IF(LEVEL < 0) THEN
PRINT *, Parnteses direito inesperado
EXIT SCAN_LINE
END IF
CASE DEFAULT
! Ignora todos os outros caracteres
END SELECT CHECK_PARENS
END DO SCAN_LINE
IF(LEVEL > 0) THEN
PRINT *, Parnteses direito ausente
END IF
Nota 8.8
Os trs seguimentos so equivalentes:
IF(SILLY == 1) THEN
CALL THIS
ELSE
CALL THAT
END IF
SELECT CASE(SILLY == 1)
CASE(.TRUE.)
CALL THIS
CASE(.FALSE.)
CALL THAT
END SELECT
SELECT CASE(SILLY)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 178
CASE DEFAULT
CALL THAT
CASE(1)
CALL THIS
END SELECT
Nota 8.9
Um fragmento de cdigo mostrando vrias selees de um bloco:
SELECT CASE(N)
CASE(1,3:5,8) !seleciona 1, 3, 4, 5, 8
CALL SUB
CASE DEFAULT
CALL OTHER
END SELECT
8.1.4 Construo Associado
8.1.4 ASSOCIATE construct
A construo associado (ASSOCIATE construct) associa entidades com expresses e variveis durante a
execuo de seus blocos. Estas entidades construo com nome (named construct entities) (16.3) so entidades
associadas (16.4.1.5). Os nomes do nomes associados (associate names).
8.1.4.1 Formas de uma Construo Associado
8.1.4.1 Form of the ASSOCIATE construct
R816 associate-construct is associate-stmt
block
end-associate-stmt
R817 associate-stmt is [associate-construct-name:]ASSOCIATE
(association-list)
R818 association is associate-name => selector
R819 selector is expr
or variable
C808 (R818) Se o seletor no uma varivel ou uma varivel que tem um subscrito vetor, associate-name
no pode aparecer em um contexto de definio de varivel (16.5.7)
C809 (R818) Um associate-name no pode ter o mesmo nome que outro associate-name no mesmo
associate-stmt
R820 end-associate-stmt is END ASSOCIATE[associate-construct-name]
C810 (R820) Se a associate-stmt de um associate-construct especifica um associate-construct-
name, o correspondente end-associate-stmt tem que especificar o mesmo associate-construct-name.
Se a associate-stmt de um associate-construct no especifica um associate-construct-name, a
correspondente end-associate-stmt no pode especificar um associate-construct-name
8.1.4.2 Execuo de uma Construo Associado
8.1.4.2 Execution of the ASSOCIATE construct
A execuo de uma construo associado (ASSOCIATE construct) produz a execuo da sua associate-
stmt seguido pela execuo de seus bloco. Durante a execuo deste bloco cada nome associado identifica uma
entidade, que associada (16.4.1.5) com o correspondente seletor. A entidade associada assume o tipo declarado e
parmetros de tipo do seletor. Se e somente se polimrfico, a entidade associada polimrfica.
Os outros atributos da entidade associada so descritos em 8.1.4.3.
permitido desviar para uma end-associate-stmt somente dentro do construtor ASSOCIATE.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 179
8.1.4.3 Atributos dos Nomes Associados
8.1.4.3 Attributes of associate names
Dentro de uma construo SELECT TYPE ou ASSOCIATE cada entidade associada tem o mesmo rank
(nmero de dimenses) que seu seletor associado. O limite inferior de cada dimenso o resultado da funo
intrnseca LBOUND (13.7.60) aplicada correspondente dimenso do seletor. O limite superior de cada dimenso
um menos que a soma do limite inferior e a extenso. A entidade associada tem o atributo ASYNCHRONOUS,
INTENT, TARGET, ou VOLATILE se e somente se o seletor uma varivel e tem o atributo. Se a entidade
associada polimrfica, ela assume o tipo dinmico e valores dos parmetros de tipo do seletor. Se o seletor tem o
atributo OPTIONAL, ele tem que estar presente.
Se o seletor (8.1.4.1) no permitido aparecer no contexto de definio de uma varivel (16.5.7) ou em
uma matriz com um subscrito vetor, o nome associado no pode aparecer em um contexto de definio de varivel.
8.1.4.4 Exemplos de uma Construo Associado
8.1.4.4 Examples of the ASSOCIATE construct
Nota 8.10
O exemplo que segue ilustra uma associao com uma expresso.
ASSOCIATE( Z => EXP(-(X**2+Y**2)) * COS(THETA) )
PRINT *, A+Z, A-Z
END ASSOCIATE
O exemplo que segue ilustra uma associao com uma varivel tipo derivado.
ASSOCIATE( XC => AX%B(I,J)%C )
XC%DV = XC%DV + PRODUCT(XC%EV(1:N))
END ASSOCIATE
O exemplo que segue ilustra associao com seo de matriz.
ASSOCIATE( ARRAY => AX%B(I,:)%C )
ARRAY(N)%EV = ARRAY(N-1)%EV
END ASSOCIATE
O exemplo que segue ilustra mltiplas associaes.
ASSOCIATE( W => RESULT(I,J)%W, ZX => AX%B(I,J)%D, ZY => AY%B(I,J)%D )
W = ZX*X + ZY*Y
END ASSOCIATE
8.1.5 Construo SELECT TYPE
8.1.5 SELECT TYPE construct
A construo SELECT TYPE seleciona para execuo no mximo de seus blocos constituintes. A seleo
est baseada no tipo dinmico da expresso. Um nome associado com a expresso (16.3, 16.4.1.5), da mesma
forma que uma construo ASSOCIATE.
8.1.5.1 Formas da Construo SELECT TYPE
8.1.5.1 Form of the SELECT TYPE construct
R821 select-type-construct is select-type-stmt
[type-guard-stmt
block] ...
end-select-type-stmt
R822 select-type-stmt is [select-construct-name:]SELECT TYPE
([associate-name=>]selector)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 180
C811 (R822) Se selector no uma varivel com nome, associate-name => tem que aparecer
C812 (R822) Se selector no uma varivel ou uma varivel que te, um subscrito vetor, associate-name no
pode aparecer num contexto de definio de varivel (16.5.7)
C813 (R822) O seletor em uma select-type-stmt tem que ser polimrfico
R823 type-guard-stmt is TYPE IS(type-spec)[select-construct-name]
or CLASS IS(type-spec)[select-construct-name]
or CLASS DEFAULT[select-construct-name]
C814 (R823) A type-spec tem que especificar cada parmetro de tipo comprimento assumido
C815 (R823) A type-spec no pode especificar um tipo derivado sequncia ou um tipo com o atributo BIND
C816 (R823) Se selector no polimrfico ilimitado, a type-spec tem que especificar uma extenso do tipo
declarado do seletor
C817 (R823) Para um dado select-type-construct, o mesmo tipo e valor de parmetro de tipo subtipo no
pode ser especificado em mais de um TYPE IS type-guard-stmt e no pode especificar mais de uma CLASS
IS type-guard-stmt
C818 (R823) Para um dado select-type-construct, tem que no mximo um CLASS DEFAULT type-
guard-stmt
R824 end-select-type-stmt is END SELECT[select-construct-name]
C819 (R821) Se uma select-type-stmt de um select-type-construct especifica um select-
construct-name, o correspondente end-select-type-stmt tem que especificar o mesmo select-
construct-name. Se a select- type-stmt de um select-type-construct no especifica um select-
construct-name, o correspondente end-select-type-stmt no pode especificar um select-construct-
name. Se uma type-guard-stmt especifica um select-construct-name, a correspondente select-type-
stmt tem que especificar o mesmo select-construct-name
O nome associado de uma construo SELECT TYPE o associate-name se especificado; caso contrrio
o nome que constitu o seletor.
8.1.5.2 Execuo da Construo SELECT TYPE
8.1.5.2 Execution of the SELECT TYPE construct
Execuo de uma construo SELECT TYPE cujo seletor no uma varivel faz com que a expresso
seletor seja calculada.
Uma construo SELECT TYPE seleciona no mximo um bloco para ser executado. Durante a execuo
de um bloco, o nome associado identifica a entidade, que associado (16.4.1.5) com o seletor.
Um tipo TYPE IS guarda instrues referentes ao seletor se o tipo dinmico e valores do parmetro de tipo
do seletor so os mesmos que aqueles especificados pela instruo. Um tipo CLASS IS guarda instrues referentes
ao seletor se o tipo dinmico do seletor uma extenso do tipo especificado pela instruo e os valores dos
parmetros de tipo subtipo especificados pela instruo so os mesmos que os correspondentes valores de
parmetros de tipo do tipo dinmico do seletor.
O bloco a ser executado selecionado assim:
1. se uma instrues guarda de tipo (type guard) TYPE IS coincide com o seletor (matches the selector), o bloco
seguindo a instruo executado
2. caso contrrio, se exatamente uma instrues guarda de tipo CLASS IS coincide com o seletor, o bloco
seguindo esta instruo executado
3. caso contrrio, se vrias instrues guarda de tipo CLASS IS coincidem com o seletor, uma destas
instrues tem que especificar um tipo que uma extenso de todos os tipo especificados nos outros; o
bloco que segue esta instruo executado
4. caso contrrio, se existe uma instrues guarda de tipo CLASS DEFAULT, o bloco seguindo esta instruo
executado
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 181
Nota 8.11
Este algoritmo no examina as instrues guarda de tipo na ordem em que aparecem no cdigo fonte quando olha
por uma coincidncia; ele seleciona o tipo guarda (type guard) mais particular quando h vrias coincidncias
possveis (several potencial matches)
Dentro do bloco que segue uma instruo guarda de tipo TYPE IS, a entidade associada (16.4.5) no
polimrfica (5.1.1.2), tem o tipo definido na instruo guarda de tipo e tem os valores de parmetros de tipo do
seletor.
Dentro do bloco que segue uma instruo guarda de tipo CLASS IS, a entidade associada polimrfica e
tem o tipo declarado na instruo guarda de tipo. Os valores do parmetro de tipo das entidades associadas so os
valores de parmetro de tipo correspondentes do seletor.
Dentro do bloco que segue uma instruo guarda de tipo CLASS DEFAULT, a entidade associada
polimrfica e tem o mesmo tipo declarado no seletor. Os valores de parmetros de tipo das entidades associadas so
aqueles dos tipos declarados no seletor.
Nota 8.12
Se o tipo declarado do seletor T , especificar CLASS DEFAULT tem o mesmo efeito que especificar
CLASS IS (T)
Os outros atributos de uma entidade assocada esto descritas em 8.1.4.3.
Uma instruo guarda de tipo no pode ser o alvo de uma instruo desvio. permitido desviar para um
end-select-type-stmt somente dentro se uma construo SELECT TYPE.
8.1.5.3 Exemplos da Construo SELECT TYPE
8.1.5.3 Examples of the SELECT TYPE construct
Nota 8.13
TYPE POINT
REAL :: X, Y
END TYPE POINT
TYPE, EXTENDS(POINT) :: POINT_3D
REAL :: Z
END TYPE POINT_3D
TYPE, EXTENDS(POINT) :: COLOR_POINT
INTEGER :: COLOR
END TYPE COLOR_POINT
TYPE(POINT), TARGET :: P
TYPE(POINT_3D), TARGET :: P3
TYPE(COLOR_POINT), TARGET :: C
CLASS(POINT), POINTER :: P_OR_C
P_OR_C => C
SELECT TYPE( A => P_OR_C )
CLASS IS( POINT )
! "CLASS(POINT) :: A" implcito aqui
PRINT *, A%X, A%Y ! Este bloco executado
TYPE IS( POINT_3D )
! "TYPE( POINT_3D ) :: A" implcito aqui
PRINT *, A%X, A%Y, A%Z
END SELECT
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 182
Nota 8.14
O exemplo que segue ilustra a omisso do nome associado. Ele usa a declarao da nota 8.13.
P_OR_C => P3
SELECT TYPE( P_OR_C )
CLASS IS( POINT )
! "CLASS( POINT ) :: P_OR_C" implcito aqui
PRINT *, P_OR_C%X, P_OR_C%Y
TYPE IS( POINT_3D )
! "TYPE( POINT_3D ) :: P_OR_C" implcito aqui
PRINT *, P_OR_C%X, P_OR_C%Y, P_OR_C%Z ! Este bloco executado
END SELECT
8.1.6 Construo DO
8.1.6 DO construct
A construo DO especifica a execuo repetida de uma sequncia de construes executveis. Este tipo de
sequncia repetida chamada de loop (volta ou repetio). As instrues EXIT e CYCLE podem ser usadas para
modificar a execuo do loop.
A expresso loop pode ser traduzida como volta ou repetio. Entretanto, o uso da expresso
inglesa loop muito comum.
O nmero de iterao (iterao repetio) de um loop pode ser determinado no incio da execuo da
construo DO ou pode ser indefinido (DO forever ou DO WHILE). Em um dos casos, uma instruo EXIT
(8.1.6.4.4) colocada em qualquer lugar da instruo DO pode ser executada para terminar a execuo do DO
imediatamente. A iterao corrente (a iterao atual, a iterao em curso) do loop pode ser pulada (pulada; abandonada;
reduzida; curtailed) pela execuo da instruo CYCLE (8.1.6.4.3).
DO forever DO infinito
8.1.6.1 Formas da Construo DO
8.1.6.1 Forms of the DO construct
A construo DO pode ser escrita na forma de bloco ou na forma no bloco.
R825 do-construct is block-do-construct
or nonblock-do-construct
8.1.6.1.1 Formas da Construo DO na Forma Bloco
8.1.6.1.1 Form of the block DO construct
R826 block-do-construct is do-stmt
do-block
end-do
R827 do-stmt is label-do-stmt
or nonlabel-do-stmt
R828 label-do-stmt is [do-construct-name:]DO label[loop-control]
R829 nonlabel-do-stmt is [do-construct-name:]DO [loop-control]
R830 loop-control is [,]do-variable=scalar-int-expr,scalar-int-expr
[,scalar-int-expr]
or [,]WHILE(scalar-logical-expr)
R831 do-variable is scalar-int-variable
C820 (R831) A do-variable tem que ser uma varivel escalar com nome do tipo inteiro
R832 do-block is block
R833 end-do is end-do-stmt
or continue-stmt
R834 end-do-stmt is END DO[do-construct-name]
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 183
C821 (R826) Se o do-stmt de uma block-do-construct especifica um do-construct-name, o
correspondente end-do tem que ser uma end-do-stmt especificando o mesmo do-construct-name. Se o
do-stmt de uma block-do-construct no especifica um do-construct-name, o correspondente end-do
no pode especificar um do-construct-name
C822 (R826) Se uma do-stmt uma nonlabel-do-stmt, o correspondente end-do tem que ser uma end-
do-stmt
C823 (R826) Se a do-stmt uma label-do-stmt, a correspondente end-do tem que ser identificada pelo
mesmo rtulo
8.1.6.1.2 Formas da Construo DO na Forna No Bloco
8.1.6.1.2 Form of the nonblock DO construct
R835 nonblock-do-construct is action-term-do-construct
or outer-shared-do-construct
R836 action-term-do-construct is label-do-stmt
do-body
do-term-action-stmt
R837 do-body is [execution-part-construct]...
R838 do-term-action-stmt is action-stmt
C824 (R838) Uma do-term-action-stmt no pode ser uma continue-stmt, uma goto-stmt, uma return-stmt,
uma stop-stmt, uma exit-stmt, uma cycle-stmt, uma end-function-stmt, uma end-subroutine-stmt, uma
end-program-stmt ou uma arithmetic-if-stmt
C825 (R835) A do-term-action-stmt tem que ser identificada com um rtulo e a correspondente label-do-stmt tem
que referir o mesmo rtulo
R839 outer-shared-do-construct is label-do-stmt
do-body
shared-term-do-construct
R840 shared-term-do-construct is outer-shared-do-construct
R841 inner-shared-do-construct is inner-shared-do-construct
R842 do-term-shared-stmt is label-do-stmt
C826 (R842) Uma do-term-shared-stmt no pode ser uma goto-stmt, uma return-stmt, uma stop-stmt, uma
exit-stmt, uma cycle-stmt, uma end-function-stmt, uma end-subroutine-stmt, uma end-program-stmt ou
uma arithmetic-if-stmt
C827 (R840) A do-term-shared-stmt tem que ser identificada com um rtulo e todas as label-do-stmts do inner-
shared-do-construct e outer-shared-do-construct tem que referir ao mesmo rtulo
A do-term-action-stmt, do-term-shared-stmt ou shared-term-do-construct seguindo o do-body de uma construo DO no bloco chamada de
terminao DO (DO termination ) desta construo.
Dentro da unidade de escopo, todas as construes DO cujas instrues referem-se ao mesmo rtulo so construes DO no bloco e so
ditas compartilharem a mesma instruo identificada por este rtulo.
8.1.6.2 Intervalo da Construo DO
8.1.6.2 Range of the DO construct
O intervalo (range) de uma construo DO o do-block, que tem que satisfazer as regras para os blocos
(8.1.1). Em particular, transferncia de controle para o interior de um bolco vindo de fora do bloco proibido.
permitido desviar para um end-do de uma construo DO somente dentro do intervalo desta construo DO.
O intervalo de uma construo no bloco consiste do-body e da terminao DO que segue. O fim deste intervalo no limitado por
uma instruo particular como para as outras construes executveis (exemplo, END IF); Entretanto, o intervalo satisfaz as regras para os
blocos (8.1.1). Transferncia do controle para dentro do do-body ou para a terminao do DO vindo de fora do intervalo proibido; em
particular, permitido ramificar para uma do-term-shared-stmt somente dentro do intervalo do correspondente inner-shared-do-construct.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 184
8.1.6.3 Construes DO Ativa e Inativa
8.1.6.3 Active and inactive DO constructs
Uma construo DO pode estar ativa ou inativa (active ou inactive). Inicialmente inativa, uma construo
DO se torna ativa somente quando a declarao DO executada.
Uma vez ativada, a construo DO se torna inativa somente quando ela termina (8.1.6.4.4).
8.1.6.4 Execuo de uma Construo DO
8.1.6.4 Execution of a DO construct
Uma construo DO especifica um loop, isto , a sequncia de construes executveis que executada
repetidamente. H trs fases na execuo de uma construo DO: inicializao do loop, execuo do loop e trmino
do loop.
8.1.6.4.1 Inicializao da Iterao
8.1.6.4.1 Loop initiation
Quando uma instruo DO executada, a construo DO se torna ativa. Se o loop-control
[,]do-variable = scalar-int-expr 1,scalar-int-expr 2 [,scalar-int-expr 3]
os seguintes passos so realizados sequencialmente:
1. o parmetro inicial
m
1
, o parmetro terminal
m
2
e o parmetro incremental
m
3
so do tipo inteiro
com o mesmo parmetro de tipo subtipo (kind type parameter) que a do-variable. Seus valores so
estabelecidos pela clculo da scalar-int-expr 1, scalar-int-expr 2 e scalar-int-expr 3,
respectivamente incluindo, se necessrio, a converso de parmetro de tipo subtipo da do-variable de
acordo com as regras da converso numrica (tabela 7.9). Se scalar-int-expr 3 no aparece, m
3
tem o
valor 1. O valor de m
3
no pode ser zero
2. a varivel DO se trona definida com o valor do parmetro inicial
m
1
3. O contador de iterao (iteration count) estabelecido e tem o valor da expresso
(m
2
m
1
+m
3
)/ m
3
,
a menos que o este valor seja negativo, neste caso o contador de iterao zero
Nota 8.15
O contador de iterao zero quando:
m
1
>m
2
e m
3
>0 ou
m
1
m
2
e m
3
0
Se loop-control omitido, nenhum contador de iterao calculado. O efeito como se usasse um
contador de iterao positivo muito grande, impossvel de ser decrementado at zero, como estabelecido. Se loop-
control [,]WHILE(scalar-logical- expr), o efeito como se loop-control tivesse sido omitido e a
instruo mostrada a seguir inserida como a primeira instruo do do-block:
IF (.NOT. (scalar- logical-expr )) EXIT
Ao trmino da execuo da instruo DO a execuo recomea (execuo se repete execution cycle
begins).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 185
8.1.6.4.2 O Ciclo de Execuo
8.1.6.4.2 The execution cycle
O ciclo de execuo (execution cycle) de uma construo DO consiste nos seguintes passos realizados em
sequncia repetidamente at seu trmino:
1. o contador de iterao, se existir, testado. Se ele zero, o loop termina e a construo DO se torna
inativa. Se o loop-control [,]WHILE(scalar-logical-expr) a scalar-logical-expr avaliada. Se o
valor desta expresso falsa o loop termina e a construo DO se torna inativa. Se, como resultado, todas as
construes DO compartilhando a mesma do-term-shared-stmt so are inativas, a execuo de todos estes construtores
completado. Entretanto, se algumas das construes DO compartilhando a do-term-shared-stmt esto ativas, a execuo continua
com o passo (3) do ciclo de execuo da construo DO ativa cuja instruo DO foi recentemente executada
2. se o contador de iterao diferente de zero, o intervalo do loop executado
3. o contador de iterao, se existir, decrementado de uma unidade. A varivel DO, se existir,
incrementada
4. com o valor do parmetro incremental
m
3

Exceto para a incrementao da varivel DO que ocorre no passo 3, a varivel DO no pode ser redefinida
nem tornar-se indefinida enquanto a construo DO est ativa.
8.1.6.4.3 Instruo Pula
8.1.6.4.3 CYCLE statement
O passo 2 descrito no ciclo de repetio acima pode ser pulado (encurtado) pela execuo da instruo
CYCLE dentro do intervalo de execuo do loop.
R843 cycle-stmt is CYCLE [ do-construct-name ]
C828 (R843) Se a cycle-stmt refere-se a um do-construct-name, ela tem que estar dentro do intervalo do
do-construct; caso contrrio, ela tem que estar dentro do intervalo de pelo menos um dos do-construct
Uma instruo CYCLE pertence a uma construo DO em particular. Se a instruo CYCLE utilizado
numa construo DO nomeada (identificada por um nome), ela pertence quela construo DO, caso contrrio, ela
pertence construo DO mais interna na qual aparece.
Execuo de uma instruo CYCLE causa imediata progresso para o passo 3 no ciclo de execuo atual
da construo DO a qual pertence. Se esta construo uma construo DO no bloco (nonblock DO construct,), a do-term-action-
stmt ou do-term-shared-stmt no executada.
Em uma construo DO bloco (block DO construct) a transferncia de controle para uma end-do tem o
mesmo efeito da execuo de uma instruo CYCLE pertencente a esta construo. Numa construo DO no bloco
(nonblock DO construct) transferncia de controle da do-term-action-stmt ou do-term-shared-stmt faz com que esta instruo ou construo
ser executada. A menos que a transferncia de controle acontea, passo (3) do ciclo de execuo da construo DO corrente ento
executada.
8.1.6.4.4 Trmino da Iterao
8.1.6.4.4 Loop termination
A instruo EXIT prov um meio de terminar um loop.
R844 exit-stmt is EXIT[do-construct-name]
C829 (R844) Se uma exit-stmt refere-se a um do-construct-name, ela tem que estar dentro do intervalo
deste do-construct; caso contrrio, ela tem que estar dentro do intervalo de pelo menos um dos do-
construct
Uma instruo EXIT pertence a uma construo DO em particular. Se a instruo EXIT refere-se a uma
construo DO que tem nome, ela pertence a este construtor. Ela pertence a construo DO interna, na qual
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 186
aparece.
O loop termina e a construo DO se torna inativa, quando alguma das condies seguintes ocorrem:
1. quando o contador de iterao zero ou a scalar-logical-expr falsa, quando testada durante o passo 1
do ciclo de execuo
2. execuo da declarao EXIT pertencendo a uma construo DO
3. execuo da declarao EXIT ou a declarao CYCLE que est dentro do intervalo da construo DO, mas
que pertence a uma construo DO externa
4. transferncia do controle vindo de uma declarao dentro do intervalo da construo DO para uma
declarao que no uma end-do nem est dentro do intervalo da mesma construo DO
5. execuo da declarao RETURN dentro do intervalo da construo DO
6. execuo da declarao STOP em qualquer parte do programa ou trmino do programa por qual quer outra
razo
Quando uma construo DO se torna inativa, a varivel DO, se existir, da construo DO retm seu ltimo
valor definido.
8.1.6.5 Exemplos de Construes DO
8.1.6.5 Examples of DO constructs
Nota 8.16
O fragmento de programa que segue calcula o produto tensorial de duas matrizes:
DO I = 1, M
DO J = 1, N
C (I, J) = SUM (A (I, J, :) * B (:, I, J))
END DO
END DO
Nota 8.17
O fragmento de programa que segue contm uma construo DO que usa a forma WHILE do loop-control. O
loop continua a execuo at encontrar um end-of-file ou erro de entrada/sada, quando ento a instruo DO
termina o loop. Quando um valor negativo de X lido, o programa pula imediatamente para a prxima instruo
READ deixando de fazer a maior parte do loop
READ(IUN, (1X, G14.7), IOSTAT = IOS) X
DO WHILE(IOS == 0)
IF(X >= 0.) THEN
CALL SUBA(X)
CALL SUBB(X)
...
CALL SUBZ(X)
ENDIF
READ(IUN, (1X, G14.7), IOSTAT = IOS) X
END DO
Nota 8.18
O exemplo que segue comporta-se exatamente como o da nota 8.17. Entretanto, a instruo READ foi movida
para o interior do intervalo, ento somente uma instruo READ necessria. Tambm, uma instruo CYCLE foi
utilizada para evitar um nvel extra do IF aninhado
DO ! A "DO WHILE + 1/2" loop
READ(IUN, (1X, G14.7), IOSTAT = IOS) X
IF(IOS /= 0) EXIT
IF(X < 0.) CYCLE
CALL SUBA(X)
CALL SUBB(X)
. . .
CALL SUBZ(X)
END DO
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 187
Nota 8.19
Exemplos adicionais do construtor DO esto em C.5.3
8.2 Desvio
8.2 Branching
Uma ramificao (branching desvio ramificao) usada para altera a sequncia normal de execuo.
Um ramo (desvio branch) produz a transferncia de controle de uma instruo em uma unidade de escopo para
uma uma instruo rtulo (labeled branch target statement) na mesma unidade de escopo. Desvio (branching) pode ser
causada por uma instruo GOTO, uma instruo GOTO calculada, uma instruo IF aritmtica, uma instruo
CALL que tem uma alt-return-spec ou uma instruo entrada/sada que tem um especificador END= ou ERR= .
Ainda que referncias a procedimentos e construes de controle podem produzir transferncia de controle, eles
no so desvios. Uma instruo alvo de desvio (branch target statement) uma action-stmt, uma associate-
stmt, uma end-associate-stmt, uma if-then-stmt, uma end-if-stmt, uma select-case-stmt, uma end-
select-stmt, uma select-type-stmt, uma end-select-type-stmt, uma do-stmt, uma end-do-stmt, uma
forall-construct-stmt, uma do-term-action-stmt, uma do-term-shared-stmt ou uma where-construct-stmt.
8.2.1 Instruo GO TO
8.2.1 GO TO statement
R845 goto-stmt is GO TO label
C830 (R845) O rtulo tem que ser uma instruo rtulo de uma instruo alvo de desvio que aparece na mesma
unidade de escopo que a goto-stmt
Execuo de uma declarao GO TO produz uma transferncia de controle tal que a instruo alvo de
desvio identificada pelo rtulo executada como prxima instruo.
8.2.2 Instruo GO TO Calculada
8.2.2 Computed GO TO statement
R846 computed-goto-stmt is GO TO (label-list)[,]scalar-int-expr
C831 (R846) Cada rtulo em uma label-list tem que ser um instruo rtulo de uma instruo alvo de desvio que
aparece na mesma unidade de escopo que a computed-goto-stmt
Nota 8.20
O mesmo rtulo de instruo pode aparecer mais de uma vez em uma lista de rtulos
Execuo da instruo GO TO calculada produz a avaliao da expresso inteira escalar. Se este valor tal que 1 i n onde n o
nmero de rtulos na label-list, uma transferncia de controle ocorre tal que a prxima instruo executada aquela identificada pelo isimo
(ith) rtulo na lista de rtulos. Se i menor que 1 ou maior que n, a sequncia de execuo continua como se uma instruo CONTINUE
tivesse sido executada.
8.2.3 Instruo IF Aritmtica
8.2.3 Arithmetic IF statement
R847 arithmetic-if-stmt is IF(scalar-numeric-expr)label,label,label
C832 (R847) Cada rtulo tem que ser um rtulo de uma instruo alvo de desvio que aparace na mesma unidade de
escopo da arithmetic-if-stmt
C833 (R847) A scalar-numeric-expr no pode ser do tipo complexo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 188
Nota 8.21
O mesmo rtulo pode aparecer mais de uma vez em uma instruo IF aritmtica
A execuo de uma instruo IF aritmtica produz a avaliao da expresso numrica seguida pela transferncia de controle. A
instruo alvo de desvio identificada pelo primeiro rtulo ou o terceiro rtulo executada como prxima instruo dependendo doso valores
da expresso numrica ser menor que zero, igual a zero ou maior que zero, respectivamente.
8.3 Instruo Continua
8.3 CONTINUE statement
Execuo de uma instruo CONTINUE no tem efeito.
R848 continue-stmt is CONTINUE
8.4 Instruo Para
8.4 STOP statement
R849 stop-stmt is STOP[stop-code]
R850 stop-code is scalar-char-constant
or digit[digit[digit[digit[digit]]]]
C834 (R850) scalar-char-constant tem que ser do tipo caractere default
Execuo da instruo STOP causa o trmino normal (2.3.4) da execuo do programa. No momento de
parada, o cdigo stop, se existir, avaliado de uma maneira dependente do processador. Zeros anteriores no cdigo
de parada no so significativos Se qualquer exceo (14) sinalizada, o processador emite uma mensagem de
ateno indicando qual exceo est ocorrendo; esta mensagem de ateno tem que ser sobre a unidade identificada
pela constante com nome ERROR_UNIT existente no mdulo intrnseco ISO_FORTRAN_ENV (13.8.2.2).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 189
9. Instrues de Entrada/Sada
Section 9: Input/output statements
Instrues de entrada (input statements) prov os meios para transferir dados de um meio externo para a
memria (armazenamento interno) ou de um arquivo interno para a memria. Este processo chamado de leitura
(reading). Instrues de sada (output statements) prov os meios para transferir dados da memria (internal
storage) para o meio externo (external media) ou da memria para um arquivo interno (internal file). Este processo
chamado de escrita (writing). Algumas instrues de entrada/sada (input/output statements) especificam que edio
dos dados deve ser realizada.
Em adio s instrues que transferem dados, existem instrues auxiliares de entrada/sada para
manipular um meio externo ou para descrever ou inquiri sobre as propriedades da conexo com o meio externo.
As instrues de entrada/sada so as instrues OPEN, CLOSE, READ, WRITE, PRINT, BACKSPACE,
ENDFILE, REWIND, FLUSH, WAIT e INQUIRE.
A instruo READ uma instruo de entrada de transferncia de dados (data transfer input statement).
A instruo WRITE e a instruo PRINT so instrues de sada de transferncia de dados (data transfer output
statements). A instruo OPEN e a instruo CLOSE so instrues de conexo de arquivos (file connection
statements). A instruo INQUIRE uma instruo de inquisio de arquivo. As instrues BACKSPACE,
ENDFILE e REWIND so instrues de posicionamento do arquivo (file positioning statements).
Um arquivo composto por uma sequncia de unidades de armazenamento de arquivo (sequence of file
storage units) (9.2.4) ou uma sequncia de registros (sequence of records), que prov um nvel extra de organizao
para o arquivo. Um arquivo composto de registros (records) chamado de arquivo de registros (record file). Um
arquivo composto de unidades de armazenamento de arquivo (file storage units) chamado de arquivo de fluxos
(stream file). Um processador pode permitir que um arquivo seja visto como um arquivo de registro e como um
arquivo de fluxos; neste caso o relacionamento entre as unidades de armazenamento quando vistas como arquivo de
fluxos e os registros quando visto como arquivo de registro dependente do processador.
Um arquivo um arquivo externo (9.2) ou um arquivo interno (9.3).
9.1 Registros
9.1 Records
Um registro (record) uma sequncia de valores ou uma sequncia de caracteres. Por exemplo, uma linha
em um terminal usualmente considerada como um registro. Entretanto, um registro no necessariamente
corresponde a uma entidade fsica. H trs tipos de registros:
1. Formatado
2. No formatado
3. fim-de-arquivo (endfile)
Nota 9.1
O que chamado de registro (record) no Fortran usualmente chamado de registro lgico (logical record). No
existe o conceito de registro fsico (physical record) no Fortran
9.1.1 Registro Formatado
9.1.1 Formatted record
Um registro formatado (formatted record) consiste de uma sequncia de caracteres que tm representao
no processador, entretanto, o processador pode proibir alguns tipos de caracteres (3.1) de aparecerem em um
registro formatado. O comprimento de um registro formatado medido em caracteres e depende primariamente do
nmero de caracteres colocados no registro quando ele escrito. Entretanto, isto pode depender do processador e
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 190
do meio externo. O comprimento pode ser zero. Registros formatados podem ser lidos e escritos somente por
instrues de entrada/sada formatada.
Registros formatados podem ser preparados por outros meios diferentes do Fortran.
9.1.2 Registro No Formatado
9.1.2 Unformatted record
Um registro no formatado (unformatted record) consiste de uma sequncia de valores em uma forma
dependente do processador e pode conter dados de qualquer tipo ou pode no conter dados. O comprimento de um
registro no formatado medido em unidades de armazenamento de arquivo (9.2.4) e depende da lista de sada
(9.5.2) usada quando escrito, tanto quanto do processador e do meio externo. O comprimento pode ser zero.
Registro no formatados podem ser lidos e escritos somente por instrues no formatadas de entrada/sada.
9.1.3 Registro Fim-de-arquivo
9.1.3 Endfile record
Um registro fim-de-arquivo (endfile record EOF) explicitamente escrito por uma instruo ENDFILE.
O arquivo tem que estar conectado para acesso sequencial. Um registro fim-de-arquivo escrito implicitamente em
um arquivo conectado para acesso sequencial quando a mais recente instruo de transferncia de dado referindo o
arquivo uma instruo de transferncia de sada de dado, no houve a ocorrncia de instruo de posicionamento
de arquivo referente a este arquivo e
1. uma instruo REWIND ou BLACKSPACE referencia a unidade na qual o arquivo est conectado
2. a unidade fechada, por uma instruo explicita CLOSE, ou implicitamente pelo trmino do programa
no causada por uma condio de erro ou implicitamente por uma outra instruo OPEN para a mesma
unidade
Um registro fim-de-arquivo pode ocorrer somente como o ltimo registro de um arquivo. Um registro de
fim-de-arquivo no tem a propriedade comprimento.
Nota 9.2
Um registro de fim-de-arquivo no necessariamente possui alguma representao fsica. O processador pode usar
um contador de registro ou outro meio para registra a posio do arquivo no momento em que uma instruo
ENDFILE executada, e ento tomar as aes adequadas quando esta posio alcanada durante a operao de
leitura. O registro fim-de-arquivo (EOF), entretanto, quando implementado, considerado existir para a
instruo BACKSPACE (9.7.1)
9.2 Arquivos Externos
9.2 External files
Um arquivo externo (external file) qualquer arquivo que exista em um meio externo ao programa.
A qualquer momento, existe um conjunto de mtodos de acesso (access methods) permitidos que so
dependentes do processador, um conjunto de formas (forms) permitidas dependente do processador, um conjunto
de aes permitidas dependente do processador e um conjunto de comprimentos de registro (record lengths)
permitidos que so dependente do processador para um arquivo.
Nota 9.3
Poe exemplo, um conjunto de aes permitidas dependente do processador para a impressora poder incluir a ao
de escrever, mas no a ao de ler
Um arquivo pode ter um nome. Um arquivo que tem um nome chamado de arquivo com nome (named
file). O nome de um arquivo com nome representado por um valor string caractere ( por uma cadeia de caracteres).
O conjunto de nomes permitidos para um arquivo dependente do processador.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 191
Um arquivo externo que est conectado a uma unidade tem a propriedade posio (position) (9.2.3).
Nota 9.4
Para informaes sobre arquivos externos veja C.6.1
9.2.1 Existncia de Arquivo
9.2.1 File existence
Em um certo tempo, existe um conjunto dependente do processador de arquivos externos que so ditos
existir (exist) para um programa. Um arquivo pode ser conhecido pelo processador, ainda que no exista em um
tempo particular.
Nota 9.5
Razes de segurana podem impedir um arquivo de existir para um programa. Um arquivo recentemente criado
pode existir, mas no conter registros
Criar um arquivo significa fazer com que o arquivo exista, sendo que ele no existia antes. Apagar um
arquivo significa terminar com a existncia do arquivo.
Toda instruo de entrada/sada pode ser usada em arquivos que existem. As instrues INQUIRE, OPEN,
CLOSE, WRITE, PRINT, REWIND, FLUSH ou ENDFILE tambm podem ser usadas em um arquivo que no
existe. Execuo das instrues WRITE, PRINT ou ENDFILE usadas em uma arquivo pr-conectado que no
existe cria o arquivo.
9.2.2 Acesso ao Arquivo
9.2.2 File access
Existem trs mtodos para acessar os dados em um arquivo externo: sequencial, direto e stream (em fluxo ou
em uma sequncia de unidades de armazenamento). Alguns arquivos podem ter mais de um mtodo de acesso
permitido, outros arquivos podem restringir o acesso a um nico mtodo de acesso.
Nota 9.6
Por exemplo, o processador pode permitir somente acesso sequencial a um arquivo de fita magntica. Ento, o
conjunto de mtodos de acesso permitido depende do arquivo e do processador
O mtodo de acesso do arquivo determinado quando o arquivo conectado a uma unidade (9.4.3) ou
quando o arquivo criado se o arquivo pr-conectado (9.4.4).
9.2.2.1 Acesso Sequencial
9.2.2.1 Sequential access
Acesso sequencial (sequential access) um mtodo de acesso de registro para um arquivo externo em
ordem, isto , um depois do outro.
Quando conectado para acesso sequencial, um arquivo externo tem as seguintes propriedades:
1. a ordem dos registros a ordem na qual eles foram escritos se o mtodo de acesso direto no um membro
do conjunto de mtodos permitidos para o arquivo. Se o mtodo de acesso direto tambm um membro do
conjunto de acesso permitido para o arquivo, a ordem dos registros a mesma daquela que foi especificada
para o acesso direto. Neste caso, o primeiro registro acessvel pelo acesso sequencial o registro cujo
nmero de registro 1 para acesso direto. O segundo registro acessvel para acesso sequencial o registro
cujo nmero de registro 2 no acesso direto, etc. Um registro que no foi escrito desde que o arquivo foi
criado no pode ser lido
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 192
2. os registros de um arquivo so todos formatados ou todos no formatados, exceto que o ltimo registro do
arquivo pode ser um registro fim-de-arquivo. A menos que uma referencia prvia do arquivo tenha sido
uma declarao de transferncia de sada, o ltimo registro, se existir, do arquivo o registro fim-de-
arquivo
3. os registros do arquivo podem ser lidos ou escritos somente por instrues de acesso sequencial de
entrada/sada
9.2.2.2 Acesso Direto
9.2.2.2 Direct access
Acesso direto (direct access) o mtodo de acesso de registros de um arquivo externo em ordem arbitrria.
Quando conectado para acesso direto, um arquivo externo tem as seguintes propriedades:
1. cada registro do arquivo unicamente identificado por um inteiro positivo chamado de nmero de
registro (record number). O nmero de registro de um registro especificado quando o registro escrito.
Uma vez estabelecido, o nmero de registro de um registro nunca pode ser mudado. A ordem dos registros
a ordem de seus nmeros de registros
Nota 9.7
Um registro no pode ser apagado; entretanto, um registro pode ser reescrito
2. os registros de um arquivo so todos formatados ou todos no formatados. Se o mtodo de acesso
sequencial tambm um membro do conjunto de acesso permitido para o arquivo, seu registro fim-de-
arquivo, se existir, no considerado ser parte do arquivo enquanto ele est conectado para acesso direto.
Se o mtodo de acesso sequencial no um membro do conjunto de acesso permitido para o arquivo, o
arquivo no contm um registro fim-de-arquivo
3. os registros de um arquivo tm que ser lidos ou escritos somente por instrues de entrada/sada de acesso
direto
4. todos os registros do arquivo tem o mesmo tamanho
5. registros no necessitam ser lidos ou escritos na ordem de seus nmeros de registro. Qualquer registro pode
ser escrito em um arquivo enquanto ele est conectado a uma unidade. Por exemplo, permitido escrever o
registro 3, mesmo que o registro 1 e 2 ainda no tenham sido escritos. Qualquer registro pode ser lido no
arquivo enquanto ele est conectado a uma unidade, garantido que o registro foi escrito desde quando o
arquivo foi criado e se a instruo READ para esta conexo for permitida
6. os registros de um arquivo no podem ser lidos ou escritos usando-se formatao lista dirigida (list-
directed formatting) (10.9), formatao lista de nomes (namelist formatting) (10.10) ou a instruo
entrada/sada sem avano (nonadvancing input/output statement) (9.2.3.1)
9.2.2.3 Acesso de Fluxo
9.2.2.3 Stream access
Acesso em fluxo (stream access) um mtodo de acesso as unidades de armazenamento de arquivo (9.2.4)
para um arquivo de fluxos externo (external stream file).
Stream fluxo em fluxo
Em computao, stream tem vrios significados, mas em todos os casos refere-se a dados
tornados disponveis com o tempo, geralmente de forma sequencial.
(em nosso caso) stream pode ser pensado como uma corrente de unidades de armazenamento que
podem ser identificadas por um nmero inteiro positivo e acessadas individualmente, uma depois
da outra, da o termo em fluxo:
stream em fluxo em sequncia em uma corrente numa cadeia de unidades
A grande vantagem do em fluxo (stream) ficar independente do tamanho usado na unidade de
armazenamento usado pelo sistema operacional e/ou dispositivo que guarda os dados (valores). O
padro recomenda que a unidade de armazenamento utilizada seja um octeto (8 bits 1 byte). A
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 193
maioria dos compiladores segue esta recomendao
As propriedades de um arquivo externo conectado para acesso em fluxo (stream access) depende da
conexo ser para acesso formatado ou no formatado.
Quando conectado para acesso em fluxo no formatado (unformatted stream access), um arquivo externo tem
as seguintes propriedades:
1. as unidades de armazenamento de arquivo (file storage units) de um arquivo tem que ser lidas ou escritas
somente por instrues de entrada/sada de acesso em fluxo (stream access input/output statements)
2. cada unidade de armazenamento de arquivo em um arquivo identificada de forma nica por um inteiro
positivo chamado posio. A primeira unidade de armazenamento de arquivo no arquivo est na posio 1.
A posio de cada unidade de armazenamento de arquivo subsequente tem um valor maior em uma unidade
que o valor da unidade de armazenamento de arquivo precedente
3. se for possvel posicionar o arquivo, as unidades de armazenamento de arquivo no necessitam ser lidas ou
escritas na ordem de suas posies. Por exemplo, possvel escrever a unidade de armazenamento de
arquivo na posio 3, mesmo que as unidades de armazenamento de arquivo nas posies 1 e 2 no tenham
sido escritas. Qualquer unidade de armazenamento de arquivo pode ser lida de um arquivo que est
conectado a uma unidade, garantido que a unidade de armazenamento de arquivo foi escrita desde quando
o arquivo foi criado e a instruo READ para esta conexo permitida
Quando conectado para acesso em fluxo formatado (formatted stream access), um arquivo externo tem as
seguintes propriedades:
1. algumas unidades de armazenamento de arquivo podem conter marcas de registro (record markers); isto
impe uma estrutura de registro no arquivo em adio sua estrutura em fluxo (stream structure). Pode
existir ou pode no existir uma marca de registro (record marker) no fim do arquivo. Se no existe uma
marca de registro no fim do arquivo, o registro final est incompleto
2. nenhum comprimento mximo (9.4.5.12) aplicado a estes registros
3. escrever um registro vazio sem marca de registro no tem efeito
Nota 9.8
Porque a estrutura do registro determinada pelas marcas de registro (record markers) que so guardas no arquivo,
um registro incompleto no fim do arquivo necessariamente no vazio
4. as unidades de armazenamento de arquivo de um arquivo tm que ser lidas ou escritas somente por
instrues de entrada/sada de acesso em fluxo formatada
5. cada unidade de armazenamento de arquivo no arquivo unicamente identificada por um inteiro positivo
chamado de posio. A primeira unidade de armazenamento de arquivo no arquivo est na posio 1. O
relacionamento das posies de sucessivas unidade de armazenamento de arquivo dependente do
processador; nem todos os inteiros positivos necessitam corresponder a posies vlidas
6. se possvel posicionar o arquivo, a posio no arquivo pode ser colocada em uma posio que foi
previamente identificada pelo especificador POS= em uma instruo INQUIRE
Nota 9.9
Pode existir algumas posies caractere no arquivo que no correspondem a caracteres escritos; isto acontece
porque alguns processadores podem escreve uma marca de registro como um carriage-return/line-feed ou
outra sequncia. O mecanismo para determinar a posio em um arquivo conectado para acesso em fluxo ( stream
access) via o especificador POS= em uma instruo INQUIRE (9.9.1.21)
7. Um processador pode proibir que alguns caracteres de controle (3.1) apaream em um arquivo fluxo
formatado
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 194
9.2.3 Posio no Arquivo
9.2.3 File position
Execuo de certas instrues de entrada/sada afeta a posio em um arquivo externo. Certas
circunstncias podem fazer a posio dentro do arquivo se tornar indeterminada.
O ponto inicial (initial point) de um arquivo a posio colocada justamente antes do primeiro registro. O
ponto terminal (terminal point) a posio justamente depois do ltimo registro ou unidade de armazenamento de
arquivo. Se no h registros ou unidades de armazenamento de arquivo no arquivo, o ponto inicial e o ponto final
so a mesma posio.
Se um arquivo de registro posicionado dentro de um registro, este registro o registro atual (ou registro
corrente current record); caso contrrio, no h registro atual.
Seja n o nmero de registros em um arquivo. Se 1i <n e o arquivo posicionado dentro do registro
isimo (ith) registro ou entre o registro (i1) e o (i ) , o registro (i1) o registro precedente (preceding
record). Se n1 e o arquivo posicionado no seu ponto terminal, o registro precedente o ensimo e ltimo
registro. Se n=0 ou se o arquivo posicionado no seu registro inicial ou dentro do primeiro registro, no h
registro precedente.
Se 1<i n e o arquivo posicionado dentro do isimo (ith) registro ou entre os registros (i ) e
(i+1) , o registro (i+1) o prximo registro (next record). Se n1 e o arquivo posicionado no seu
ponto inicial, o primeiro registro o prximo registro. Se n=0 ou se o arquivo posicionado no seu ponto
terminal ou dentro do ensimo (ltimo) registro, no h prximo registro.
Para um arquivo conectado para acesso em fluxo (stream access), a posio do arquivo entre duas
unidades de armazenamento de arquivo (file storage units), no ponto inicial do arquivo, no ponto final do arquivo ou
indefinido.
9.2.3.1 Entrada/Sada Avana e No Avana
9.2.3.1 Advancing and nonadvancing input/output
Uma instruo de entrada/sada com avano (advancing input/output statement) sempre posiciona o
arquivo de registro depois do ltimo registro lido ou escrito, a menos que uma condio de erro acontea.
Uma instruo de entrada/sada sem avano (nonadvancing input/output statement) pode posicionar o
arquivo de registro dentro do registro atual ou do registro subsequente (10.7.2). Usando uma instruo de
entrada/sada sem avano possvel ler ou escrever um registro de um arquivo por uma sequncia de instrues de
entrada/sada, cada uma acessando uma poro do registro. tambm possvel ler um registro de comprimento
varivel e ser notificado de seus tamanhos. Se uma instruo de sada sem avano deixa um arquivo posicionado
dentro do registro atual e nenhuma outra instruo de sada executada para o arquivo antes dele ser fechado ou a
instruo BACKSPACE, ENDFILE ou REWIND executada para ele, o efeito como se a instruo de sada
fosse uma instruo de sada com avano.
9.2.3.2 Posio do Arquivo antes da Transferncia de Dados
9.2.3.2 File position prior to data transfer
A posio dentro do arquivo antes de uma transferncia de dado depende do mtodo de acesso: sequencial,
direto ou em fluxo (stream).
Para o acesso sequencial na entrada, se existe um registro atual, a posio do arquivo no mudada. Caso
contrrio, o arquivo posicionado no incio do prximo registro e este registro se torna o registro atual. Entrada
no pode ocorrer se no h prximo registro ou se o registro atual e o ltima instruo de transferncia acessando
acessando o arquivo realizou uma sada.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 195
Se o arquivo contm um registro fim-de-arquivo, o arquivo no pode ser posicionado depois do registro
fim-de-arquivo antes da transferncia de dados. Entretanto, uma instruo REWIND ou BACKSPACE pode ser
usada para reposicionar o arquivo.
Para acesso sequencial na sada, se existe um registro atual, a posio do arquivo no mudada e o registro
atual se torna o ltimo registro do arquivo. Caso contrrio, um novo registro criado como prximo registro do
arquivo. Este novo registro se torna o ltimo registro e o registro atual do arquivo e o arquivo posicionado no
incio deste registro.
Para acesso direto, o arquivo posicionado no incio do registro especificado pelo especificador REC=.
Este registro se torna o registro atual.
Para acesso em fluxo (stream access), o arquivo posicionado imediatamente antes da unidade de
armazenamento de arquivo especificada pelo especificador POS=. No existindo o especificador POS=, a posio
do arquivo no mudada.
Posicionamento do arquivo para instrues de transferncia de dados filha (filha derivada: instrues de
transferncia de dados derivada child data transfer statements) descrito em 9.5.3.7.
9.2.3.3 Posio do Arquivo depois da Transferncia de Dados
9.2.3.3 File position after data transfer
Se uma condio de erro (9.10) ocorreu, a posio do arquivo indeterminada. Se no ocorreu uma
condio de erro, mas uma condio de fim-de-arquivo (end-of-file condition) (9.10) ocorre como resultado da leitura
de um registro de fim-de-arquivo, o arquivo posicionado depois do registro fim-de-arquivo.
Para acesso em fluxo no formatado (unformatted stream access), se no ocorreu uma condio de erro, a
posio do arquivo no mudada. Para sada em fluxo no formatada, se a posio do arquivo excede o ponto
terminal de arquivo precedente, o ponto terminal ajustado para a posio do arquivo.
Nota 9.10
Uma instruo de sada em fluxo no formatado (unformatted stream output statement) com o especificador POS= e
uma lista de sada vazia pode ter o efeito de estender o ponto terminal de um arquivo sem atualizar qualquer dado
escrito
Para uma instruo de sada em fluxo formatado, se no ocorreu uma condio de erro, a posio do
arquivo do ponto terminal ajustado para a posio de maior nmero para a qual dados foram transferidos pela
instruo.
Nota 9.11
A posio de maior nmero (highest-numbered position) pode no ser a posio atual se a sada envolve os
descritores de edio T ou TL (10.7.1.1)
Para uma instruo de entrada em fluxo formatada, se a condio fim-de-arquivo ocorreu, a posio do
arquivo no mudada.
Para entrada sem avano, se no h condio de erro ou uma condio fim-de-arquivo ( end-of-file condition)
ocorreu, mas uma condio fim-de-registro ocorreu (9.10), o arquivo posicionado depois do registro que est
sendo lido. Se condio de erro, condio fim-de-arquivo ou condio fim-de-registro no ocorreram em uma
instruo de entrada sem avano, a posio do arquivo no mudada. Se uma condio de erro no ocorreu em
uma instruo de sada sem avano, a posio do arquivo no mudada.
Em todos os outros casos, o arquivo posicionado depois do registro que est sendo lido ou escrito e este
registro se torna o registro precedente.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 196
9.2.4 Unidades de Armazenamento de Arquivo
9.2.4 File storage units
Uma unidade de armazenamento de arquivo (file storage unit) a unidade bsica de armazenamento de
um arquivo de fluxos (stream file) ou de um arquivo de registro no formatado. Ela a unidade de posio de
arquivo para acesso em fluxo (stream access), a unidade de comprimento de registro para arquivos no formatados e
a unidade de tamanho de arquivo para todos os arquivos externos.
Cada valor em um arquivo de fluxos (stream file) ou um arquivo de registro no formatado tem que ocupar
um nmero inteiro de unidade de armazenamento de arquivo. Se o arquivo de fluxos ou registro no formatado,
este nmero tem que ser o mesmo para todos os valores escalares do mesmo tipo e parmetros de tipo. O nmero
de unidades de armazenamento de arquivo requerido para um item de um dado tipo e parmetro de tipo pode ser
determinado.

O nmero de unidades de armazenamento de arquivo requerida para um item de um dado tipo e parmetros
pode ser determinado usando o especificador IOLENGTH= na instruo INQUIRE (9.9.3).
Para um arquivo conectado para acesso em fluxo no formatado, o processador no pode criar restries de
alinhamento (alignment requirements) que impeam o valor de qualquer tipo de ser guardado em qualquer posio
inteira do arquivo.
O nmero de bits em uma unidade de armazenamento de arquivo dado pela constante
FILE_STORAGE_SIZE (13.8.2.3) definida no mdulo intrnseco ISO_FORTRAN_ENV. recomendado que a
unidade de armazenamento de arquivo seja um octeto (8-bits 1 byte) onde esta escolha for conveniente.
Nota 9.12
O requerimento que cada valor de dado ocupe um nmero inteiro de unidade de armazenamento de arquivo
implica que itens de dados menores que a unidade de armazenamento de arquivo requerem preenchimento. Isto
sugere que a unidade de armazenamento de arquivo seja pequena para evitar desperdcio de espao. Idealmente, a
unidade de armazenamento de arquivo deve ser escolhida de tal forma que preenchimento nunca seja requerido.
Uma unidade de armazenamento de arquivo de um bit sempre preenche este requerimento, mas pode ser
impraticvel por causa de restries de alinhamento (alignment requirements)
A proibio de restries no alinhamento (alignment restrictions) probe que o processador requeira alinhamentos de
dados maiores que a unidade de armazenamento de arquivo
Um octeto (8-bit 1 byte) recomendado como um bom compromisso que pequeno o suficiente para acomodar
os requerimentos de muitas aplicaes, ainda que no to pequeno que os requerimentos de alinhamento de dados
(data alignment requirements) sejam tais que produzam problemas significativos na performance
9.3 Arquivos Interno
9.3 Internal files
Arquivos interno proveem um meio de transferncia e converter dados de um armazenamento interno para
um armazenamento interno.
Um arquivo interno um arquivo de registro com as seguintes propriedades:
1. o arquivo uma varivel do tipo caractere default, ASCII ou ISO 10646 que no uma seo de matriz
com um subscrito vetor
2. um registro de um arquivo interno uma varivel caractere escalar
3. se o arquivo uma varivel caractere escalar, ele consiste de um nico registro cujo comprimento o
mesmo que o comprimento da varivel caractere escalar. Se o arquivo uma matriz caractere, ele tratado
como uma sequncia de elementos de matriz caractere. Cada elemento de matriz, se existir, um registro
do arquivo. A ordem dos registros no arquivo a mesma ordem dos elementos na matriz (6.2.2.2) ou da
seo de matriz 6.2.2.3). Cada registro do arquivo tem o mesmo comprimento, que o comprimento de um
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 197
elemento de matriz na matriz
4. um registro interno de um arquivo interno se torna definido escrevendo-se o registro. Se o nmero de
caracteres escrito em um registro menor que o comprimento do registro, a poro restante do registro
preenchido com brancos. O nmero de caractere a ser escrito no pode exceder o comprimento do registro
5. o registro s pode ser lido se o registro est definido
6. um registro de um arquivo interno pode se torna definido (ou indefinido) por outros meio que uma
instruo de sada. Por exemplo, a varivel caractere pode se tornar definida por uma instruo de
atribuio caractere
7. um arquivo interno sempre posicionado no incio do primeiro registro antes da transferncia de dados,
exceto para a instruo de transferncia de dado filha (child data transfer statemen) (9.5.3.7). Este registro se
torna o registro atual
8. o valor inicial de um modo de conexo (connection mode) (9.4.1) o valor que pode ser obtido por uma
instruo OPEN sem a palavra-chave correspondente
9. ler e escrever registros tem que ser acompanhado somente por instrues de entrada/sada de acesso
sequencial formatado
10. um arquivo interno no pode ser especificado como a unidade em uma instruo de conexo de arquivo,
instruo de posicionamento de arquivo ou instruo de inquisio de arquivo
9.4 Conexo de Arquivo
9.4 File connection
Uma unidade, especificada por uma io-unit, prove um mecanismo para referenciar um arquivo.
R901 io-unit is file-unit-number
or *
or internal-file-variable
R902 file-unit-number is scalar-int-expr
R903 internal-file-variable is char-variable
C901 (R903) A char-variable no pode ser uma seo de matriz com um subscrito vetor
C902 (R903) A char-variable tem que ser um tipo caractere default, caractere ASCII ou caractere ISO
10646
Uma unidade uma unidade externa ou uma unidade interna. Uma unidade externa (external unit) usada
para fazer meno um arquivo interno e especificada por um asterisco ou um file-unit-number cujo valor
no negativo ou igual a uma das constantes com nome INPUT_UNIT, OUTPUT_UNIT ou ERROR_UNIT do
mdulo intrnseco ISO_FORTRAN_ENV (13.8.2). Uma unidade interna (internal unit) usada para fazer meno
um arquivo interno e especificado por uma internal-file-variable ou um file-unit-number cujo valor
igual unidade do argumento de um procedimento entrada/sada tipo derivado ativo (9.5.3.7). O valor de um
nmero file-unit-number tem que identificar uma unidade vlida.
A unidade externa identificada por um valor particular de um scalar-int-expr a mesma unidade externa
em todas as unidades de programa.
Nota 9.13
No exemplo:
SUBROUTINE A
READ (6) X
...
SUBROUTINE B
N = 6
REWIND N
o valor 6 usado nos dois programas identifica a mesma unidade externa
Um asterisco identifica unidades externas particulares dependente do processador que so pr-conectadas
para acesso sequencial formatado (9.5.3.2). Estas unidades so tambm identificadas por nmeros de unidade
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 198
definido por constantes com nome INPUT_UNIT e OUTPUT_UNIT do mdulo ISO_FORTRAN_ENV (13.8.2).
Este padro identifica uma unidade externa dependente do processador para o propsito de emitir
mensagem de erro. Esta unidade tem que ser pr-conectada para sada sequencial formatada. O processador pode
definir a unidade como sendo a mesma unidade de sada identificada por um asterisco. Esta unidade tambm
identificada por um nmero de unidade definido pela constante com nome ERROR_UNIT do mdulo intrnseco
ISO_FORTRAN_ENV.
9.4.1 Modos de Conexo
9.4.1 Connection modes
A conexo para entrada/sada formatada tem vrios modos mutveis: modo interpretao branco ( blank
interpretation mode) (10.7.6), modo delimitado (delimiter mode) (10.9.2, 10.10.2.1), modo sinalizado (sign mode)
(10.7.4), modo de edio decimal (decimal edit mode) (10.7.8), modo E/S arredondado (I/O rounding mode)
(10.6.1.2.6), modo preenchimento (pad mode) (9.5.3.4.2) e modo fator de escala (scale factor) (10.7.5). Uma conexo
para entrada/sada no formatada no tem modos mutveis.
Valores para os modos de uma conexo so estabelecidos quando a conexo iniciada. Se a conexo
iniciada com uma instruo OPEN, os valores so especificados, explicitamente ou implicitamente, pela instruo
OPEN. Se a conexo no iniciada por uma instruo OPEN (ou seja, se o arquivo um arquivo interno ou
arquivo pr-conectado) os valores estabelecidos so aqueles que so impostos por uma instruo OPEN sem as
correspondentes palavras-chaves.
O fator de escala no pode se especificado explicitamente em uma instruo OPEN; ele implicitamente 0.
Os modos de uma conexo a um arquivo externo pode ser mudado por uma instruo OPEN subsequente
que modifique a conexo.
Os modos de uma conexo podem ser temporariamente modificados por um uma palavra-chave
especificadora correspondente em uma instruo de transferncia ou por um descritor de edio. Palavras-chaves
especificadoras tomam efeito no incio da execuo da instruo de transferncia de dado. Descritores de formato
tomam efeito quando eles so encontrados no processamento do formato. Quando a instruo de transferncia de
dado termina, os valores para os modos so reajustados para os valores em efeito imediatamente antes da instruo
de transferncia de dado que foi executada.
9.4.2 Existncia da Unidade
9.4.2 Unit existence
Em qualquer tempo, existe um conjunto de unidades externas, dependente do processador, que so ditas
existir para um programa.
Todas as instrues de entrada/sada podem usar unidades que existem. A instruo CLOSE, INQUIRE e
WAIT tambm podem usar unidades que no existem.
9.4.3 Conexo de um Arquivo uma Unidade
9.4.3 Connection of a file to a unit
Uma unidade externa tem a propriedade de estar conectada (connected) ou no conectada. Se conectada,
ela refere-se a um arquivo externo. Uma unidade externa pode se tornar conectada por pr-conexo ou pela
execuo da instruo OPEN. A propriedade de conexo simtrica; se a unidade est conectada a um arquivo se e
somente se o arquivo est conectado unidade.
Toda instruo de entrada/sada exceto as instrues OPEN, CLOSE, INQUIRE ou WAIT tem referir uma
unidade que est conectada a um arquivo e portanto utilizar ou afetar este arquivo.
Um arquivo pode estar conectado e no existir(9.2.1).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 199
Nota 9.14
Um exemplo um arquivo externo pr-conectado que ainda no foi escrito
Uma unidade no pode ser conectada a mais de um arquivo ao mesmo tempo e o arquivo no pode estar
conectado a mais de uma unidade ao mesmo tempo. Entretanto, existem meios de se mudar o estado de uma
unidade externa e conectar uma unidade a um arquivo diferente.
Este padro define meios de interoperao porttil (portable interoperation) com o C. Fluxos em C (C streams)
so descritos em 7.19.2 do padro C. Se a unidade pode ser conectada a um arquivo que tambm conectado em
fluxo C (C stream) dependente do processador. Se o processador permite uma unidade ser conectada a um arquivo
que tambm est conectado em fluxo C (C stream), os resultados de operaes de entrada/sada neste arquivo
dependente do processador. dependente do processador se os arquivos conectados s unidades INPUT_UNIT,
OUTPUT_UNIT e ERROR_UNIT correspondente a uma entrada em fluxo padro de texto em C prdefinido ( C
text streams standard input), sada padro e erro padro. Se um procedimento definido por meio do Fortran e um
procedimento definido por outros meios que no o Fortran realizam operaes de entrada/sada no mesmo arquivo
externo, os resultados so dependente do processador. Um procedimento por meio do Fortran e um procedimento
definido por outros meios que no o Fortran pode realizar operaes de entrada/sada em diferentes arquivos
externos sem interferncia.
Depois de um arquivo externo ter sido desconectado pela execuo da instruo CLOSE, ela pode ser
conectado de novo dentro do mesmo programa ao mesmo arquivo ou a um arquivo diferente. Depois de um arquivo
externo ter sido desconectado pela execuo de uma instruo CLOSE, ele pode ser conectado de novo dentro
mesma unidade ou a uma unidade diferente.
Nota 9.15
O nico meio de referenciar um arquivo que foi desconectado pela utilizao de seu nome em uma instruo
OPEN ou INQUIRE. No existe meios de se reconectar um arquivo sem nome uma vez que ele foi desconectado
Uma unidade interna est sempre conectada a um arquivo interno designado pela varivel que identifica a
unidade.
Nota 9.16
Para mais explicaes sobre propriedades de conexo de arquivos ver C.6.5
9.4.4 Pr-conexo
9.4.4 Preconnection
Pr-conexo (preconnection) significa que uma unidade est conectada a um arquivo no incio da execuo
do programa e portanto pode ser utilizado em instrues de entrada/sada sem a execuo anterior da instruo
OPEN.
9.4.5 A instruo OPEN
9.4.5 The OPEN statement
Uma instruo OPEN (OPEN statement) inicia ou modifica a conexo entre um arquivo externo e uma
unidade especificada. A instruo OPEN pode ser utilizada para conectar um arquivo existente a uma unidade, criar
um arquivo que est pr-conectado, criar um arquivo e conect-lo uma unidade ou mudar certos modos de
conexo o arquivo e a unidade.
Uma unidade externa pode ser conectada por uma instruo OPEN em qualquer unidade de programa e,
uma vez conectada, a referncia a ela pode aparecer em qualquer unidade de programa do programa.
Se a unidade est conectada a um arquivo que existe, execuo da instruo OPEN para esta unidade
permitida. Se o especificador FILE= no includo nesta instruo OPEN, o arquivo que est sendo conectado
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 200
unidade o mesmo que o arquivo para o qual a unidade j est conectada.
Se o arquivo a ser conectado unidade no existe, mas o mesmo arquivo para o qual a unidade pr-
conectada, os modos especificados por uma instruo OPEN se tornam a parte da conexo.
Se o arquivo a ser conectado unidade no o mesmo arquivo para o qual a unidade est conectada, o
efeito como se a instruo CLOSE sem o especificador STATUS= tivesse sido executada para a unidade
imediatamente antes da execuo da instruo OPEN.
Se o arquivo que est sendo conectado unidade o mesmo que o arquivo para o qual a unidade est
conectado, somente os especificadores para mudar modos (9.4.1) podem ter valores diferentes daqueles
correntemente em efeito. Se o especificador POSITION= aparece nesta instruo OPEN, o valor especificado no
pode discordar com a posio atual do arquivo. Se o especificador STATUS= includo nesta instruo OPEN, ele
tem que ser especificado com o valor OLD. Execuo desta instruo OPEN faz com que qualquer novo valor dos
especificadores para mudar modos se tornem ativos, mas no causa qualquer mudana nos especificadores no
especificados e a posio do arquivo fica inalterada. Os especificadores ERR=, IOSTAT= e IOMSG= de qualquer
instruo OPEN previamente executada no tem efeito em qualquer instruo OPEN sendo executada.
O especificador STATUS= com o valor OLD sempre permitido quando o arquivo a ser conectado a
mesma unidade o mesmo que o arquivo para a qual a unidade est conectada. Neste caso, se o status do arquivo
era SCRATCH antes da execuo da instruo OPEN, o arquivo ainda ser apagado quando a unidade for fechada e
o arquivo ainda considerado como tendo o estado SCRATCH. Se o arquivo j est conectado a uma unidade, a
execuo da instruo OPEN sobre este arquivo e uma unidade diferente no permitida.
R904 open-stmt is OPEN(connect-spec-list)
R905 connect-spec is [UNIT=]file-unit-number
or ACCESS=scalar-default-char-expr
or ACTION=scalar-default-char-expr
or ASYNCHRONOUS=scalar-default-char-expr
or BLANK=scalar-default-char-expr
or DECIMAL=scalar-default-char-expr
or DELIM=scalar-default-char-expr
or ENCODING=scalar-default-char-expr
or ERR=label
or FILE=file-name-expr
or FORM=scalar-default-char-expr
or IOMSG=iomsg-variable
or IOSTAT=scalar-int-variable
or PAD=scalar-default-char-expr
or POSITION=scalar-default-char-expr
or RECL=scalar-int-expr
or ROUND=scalar-default-char-expr
or SIGN=scalar-default-char-expr
or STATUS=scalar-default-char-expr
R906 file-name-expr is scalar-default-char-expr
R907 iomsg-variable is scalar-default-char-variable
C903 (R905) Nenhum especificador pode aparecer mais de uma vez em uma dada connect-spec-list
C904 (R905) Um file-unit-number tem que ser especificado; se os caracteres opcionais UNIT= so
omitidos, o file-unit-number tem que ser o primeiro item da connect-spec-list
C905 (R905) O rtulo no especificador ERR= tem que se um rtulo de instruo de um uma instruo alvo de
desvio que aparece na mesma unidade de escopo que a instruo OPEN
Se o especificador STATUS= tem o valor NEW ou REPLACE, o especificador FILE= tem que ser usado.
Se o especificador STATUS= tem o valor SCRATCH, o especificador FILE= no pode ser usado. Se o
especificador STATUS= tem o valor OLD, o especificador FILE= tem que ser usado a menos que a unidade esteja
conectada e o arquivo conectado unidade exista.
Um especificador que requeira uma scalar-default-char-expr pode ter uma lista limitada de valores
caractere. Estes valores so listados para cada um destes especificadores. Quaisquer brancos posteriores so
ignorados. O valor especificado no leva em conta diferena entre letras maisculas e letras minsculas. Alguns
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 201
especificadores tm um valor default se o especificador omitido.
Os especificadores IOSTAT=, ERR= e IOMSG= so descritos em 9.10.
Nota 9.17
Um exemplo de uma instruo OPEN :
OPEN (10, FILE = employee.names, ACTION = READ, PAD = YES)
Nota 9.18
Para mais explicaes sobre instruo OPEN ver C.6.4
9.4.5.1 Especificador ACCESS= na Instruo OPEN
9.4.5.1 ACCESS= specifier in the OPEN statement
A scalar-default-char-expr avaliada como SEQUENTIAL, DIRECT ou STREAM. O especificador
ACCESS= especifica o mtodo de acesso para a conexo do arquivo como sendo sequencial, direto ou em fluxo
(stream). Se este especificador omitido, o valor default SEQUENTIAL. Para um arquivo existente, o mtodo de
acesso especificado tem que estar includo no conjunto de mtodos de acesso permitidos para o arquivo. Para um
arquivo novo, o processador cria o arquivo com o conjunto de mtodos de acesso permitidos que inclu o mtodo
especificado.
9.4.5.2 Especificador ACTION= na Instruo OPEN
9.4.5.2 ACTION= specifier in the OPEN statement
A scalar-default-char-expr avaliada como READ, WRITE ou READWRITE. READ especifica que
as instrues WRITE, PRINT e ENDFILE no podem ser usadas com esta conexo. WRITE especifica que a
instruo READ no podem ser usada com esta conexo. READWRITE permite o uso de qualquer instruo
entrada/sada nesta conexo. Se este especificador omitido, o valor default dependente do processador. Se
READWRITE includo no conjunto de aes permitidas para o arquivo, READ e WRITE tambm devem estar
includos no conjunto de aes permitidas para este arquivo. Para um arquivo existente, a ao especificada tem
que estar includa no conjunto de aes permitidas que inclu o especificador de a ao. Para um arquivo novo, o
processador cria o arquivo com o conjunto de aes permitidas que inclu as aes especificadas
9.4.5.3 Especificador ASYNCHRONOUS= na Instruo OPEN
9.4.5.3 ASYNCHRONOUS= specifier in the OPEN statement
A scalar-default-char-expr avaliada como YES ou NO. Se YES especificada, entrada/sada
assncrona na unidade permitida. Se o especificador NO especificado, entrada/sada assncrona na unidade no
permitida. Se o especificador omitido, o valor default NO.
9.4.5.4 Especificador BLANK= na Instruo OPEN
9.4.5.4 BLANK= specifier in the OPEN statement
A scalar-default-char-expr avaliada como NULL ou ZERO. O especificador BLANK= permitido
somente se para a conexo entrada/sada formatada. Ele especifica o valor atual do modo interpretao branco
(blank interpretation mode) (10.7.6, 9.5.1.5) para entrada nesta conexo. Este modo no tem efeito na sada. Se o
modo mutvel (changeable mode) (9.4.1). Se este especificador omitido em uma instruo OPEN isto inicia a
conexo, o valor default NULL.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 202
9.4.5.5 Especificador DECIMAL= na Instruo OPEN
9.4.5.5 DECIMAL= specifier in the OPEN statement
A scalar-default-char-expr avaliada como COMMA ou POINT. O especificador DECIMAL=
permitido somente para a conexo de entrada/sada formatada. Ele especifica o valor atual do modo edio decimal
(decimal edit mode) (10.7.8, 9.5.1.6) para entrada nesta conexo. Este um modo mutvel (changeable mode) (9.4.1).
Se este especificador omitido em uma instruo OPEN isto inicia a conexo, o valor default POINT.
9.4.5.6 Especificador DELIM= na Instruo OPEN
9.4.5.6 DELIM= specifier in the OPEN statement
A scalar-default-char-expr avaliada como APOSTROPHE, QUOTE ou NONE. O especificador
DELIM= permitido somente para a conexo de entrada/sada formatada. Ele especifica o valor atual do modo
delimitado (delimiter mode) (9.5.1.7) para sada lista dirigida (list-directed) (10.9.2) e lista de nomes (namelist)
(10.10.2.1) para a conexo. Este modo no tem efeito na entrada. Ele um modo mutvel (changeable mode)
(9.4.1). Se este especificador omitido em uma instruo OPEN isto inicia a conexo, o valor default NONE.
9.4.5.7 Especificador ENCODING= na Instruo OPEN
9.4.5.7 ENCODING= specifier in the OPEN statement
A scalar-default-char-expr avaliada como UTF-8 ou DEFAULT. O especificador ENCODING=
permitido somente para a conexo de entrada/sada formatada. O valor UTF-8 especifica que a forma codificao
(encoding form) do arquivo UTF-8 como especificado pela ISO/IEC 10646-1:2000. Este tipo de arquivo
chamado de arquivo Unicode e todos os caracteres nele so do tipo caractere ISO 10646. O valor UTF-8 no pode
ser especificado se o processador no suporta caracteres do tipo ISO 10646. O valor DEFAULT especifica que a
forma de codificao (encoding form) do arquivo dependente do processador. Se este especificador omitido em
uma instruo OPEN isto inicia a conexo, o valor default DEFAULT.
9.4.5.8 Especificador FILE= na Instruo OPEN
9.4.5.8 FILE= specifier in the OPEN statement
O valor do especificador FILE= o nome do arquivo a ser conectado unidade especificada. Quaisquer
brancos posteriores so ignorados. A file-name-expr tem que ser um nome que seja permitido pelo processador.
Se este especificador omitido e a unidade no est conectada a um arquivo, o especificador STATUS= tem que ser
especificado com o valor SCRATCH; neste caso, a conexo feita com um arquivo dependente do processador. A
interpretao quanto diferenciao entre a letras maisculas e minsculas dependente do processador.
9.4.5.9 Especificador FORM= na Instruo OPEN
9.4.5.9 FORM= specifier in the OPEN statement
A scalar-default-char-expr avaliada como FORMATTED ou UNFORMATTED. O especificador
FORM= determina se o arquivo est sendo conectado para uma entrada/sada formatada ou no formatada. Se este
especificador omitido, o valor default UNFORMATTED se o arquivo est sendo conectado para acesso direto
ou acesso em fluxo (stream access) e valor default FORMATTED se o arquivo est sendo conectado para acesso
sequencial. Para um arquivo existente, a forma especificada tem que estar includo no conjunto de formas
permitidas para o arquivo. Para um arquivo novo, o processador cria o arquivo com um conjunto de formas
permitidas que inclu a forma especificada.
9.4.5.10 Especificador PAD= na Instruo OPEN
9.4.5.10 PAD= specifier in the OPEN statement
A scalar-default-char-expr avaliada como YES ou NO. O especificador PAD= permitido somente
para a entrada/sada formatada. Ele especifica o valor atual do modo preenchimento (pad mode) (9.5.3.4.2, 9.5.1.9)
para entrada para esta conexo. Este modo no tem efeito na sada. Ele um modo mutvel (changeable mode)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 203
(9.4.1). Se este especificador omitido em uma instruo OPEN isto inicia a conexo, o valor default YES.
Nota 9.19
Para tipos caractere no default, o preenchimento com o caractere branco dependente do processador
9.4.5.11 Especificador POSITION= na Instruo OPEN
9.4.5.11 POSITION= specifier in the OPEN statement
A scalar-default-char-expr avaliada com ASIS, REWIND ou APPEND. A conexo tem que ser para
acesso sequencial ou acesso em fluxo (stream acess). Um arquivo novo posicionado no seu ponto inicial.
REWIND posiciona um arquivo existente no seu ponto inicial. APPEND posiciona o arquivo no seu ponto
terminal. ASIS deixa a posio intocada se o arquivo existe e j est conectado. ASIS deixa a posio no
especificada se o arquivo existe, mas no est conectado. Se este especificador omitido, o valor default ASIS.
9.4.5.12 Especificador RECL= na Instruo OPEN
9.4.5.12 RECL= specifier in the OPEN statement
O valor do especificador RECL= tem que ser positivo. Ele especifica o comprimento de cada registro no
arquivo que est sendo conectado para acesso direto ou especifica o comprimento mximo do registro no arquivo
que est sendo conectado para acesso sequencial. Este especificador no pode aparecer quando o arquivo
conectado para acesso em fluxo (stream access). Se este especificador omitido quando o arquivo est sendo
conectado para acesso sequencial, o valor default dependente do processador. Se o arquivo est sendo conectado
para entrada/sada formatada, o comprimento o nmero de caracteres de todos os registros que contm somente
caracteres do tipo caractere default. Quando um registro contm algum caractere no default, o valor apropriado
para o especificador RECL= dependente do processador. Se o arquivo est sendo conectado para entrada/sada
no formatada, o comprimento medido em unidades de armazenamento de arquivo. Para um arquivo novo, o
processador cria o arquivo com um conjunto de comprimentos de registro permitidos que inclu o valor
especificado.
9.4.5.13 Especificador ROUND= na Instruo OPEN
9.4.5.13 ROUND= specifier in the OPEN statement
A scalar-default-char-expr avaliada como UP, DOWN, ZERO, NEAREST, COMPATIBLE ou
PROCESSOR_DEFINED. O especificador ROUND= permitido somente para a conexo entrada/sada
formatada. Ele especifica o valor atual do modo E/S arredondado (I/O rounding mode) (10.6.1.2.6, 9.5.1.12) para esta
conexo. Ele um modo mutvel (changeable mode) (9.4.1). Se este especificador omitido em uma instruo
OPEN isto inicia a conexo, o modo arredondamento E/S dependente do processador; ele tem que ser um dos
modos acima.
Nota 9.20
Um processador livre para selecionar qualquer modo arredondamento E/S para o modo default. O modo tem que
corresponder a UP, DOWN, ZERO, NEAREST ou COMPATIBLE; ou ele pode ser completamente diferente do
modo arredondamento E/S
9.4.5.14 Especificador SIGN= na Instruo OPEN
9.4.5.14 SIGN= specifier in the OPEN statement
A scalar-default-char-expr avaliada como PLUS, SUPPRESS ou PROCESSOR_DEFINED. O
especificador SIGN= permitido somente para a conexo entrada/sada formatada. Ele especifica o valor atual do
modo sinalizado (sign mode) (10.7.4, 9.5.1.13) para esta conexo. Ele um modo mutvel (changeable mode)
(9.4.1). Se este especificador omitido em uma instruo OPEN isto inicia a conexo, o valor default
PROCESSOR_DEFINED.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 204
9.4.5.15 Especificador STATUS= na Instruo OPEN
9.4.5.15 STATUS= specifier in the OPEN statement
Uma scalar-default-char-expr tem que ser OLD, NEW, SCRATCH, REPLACE ou UNKNOWN. Se
OLD especificado, o arquivo tem que existir. Se NEW especificado, o arquivo no pode existir.
Execuo bem sucedida da instruo OPEN com o especificador NEW cria o arquivo muda o estado para
OLD. Se o especificador REPLACE especificado e o arquivo ainda no existe, o arquivo criado e o estado
mudado para OLD. Se REPLACE especificado e o arquivo existe, o arquivo removido, um novo arquivo
criado com o mesmo nome e o estado mudado para OLD. Se SCRATCH especificado, o arquivo criado e
conectado a unidade especificada para uso pelo programa, mas removido quando a execuo da instruo CLOSE
referente mesma unidade ou no trmino normal do programa.
Nota 9.21
SCRATCH no pode ser especificado com um arquivo com nome
Se UNKNOWN especificado, o estado dependente do processador. Se este especificador omitido, o
valor default UNKNOWN.
9.4.6 A Instruo CLOSE
9.4.6 The CLOSE statement
A instruo CLOSE (CLOSE statement) usada para terminar a conexo de uma unidade especfica com
um arquivo esteno.
Execuo da instruo CLOSE para uma unidade pode ocorrer em qualquer unidade de programa de um
programa e no precisa ocorrer na mesma unidade de programa que a execuo da instruo OPEN referindo a esta
unidade.
Execuo da instruo CLOSE executa um operao de espera (wait) para qualquer operao pendente de
transferncia de dados assncrono para a unidade especificada.
Execuo da instruo CLOSE especificando uma unidade que no existe ou no tem arquivo conectado
permitida e no tem efeito.
Depois de uma unidade ter sido desconectada pela execuo de uma instruo CLOSE ela pode ser
conectada de novo dentro do mesmo programa, ao mesmo arquivo ou a um arquivo diferente. Depois de de um
arquivo com nome ter sido desconectado pela execuo da instruo CLOSE, ele pode ser conectado de novo
dentro do mesmo programa, mesma unidade ou a uma unidade diferente, garantido que o arquivo ainda exista.
Ao trmino normal de execuo de um programa, todas as unidades que esto conectadas so fechadas.
Cada unidade fechada com o estado KEEP a menos que o estado do arquivo antes do trmino da execuo seja
SCRATCH, e neste caso a unidade ser fechada com o estado DELETE.
Nota 9.22
O efeito como se uma instruo CLOSE sem o especificador STATUS= fosse executado em cada unidade
conectada
R908 close-stmt is CLOSE(close-spec-list)
R909 close-spec is [UNIT=]file-unit-number
or IOSTAT=scalar-int-variable
or IOMSG=iomsg-variable
or ERR=label
or STATUS=scalar-default-char-expr
C906 (R909) Nenhum especificador pode aparecer mais de uma vez em uma dada close-spec-list
C907 (R909) Um file-unit-number tem que ser especificado; se os caracteres opcionais UNIT= so
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 205
omitidos, o file-unit-number tem que ser o primeiro item na close-spec-list
C908 (R909) o rtulo usado no especificador ERR= tem que ser uma instruo rtulo de uma instruo alvo de
desvio que aparece na mesma unidade de escopo que a instruo CLOSE
Uma scalar-default-char-expr tem uma lista limitada de valores de caracteres. Qualquer brancos
posteriores so ignorados. O valor especificado no considera diferena entre letra maiscula e letra minscula.
Os especificadores IOSTAT=, ERR= e IOMSG= so descritos em 9.10.
Nota 9.23
Um exemplo de uma instruo CLOSE :
CLOSE (10, STATUS = KEEP)
Nota 9.24
Para mais explicaes sobre instruo CLOSE ver C.6.6.
9.4.6.1 Especificador STATUS= na Instruo CLOSE
9.4.6.1 STATUS= specifier in the CLOSE statement
Uma scalar-default-char-expr avaliada como KEEP ou DELETE. O especificador STATUS=
determina a disposio do arquivo que est conectado a uma unidade especfica. KEEP no pode ser especificado
para um arquivo cujo estado antes da execuo da instruo CLOSE SCRATCH. Se KEEP especificado para
um arquivo que existe, o arquivo continua a existir depois da execuo da instruo CLOSE. Se KEEP
especificado para um arquivo que no existe, o arquivo no existir depois da execuo da instruo CLOSE. Se
DELETE especificado, o arquivo no existir depois da execuo da instruo CLOSE. Se este especificador
omitido seu valor default KEEP, a menos que o estado do arquivo antes da execuo da instruo CLOSE seja
SCRATCH, neste caso o valor default DELETE.
9.5 Instrues de Transferncia de Dados
9.5 Data transfer statements
A instruo READ (READ statement) uma declarao de transferncia de dado de entrada. A instruo
WRITE (WRITE statement) e a instruo PRINT (PRINT statement) so instrues de transferncia de dado de
sada.
R910 read-stmt is READ(io-control-spec-list)[input-item-list]
or READ format[,input-item-list]
R911 write-stmt is WRITE(io-control-spec-list)[output-item-list]
R912 print-stmt is PRINT format[,output-item-list]
Nota 9.25
Exemplos de instruo de transferncia de dados so:
READ (6, *) SIZE
READ 10, A, B
WRITE (6, 10) A, S, J
PRINT 10, A, S, J
10 FORMAT (2E16.3, I5)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 206
9.5.1 Lista de Informao de Controle
9.5.1 Control information list
Uma lista de informao de controle uma io-control-spec-list. Ela controla a transferncia de dados.
R913 io-control-spec is [UNIT=]io-unit
or [FMT=]format
or [NML=]namelist-group-name
or ADVANCE=scalar-default-char-expr
or ASYNCHRONOUS=scalar-char-initialization-expr
or BLANK=scalar-default-char-expr
or DECIMAL=scalar-default-char-expr
or DELIM=scalar-default-char-expr
or END=label
or EOR=label
or ERR=label
or ID=scalar-int-variable
or IOMSG=iomsg-variable
or IOSTAT=scalar-int-variable
or PAD=scalar-default-char-expr
or POS=scalar-int-expr
or REC=scalar-int-expr
or ROUND=scalar-default-char-expr
or SIGN=scalar-default-char-expr
or SIZE=scalar-int-variable
C909 (R913) Nenhum especificador pode aparecer mais de uma vezem uma dada io-control-spec-list
C910 (R913) Uma io-unit tem que ser especificada; se os caracteres opcionais UNIT= so omitidos, a io-
unit tem que ser o primeiro item na io-control-spec-list
C911 (R913) O especificador DELIM= ou SIGN= no pode aparecer em uma read-stmt
C912 (R913) O especificador BLANK=, PAD=, END=, EOR= ou SIZE= no pode aparecer em uma write-stmt
C913 (R913) Um rtulo no especificador ERR=, EOR= ou END= tem que ser uma instruo rtulo de uma
instruo alvo de desvio que aparece na mesma unidade de escopo que a instruo de transferncia de dado
C914 (R913) Um namelist-group-name tem que ser o nome de um namelist group
C915 (R913) Um namelist-group-name no pode aparecer em uma input-item-list ou uma output-
item-list aparecer em uma instruo de transferncia de dado
C916 (R913) Uma io-control-spec-list conter um formato e um namelist-group-name
C917 (R913) Se formato aparece sem um precedente FMT=, ele tem que ser o segundo item na io-control-
spec-list e o primeiro item tem que ser a io-unit
C918 (R913) Se namelist-group-name aparece sem um precedente NML=, ele tem que ser o segundo item
na io-control-spec-list e o primeiro item tem que ser a io-unit
C919 (R913) Se io-unit no um file-unit-number, a io-control-spec-list no pode conter o
especificador REC= ou o especificador POS=
C920 (R913) Se o especificador REC= aparece, um especificador END= no pode aparecer, um namelist-
group- name no pode aparecer e o formato, se existir, no pode ser um asterisco
C921 (R913) Um especificador ADVANCE= s pode aparecer em uma instruo sequencial formatada ou
instruo entrada/sada em fluxo (stream input/output statement) com especificao explcita de formato (10.1) cuja
lista de informao de controle no contm uma internal-file-variable como a io-unit
C922 (R913) Se um especificador EOR= aparece, um especificador ADVANCE= tambm tem que aparecer
C923 (R913) Se um especificador SIZE= aparece, um especificador ADVANCE= tambm tem que aparecer
C924 (R913) A scalar-char-initialization-expr em um especificador ASYNCHRONOUS= tem que ser
tipo caractere default e tem que ter o valor YES ou NO
C925 (R913) Um especificador ASYNCHRONOUS= com o valor YES no pode aparecer a menos que io-unit
seja um file-unit-number
C926 (R913) Se um especificador ID= aparece, um especificador ASYNCHRONOUS= com o valor YES tambm
tem que aparecer
C927 (R913) Se um especificador POS= aparece, a io-control-spec-list no pode conter o especificador
REC=
C928 (R913) Se o especificador DECIMAL=, BLANK=, PAD=, SIGN= ou ROUND= aparece, um formato ou
namelist-group-name tambm tem que aparecer
C929 (R913) Se o especificador DELIM= aparece, o formato tem que ser um asterisco ou namelist-group-
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 207
name tem que aparecer
O especificador SIZE= pode aparecer somente em uma instruo que contm o especificador ADVANCE=
como o valor NO.
O especificador EOR= pode aparecer somente em uma instruo de entrada que contm o especificador
ADVANCE= como o valor NO.
Se a instruo de transferncia de dados contm um formato ou namelist-group-name, a instruo uma
instruo de entrada/sada formatada (formatted input/output statement), caso contrrio, ela uma instruo de
entrada/sada no formatada (unformatted input/output statement).
Os especificadores ADVANCE=, ASYNCHRONOUS=, DECIMAL=, BLANK=, DELIM=, PAD=, SIGN=
e ROUND= tem uma lista limitada de valores caractere. Quaisquer brancos posteriores so ignorados. Os valores
especificados no levam em conta diferena entre letra maiscula e letra minscula.
Os especificadores IOSTAT=, ERR=, EOR=, END= e IOMSG= so descritos em 9.10.
Nota 9.26
Um exemplo de instruo READ :
READ (IOSTAT = IOS, UNIT = 6, FMT = (10F8.2)) A, B
9.5.1.1 Especificador FMT= na Instruo de Transferncia de Dados
9.5.1.1 FMT= specifier in a data transfer statement
O especificador FMT= fornece uma especificao de formato ou especifica formatos uma lista dirigida
formatada (list-directed formatting) para a instruo formatada de entrada/sada.
R914 format is default-char-expr
or label
or *
C930 (R914) O rtulo tem que ser um rtulo de uma instruo FORMAT que aparece na mesma unidade de
escopo que a instruo contendo o especificador FMT=
A default-char-expr shall avaliada para uma especificao vlida de formato (10.1.1 e 10.1.2).
Nota 9.27
A default-char-expr inclu uma constante caractere
Se default-char-expr uma matriz, ela tratada como se todos os elementos da matriz tivesse sido
especificados na ordem dos elementos da matriz e ento concatenados.
Se formato *, a instruo uma instruo lista dirigida entrada/sada (list-directed input/output).
Nota 9.28
Um exemplo no qual o formato uma expresso caractere :
READ (6, FMT = "(" // CHAR_FMT // ")" )
188
X, Y, Z
onde CHAR_FMT uma varivel caractere default
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 208
9.5.1.2 Especificador NML= na Instruo de Transferncia de Dados
9.5.1.2 NML= specifier in a data transfer statement
O especificador NML= fornece um namelist-group-name (5.4). Este nome identifica uma coleo de
objetos de dados para onde a sada ser realizada.
Se um namelist-group-name aparece, a instruo uma instruo de entrada/sada lista de nome (namelist
input/output statement).
9.5.1.3 Especificador ADVANCE= na Instruo de Transferncia de Dados
9.5.1.3 ADVANCE= specifier in a data transfer statement
Uma scalar-default-char-expr avaliada como YES ou NO. O especificador ADVANCE= especifica
se uma entrada/sada com avano ocorre para esta instruo de entrada/sada. Se YES especificado, uma
entrada/sada com avano ocorre. Se NO especificado, uma entrada/sada sem avano ocorre (9.2.3.1). Se este
especificador emitido em uma instruo de entrada/sada que permite o especificador, o valor default YES.
9.5.1.4 Especificador ASYNCHRONOUS= na Instruo de Transferncia de Dados
9.5.1.4 ASYNCHRONOUS= specifier in a data transfer statement
O especificador ASYNCHRONOUS= determina determines se esta instruo de entrada/sada sncrona
ou assncrona. Se YES especificado, a instruo e a operao de entrada/sada so ditas serem assncronas. Se NO
especificado ou se o especificador omitido, a instruo e a operao de entrada/sada so ditas serem sncronas.
Entrada/sada assncrona permitida somente para arquivos externos abertos com o um especificador
ASYNCHRONOUS= com o valor YES em uma instruo OPEN.
Nota 9.29
Ambas, entrada/sada sncrona e assncrona so permitidas para arquivos abertos com um especificador
ASYNCHRONOUS= com YES. Para outros arquivos, somente entrada/sada sncrona permitida; isto inclu
arquivos abertos com um especificador ASYNCHRONOUS= especificado com NO, arquivos abertos sem um
especificador ASYNCHRONOUS=, pr-conecta arquivos acessados sem a instruo OPEN e arquivos internos.
O valor do especificador ASYNCHRONOUS= em uma instruo de transferncia de dado uma expresso de
inicializao porque ela afeta otimizao de compilao e, portanto, necessita ser conhecida no tempo de
compilao
O processador pode realizar uma operao de transferncia de dados assncrona, mas isto no requerido.
Para cada arquivo externo, registros e unidade de armazenamento de arquivo lidas ou escritas por instrues de
transferncia de dados assncrona so lidas e escritas e processadas na mesma ordem que elas podem ter nas
instrues de transferncia de dados sncrona.
Se uma varivel usada em uma instruo de transferncia de dados assncrona como
1. um item em uma lista de entrada/sada
2. um grupo de objetos em uma lista de nomes (namelist) ou
3. um especificador SIZE=
o objeto base da data-ref implicitamente dado como um atributo ASYNCHRONOUS na unidade de escopo da
instruo de transferncia de dado. Este atributo pode ser confirmado por uma declarao explcita.
Quando uma instruo de transferncia de dados assncrona executada, o conjunto de unidades de
armazenamento de arquivo especificado pelo lista de itens ou especificador NML=, mais as unidades de
armazenamento especificada pelo especificador SIZE=, definida como sendo uma sequncia de armazenamento
de entrada/sada para a operao de transferncia de dado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 209
Nota 9.30
Uma sequncia de armazenamento de entrada/sada no necessariamente um conjunto contguo (uma ao lado da
outra) de unidades de armazenamento
Um apontador (affector) de sequncia de armazenamento de entrada/sada pendente (A pending input/output
storage sequence affector) uma varivel com a qual qualquer parte associada com a unidade de armazenamento
em uma sequncia de armazenamento de entrada/sada.
affector: apontador (conector) varivel que liga uma parte com a origem da parte
9.5.1.5 Especificador BLANK= na Instruo de Transferncia de Dados
9.5.1.5 BLANK= specifier in a data transfer statement
Uma scalar-default-char-expr avaliada como NULL ou ZERO. O especificador BLANK=
temporariamente muda (9.4.1) o modo interpretao branco (blank interpretation mode) (10.7.6, 9.4.5.4) para a
conexo. Se o especificador omitido, o modo no mudado.
9.5.1.6 Especificador DECIMAL= na Instruo de Transferncia de Dados
9.5.1.6 DECIMAL= specifier in a data transfer statement
Uma scalar-default-char-expr avaliada como COMMA ou POINT. O especificador DECIMAL=
temporariamente muda (9.4.1) o modo edio decimal (decimal edit mode) (10.7.8, 9.4.5.5) para a conexo. Se o
especificador omitido, o modo no mudado.
9.5.1.7 Especificador DELIM= na Instruo de Transferncia de Dados
9.5.1.7 DELIM= specifier in a data transfer statement
Uma scalar-default-char-expr avaliada como APOSTROPHE, QUOTE ou NONE. O especificador
DELIM= temporariamente muda (9.4.1) o modo delimitado (delimiter mode) (10.9.2, 10.10.2.1, 9.4.5.6) para a
conexo. Se o especificador omitido, o modo no mudado.
9.5.1.8 Especificador ID= na Instruo de Transferncia de Dados
9.5.1.8 ID= specifier in a data transfer statement
Execuo realizada com sucesso de uma instruo de transferncia de dados assncrona contendo o
especificador ID= faz a varivel especificada no especificador ID= se tornar definida com um valor dependente do
processador. Este valor referido como o identificador da operao de transferncia de dado. Ele pode ser usado
em uma instruo subsequente WAIT ou INQUIRE para identificar uma operao de transferncia de dado em
particular.
Se um erro ocorre durante a execuo da transferncia de dado contendo um especificador ID=, a varivel
especificada no especificador ID= se torna indefinida.
Uma instruo de transferncia de dado filha (child data transfer statement) no pode especificar um
especificador ID=.
9.5.1.9 Especificador PAD= na Instruo de Transferncia de Dados
9.5.1.9 PAD= specifier in a data transfer statement
Uma scalar-default-char-expr avaliada como YES ou NO. O especificador PAD= temporariamente
muda (9.4.1) o modo preenchimento (pad mode) (10.9.2, 10.10.2.1, 9.4.5.6) para a conexo. Se o especificador
omitido, o modo no mudado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 210
9.5.1.10 Especificador POS= na Instruo de Transferncia de Dados
9.5.1.10 POS= specifier in a data transfer statement
O especificador POS= especifica a posio do arquivo em unidades de armazenamento de arquivo. Este
especificador s pode aparecer em uma instruo de transferncia se a instruo especifica a unidade conectada
para acesso em fluxo (stream access). Uma instruo de transferncia filha (child data transfer statement) no pode
especificar este especificador.
Um processador pode proibir o uso de POS= com um arquivo particular que no tem as propriedades
necessrias para suportar posicionamento aleatrio . Um processador tambm pode proibir posicionar um arquivo
particular em uma posio antes da posio de arquivo atual se o arquivo no possu a propriedade necessria para
suportar este posicionamento.
Nota 9.31
Um arquivo que representa conexo com um dispositivo ou fluxo de dados no pode ser posicionado
Se um arquivo conectado para acesso em fluxo formatado (formatted stream access), a posio
especificada por POS= tem que ser igual a 1 (o incio do arquivo) ou um valor previamente retornado pelo
especificador POS= em uma instruo INQUIRE para o arquivo.
9.5.1.11 Especificador REC= na Instruo de Transferncia de Dados
9.5.1.11 REC= specifier in a data transfer statement
O especificador REC= especifica o nmero de registro que para ser lido ou escrito. Este especificador s
pode aparecer em instruo de entrada/sada que especifica a unidade conectada para acesso direta; ele no pode
aparecer em uma transferncia de dados filha (child data transfer statement). Se a lista de informao de controle
contm o especificador REC=, a instruo uma instruo de entrada/sada de acesso direta. Uma instruo de
transferncia de dados filha uma instruo de transferncia de dados de acesso direta se a raiz ( pai origem
parent) uma transferncia de dados de acesso direta. Qualquer outra instruo de transferncia de dado uma
instruo de entrada/sada de acesso sequencial ou uma instruo de entrada/sada de acesso em fluxo ( stream
access), dependendo se o arquivo est conectado para acesso sequencial ou acesso fluxo.
9.5.1.12 Especificador ROUND= na Instruo de Transferncia de Dados
9.5.1.12 ROUND= specifier in a data transfer statement
Uma scalar-default-char-expr avaliada para um dos valores especificado em 9.4.5.13. O
especificador ROUND= temporariamente muda (9.4.1) o modo E/S arredondado (I/O rounding mode) (10.6.1.2.6,
9.4.5.13) para a conexo. Se o especificador omitido, o modo no mudado.
9.5.1.13 Especificador SIGN= na Instruo de Transferncia de Dados
9.5.1.13 SIGN= specifier in a data transfer statement
Uma scalar-default-char-expr avaliada como PLUS, SUPPRESS ou PROCESSOR_DEFINED. O
especificador SIGN= temporariamente muda (9.4.1) o modo sinal (sign mode) (10.7.4, 9.4.5.14) para a conexo. Se
o especificador omitido, o modo no mudado.
9.5.1.14 Especificador SIZE= na Instruo de Transferncia de Dados
9.5.1.14 SIZE= specifier in a data transfer statement
Quando uma instruo de entrada sncrona sem avano termina, a varivel especificada no especificador
SIZE= se torna definida com o nmero de caracteres transferidos pelo descritor de edio de dados durante a
execuo da instruo de entrada atual. Brancos inseridos como preenchimento (9.5.3.4.2) no so contados.
Para entrada assncrona sem avano, as unidades de armazenamento especificadas no especificador SIZE=
se tornam definida com o nmero de caracteres transferidos quando a operao de espera ( wait operation)
correspondente executada.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 211
9.5.2 Lista de Entrada/Sada na Transferncia de Dados
9.5.2 Data transfer input/output list
Uma lista de entrada/sada especifica as entidades cujos valores so transferidos por uma instruo de
transferncia de dados entrada/sada.
R915 input-item is variable
or io-implied-do
R916 output-item is expr
or io-implied-do
R917 io-implied-do is (io-implied-do-object-list,io-implied-do-control)
R918 io-implied-do-object is input-item
or output-item
R919 io-implied-do-control is do-variable=scalar-int-expr,
scalar-int-expr[,scalar-int-expr]
C931 (R915) Uma varivel que um input-item no pode ser uma matriz inteira de tamanho assumido
C932 (R915) Uma varivel que um input-item no pode ser um ponteiro de procedimento
C933 (R919) Uma do-variable tem que ser uma varivel escalar com nome do tipo inteiro
C934 (R918) Em uma input-item-list, um io-implied-do-object tem que ser um input-tem. Em
uma output-item-list, um io-implied-do-object tem que ser um output-item
C935 (R916) Uma expresso que um output-item no pode ter um valor que um ponteiro procedimento
Um input-item no pode aparecer como, nem ser associado com, uma do-variable de qualquer io-
implied-do que contem o input-item
Nota 9.32
Uma constante, uma expresso envolvendo operadores e referncia de funo ou uma expresso envolvida por
parnteses pode aparecer como um item de lista de sada, mas no pode aparecer como um item de lista de entrada
Se um item de entrada um ponteiro, ele tem que estar associado com um alvo definvel ( definable target) e
o dado transferido do arquivo para o alvo associado. Se um item de sada um ponteiro, ele ele tem que estar
associado com um alvo e dado transferncia do alvo para o arquivo.
Nota 9.33
Transferncia de dado sempre envolve o movimento de valores entre um arquivo e armazenamento interno. Um
ponteiro, como tal, no pode ser lido ou escrito. Portanto, um ponteiro no pode aparecer como um item em uma
lista de entrada/sada a menos que esteja associado com um alvo que pode receber o valor (entrada) e pode
entregar o valor (sada)
Se um item de entrada ou um item de sada alocvel, ele tem que estar alocado.
Uma lista de itens no pode ser polimrfica a menos que ela seja processada por um procedimento de
entrada/sada tipo derivado definido pelo usurio (9.5.3.7).
Uma do-variable de um io-implied-do que est em outro io-implied-do no pode aparecer, nem ser
associado com, a do-variable de um io-implied-do interno.
As regras que seguem descrevendo se a expanso de um item de uma lista de entrada/sada so reaplicado a
cada item da lista expandida at nenhuma das regras se aplicar.
Se uma matriz aparece como um item de entrada/sada, ela tratada como se os elementos, se existir,
fossem especificados na ordem dos o elementos da matriz (6.2.2.2). Entretanto, nenhum elemento da matriz pode
afetar o valor de qualquer expresso de um input-item, nem qualquer elemento aparece mais de uma vez como
um input-item.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 212
Nota 9.34
Por exemplo:
INTEGER A(100), J(100)
...
READ *, A(A) ! no permitido
READ *, A(LBOUND(A,1):UBOUND(A,1)) ! permitido
READ *, A(J) ! permitido se no existem dois elementos
! de J tm o mesmo valor
A(1) = 1; A(10) = 10
READ *, A(A(1):A(10)) ! no permitido
Se um item da lista tipo derivado em uma instruo de entrada/sada no formatada no processado por
um procedimento de entrada/sada tipo derivado definido pelo usurio (user-defined derived-type input/output
procedure) (9.5.3.7) e se qualquer subobjeto desta lista de itens for processado por um procedimento entrada/sada
tipo derivado definido pelo usurio, o item da lista tratado como se todos os componentes do objeto tivesse sido
especificado na lista na ordem dos componentes (4.5.3.5); estes componentes tem que ser acessveis na unidade de
escopo contendo a instruo de entrada/sada e no pode ser ponteiros ou alocvel.
Um item efetivo de uma lista de entrada/sada tipo derivado em uma instruo de entrada/sada no
formatada tratado como um valor nico em uma forma dependente do processador a menos que o item da lista ou
o subobjeto deste seja processado por um procedimento entrada/sada tipo derivado definido pelo usurio (9.5.3.7).
Nota 9.35
A utilizao de um objeto tipo derivado como um item da lista de entrada/sada em uma instruo entrada/sada
no formatada no equivalente a uma lista de seus componentes.
Entrada/sada no formatada envolvendo itens de lista tipo derivado forma a nica exceo regra que a apario
de um agregado de item da lista (como uma matriz) equivalente a apario da lista expandida de partes do
componente. Esta exceo permite ao processador grande flexibilidade para prover eficincia ou em coincidir
(matching) valores de sequncia dependente do processador para objetos do tipo derivado com sequncias
similares para agregado de objetos usados por outros meios que no o Fortran. Entretanto, entrada/sada formatada
de todos os itens da lista e entrada/sada no formatada de itens da lista diferentes daqueles tipos derivados aderem
regra acima
Se um item de uma lista de tipo derivados em uma instruo de entrada/sada formatada no processada
por um procedimento de entrada/sada tipo derivado definido pelo usurio, este item da lista tratado como se
todos os componentes da lista tivessem sido especificados na ordem da lista; aqueles componentes tem que ser
acessveis na unidade de escopo contendo a instruo de entrada/sada e no pode ser um ponteiro ou alocvel.
Se uma lista de itens tipo derivada no tratada como uma lista de seus componentes individuais, estes
componentes ltimos da lista no pode ter o atributo POINTER ou ALLOCATABLE, a menos que o item da lista
seja processado por um procedimento de entrada/sada tipo derivado definido pelo usurio.
Objetos escalares resultante quando itens de uma lista de transferncia de dados so expandidos de acordo
com as regras nesta seo para manusear matriz e itens da lista tipo derivado so chamados itens efetivos (effective
items). Matrizes com tamanho zero e io-implied-dos com um contador de iterao zero no contribuem para itens
efetivos da lista. Um item caractere escalar de comprimento zero um item efetivo da lista.
Nota 9.36
Em uma instruo de entrada/sada formatada, descritores de edio so associados com itens efetivos da lista, que
so sempre escalares. As regras em 9.5.2 determinam o conjunto de itens efetivos da lista correspondendo a cada
item atual da lista na instruo. Estas regras podem ser aplicada repetidamente at que todos os itens efetivos da
lista sejam itens escalares
Para um io-implied-do, a inicializao e execuo do loop so as mesmas que as do construtor
DO(8.1.6.4).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 213
Uma lista de entrada/sada no pode conter um item do tipo caractere no default se a instruo de
entrada/sada especifica um arquivo interno do tipo caractere default. Uma lista de entrada/sada no pode conter
um tipo caractere no default diferente do tipo ISO 10646 ou tipo caractere ASCII se a instruo de entrada/sada
especifica um arquivo interno do tipo caractere ASCII.
Nota 9.37
Um exemplo de uma lista de sada com um DO implcito :
WRITE(LP,FMT=(10F8.2)) (LOG(A(I)),I=1,N+9,K), G
9.5.3 Execuo da Instruo de Entrada/Sada de uma Transferncia de
Dados
9.5.3 Execution of a data transfer input/output statement
Execuo de uma instruo WRITE ou instruo PRINT para um arquivo que no existe cria o arquivo a
menos que uma condio de erro ocorra.
O efeito da execuo de uma instruo de transferncia de dados de entrada/sada sncrona tem que ser
como se as operaes que seguem fossem realizadas na ordem especificada:
1. determina a direo da transferncia de dados
2. identifica a unidade
3. implementa uma operao de espera (wait) para todas as operaes pendentes de entrada/sada para a
unidade. Se uma condio de erro end-of-file ou end-of-record ocorre durante qualquer das operaes
de espera, passo 4 at 8 so pulados para a instruo de transferncia de dados atual
4. estabelece o formato, se algum especificado
5. posiciona o arquivo antes da transferncia de dados (9.2.3.2) a menos que a instruo seja uma instruo de
transferncia filha (9.5.3.7)
6. transfere dados entre o arquivo e as entidades especificadas pela lista de entrada/sada (se existirem) ou
lista de nomes (namelist)
7. determina se uma condio de erro end-of-file ou end-of-record ocorreu
8. posiciona o arquivo depois da transferncia de dados (9.2.3.3) a menos que a instruo seja uma instruo
de transferncia filha (9.5.3.7)
9. faz com que qualquer varivel especificada no especificador SIZE= se torne definida
10. se uma condio de erro end-of-file ou end-of-record ocorreu, o processamento continua conforme
foi especificado em 9.10; caso contrrio qualquer varivel especificada em um especificador IOSTAT=
atribudo o valor zero
O efeito da execuo de uma instruo de transferncia de dados de entrada/sada assncrona tem que ser
como se as operaes que seguem fossem realizadas na ordem especificada:
1. determina a direo da transferncia de dados
2. identifica a unidade
3. estabelece o formato, se um especificado
4. posiciona o arquivo antes da transferncia de dados (9.2.3.2)
5. estabelece o conjunto de unidades de armazenamento identificadas pela lista de entrada/sada. Para uma
instruo READ, isto requer que alguns ou todos os dados no arquivo seja lido se uma varivel de entrada
usada como uma scalar-int-expr em uma io-implied-do-control na lista de entrada/sada, como um
subscrito, substring-range, passo ou referncia de outra forma
6. inicie uma transferncia de dados assncrona entre o arquivo e as entidades especificadas pela lista de
entrada/sada (se existir) ou lista com nomes (namelist). A transferncia de dados assncrona pode terminar
(e uma condio de erro end-of-file ou end-of-record pode ocorrer) durante a execuo desta
transferncia de dados ou durante a operao espera posterior
7. determina se uma condio de erro end-of-file ou end-of-record ocorreu. Estas condies podem
ocorrer durante a execuo desta transferncia de dados ou durante a operao espera correspondente, mas
no em ambas
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 214
tambm, qualquer uma destas condies que possam ter ocorrido durante a operao espera correspondente
para uma operao de transferncia de dados previamente pendente que no tem o especificador ID= pode
ocorrer durante a execuo desta instruo de transferncia de dados
8. posiciona o arquivo como se a transferncia de dados tivesse terminado(9.2.3.3)
9. faz com que a varivel especificada no especificador SIZE= se torne indefinida
10. uma condio de erro end-of-file ou end-of-record ocorreu, o processamento continua conforme
especificado em 9.10; caso contrrio qualquer varivel especificada em um especificador IOSTAT=
atribudo o valor zero
Para uma instruo de transferncia de dados assncrona, a transferncia de dados pode ocorrer durante a
execuo de uma instruo, durante a execuo de uma operao espera correspondente ou a qualquer momento
entre elas. A operao de transferncia de dados considerada estar pendente at que uma operao espera
correspondente realizada.
Para sada assncrona, um apontador de sequncia de entrada/sada pendente (pending input/output storage
sequence affector) (9.5.1.4) no pode ser redefinido, tornar-se indefinido ou ter o seu estado de associao de
ponteiro mudado.
Para entrada assncrona, um apontador de sequncia de entrada/sada pendente no pode ser referenciado,
tornar-se definido, tornar-se indefinido, tornar-se associado com um argumento mudo que tem o atributo VALUE,
ou ter o seu estado de associao de ponteiro mudado.
Erro, end-of-file e condio end-of-record em uma operao de transferncia de dados assncrona
pode ocorre durante a execuo da instruo de transferncia de dados ou operao de espera correspondente. Se
um especificador ID= no aparece na instruo que inicia a transferncia de dados, as condies podem ocorrer
durante a execuo de qualquer transferncia de dados subsequente ou operao espera para a mesma unidade.
Quando a condio acontece para uma instruo de transferncia de dados assncrona executada previamente, a
operao espera realizada para todas as operaes de transferncia de dados pendentes nesta unidade. Quando a
condio ocorre durante a instruo subsequente, qualquer ao especificada pelos especificadores IOSTAT=,
IOMSG=, ERR=, END= e EOR= para esta instruo feitas.
Nota 9.38
Porque condies end-of-file e erro para as instrues de transferncia de dados assncrona sem o especificador
ID= pode ser reportada pelo processador durante a execuo de uma instruo transferncia de dado subsequente,
pode ser impossvel para o usurio determinar qual instruo de entrada/sada causou a condio. Deteco
confivel com a instruo READ que causou uma condio end-of-file requer qur todas as instrues READ
para a unidade incluam o especificador ID=
9.5.3.1 Direo da Transferncia de Dados
9.5.3.1 Direction of data transfer
Execuo de uma instruo READ faz com que valores sejam transferidos do arquivo para as entidades
especificadas na lista de entrada, se existir, ou especificada dentro do prprio arquivo para uma entrada lista de
nomes (namelist). Execuo da instruo WRITE ou PRINT faz com que os valores sejam transferidos para o
arquivo das entidades especificadas pela lista de sada e especificao de formato, se existir, ou pelo namelist-
group-name para uma sada lista de nomes (namelist)
9.5.3.2 Identificando a Unidade
9.5.3.2 Identifying a unit
Uma instruo de transferncia de dados de entrada/sada que contm uma lista de controle de
entrada/sada inclu um especificador UNIT= que identifica a unidade externa ou uma unidade interna. A instruo
READ que no contm uma lista de controle de entrada/sada especifica uma unidade particular dependente do
processador, que a mesma que a unidade identificada por * em uma instruo READ que contm uma lista de
controle de entrada/sada. A instruo PRINT especificando alguma outra unidade dependente do processador, que
a mesma que a unidade * identificada em uma instruo WRITE. Ento, cada instruo de transferncia de dado
de entrada/sada identifica uma unidade externa ou uma unidade interna.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 215
A unidade identificada por uma instruo de transferncia de dado de entrada/sada tem que estar conectada
a um arquivo quando a execuo da instruo inicia.
Nota 9.39
O arquivo pode ser pr-conectado
9.5.3.3 Estabelecendo um Formato
9.5.3.3 Establishing a format
Se a lista de controle de entrada/sada contm um * como formato, o formato de lista dirigida (list-directed)
estabelecido. Se namelist-group-name aparece, o formato lista de nomes (namelist) estabelecido. Se nenhum
formato ou namelist-group-name especificado, transferncia de dados no formatado estabelecida. De outra
forma, a especificao do formato identificada pelo especificador FMT= estabelecido.
Na sada, se um arquivo interno foi especificado, uma especificao do formato que est no arquivo ou est
associado com o arquivo no pode ser especificada.
9.5.3.4 Transferncia de Dados
9.5.3.4 Data transfer
Dados so transferidos entre o arquivo e as entidades especificadas pela lista de entrada/sada ou lista de
nomes (namelist). Os itens da lista so processados na ordem da lista de entrada/sada para todas as instrues de
transferncias de dados de entrada/sada exceto para instrues de transferncia de dados lista de nomes ( namelist)
formatada. Os itens da lista para instrues de entrada lista de nomes (namelist) so processadas na ordem das
entidades especificadas dentro dos registros de entrada. A lista de itens para uma instrues de sada lista de nomes
(namelist) so processadas na ordem das entidades especificadas na namelist-group-object-list. Itens efetivos
so derivados dos itens da lista de entrada/sada como descrito em 9.5.2.
Todos os valores necessrios para determinar quais entidades so especificadas por itens de uma lista de
entrada/sada so determinados no incio do processamento deste item.
Todos os valores so transmitidos para ou das entidades especificadas por um item da lista antes do
processamento de qualquer item subsequente da lista para todas as instrues de transferncia de dados de
entrada/sada.
Nota 9.40
No exemplo,
READ (N) N, X (N)
o valor antigo de N identifica a unidade, mas o valor novo de N o subscrito de X
Todos os valores que seguem o name= parte de uma entidade lista de nomes (10.10) dentro dos registros de
entrada so transmitidos para a entidade especificada correspondente na namelist-group-object-list antes do
processamento de qualquer entidade dentro do registro de entrada para instrues de entrada lista de nomes. Se uma
entidade especificada mais de uma vez dentro do registro de entrada durante uma transferncia de dados de
entrada lista de nomes formatada, a ltima ocorrncia da entidade especifica o valor ou valores a serem usados por
esta entidade.
Um item da lista de entrada ou uma entidade associada com ele, no pode conter qualquer poro de uma
especificao de formato estabelecida.
Se o item de entrada/sada um ponteiro, dados so transferidos entre o arquivo e o alvo associado.
Se um arquivo interno foi especificado, um item da lista de entrada/sada no pode estar em um arquivo ou
associado com o arquivo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 216
Nota 9.41
O arquivo um objeto de dados
Uma varivel DO se torna definida e seu contador de iterao estabelecido no incio do processamento dos
itens que constituem o intervalo de um io-implied-do.
Na sada, cada entidade cujo valor ser transferido tem que estar definido.
9.5.3.4.1 Transferncia Dados No Formatados
9.5.3.4.1 Unformatted data transfer
Durante a transferncia de dados no formatados, dados so transferidos sem edio entre o arquivo e as
entidades especificadas pela lista de entrada/sada. Se o arquivo est conectado para acesso sequencial ou direto,
exatamente um registro lido ou escrito.
Objetos do tipo intrnseco ou tipos derivados podem ser transferidos por meio de uma instruo de
transferncia de dados no formatada.
Um valor em um arquivo guardado em uma sequncia adjacentes de unidades de armazenamento de
arquivo, iniciando com a unidades de armazenamento de arquivo imediatamente seguindo a posio atual do
arquivo.
Depois de cada valor ser transferido, a posio atual do arquivo movida para o ponto imediatamente
depois do ltima unidade de armazenamento de arquivo do valor
Na entrada vindo de arquivo conectado para acesso sequencial ou direto, o nmero de unidades de
armazenamento de arquivo requerido pela lista de entrada tem que ser menor ou igual ao nmero de unidades de
armazenamento de arquivo no registro.
Na entrada, se as unidades de armazenamento de arquivo no contm um valor com o mesmo tipo e
parmetros de tipo que a entidade da lista de entrada, ento o valor resultante da entidade dependente do
processador exceto nos seguintes casos:
1. lista com entidade complexas pode corresponder a dois valores reais do mesmo subtipo ( kind) guardado no
arquivo ou vice-versa
2. uma lista caractere default de comprimento n pode corresponder a n caracteres default guardados em
um arquivo, apesar dos parmetros de comprimento das entidades que foram escritas nestas unidades de
armazenamento do arquivo. Se o arquivo conectado para entrada em fluxo ( stream input), os caracteres
podem ter sido escritos por sada de fluxo formatada
Na sada para um arquivo conectada para acesso direto no formatado, a lista de sada no pode especificar
mais valores que podem caber no registro. Se o arquivo conectado para acesso direto e os valores especificados
pela lista de sada no cabem no registro, o restante do registro indefinido.
Se o arquivo conectado para acesso sequencia no formatado o registro criado com o comprimento
suficiente para conter os valores da lista de sada. Este comprimento tem que ser um do conjunto de comprimentos
de registros permitidos para o arquivo e no pode exceder o valor especificado no especificador RECL=, se existir,
da instruo OPEN que estabelece a conexo.
Se o arquivo no est conectado para entrada/sada no formatada, transferncia de dados no formatado
proibido.
A unidade especificada tem que ser uma unidade externa.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 217
9.5.3.4.2 Transferncia de Dados Formatados
9.5.3.4.2 Formatted data transfer
Durante a transferncia de dado formatado, dados so transferidos com edio entre o arquivo e as
entidades especificadas pela lista de entrada/sada ou pelo namelist-group-name. Controle do formato iniciado e
edio realizada como descrito na seo 10.
O registro atual e possveis registros adicionais so lidos e escritos.
Valores podem ser transferidos por meio de uma instruo de transferncia de dado formatado para ou de
objetos do tipo intrnseco ou tipo derivado. No ltimo caso, a transferncia na forma de valores de tipo intrnseco
para ou dos componentes de tipos intrnsecos que compe estes objetos estruturados ltimos, a menos que o item
da lista tipo derivada esteja sendo processada por um procedimento de entrada/sada tipo derivada definida pelo
usurio (9.5.3.7).
Se o arquivo no est conectado para entrada/sada formatada, transferncia de dados formatado proibido.
Durante entrada com avano quando o modo preenchimento (pad mode) tem o valor NO, a lista de entrada e
especificao de formato no pode requerer mais caracteres do registro que o registro contm.
Durante entrada com avano quando o modo preenchimento (pad mode) tem o valor YES, caracteres
brancos so supridos pelo processador se a lista de entrada e o especificador formato reque mais caracteres do
registro que o registro contm.
Durante entrada sem avano quando o modo preenchimento tem o valor NO, uma condio end-of-
record (9.10) ocorre se a lista de entrada e a especificao do formato requer require mais caracteres do registro
que aqueles que o registro contm e o registro est completo (9.2.2.3). Se o registro est incompleto uma condio
end-of-file ocorre em vez de uma condio end-of-record.
Durante entrada sem avano quando modo preenchimento tem o valor YES, caracteres brancos so
supridos pelo processador se a lista de entrada e seu descritor de edio de dados correspondente requer mais
caracteres do registro que o registro contm. Se o registro est incompleto, uma condio end-of-file ocorre;
caso contrrio, uma condio end-of-record ocorre.
Se o arquivo est conectado para acesso direto, o nmero do registro acrescido de um para cada registro
lido ou escrito com sucesso.
Na sada, se o arquivo est conectado para acesso direto ou um arquivo interno e o os caracteres
especificados pela lista de sada e formato no completa o registro, caracteres brancos so adicionados para
preencher o registro.
Na sada, a lista de sada e especificao de formato no pode especificar mais caracteres para o registro
que foram especificados pelo especificador RECL= na instruo OPEN ou comprimento de registro de um arquivo
interno.
9.5.3.5 Formatao Lista Dirigida
9.5.3.5 List-directed formatting
Se formatao lista dirigida (list-directed) foi criada, edio realizada como descrito em 10.9.
9.5.3.6 Formatao Lista de Nome
9.5.3.6 Namelist formatting
Se formatao lista de nomes (namelist) foi criada, edio realizada como descrito em 10.10.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 218
Cada namelist-group-object alocvel no grupo de lista de nomes (namelist group) tem que estar alocado e
cada namelist-group-object que um ponteiro tem que estar associado com um alvo. Se um namelist-group-
object polimrfico ou tem componentes ltimos que so alocveis ou um ponteiro, este objeto tem que ser
processado por um procedimento tipo derivado definido pelo usurio (9.5.3.7).
9.5.3.7 Entrada/Sada de Tipo Derivado Definido pelo Usurio
9.5.3.7 User-defined derived-type input/output
Procedimento de entrada/sada tipo derivado definido pelo usurio permite que um programa sobrecarregue
(override) a manipulao default de um objeto tipo derivado e valores em instrues de transferncia de
entrada/sada descrita em 9.5.2.
Um procedimento de entrada/sada tipo derivado definido pelo usurio um procedimento acessvel por
uma dtio-generic-spec (12.3.2.1). Um procedimento de entrada/sada tipo derivado definido pelo usurio
particular selecionado como descrito em 9.5.3.7.3.
9.5.3.7.1 Executando Transferncias de Entrada/Sada de Dados Tipo Derivado Definido
pelo Usurio
9.5.3.7.1 Executing user-defined derived-type input/output data transfers
Se um procedimento de entrada/sada tipo derivado secionado como especificado em 9.5.3.7.3, o
processador tem que chamar (call) o procedimento de entrada/sada tipo derivado definido pelo usurio para
qualquer instruo de transferncia de dado de entrada/sada apropriada executada na unidade de escopo. O
procedimento de entrada/sada tipo derivado definido pelo usurio controla a operao de transferncia de dados
atual para item na lista de tipo derivados.
Uma instruo de transferncia de dados que inclu um item de uma lista de tipo derivados e que faz com
que um procedimento de entrada/sada tipo derivado definido pelo usurio ser invocado chamada de instruo de
transferncia de dado raiz (instruo de transferncia de dado base instruo de transferncia de dado pai
parent data transfer statement). Uma instruo de transferncia de dado que executada enquanto uma instruo de
transferncia de dado raiz est sendo processada e que especifica que a unidade passada no procedimento de
entrada/sada tipo derivado definido pelo usurio chamada de instruo de transferncia de dado filha
(instruo de transferncia de dado derivada child data transfer statement).
Nota 9.42
Um procedimento de entrada/sada tipo derivado definido pelo usurio usualmente ir conter instrues de
transferncia de dados filha que l valores do ou escreve valores no registro atual ou na posio atual do arquivo.
O efeito de executar um procedimento de entrada/sada tipo derivado definido pelo usurio similar quele de
substituio de itens da lista de qualquer instrues de transferncia de dados filha no itens da instruo de de
transferncia de dados raiz (instruo de transferncia de dados pai instruo de transferncia de dados base parent
data transfer statement), seguido de substituio similar na especificao do formato
Nota 9.43
Uma execuo particular de uma instruo READ, WRITE ou PRINT pode ser uma instruo de transferncia de
dados raiz ou instruo de transferncia de dados filha. Um procedimento de entrada/sada tipo derivado definido
pelo usurio pode indiretamente chamar a si prprio ou outro procedimento de entrada/sada tipo derivado
definido pelo usurio pela execuo de uma instruo de transferncia de dados filha contendo uma lista de itens
do tipo derivado, onde um interface coincidente (matching interface) acessvel para aquele tipo derivado. Se um
procedimento de entrada/sada tipo derivado definido pelo usurio chama a si prprio por meio indireto desta
forma, ele tem que ser declarado RECURSIVE
Uma instruo de transferncia de dado filha processada diferentemente de uma instruo de
transferncia de dado no filha da seguinte maneira:
execuo de uma instruo de transferncia de dado filha no posiciona o arquivo antes da transferncia de
dado
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 219
uma instruo de transferncia de dado filha no formatada no posiciona o arquivo depois da transferncia
de dado estar completada
9.5.3.7.2 Procedimentos de Entrada/sada Tipo Derivado Definido pelo Usurio
9.5.3.7.2 User-defined derived-type input/output procedures
Para um tipo derivado particular e um conjunto de valores de parmetro de tipo subtipo (kind type parameter)
particular, existem quatro conjuntos possveis de caractersticas parar procedimento de entrada/sada tipo derivado
definido pelo usurio; um para cada entrada formatada, sada formatada, entrada no formatada e sada no
formatada. O usurio no necessita fornecer todos os quatros procedimentos. Os procedimentos so especificados,
para serem usados, por blocos de interface (interface blocks) de entrada/sada tipo derivado por (12.3.2.1) ou por
ligaes genricas (generic bindings) (4.5.4), com uma dtio-generic-spec (R1208).
Nas quatros interfaces, que especificam as caractersticas dos procedimentos definidos pelo usurio para
entrada/sada tipo derivado, a seguinte sintaxe usada:
R920 dtv-type-spec is TYPE(derived-type-spec)
or CLASS(derived-type-spec)
C936 (R920) Se derived-type-spec especifica um tipo extensvel, a palavra-chave CLASS tem que ser
usada, caso contrrio, a palavra-chave TYPE tem que ser usada
C937 (R920) Todos os parmetros de tipo comprimento da derived-type-spec tm que ser assumidos
Se a dtio-generic-spec READ (FORMATTED), as caractersticas tm que ser as mesmas que as
especificadas pela seguinte interface:
SUBROUTINE my_read_routine_formatted(dtv,unit,iotype,v_list,iostat,iomsg)
! o valor/varivel tipo derivado
dtv-type-spec,INTENT(INOUT):: dtv
INTEGER,INTENT(IN):: unit ! nmero da unidade
! o string descritor de edio
CHARACTER(LEN=*),INTENT(IN):: iotype
INTEGER,INTENT(IN):: v_list(:)
INTEGER,INTENT(OUT):: iostat
CHARACTER(LEN=*),INTENT(INOUT):: iomsg
END
Se a dtio-generic-spec READ (UNFORMATTED), as caractersticas tm que ser as mesmas que as
especificadas pela seguinte interface:
SUBROUTINE my_read_routine_unformatted(dtv,unit,iotype,v_list,iostat,iomsg)
! o valor/varivel tipo derivado
dtv-type-spec,INTENT(INOUT):: dtv
INTEGER,INTENT(IN):: unit
INTEGER,INTENT(OUT):: iostat
CHARACTER(LEN=*),INTENT(INOUT):: iomsg
END
Se a dtio-generic-spec WRITE (UNFORMATTED), as caractersticas tm que ser as mesmas que as
especificadas pela seguinte interface:
SUBROUTINE my_write_routine_unformatted(dtv,unit,iostat,iomsg)
! o valor/varivel tipo derivado
dtv-type-spec,INTENT(IN):: dtv
INTEGER,INTENT(IN):: unit
INTEGER,INTENT(OUT):: iostat
CHARACTER(LEN=*),INTENT(INOUT):: iomsg
END
Os nomes dos procedimentos especificados reais (os nomes dos procedimentos my_...routine_...
usados anteriormente) no so significativos. Na discusso que segue e depois, os argumentos mudos nestas
interfaces so referenciados pelos nomes usados anteriormente; os nomes so, entretanto, arbitrrios.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 220
Adicionalmente s caractersticas especificadas pela interface mostradas anteriormente, o argumento mudo
dtv pode opcionalmente ter o atributo VOLATILE.
Quando um procedimento de entrada/sada tipo derivado definido pelo usurio invocado, o processador
tem que passar o argumento unidade que tem um valor como segue:
se a instruo de transferncia de dados raiz (parent data transfer statement) usa um file-unit-number, o
valor do argumento unidade tem que ser aquele do file-unit-number
se a instruo de transferncia de dados raiz uma instruo WRITE com uma unidade asterisco ou
instruo uma PRINT, o argumento unidade tem que ter o mesmo valor que a constante com nome
OUTPUT_UNIT do mdulo intrnseco ISO_FORTRAN_ENV (13.8.2)
se a instruo de transferncia de dados raiz uma instruo READ com uma unidade asterisco ou
instruo uma READ sem uma io-control-spec-list, to argumento unidade tem que ter o mesmo valor
que a constante com nome INPUT_UNIT do mdulo intrnseco ISO_FORTRAN_ENV (13.8.2)
caso contrrio, instruo de transferncia de dados raiz tem que acessar um arquivo interno, e neste caso o
argumento unidade tem um valor negativo dependente do processador
Nota 9.44
Porque o valor do argumento unidade ser negativo quando a instruo de transferncia de dados raiz especifica
um arquivo interno, um procedimento de entrada/sada tipo derivado definido pelo usurio no pode executar uma
instruo INQUIRE sem verificar se o argumento unidade negativo ou igual a uma das constantes com nome
INPUT_UNIT, OUTPUT_UNIT ou ERROR_UNIT do mdulo intrnseco ISO_FORTRAN_ENV (13.8.2)
Para uma transferncia de dado formatada, o processador passa o argumento iotype que tem um valor
como descrito a seguir:
LISTDIRECTED se a instruo de transferncia de dados raiz especifica um formato de lista dirigida
NAMELIST a instruo de transferncia de dados raiz especifica um formato lista de nomes (namelist)
DT concatenado com a char-literal-constant, se existir, do descritor de edio, se a instruo de
transferncia de dados raiz contm uma especificao de formato e o descritor de edio correspondente
aos itens da lista um descritor de edio DT
Se a instruo de transferncia de dados raiz uma instruo READ, o argumento mudo dtv associado
pelo argumento com o item efetivo da lista que que faz com que o procedimento de entrada/sada tipo derivado
definido pelo usurio seja invocado, como se o item efetivo da lista fosse um argumento real nesta referncia de
procedimento (2.5.6).
Se a instruo de transferncia de dados raiz uma instruo WRITE ou PRINT, o processador tem que
prover o valor do item efetivo da lista efetiva (effective list item) no argumento mudo dtv.
Se o v-list do descritor de edio aparece na instruo de transferncia de dados raiz, o processador tem
que prover os valores no argumento mudo v-list, com o mesmo nmero de elementos na mesma ordem que v-
list. Se no h v-list no descritor de edio ou se uma instruo de transferncia de dados especifica lista
dirigida ou formatao nome de lista, o processador tem que prover v-list como uma matriz de tamanho zero.
Nota 9.45
O procedimento do usurio pode escolher interpretar um elemento do argumento v-list como a largura de um
campo (field width), mas isto no requerido. Se ele o faz, ser apropriado preencher um campo de sada com *
se a largura muito pequena
O argumento iostat usado para relatar se um erro, end-of-record ou condio end-of-file (9.10)
ocorreu. Se uma condio de erro acontece, o procedimento de entrada/sada tipo derivado definido pelo usurio
tem que atribuir um valor positivo ao argumento iostat. Caso contrrio, se uma condio end-of-file ocorre, o
procedimento de entrada/sada tipo derivado definido pelo usurio tem que atribuir o valor da constante com nome
IOSTAT_END (13.8.2.5) ao argumento iostat. Caso contrrio, se uma condio end-of-record ocorre, o
procedimento de entrada/sada tipo derivado definido pelo usurio tem que atribuir o valor da constante com nome
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 221
IOSTAT_EOR (13.8.2.6) iostat. Caso contrrio, o procedimento de entrada/sada tipo derivado definido pelo
usurio tem que atribuir o valor zero ao argumento iostat.
Se o procedimento de entrada/sada tipo derivado definido pelo usurio retorna um valor diferente de zero
para o argumento iostat, o procedimento tambm tem que retornar uma mensagem explicativa no argumento
iomsg. Caso contrrio, o procedimento no pode mudar o valor do argumento iomsg.
Nota 9.46
Os valores dos argumentos iostat e iomsg definidos em um procedimento de entrada/sada tipo derivado
definido pelo usurio no necessitam ser passados para todas as instrues de transferncia de dado raiz
Se o argumentos iostat de um procedimento de entrada/sada tipo derivado definido pelo usurio tem um
valor diferente de zero quando o procedimento retorna e o processador portanto termina termina a execuo do
programa como descrito em 9.10, o processador tem que fazer o valor do argumento iomsg disponvel em uma
maneira dependente do processador.
Quando uma instruo raiz READ est ativa, uma instruo de entrada/sada no pode ler de qualquer
unidade externa diferente daquela especificada pela unidade argumento mudo e no pode realizar sada para
qualquer unidade externa.
Quando uma instruo raiz WRITE ou PRINT est ativa, uma instruo de entrada/sada no pode realizar sada
para qualquer unidade externa diferente daquela especificada pela unidade argumento mudo e no pode ler de
qualquer unidade externa.
Quando uma instruo raiz READ est ativa, uma instruo de transferncia de dados que especifica um
arquivo interno permitida.
Instrues OPEN, CLOSE, BACKSPACE, ENDFILE e REWIND no podem ser executadas enquanto uma
instruo de transferncia de dado raiz est ativa.
Um procedimento de entrada/sada tipo derivado definido pelo usurio pode usar um FORMAT com um
descritor de edio DT para manipular o componente do tipo derivado que por si um tipo derivado. Uma
instruo de transferncia de dado filha que uma instruo de entrada/sada lista dirigia ou lista de nomes
(namelist) pode conter uma item da lista do tipo derivado.
Porque uma instruo de transferncia de dado filha no posiciona o arquivo antes da transferncia de
dado, a instruo de transferncia de dado filha inicia transferindo dado de onde o arquivo est posicionado pela
instruo de transferncia de dado raiz mais recentemente processada pelo item efetivo da lista efetiva (effective list
item) ou descritor de edio de posicionamento. Isto no necessariamente no incio do registro.
Um descritor de edio de posicionamento de registro, tal como TL e TR, usado na unidade por uma
instruo de transferncia de dado filha no pode fazer a posio do registro ser posicionada antes da posio do
registro quando o procedimento de entrada/sada tipo derivado definido pelo usurio invocado.
Nota 9.47
Um procedimento de entrada/sada tipo derivado definido pelo usurio robusto pode desejar usar INQUIRE para
determinar os valores de BLANK=, PAD=, ROUND=, DECIMAL= e DELIM= para a unidade externa. A
INQUIRE prov valores como especificado em 9.9
Nem a instruo de transferncia de dado raiz nem a instruo de transferncia de dado filha podem ser
assncronas.
Um procedimento de entrada/sada tipo derivado definido pelo usurio e qualquer procedimento invocado
da, no pode invocar nem tornar indefinido, qualquer item na lista de entrada/sada, o formato correspondente ou
qualquer especificador em qualquer instruo de transferncia de dado raiz, exceto por meio do argumento dtv.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 222
Nota 9.48
Uma instruo de transferncia de dado filha no pode usar os especificadores ID=, POS= ou REC= em uma lista
de controle de entrada/sada
Nota 9.49
Um exemplo simples de sada formatada tipo derivado mostrado a seguir. A varivel tipo derivado chairman
tem dois componentes. O tipo e um procedimento de escrita formatado associado so definidos em um mdulo
para que que estejam acessveis onde forem necessrios. Tambm ser possvel verificar se iotype realmente tem
o valor DT e ajustar iostat e iomsg de acordo,
MODULE p
TYPE :: person
CHARACTER(LEN=20):: name
INTEGER:: age
CONTAINS
GENERIC:: WRITE(FORMATTED) => pwf
END TYPE person
CONTAINS
SUBROUTINE pwf(dtv,unit,iotype,vlist,iostat,iomsg)
! definies do argumentos
CLASS(person), INTENT(IN) :: dtv
INTEGER, INTENT(IN) :: unit
CHARACTER (LEN=*), INTENT(IN) :: iotype
INTEGER, INTENT(IN) :: vlist(:)
INTEGER, INTENT(OUT) :: iostat
CHARACTER (LEN=*), INTENT(INOUT) :: iomsg
! variveis locais
CHARACTER (LEN=9) :: pfmt

! vlist(1) e (2) so para serem usados como comprimento de campo de dois
! componentes de variveis do tipo derivado. Primeiro ajuste o formato para
! ser usado pela sada

WRITE(pfmt,(A,I2,A,I2,A))(A, vlist(1), ,I, vlist(2), )

! agora a instruo de sada bsica
WRITE(unit, FMT=pfmt, IOSTAT=iostat) dtv%name, dtv%age
END SUBROUTINE pwf
END MODULE p
PROGRAM
USE p
INTEGER id, members
TYPE (person) :: chairman
...
WRITE(6, FMT="(I2, DT (15,6), I5)" ) id, chairman, members
! isto escreve um registro com quatro campos, com comprimentos 2, 15, 6, 5 respectivamente
END PROGRAM
Nota 9.50
No exemplo que segue , as variveis do tipo derivado node de uma lista conectada (linked list), com um nico valor
em cada node. A sub-rotina pwf usada para escrever os valores na lista,um por linha.
MODULE p
TYPE node
INTEGER :: value = 0
TYPE (NODE), POINTER :: next_node => NULL( )
CONTAINS
GENERIC :: WRITE(FORMATTED) => pwf
END TYPE node
CONTAINS
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 223
RECURSIVE SUBROUTINE pwf(dtv,unit,iotype,vlist,iostat,iomsg)
! escreve a corrente de valores, cada um em uma linha separada com formato I9
CLASS(node), INTENT(IN) :: dtv
INTEGER, INTENT(IN) :: unit
CHARACTER (LEN=*), INTENT(IN) :: iotype
INTEGER, INTENT(IN) :: vlist(:)
INTEGER, INTENT(OUT) :: iostat
CHARACTER (LEN=*), INTENT(INOUT) :: iomsg
WRITE(unit,(i9 /), IOSTAT = iostat) dtv%value
IF(iostat/=0) RETURN
IF(ASSOCIATED(dtv%next_node)) WRITE(unit,(dt), IOSTAT=iostat) dtv%next_node
END SUBROUTINE pwf
END MODULE p
9.5.3.7.3 Resolvendo Referncia de Procedimento de Entrada/Sada Tipo Derivado
9.5.3.7.3 Resolving derived-type input/output procedure references
Uma interface genrica apropriada para entrada/sada tipo derivado definido pelo usurio de um item
efetivo uma que tem uma dtio-generic-spec que apropriada para a direo (ler ou escrever) e forma
(formatada ou no formatada) da transferncia de dados como especificado em 9.5.3.7 e tem uma interface
especfica cujo argumento dtv compatvel com o item efetivo de acordo com as regras de associao de
argumentos em 12.4.1.2.
Quando um item efetivo (9.5.2) que do tipo derivado encontrado durante uma transferncia de dados,
entrada/sada tipo derivado definido pelo usurio ocorre se as duas condies que seguem so verdadeiras:
1. as circunstncias da entrada/sada so tais que entrada/sada tipo derivado definido pelo usurio
permitida, isto , em um dos casos
(a) a transferncia foi iniciada por uma lista dirigida (list-directed), lista de nomes (namelist) ou instruo
de entrada/sada no formatada ou
(b) uma especificao de formato fornecida para a instruo de entrada/sada e o descritor de edio
correspondente para o item efetivo o descritor de edio DT
2. um procedimento de entrada/sada tipo derivado definido pelo usurio apropriado disponvel; isto , em
um dos casos
(a) o tipo declarado do item efetivo tem um procedimento ligado ao tipo genrico apropriado , ou
(b) uma interface genrica apropriada est acessvel
Se (2a) verdade, o procedimento referenciado determinado como uma referncia a um procedimento
ligado ao tipo explcito (12.4); isto , a ligao com a interface especfica apropriada localizada no tipo declarado
do item efetivo e a ligao correspondente no tipo dinmico do item efetivo selecionada.
Se (2a) falsa e (2b) verdadeira, a referncia a do procedimento identificado pela interface especfica
apropriada no bloco de interface. Esta referncia no pode ser um procedimento mudo que no esteja presente ou
para um ponteiro de procedimento desassociado
9.5.4 Trmino de Instrues de Transferncia de Dados
9.5.4 Termination of data transfer statements
Trmino de uma instruo de transferncia de dados de entrada/sada ocorre quando qualquer uma das
condies que seguem so encontradas:
1. processamento do formato encontra um descritor de edio de dados e no h mais elementos restantes na
input-item-list ou output-item-list
2. No formatada ou transferncia de dados lista dirigida esgota a input-item-list ou output-item-list
3. sada lista de nomes (namelist output) esgota a namelist-group-object-list
4. uma condio de erro ocorre
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 224
5. uam condio end-of-file ocorre
6. uma barra (/) encontrada como um valor separador (10.9, 10.10) no registro que est sendo lido durante a
entrada lista dirigida (list-directed) ou lista de nomes (namelist)
7. uma condio end-of-record ocorre durante a execuo de uma instruo de entrada sem avano(9.10)
9.6 Espera na Transferncia de Dados Pendente
9.6 Waiting on pending data transfer
Uma operao espera (wait operation) completa o processamento de uma operao de transferncia
de dados pendente
Execuo de uma instruo de transferncia de dados assncrona na qual no ocorre erro, ocorre um end-
of-record nem ocorre uma condio end-of-file inicia uma operao de transferncia de dados pendente. Pode
haver mltiplas operaes de transferncia de dados pendentes para o mesmo ou mltiplas unidades
simultaneamente. Uma operao de transferncia de dados pendente permanece pendente at a operao espera
correspondente ser realizada. Uma operao espera (wait operation) pode ser realizada por uma WAIT, INQUIRE,
CLOSE ou instruo de posicionamento de arquivo.
9.6.1 Instruo Espera
9.6.1 WAIT statement
Uma instruo espera (WAIT statement) realiza uma operao espera para operaes especificadas de
transferncia de dados assncronos pendentes.
Nota 9.51
A CLOSE, INQUIRE e instrues de posicionamento de arquivo tambm podem realizar operaes espera
R921 wait-stmt is WAIT(wait-spec-list)
R922 wait-spec is [UNIT=]file-unit-number
or END = label
or EOR = label
or ERR = label
or ID = scalar-int-variable
or IOMSG = iomsg-variable
or IOSTAT = scalar-int-variable
C938 (R922) Nenhum especificador pode aparecer mais de uma vez em uma dada wait-spec-list
C939 (R922) Um file-unit-number tem que ser especificado; se os caracteres opcionais UNIT= so
omitidos, o file-unit-number tem que ser o primeiro item na wait-spec-list
C940 (R922) O rtulo no especificador ERR=, EOR= ou END= tem que ser um rtulo de instruo de uma
instruo alvo de desvio que aparece na mesma unidade de escopo que a instruo WAIT
Os especificadores IOSTAT=, ERR=, EOR=, END=, e IOMSG= so descritos em 9.10.
O valor da varivel especificada no especificador ID= tem que ser o identificador de uma operao de
transferncia de dados pendente para a unidade especificada. Se o especificador ID= aparece, a operao de espera
(wait operation) para a operao de transferncia de dados especificada realizada. Se especificador ID= omitido,
operaes espera para todas as transferncias de dados pendentes para a unidade especificada so realizadas.
Execuo de uma instruo de espera (WAIT statement) especificando uma unidade que no existe, no tem
arquivo conectado com ela ou no foi aberta para entrada/sada assncrona permitida, garantido que a instruo
espera no tem o especificador ID=; este tipo de instruo de espera no causa um erro ou ocorrncia de end-of-
file.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 225
Nota 9.52
Um especificador EOR= no tem efeito se a operao de transferncia de dados pendente que no uma leitura
sem avano. Um especificador END= no tem efeito se operao de transferncia de dados pendente no uma
leitura
9.6.2 Operao Espera
9.6.2 Wait operation
Uma operao espera (wait operation) completa o processamento de operao de transferncia de dados
pendente. Cada operao espera completa somente um nica operao de transferncia de dados, apesar de uma
nica instruo poder realizar mltiplas operaes de espera.
Se a atual transferncia de dados no est completa, a operao espera primeiro espera por sua concluso.
Se a operao de transferncia em uma operao de entrada que completa sem erro, as unidades de armazenamento
da sequncia de armazenamento de entrada/sada ento se torna definida com os valores como descrito em 9.5.1.14
e 9.5.3.4.
Se qualquer erro, condio end-of-file ou end-of-record ocorre, as aes aplicveis especificadas pelos
especificadores de instruo IOSTAT=, IOMSG=, ERR=, END= e EOR= que executam a operao espera so
realizadas.
Se um erro ou condio end-of-file ocorre durante a operao espera para a unidade, o processador
realiza a operao espera para todas as operaes de transferncia de dados pendentes para esta unidade.
Nota 9.53
Erro e as condies end-of-file e end-of-record podem ser levantadas durante a instruo de transferncia de
dados que inicia entrada/sada assncrona, uma instruo de transferncia de dados subsequente para a mesma
unidade ou durante uma operao espera. Se tal condio so levantadas durante uma instruo de transferncia
de dados, elas disparam aes de acordo com os especificadores IOSTAT=, ERR=, END= e EOR= desta
instruo; se eles so levantados durante a operao espera, as aes esto em acordo com os especificadores da
instruo que realiza a operao espera
Depois da concluso da operao espera, a operao de transferncia de dados e sua sequncia de
armazenamento de entrada/sada no mais so consideradas como pendente.
9.7 Instrues de Posicionamento de Arquivo
9.7 File positioning statements
R923 backspace-stmt is BACKSPACE file-unit-number
or BACKSPACE(position-spec-list)
R924 endfile-stmt is ENDFILE file-unit-number
or ENDFILE(position-spec-list)
R925 rewind-stmt is REWIND file-unit-number
or REWIND(position-spec-list)
Um arquivo que est conectado para acesso direto no pode ser referido por uma instruo BACKSPACE,
ENDFILE ou REWIND. Um arquivo que est conectado para acesso de fluxo no formatado no pode ser referido
por uma instruo BACKSPACE. Um arquivo que est conectado com o especificador ACTION= tendo o valor
READ no pode ser referido por uma instruo ENDFILE.
R926 position-spec is [UNIT=]file-unit-number
or IOMSG=iomsg-variable
or IOSTAT=scalar-int-variable
or ERR=label
C941 (R926) Nenhum especificador pode aparecer mais de uma vezem uma dada position-spec-list
C942 (R926) Um file-unit-number tem que ser especificado; se os caracteres opcionais UNIT= so
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 226
omitidos, o file-unit-number tem que ser o primeiro item na position-spec-list
C943 (R926) O rtulo no especificador ERR= tem que ser uma instruo rtulo de uma instruo alvo de desvio
que aparece na mesma unidade de escopo que a instruo de posicionamento do arquivo
Os especificadores IOSTAT=, ERR= e IOMSG= so descritos em 9.10.
Execuo de instruo de posicionamento de arquivo realiza uma instruo de espera (wait operation) para
todas as operaes de transferncia de dados assncronas pendentes para a unidade especificada.
9.7.1 Instruo Retrocede
9.7.1 BACKSPACE statement
Execuo de uma instruo retrocede (BACKSPACE statement) faz com que o arquivo conectado com a
unidade especificada seja posicionado antes do registro atual se existe um registro atual ou antes do registro
precedente se no h registro atual. Se o arquivo est no seu ponto inicial, a posio do arquivo no mudada.
Nota 9.54
Se o registro precedente um registro fim-de-arquivo, o arquivo posicionado antes do registro fim-de-arquivo
Se a instruo retrocede causa a escrita implcita do registro fim-de-arquivo, o arquivo posicionado antes
do registro que precede o registro fim-de-arquivo.
Retroceder um um arquivo que est conectado mas no existe proibido.
Retroceder sobre registros escritos usando lista direcionada (list-directed) ou formatao lista de nomes
(namelist) proibido.
Nota 9.55
Um exemplo de instruo Retrocede :
BACKSPACE (10, IOSTAT = N)
9.7.2 Instruo Fim-de-arquivo
9.7.2 ENDFILE statement
Execuo de uma instruo fim-de-arquivo (ENDFILE statement) para um arquivo conectado para escrita
acesso sequencial escreve um registro fim-de-arquivo (endfile) no prximo registro do arquivo. O arquivo ento
posicionado depois do registro fim-de-arquivo, que se torna o ltimo registro do arquivo. Se o arquivo tambm
pode ser conectado para acesso direto, somente aqueles registros antes do registro fim-de-arquivo so considerados
como tendo sido escrito. Ento, somente aqueles registros podem ser lidos durante subsequente conexo de acesso
direto do arquivo.
Depois da execuo da instruo fim-de-arquivo (endfile) para o arquivo conectado para acesso sequencial,
uma instruo BACKSPACE ou REWIND tem que ser usada para reposicionar o arquivo antes da execuo de
qualquer instruo de transferncia de entrada/sada ou instruo ENDFILE.
Execuo de uma instruo ENDFILE para um arquivo conectado para acesso em fluxo (stream access) faz
com que o ponto terminal do arquivo se torne igual posio atual do arquivo. Somente unidades de
armazenamento de arquivo antes da posio atual so consideradas como tendo sido escritas; ento, somente estas
unidades de armazenamento podem ser lidas subsequentemente. Instrues de sada de fluxo subsequentes podem
ser usadas para escritas adicionais no arquivo.
Execuo de uma instruo ENDFILE para um arquivo que est conectado mas que no existe cria o
arquivo; se o arquivo est conectado para acesso sequencial, ele criado antes de escrever o registro fim-de-
arquivo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 227
Nota 9.56
Um exemplo de instruo fim-de-arquivo :
ENDFILE K
9.7.3 Instruo Rebobina
9.7.3 REWIND statement
Execuo da instruo rebobina (REWIND statement) faz com que o arquivo especificado seja posicionado
no seu ponto inicial.
Nota 9.57
Se o arquivo j est posicionado no seu ponto inicial, execuo desta instruo no tem efeito na posio do
arquivo
Execuo da instruo rebobina para um arquivo que est conectado mas no existe permitida e no tem
efeito sobre o arquivo.
Nota 9.58
Um exemplo de uma instruo rebobina :
REWIND 10
9.8 Instruo Descarrega
9.8 FLUSH statement
A forma da instruo descarrega (FLUSH statement) :
R927 flush-stmt is FLUSH file-unit-number
or FLUSH(flush-spec-list)
R928 flush-spec is [UNIT=]file-unit-number
or IOSTAT=scalar-int-variable
or IOMSG=iomsg-variable
or ERR=label
C944 (R928) Nenhum especificador pode aparecer mais de uma vez em uma dada flush-spec-list
C945 (R928) O file-unit-number tem que ser especificado; se os caracteres opcionais UNIT= so omitidos
do unidade especificada, o file-unit-number tem que ser o primeiro item na flush-spec-list
C946 (R928) O rtulo no especificador ERR= tem que ser a instruo rtulo de uma instruo alvo de desvio que
aparece na mesma unidade de escopo que a instruo flush
Os especificadores IOSTAT=, IOMSG= e ERR= so descritos em 9.10. A varivel IOSTAT= tem que
definir um valor positivo dependente do processador se um erro ocorre, zero se a operao descarrega (flush
operation) dependente do processador teve sucesso ou um valor negativo dependente do processador se a operao
descarrega no suportada para a unidade especificada.
Execuo da instruo descarrega faz com que dados escritos em um arquivo externo fique disponvel para
outros processos ou faz que dado colocado em um arquivo externo por meios diferentes do Fortran se torne
disponvel para uma instruo READ. A ao dependente do processador.
Execuo de uma instruo descarrega para um arquivo que est conectado mas no existe permitido e
no tem efeito em qualquer arquivo. A instruo descarrega (FLUSH statement) no tem efeito na posio do
arquivo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 228
Nota 9.59
Porque este padro no especifica o mecanismo de armazenamento de arquivo, o significado exato da operao
descarrega no precisamente definido. A inteno que a operao descarrega (flush operation) possa fazer todos
os dados escritos em um arquivo disponvel para outros processos ou dispositivos ou fazer dados recentemente
adicionado ao arquivo por outros processos ou dispositivos disponveis para o programa via uma operao de
leitura subsequente. Isto comumente chamado de descarga de memria de E/S flushing I/O buffers.
Buffer memria temporria para guarda dados
Nota 9.60
Um exemplo de instruo descarrega :
FLUSH(10,IOSTAT=N)
9.9 Inquisio de Arquivo
9.9 File inquiry
A instruo de inquisio (INQUIRE statement) pode ser utilizada para inquirir sobre as propriedades de um
arquivo com nome em particular ou conexo com uma unidade em particular. H trs formas da instruo
inquisio: inquirir por arquivo (inquire by file) que usa o especificador FILE= , inquirir por unidade (inquire by
unit) que uso o especificador UNIT= e inquirir por lista sada (inquire by output list), que usa o somente o
especificador IOLENGHT=. Todos os valores atribudos aos especificadores so realizados de acordo com as
regras para instrues de atribuio.
Uma instruo de inquisio pode ser executada antes, durante ou depois do arquivo estar conectado a um a
unidade. Todos os valores atribudos por uma instruo inquisio so aqueles que so existentes no momento da
execuo da instruo.
R929 inquire-stmt is INQUIRE(inquire-spec-list)
or INQUIRE(IOLENGTH=scalar-int-variable)
output-item-list
Nota 9.61
Exemplos de instrues de inquisio so:
INQUIRE(IOLENGTH=IOL) A(1:N)
INQUIRE(UNIT=JOAN,OPENED=LOG_01,NAMED=LOG_02,FORM=CHAR_VAR,IOSTAT=IOS)
9.9.1 Especificadores de Inquisio
9.9.1 Inquiry specifiers
A menos das restries, os seguintes especificadores de inquisio podem ser usados em uma inquisio
por arquivo ou inquisio por unidade, que so formas da instruo INQUIRE:
R930 inquire-spec is [ UNIT = ] file-unit-number
or FILE = file-name-expr
or ACCESS = scalar-default-char-variable
or ACTION = scalar-default-char-variable
or ASYNCHRONOUS = scalar-default-char-variable
or BLANK = scalar-default-char-variable
or DECIMAL = scalar-default-char-variable
or DELIM = scalar-default-char-variable
or DIRECT = scalar-default-char-variable
or ENCODING = scalar-default-char-variable
or ERR = label
or EXIST = scalar-default-logical-variable
or FORM = scalar-default-char-variable
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 229
or FORMATTED = scalar-default-char-variable
or ID = scalar-int-variable
or IOMSG = iomsg-variable
or IOSTAT = scalar-int-variable
or NAME = scalar-default-char-variable
or NAMED = scalar-default-logical-variable
or NEXTREC = scalar-int-variable
or NUMBER = scalar-int-variable
or OPENED = scalar-default-logical-variable
or PAD = scalar-default-char-variable
or PENDING = scalar-default-logical-variable
or POS = scalar-int-variable
or POSITION = scalar-default-char-variable
or READ = scalar-default-char-variable
or READWRITE = scalar-default-char-variable
or RECL = scalar-int-variable
or ROUND = scalar-default-char-variable
or SEQUENTIAL = scalar-default-char-variable
or SIGN = scalar-default-char-variable
or SIZE = scalar-int-variable
or STREAM = scalar-default-char-variable
or UNFORMATTED = scalar-default-char-variable
or WRITE = scalar-default-char-variable
C947 (R930) Nenhum especificador pode aparecer mais de uma vez em uma dada inquire-spec-list
C948 (R930) Uma inquire-spec-list tem que conter um especificador FILE= ou um especificador UNIT=,
mas no ambos
C949 (R930) Na forma de inquisio por unidade da instruo INQUIRE, se os caracteres opcionais UNIT= so
omitidos, o file-unit-number tem que ser o primeiro item na inquire-spec-list
C950 (R930) Se um especificador ID= aparece, um especificador PENDING= tambm tem que aparecer
O valor do file-unit-number tem que ser no negativo ou igual a uma das constantes com nome
INPUT_UNIT, OUTPUT_UNIT ou ERROR_UNIT do mdulo intrnseco ISO_FORTRAN_ENV (13.8.2).
Quando um valor retornado de um especificador diferente do especificador NAME= do tipo caractere, o
valor retornado est em letra maiscula.
Se uma condio de erro ocorre durante a execuo de uma instruo INQUIRE, todas as variveis dos
especificadores de inquisio se tornam indefinidas exceto para para as variveis nos especificadores IOSTAT= e
IOMSG= (se existir).
Os especificadores IOSTAT=, ERR= e IOMSG= so descritos em 9.10.
9.9.1.1 Especificador FILE= na Instruo INQUIRE
9.9.1.1 FILE= specifier in the INQUIRE statement
O valor da file-name-expr no especificador FILE= especifica o nome do arquivo que est sendo
inquirido. O arquivo com nome no precisa existir ou estar conectada a uma unidade. O valor da file-name-expr
tem que ser uma das formas aceitas pelo processador como arquivo com nome. Quaisquer brancos posteriores so
ignorados. A diferenciao de letras maisculas e minsculas dependente do processador.
9.9.1.2 Especificador ACCESS= na Instruo INQUIRE
9.9.1.2 ACCESS= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador ACCESS= atribudo o valor SEQUENTIAL se o
arquivo est conectado para acesso sequencial e DIRECT se o arquivo est conectado para acesso direto ou
STREAM se o arquivo est conectado para acesso em fluxo ( stream access). Se no h conexo, ele recebe o valor
UNDEFINED.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 230
9.9.1.3 Especificador ACTION= na Instruo INQUIRE
9.9.1.3 ACTION= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador ACTION= recebe o valor READ se o arquivo est
conectado somente para entrada, WRITE se o arquivo est conectado somente para sada e READWRITE se o
arquivo est conectado para entrada e sada. Se no h conexo, a scalar-default-char-variable recebe o valor
UNDEFINED.
9.9.1.4 Especificador ASYNCHRONOUS= na Instruo INQUIRE
9.9.1.4 ASYNCHRONOUS= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador ASYNCHRONOUS= recebe o valor YES se o
arquivo est conectado e entrada/sada assncrona na unidade permitida; recebe o valor NO se est conectado e
entrada/sada assncrona na unidade no permitida. Se no h conexo, a scalar-default-char-variable
recebe o valor UNDEFINED.
9.9.1.5 Especificador BLANK= na Instruo INQUIRE
9.9.1.5 BLANK= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador BLANCK= recebe o valor ZRO ou NULL,
correspondendo ao modo interpretao branco (blank interpretation mode) que est em uso para a conexo para a
entrada/sada formatada. Se no h conexo ou se a conexo no para entrada/sada formatada a scalar-
default-char-variable no recebe o valor UNDEFINED.
9.9.1.6 Especificador DECIMAL= na Instruo INQUIRE
9.9.1.6 DECIMAL= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador DECIMAL= recebe o valor COMMA ou POINT,
correspondendo ao modo de edio decimal (decimal edit mode) em uso para a conexo para a entrada/sada
formatada. Se no h conexo ou se a conexo no para entrada/sada formatada a scalar-default-char-
variable no recebe o valor UNDEFINED.
9.9.1.7 Especificador DELIM= na Instruo INQUIRE
9.9.1.7 DELIM= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador DELIM= recebe o valor APOSTROPHE, QUOTE ou
NONE, correspondendo ao modo delimitado (delimiter mode) em uso para a conexo para a entrada/sada formatada.
Se no h conexo ou se a conexo no para entrada/sada formatada a scalar-default-char-variable no
recebe o valor UNDEFINED.
9.9.1.8 Especificador DIRECT= na Instruo INQUIRE
9.9.1.8 DIRECT= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador DIRECT= recebe o valor YES se DIRECT est
includo no conjunto de mtodos de acesso permitido para o arquivo, NO se DIRECT no est includo no conjunto
de mtodos de acesso permitido para o arquivo e UNKNOWN se o processador incapaz de determinar se ou no
DIRECT est no conjunto de mtodos de acesso permitido para o arquivo.
9.9.1.9 Especificador ENCODING= na Instruo INQUIRE
9.9.1.9 ENCODING= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador ENCODING= recebe o valor UTF-8 se o arquivo
estr conectado para entrada/sada formatada com a forma de codificao UTF-8 e recebe o valor UNDEFINED se
o arquivo est conectado para entrada/sada no formatada. Se no h conexo, ele recebe o valor UTF-8 se o
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 231
processador capaz de determinar que a forma de codificao do arquivo UTF-8. Se o processador no capaz
de determinar que a forma de codificao do arquivo, a varivel recebe o valor UNKNOWN.
Nota 9.62
O valor atribudo pode ser algo diferente de UTF-8, UNDEFINED ou UNKNOWN se o processador suporta
outras formas de codificao (exemplo, UTF-16BE)
9.9.1.10 Especificador EXIST= na Instruo INQUIRE
9.9.1.10 EXIST= specifier in the INQUIRE statement
A execuo de uma instruo INQUIRE por arquivo (inquire by file) faz com que a scalar-default-
logical-variable no especificador EXIST= receba o valor verdadeiro (true) se o arquivo existe com o nome
especificado. Caso contrrio, falso (false) atribudo. Execuo de uma instruo INQUIRE por unidade (inquire by
unit) faz com que o valor verdadeiro (true) seja atribudo se a unidade especificada existe, caso contrrio, falso
(false) atribudo.
9.9.1.11 Especificador FORM= na Instruo INQUIRE
9.9.1.11 FORM= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador FORM= recebe o valor FORMATTED se o arquivo
est conectado para entrada/sada formatada e atribudo o valor UNFORMATTED se o arquivo est conectado para
entrada/sada no formatada. Se no h conexo, ela recebe valor UNDEFINED.
9.9.1.12 Especificador FORMATTED= na Instruo INQUIRE
9.9.1.12 FORMATTED= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador FORMATTED= recebe o valor YES se
FORMATTED est includo no conjunto de formas permitido para o arquivo, NO se FORMATTED no est
includo no conjunto de formas permitidas para o arquivo e UNKNOWN se o processador incapaz de determinar
se ou no FORMATTED est includo no conjunto de formas permitidas para o arquivo.
9.9.1.13 Especificador ID= na Instruo INQUIRE
9.9.1.13 ID= specifier in the INQUIRE statement
O valor da varivel especificada no especificador ID= tem que ser o identificador de uma operao
pendente operao de transferncia de dados pendente para a unidade especificada. Este especificador interage com
o especificador PENDING= (9.9.1.20).
9.9.1.14 Especificador NAME= na Instruo INQUIRE
9.9.1.14 NAME= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador NAME= recebe o valor do nome do arquivo se o
arquivo tem um nome, caso contrrio ela se torna indefinido.
Nota 9.63
Se este especificador aparece em uma instruo INQUIRE por arquivo, seu valor no necessariamente igual ao
nome dado no especificador FILE=. Entretanto, o valor retornado tem que ser possvel de ser usado como o valor
de uma file-name-expr no especificador FILE= em uma instruo OPEN.
O processador pode retornar o nome do arquivo qualificado com a identificao do usurio, dispositivo, diretrio
ou outra informao relevante
O caso de caracteres assinalados em uma scalar-default-char-variable dependente do processador.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 232
9.9.1.15 Especificador NAMED= na Instruo INQUIRE
9.9.1.15 NAMED= specifier in the INQUIRE statement
A scalar-default-logical-variable no especificador recebe o valor verdade (true) se o arquivo tem um
nome. Caso contrrio, recebe o valor falso (false).
9.9.1.16 Especificador NEXTREC= na Instruo INQUIRE
9.9.1.16 NEXTREC= specifier in the INQUIRE statement
A scalar-default-int-variable no especificador NEXTREC= recebe o valor n+1, onde n o nmero
do registro do ltimo registro lido ou escrito no arquivo conectado para acesso direto. Se o arquivo est conectado,
mas nenhum registro foi lido ou escrito desde a conexo, a scalar-default-int-variable recebe o valor 1. Se o
arquivo no est conectado para acesso direto ou se a posio do arquivo indeterminado por causa de uma
condio de erro prvia, a scalar-default-int-variable se torna indefinida. Se existem operaes de
transferncia de dados pendentes para a unidade especificada, o valor atribudo calculado como se todas as
transferncias de dados pendentes j tivessem sido realizadas.
9.9.1.17 Especificador NUMBER= na Instruo INQUIRE
9.9.1.17 NUMBER= specifier in the INQUIRE statement
A scalar-default-int-variable no especificador NUMBER= recebe o valor do nmero da unidade
externa que est atualmente conectado com o arquivo. Se no h unidade conectada com o arquivo, o valor -1
atribudo.
9.9.1.18 Especificador OPENED= na Instruo INQUIRE
9.9.1.18 OPENED= specifier in the INQUIRE statement
A execuo da instruo INQUIRE por arquivo faz com que a scalar-default-logical-variable no
especificador OPENED= receba o valor verdadeiro (true) se o arquivo est conectado unidade, caso contrrio,
falso (false) atribudo. Execuo da instruo INQUIRE por unidade faz com a scalar-default-logical-
variable receba o valor verdadeiro (true) se a unidade especificada est conectada a um arquivo, caso contrrio
atribudo o valor falso.
9.9.1.19 Especificador PAD= na Instruo INQUIRE
9.9.1.19 PAD= specifier in the INQUIRE statement
A scalar-default-char-variable no especificador PAD= recebe o valor YES ou NO, correspondendo
ao modo preenchimento (pad mode) em uso para a conexo para a entrada/sada formatada. Se no h conexo ou se
a conexo no para entrada/sada formatada, a scalar-default-char-variable recebe o valor UNDEFINED.
9.9.1.20 Especificador PENDING= na Instruo INQUIRE
9.9.1.20 PENDING= specifier in the INQUIRE statement
O especificador PENDING= usado para determinar se ou uma operao de transferncia de dados
assncrono pendente prvia est completa. A operao de transferncia de dados prvia est pendente se est
pendente no incio da execuo da instruo INQUIRE.
Se o especificador ID= aparece e a operao de transferncia de dados especificada est completa, ento a
varivel especificada no especificador PENDING= recebe o valor falso e a instruo INQUIRE realiza uma
operao espera (wait operation) para a transferncia de dados especificada.
Se o especificador ID= omitido e todas as operaes de transferncia de dados pendentes previas para a
unidade especificada esto completas, ento a varivel especificada no especificador PENDING= receber o valor
falso instruo INQUIRE realiza operaes espera (wait operations) para todas as operaes prvias de
transferncias de dados pendentes para a unidade especificada.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 233
Em todos os outros casos, a varivel especificada no especificador PENDING= receber o valor verdadeiro
e nenhumas das operaes espera realizada; nesta caso as transferncias prvias de dados pendentes permanecem
pendentes depois da execuo da instruo INQUIRE.
Nota 9.64
O processador tem considervel flexibilidade na definio de quando ele considera a transferncia estar completa.
Qualquer das seguintes abordagens pode ser usada:
(1) A instruo INQUIRE pode considerar uma transferncia de dados assncrona estar incompleta at depois da
correspondente operao espera (wait operation). Neste caso PENDING= pode sempre retornar verdade (true) a
menos que no exista transferncia de dados prvia pendente para a unidade
(2) A instruo INQUIRE pode esperar que todas as transferncias de dados especificadas sejam completadas e
ento sempre retornar falso (fase) para PENDING=
(3) A instruo INQUIRE pode realmente testar o estado das operaes de transferncias de dados especificadas
9.9.1.21 Especificador POS= na Instruo INQUIRE
9.9.1.21 POS= specifier in the INQUIRE statement
A scalar-int-variable no especificador POS= recebe o nmero da unidade de armazenamento de arquivo
imediata (que segue ) posio atual para o arquivo conectado para acesso em fluxo (stream access). Se o arquivo
est posicionado no seu ponto terminal, a varivel recebe o valor uma unidade maior que o nmero da unidade de
armazenamento de arquivo com maior nmero no arquivo. Se o arquivo no est conectado para acesso de fluxo ou
se a posio do arquivo est indeterminada por causa de um condio de erro prvia, a varvel se torna indefinida.
9.9.1.22 Especificador POSITION= na Instruo INQUIRE
9.9.1.22 POSITION= specifier in the INQUIRE statement
A scalar-default-char-variable no especificado POSITION= recebe o valor REWIND se o arquivo
conectado com a declarao OPEN para posicionamento no ponto inicial, APPEND se o arquivo conectado para
posicionamento antes do registro fim de arquivo ou no seu ponto terminal e ASIS se o arquivo est conectado sem
mudana na na sua posio. Se no h conexo ou se o arquivo est conectado para acesso direto, a scalar-
default-char-variable recebe o valor UNDEFINED. Se o arquivo foi reposicionado desde a conexo, a
scalar-default-char-variable recebe um valor dependente do processador, que no pode ser REWIND a
menos que o arquivo esteja posicionado no seu ponto inicial e no pode ser APPEND a menos que os arquivo esteja
posicionado de forma tal que o registro fim-de-arquivo o prximo registro ou no seu ponto terminal se no houver
registro fim-de-arquivo.
9.9.1.23 Especificador READ= na Instruo INQUIRE
9.9.1.23 READ= specifier in the INQUIRE statement
A scalar-default-char-variable no especificado READ= recebe o valor YES se READ est includo
no conjunto de aes permitidas para o arquivo. NO se READ no est includo no conjunto de aes permitidas
para o arquivo e UNKNOWN se o processador no consegue determinar se ou no READ est no conjunto de
aes permitidas para o arquivo.
9.9.1.24 Especificador READWRITE= na Instruo INQUIRE
9.9.1.24 READWRITE= specifier in the INQUIRE statement
A scalar-default-char-variable no especificado READWRITE= recebe o valor YES se READWRITE
est includo no conjunto de aes permitidas para o arquivo. NO se READWRITE no est includo no conjunto
de aes permitidas para o arquivo e UNKNOWN se o processador no consegue determinar se ou no
READWRITE est no conjunto de aes permitidas para o arquivo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 234
9.9.1.25 Especificador RECL= na Instruo INQUIRE
9.9.1.25 RECL= specifier in the INQUIRE statement
A scalar-default-int-variable no especificador RECL= recebe o valor do comprimento do registro de
um arquivo conectado para acesso direto ou o valor do comprimento mximo do registro para um arquivo
conectada para acesso sequencial. Se o arquivo est conectado para entrada/sada formatada, o comprimento o
nmero de caracteres para todos os registros que contm somente caracteres do tipo caractere default. Se o arquivo
est conectado para entrada/sada no formatada, o comprimento medido em unidades de armazenamento de
arquivo. Se no h conexo ou se a conexo para acesso em fluxo (stream access), a scalar-default-int-
variable se torna indefinida.
9.9.1.26 Especificador ROUND= na Instruo INQUIRE
9.9.1.26 ROUND= specifier in the INQUIRE statement
A scalar-default-char-variable no especificado ROUND= recebe o valor UP, DOWN, ZERO,
NEAREST, COMPATIBLE ou PROCESSOR_DEFINED, correspondendo ao modo E/S arredondado (I/O rounding
mode) em uso para a conexo entrada/sada formatada. Se no h conexo ou se a conexo no para
entrada/sada formatada, a scalar-default-char-variable atribudo o valor UNDEFINED. O processador tem
que retornar o valor PROCESSOR_DEFINED somente se o modo E/S arredondado atualmente em uso se
comporta diferentemente dos modos UP, DOWN, ZERO, NEAREST e COMPATIBLE.
9.9.1.27 Especificador SEQUENTIAL= na Instruo INQUIRE
9.9.1.27 SEQUENTIAL= specifier in the INQUIRE statement
A scalar-default-char-variable no especificado SEQUENTIAL= recebe o valor YES se
SEQUENTIAL est includo no conjunto de mtodos de acesso permitido para este arquivo. NO, se SEQUENTIAL
no est includo no conjunto de mtodos de acesso permitido para este arquivo e UNKNOWN se o processador
incapaz de determinar se ou no SEQUENTIAL est includo no conjunto de mtodos de acesso permitido para o
arquivo.
9.9.1.28 Especificador SIGN= na Instruo INQUIRE
9.9.1.28 SIGN= specifier in the INQUIRE statement
A scalar-default-char-variable no especificado SIGN= recebe o valor PLUS, SUPPRESS ou
PROCESSOR_DEFINED, correspondendo ao modo sinalizado (sign mode) em uso para a conexo para
entrada/sada formatada. Se no h conexo ou se a conexo no para entrada/sada formatada, a scalar-
default-char-variable recebe o valor UNDEFINED.
9.9.1.29 Especificador SIZE= na Instruo INQUIRE
9.9.1.29 SIZE= specifier in the INQUIRE statement
A scalar-char-variable no especificado SIZE= recebe o tamanho do arquivo em unidades de
armazenamento de arquivo. Se o tamanho do arquivo no pode ser determinado, a varivel recebe o valor -1.
Para o arquivo que pode estar conectado para acesso em fluxo (stream access), o tamanho do arquivo o
nmero da unidade de armazenamento de arquivo com valor mais eleado no arquivo.
Para o arquivo que pode estar conectado para sequencial ou acesso direto, o tamanho do arquivo pode ser
diferente do nmero unidades de armazenamento indicada pelo dado nos registros; a relao exata dependente do
processador.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 235
9.9.1.30 Especificador STREAM= na Instruo INQUIRE
9.9.1.30 STREAM= specifier in the INQUIRE statement
A scalar-char-variable no especificado STREAM= recebe o valor YES se STREAM est includo no
conjunto de mtodos de acesso permitidos para o arquivo. NO se STREAM no est includo no conjunto de
mtodos de acesso permitidos para o arquivo e UNKNOWN se o processador incapaz de determinar se ou no
STREAM est includo no conjunto de mtodos de acesso permitidos para o arquivo.
9.9.1.31 Especificador UNFORMATTED= na Instruo INQUIRE
9.9.1.31 UNFORMATTED= specifier in the INQUIRE statement
A scalar-char-variable no especificado UNFORMATTED= recebe o valor YES se UNFORMATTED
est includo no conjunto de formas permitido para o arquivo. NO, se UNFORMATTED no est includo no
conjunto de formas permitido para o arquivo e UNKNOWN se o processador incapaz de determinar se ou no
UNFORMATTED est includo no conjunto de formas permitido para o arquivo. .
9.9.1.32 Especificador WRITE= na Instruo INQUIRE
9.9.1.32 WRITE= specifier in the INQUIRE statement
A scalar-char-variable no especificado WRITE= recebe o valor YES se WRITE est includo no
conjunto de aes permitidas para o arquivo. NO se WRITE no est includo no conjunto de aes permitidas para
o arquivo e UNKNOWN se o processador no consegue determinar se ou no WRITE est includo no conjunto de
aes permitidas para o arquivo.
9.9.2 Restries sobre os Especificadores de Inquisio
9.9.2 Restrictions on inquiry specifiers
A inquire-spec-list em uma instruo INQUIRE por arquivo tem que conter exatamente um
especificador FILE= e no pode conter o especificador UNIT=. A inquire-spec-list em uma instruo
INQUIRE por unidade tem que conter exatamente um especificador UNIT= e no pode conter o especificador
FILE=. O especificador de unidade no necessita existir ou estar conectado a um arquivo. Se ele est conectado a
um arquivo, a inquisio feita sobre a conexo e sobre o arquivo conectado.
9.9.3 Inquirindo sobre Lista Sada
9.9.3 Inquire by output list
A inquisio por lista de sada (inquire by output list) uma das forma da instruo INQUIRE tem somente um
especificador IOLENGTH= e uma lista de sada.
A scalar-int-variable no especificador IOLENGTH= recebe um nmero dependente do processador de
unidades de armazenamento de arquivos que ser requerido para guardar o dado da lista de sada em um arquivo
no formatado. O valor tem que ser fornecido por um especificador RECL= em uma instruo OPEN que conecta o
arquivo para acesso direto no formatado quando existe instrues de entrada/sada dentro da mesma lista de
entrada/sada.
A lista de sada em uma instruo INQUIRE no pode conter quaisquer itens da lista tipo derivado que
requer um procedimento de entrada/sada tipo derivado definido pelo usurio (user-defined derived-type input/output
procedure) como descrito na seo 9.5.2. Se um item da lista tipo derivado aparece na lista de sada, o valor
retornado para o especificador IOLENGTH= assume que nenhum procedimento de entrada/sada tipo derivado
definido pelo usurio ser invocado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 236
9.10 Erro, Fim-de-registro e Condio Fim-de-arquivo
9.10 Error, end-of-record, and end-of-file conditions
O conjunto de condies de erro de entrada/sada dependente do processador.
Uma condio de fim-de-registro (end-of-record condition) ocorre quando uma instruo de entrada sem
avano tenta transferir dados de uma posio alm do fim do registro atual, amenos que o arquivo seja um arquivo
de fluxos (stream file) e o registro atual est no fim do arquivo (uma condio fim-de-arquivo ocorre neste caso).
Uma condio fim-de-arquivo (end-of-file condition ) ocorre nos seguintes casos:
1. quando um registro fim-de-arquivo (endfile) encontrado durante a leitura do arquivo conectado para
acesso sequencial
2. quando uma tentativa feita de ler um registro alm do fim de um arquivo interno
3. quando uma tentativa feita para ler alm do fim de um arquivo de fluxos (stream file)
Uma condio fim-de-arquivo (end-of-file) pode ocorrer no incio da execuo de uma instruo de entrada.
Uma condio fim-de-arquivo tambm pode ocorrer durante a execuo de uma instruo de entrada formatada
quando mais de um registro requerido pela interao da lista de entrada e o formato. Uma condio fim-de-
arquivo tambm pode ocorrer durante a execuo de uma instruo de entrada em fluxo (stream input statement).
9.10.1 Condies de Erro e Especificador ERR=
9.10.1 Error conditions and the ERR= specifier
Se uma condio de erro ocorre durante a execuo de uma instruo de entrada/sada, a posio do
arquivo se torna indeterminada.
Se uma condio de erro ocorre durante a execuo de uma instruo de entrada/sada que no contm o
especificador ERR= nem o especificador IOSTAT=, execuo do programa terminado. Se uma condio de erro
ocorre durante a execuo de uma instruo de entrada/sada que contm o especificador ERR= ou o especificador
IOSTAT= ento
1. processamento da lista entrada/sada, se existir, termina
2. se a instruo uma instruo de transferncia de dados ou o erro ocorre durante a operao espera (wait
operation), todos as do-variables na instruo que iniciaram a transferncia se tornam indefinidos
3. Se um especificador IOSTAT= aparece, a scalar-int-variable ino especificador IOSTAT= se torna
definido como especificado em 9.10.4
4. Se um especificador IOMSG= aparece, a iomsg-variable se torna definida como especificado em 9.10.5
5. se a instruo uma instruo READ e ela contm um especificador SIZE=, a scalar-int-variable no
especificador SIZE= se torna definido como especificado em 9.5.1.14
6. se a instruo uma instruo READ ou a condio de erro ocorre em uma operao espera para a
transferncia iniciada por uma instruo READ, todos os itens de entrada ou objetos do grupo lista de
nomes (namelist group objects) na instruo que iniciou a transferncia se tornam indefinidos
7. se um especificador ERR= aparece, a execuo continua com a instruo rotulada pelo rtulo no
especificador ERR=
9.10.2 Condio Fim-de-arquivo e especificador END=
9.10.2 End-of-file condition and the END= specifier
Se uma condio fim-de-arquivo ocorre durante a execuo de uma instruo entrada/sada que no contm
um especificador END= nem um especificador IOSTAT=, execuo do programa termina. Se uma condio fim-
de-arquivo ocorre durante a execuo de uma instruo entrada/sada que contm um especificador END= ou um
especificador IOSTAT= e uma condio de erro no ocorre, ento
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 237
1. processamento da lista entrada, se existir, termina
2. se a instruo uma instruo de transferncia de dados ou o erro ocorre durante a operao espera (wait
operation), todos as do-variables na instruo que iniciaram a transferncia se tornam indefinidos
3. se a instruo uma instruo READ ou a condio de fim-de-arquivo ocorre em uma operao espera
para a transferncia iniciada por uma instruo READ, todos os itens de entrada ou objetos do grupo lista
de nomes (namelist group objects) na instruo que iniciou a transferncia se tornam indefinidos
4. se o arquivo especificado na instruo de entrada em um arquivo de registro externo, ele posicionado
depois do registro fim-de-arquivo (endfile record)
5. se um especificador IOSTAT= aparece, a scalar-int-variable no especificador IOSTAT= se torna
definido como especificado em 9.10.4
6. se um especificador IOMSG= aparece, a iomsg-variable se torna definida como especificado em 9.10.5
7. se um especificador END= aparece, a execuo continua com a instruo rotulada pelo rtulo no
especificador END
9.10.3 Condio Fim-de-registro e Especificador EOR=
9.10.3 End-of-record condition and the EOR= specifier
Se uma condio fim-de-registro (end-of-record condition) ocorre durante a execuo de uma instruo de
entrada/sada que no contm o especificador EOR= nem um especificador IOSTAT=, a execuo do programa
termina. Se uma condio fim-de-registro ocorre durante a execuo de uma instruo de entrada/sada que contm
um especificador EOR= ou um especificador IOSTAT= e uma condio de erro no ocorre, ento
1. se o modo preenchimento (pad mode) tem o valor YES, o registro preenchido com brancos para satisfazer
os itens da lista de entrada (9.5.3.4.2) e descritor de edio de dados correspondente que requeira mais
caracteres que o registro contm. Se o modo preenchimento tem o valor NO o item da lista de entrada se
torna indefinido
2. processamento da lista entrada, se existir, termina
3. se a instruo uma instruo de transferncia de dados ou o erro ocorre durante a operao espera (wait
operation), todos as do-variables na instruo que iniciaram a transferncia se tornam indefinidos
4. o arquivo especificado na instruo de entrada posicionado depois do registro atual
5. se um especificador IOSTAT= aparece, a scalar-int-variable no especificador IOSTAT= se torna
definido como especificado em 9.10.4
6. se um especificador IOMSG= aparece, a iomsg-variable se torna definido como especificado em 9.10.5
7. se um especificador SIZE= aparece, a scalar-int-variable no especificador SIZE= se torna definida
como especificado em (9.5.1.14)
8. se um especificador EOR= aparece, a execuo continua com a instruo rotulada pelo rtulo no
especificador EOR=
9.10.4 Especificador IOSTAT=
9.10.4 IOSTAT= specifier
Execuo de uma instruo de entrada/sada contendo um especificador IOSTAT= faz com que a scalar-
int-variable no especificador IOSTAT= se torne definido com
1. um valor zero no uma ocorrncia de condio de erro, condio fim-de-arquivo nem ocorrncia de fim-
de-registro
2. um valor inteiro positivo dependente do processador se uma condio de erro ocorre
3. um valor inteiro negativo dependente do processador da constante IOSTAT_END (13.8.2.5) se uma
condio fim-de-arquivo ocorre e nenhuma condio de erro acorre
4. um valor inteiro negativo dependente do processador da constante IOSTAT_EOR (13.8.2.6) se uma
condio fim-de-registro ocorre e nenhuma condio de erro acorre ou condio fim-de-arquivo ocorre
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 238
Nota 9.65
Uma condio fim-de-arquivo pode ocorrer somente para entrada sequencial ou em fluxo (stream) e uma condio
de fim-de-registro pode ocorrer somente para entrada sem avano
Considere o exemplo:
READ(FMT="(E8.3)",UNIT=3,IOSTAT=IOSS) X
IF(IOSS < 0) THEN
! realiza processamento end-of-file no arquivo conectado na unidade 3
CALL END_PROCESSING
ELSEIF(IOSS > 0) THEN
! realiza processamento erro
CALL ERROR_PROCESSING
END IF
9.10.5 Especificador IOMSG=
9.10.5 IOMSG= specifier
Se uma condio de erro, fim-de-arquivo ou fim-de-registro ocorre durante a execuo de uma instruo de
entrada/sada, o processador tem que atribuir uma mensagem explicativa iomsg-variable. Se esta condio no
ocorre, o processador no muda o valor de tem iomsg-variable.
9.11 Restries sobre Instrues Entrada/Sada
9.11 Restrictions on input/output statements
Se uma unidade ou arquivo conectado a uma unidade, no tem todas as propriedades requeridas para a
execuo de certas instrues de entrada/sada, elas no podem ser usadas nestas unidades.
Uma instruo de entrada/sada que executada enquanto outra instruo de entrada/sada est sendo
executada chamada de instruo de entrada/sada recursiva (recursive input/output statement).
Uma instruo de entrada/sada recursiva no pode identificar uma unidade externa exceto que a instruo
de transferncia de dado filha pode identificar a unidade externa da instruo de transferncia de dado raiz.
Uma instruo de entrada/sada no pode modificar o valor de qualquer especificao de formato
estabelecida.
Uma instruo de entrada/sada recursiva no pode modificar o valor de qualquer unidade interna exceto
que a instruo WRITE recursiva pode modificar a unidade interna identificada pela instruo WRITE recursiva.
O valor de um especificador em uma instruo de entrada/sada no pode depender de qualquer input-
item, io-implied-do do-variable ou da definio ou avaliao de qualquer outro especificador na io-control-
spec-list ou inquire-spec-list nesta instruo.
O valor de qualquer subscrito ou limite de subscrito de uma varivel que aparece em um especificador em
uma instruo de entrada/sada no pode depender de qualquer input-item, io-implied-do do-variable ou da
definio ou avaliao de qualquer outro especificador na io-control-spec-list ou inquire-spec-list nesta
instruo.
Em a instruo de entrada/sada, a varivel especificada em um especificador IOSTAT=, IOMSG= ou
SIZE=, se existir, no pode ser associado com qualquer entidade na lista de entrada/sada de transferncia de dados
(9.5.2) ou namelist-group-object-list nem com a do-variable de um io-implied-do em uma lista de
entrada/sada de transferncia de dados.
Em uma instruo de transferncia de dado, se a varivel especificada em um especificador IOSTAT=,
IOMSG= ou SIZE= um elemento de matriz, seus valores de subscrito no pode ser afetado pela transferncia de
dado, processamento do io-implied-do ou definio ou avaliao de qualquer outro especificador na io-
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 239
implied-do.
Uma varivel que pode tornar-se definida como resultado do uso de um especificador em uma instruo
INQUIRE ou qualquer entidade associada, no pode aparecer em outro especificador na mesma instruo
INQUIRE.
Uma instruo STOP no pode ser executada durante a execuo de uma instruo de entrada/sada.
Nota 9.66
Restries na avaliao de expresses (7.1.8) probem certos efeitos colaterais
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 240
10. Editao de Entrada/Sada
Section 10: Input/output editing
Um formato usado junto com uma instruo de entrada/sada prov informaes que controla a edio entre
a representao interna do dado e os caracteres de uma sequncia de registros formatados.
Um especificador A FMT= (9.5.1.1) em uma instruo de entrada/sada pode referir-se a uma instruo
FORMAT ou a uma expresso caractere que contm a especificao do formato. Uma especificao de formato
prov informao de edio explcitas. O especificador FMT= pode, alternativamente, ser um asterisco ( * ) que
indica formatao lista dirigida (list-directed formatting) (10.9). Formatao lista de nomes (namelist formatting)
(10.10) pode ser indicada especificando-se um namelist-group-name em vez de um formato.
10.1 Mtodos Explcitos de Especificao de Formato
10.1 Explicit format specification methods
Especificao de um formato explcito pode ser fornecido em
1. uma instruo FORMAT ou em
2. uma expresso caractere
10.1.1 Instruo Formato
10.1.1 FORMAT statement
R1001 format-stmt is FORMAT format-specification
R1002 format-specification is ([format-item-list])
C1001 (R1001) Uma format-stmt tem que ter um rtulo
C1002 (R1002) O dois pontos usado para separar format-items em um format-item-list pode se
omitido
(1) entre o descritor de edio P e um descritor de edio F, E, EN, ES, D ou G que (10.7.5) escrito
imediatamente depois, possivelmente precedido por um especificador de repetio
(2) Antes de uma descritor de edio barra quando a especificao de repetio opcional no est
presente(10.7.2)
(3) depois de um descritor de edio barra ou
(4) antes ou depois do descritor de edio dois pontos(10.7.3)
Caracteres brancos podem preceder o parnteses esquerdo inicial de uma especificao de formato.
Caracteres branco adicionais podem aparecer em qualquer ponto dentro da especificao do formato, sem efeito na
interpretao da especificao do formato, exceto dentro de um descritor de edio de cadeia de caracteres
(character string edit descriptor) (10.8).
Nota 10.1
Exemplos de instruo FORMAT so:
5 FORMAT (1PE12.4, I10)
9 FORMAT (I12, /, Dates: , 2 (2I3, I5))
10.1.2 Especificao de Formato Caractere
10.1.2 Character format specification
Uma expresso caractere usada como um formato em uma instruo de entrada/sada formatada tem que
ser avaliada como uma cadeia de caracteres (character string) cuja parte inicial uma especificao de formato
vlida.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 241
Nota 10.2
A especificao de formato inicia com o parntese esquerdo e termina com o parntese direito
Todas as posies de caracteres at e incluindo incluindo o parntese direito da especificao de formato
tm que estar definidas quando da execuo da instruo de entrada/sada e no pode ser redefinido ou indefinido
durante a execuo da instruo. As posies dos caracteres, se existirem, depois do parntese direito que termina a
especificao do formato no precisam estar definidas e podem conter qualquer dado caractere sem efeito na
interpretao da especificao do formato.
Se o formato uma matriz caractere, ele tratado como se todos os elementos da matriz fossem
especificados na ordem dos elementos da matriz e ento concatenados. Entretanto, se um formato uma elemento
de matriz caractere, a especificao do formato tem que estar completamente contida dentro do elemento de matriz.
Nota 10.3
Se uma constante caractere usada como um formato em uma instruo de entrada/sada, cuidados devem ser
tomados para que o valor da constante caractere seja uma especificao de formato vlida. Em particular, se uma
especificao de formato delimitada por apstrofo contm um descritor de edio constante caractere delimitado
por apstrofos, dois apstrofos tm que ser escritos para delimitar o descritor de edio e quatro apstrofos tm
que ser escritos para cada apstrofo que ocorre dentro de descritor de edio. Por exemplo, o texto
2 ISNT 3
pode ser escrito por vrias combinaes de instrues de sada e especificaes de formato:
WRITE (6, 100) 2, 3
100 FORMAT (1X, I1, 1X, ISNT, 1X, I1)
WRITE (6, (1X, I1, 1X, ISNT, 1X, I1)) 2, 3
WRITE (6, (A)) 2 ISNT 3
A dobra de apstrofos internos usualmente pode ser evitada pelo uso se aspas (quotation marks) para delimitar a
especificao de formato e a dobra de aspas pode usualmente ser evitada pelo uso de apstrofos como
delimitadores
10.2. Forma de uma Lista de Itens de Formatos
10.2 Form of a format item list
R1003 format-item is [r]data-edit-desc
or control-edit-desc
or char-string-edit-desc
or [r](format-item-list)
R1004 r is int-literal-constant
C1003 (R1003) r tem que ser positivo
C1004 (R1003) r no pode ter parmetro de subtipo (kind parameter) especificado para ele
Uma constante literal inteira r chamada de especificao de repetio (repeat specification).
10.2.1 Descritores de Edio
10.2.1 Edit descriptors
Um descritor de edio (edit descriptor) um descritor de edio de dados (data edit descriptor), um
descritor de edio de controle (control edit descriptor) ou um descritor de edio de cadeia de caracteres
(character string edit descriptor).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 242
R1005 data-edit-desc is Iw [. m ]
or Bw [. m ]
or Ow [. m ]
or Zw [. m ]
or Fw . d
or Ew . d [Ee ]
or EN w . d [ E e ]
or ES w . d [ E e ]
or Gw . d [Ee ]
or Lw
or A[w ]
or Dw . d
or DT [ char-literal-constant ] [ ( v -list ) ]
R1006 w is int-literal-constant
R1007 m is int-literal-constant
R1008 d is int-literal-constant
R1009 e is int-literal-constant
R10010 v is signed-int-literal-constant
C1005 (R1009) e tem que ser positivo
C1006 (R1006) w tem que ser zero ou positivo para os descritores de edio I, B, O, Z e F.w tem que ser
positivo para todos os outros descritores de edio
C1007 (R1005) w, m, d , e e v no podem ter parmetros de subtipo (kind parameters) especificados para ele
C1008 (R1005) Uma char-literal-constant no descritor de edio DT no pode ter parmetro de subtipo
(kind parameter) especificado para ele
I, B, O, Z, F, E, EN, ES, G, L, A, D e DT indica a maneira de edio.
R10011 control-edit-desc is position-edit-desc
or [r ]/
or :
or sign-edit-desc
or k P
or blank-interp-edit-desc
or round-edit-desc
or decimal-edit-desc
R10012 k is signed-int-literal-constant
C1009 (R1012) k no pode ter parmetro de subtipo (kind parameter) especificado para ele
No k P, k chamado de fator de escala (scale factor).
R10013 position-edit-desc is Tn
or TL n
or TR n
or n X
R10014 n is int-literal-constant
C1010 (R1014) n tem que ser positivo
C1011 (R1014) n no pode ter parmetro de subtipo (kind parameter) especificado para ele
R10015 sign-edit-desc is SS
or SP
or S
R10016 blank-interp-edit-desc r is BN
or BZ
R10017 ound-edit-desc is RU
or RD
or RZ
or RN
or RC
or RP
R10018 decimal-edit-desc is DC
or DP
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 243
T, TL, TR, X, slash, colon, SS, SP, S, P, BN, BZ, RU, RD, RZ, RN, RC, RP, DC e DP indica a maneira de edio.
R10019 char-string-edit-desc is char-literal-constant
C1012 (R1019) A char-literal-constant no pode ter parmetro de subtipo (kind parameter) especificado
para ela
Cada rep-char em um descritor de edio de cadeia de caracteres (character string edit descriptor) tem que
ser um dos caracteres capazes de representao pelo processador.
Os descritores de edio de cadeia de caracteres (character string edit descriptor) provm constantes de dado
para a sada e no so vlidos para entrada.
Os descritores de edio so, sem considerao do tipo de letra, para os caracteres na constante caractere.
10.2.2 Campos
10.2.2 Fields
Um campo (field) a parte de um registro que lida na entrada ou escrita na sada quando o controle do
formato (format control) encontra um descritor de edio de dados ou um descritor de edio de cadeia de caracteres.
A largura do campo (field width) o tamanho em caracteres do campo.
10.3. Interao entre Lista de Entrada/sada e Formato
10.3 Interaction between input/output list and format
No incio da transferncia de dados formatado usando um especificador de formato inicia um controle do
formato (format control) (9.5.3.4.2). Cada ao do controle do formato depende das informaes comuns
fornecidas juntas pelo
1. prximo descritor de edio na especificao de formato e
2. prximo item efetivo na lista de entrada/sada, se ela existir
Se uma lista de entrada/sada especificar ao menos um item da lista efetiva, ao menos um descritor de
edio de dado tem que existir na especificao do formato.
Nota 10.4
Uma especificao de formato vazia da forma ( ) pode ser usada somente se a lista de entrada/sada no tem itens
na lista efetiva (9.5.3.4). Itens com comprimento caractere zero so itens da lista efetiva, mas matrizes de tamanho
zero e listas de DO implcitos com um contador de iterao zero no so
Uma especificao de formato interpretada da esquerda para a direita. A exceo so itens do formato
precedidos por uma especificao de repetio r e reverso de formato (format reversion) (descritos a seguir).
Um item de formato precedido por uma especificao de repetio processado como uma lista de r itens,
cada um idntico ao item do formato mas sem a especificao de repetio e separado por vrgulas.
Nota 10.5
Uma especificao de repetio omitida tratada da mesma forma como se o especificador de repetio tivesse o
valor um
Para cada descritor de edio de dados interpretado em uma especificao de formato, existe uma item
efetivo correspondente especificado pela lista de entrada/sada (9.5.2), exceto que um item da lista de entrada/sada
do tipo complexo requer a interpretao de dois descritores de edio F, E, em, ES, D ou G. Para cada descritor de
edio de controle ou descritor de edio caractere, no existe item correspondente especificado na lista de
entrada/sada e o controle do formato (format control) comunica a informao diretamente com o registro.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 244
Quando um controle do formato encontra um descritor de edio de dados em uma especificao de
formato, ele determina se existe um item efetivo correspondente especificado pela lista de entrada/sada. Se este
este item existe, ele transmite informao editada apropriada entre o item e o registro e ento o controle de formato
feito. Se no h este tipo de item, o controle do formato termina.
Se o controle do formato encontra um descritor de edio dois pontos (colon edit descriptor) em uma
especificao de formato e outro item efetivo da lista de entrada/sada (effective input/output list item) no
especificado, o controle do formato termina.
Se o controle do formato encontra o parntese mais a direita de uma especificao de formato completa e
outro item efetivo da lista de entrada/sada no especificado, o controle do formato termina. Entretanto, se outro
item efetivo da lista de entrada/sada especificado, o arquivo posicionado de maneira idntica como ele
posicionado quando um descritor de edio barra (slash) processado (10.7.2). O controle do formato ento volta
para o incio do item do formato terminado pelo ltimo parntese direito precedente que no parte do descritor de
edio DT. Se no existir este parntese direito precedente, o controle do formato vai para o primeiro parntese
esquerdo da especificao de formato. Se qualquer reverso acontece, a poro reutilizada da especificao do
formato tem que conter ao menos um descritor de edio de dados. Se o controle do formato reverter para um
parntese que precedido por uma especificao de repetio, a especificao de repetio reutilizada. Reverso
do controle do formato, sobre si prprio, no tem efeito nos modos mutveis (9.4.1).
Nota 10.6
Exemplo: a especificao de formato:
10 FORMAT(1X,2(F10.3,I5))
com uma lista de sada igual a
WRITE(10,10) 10.1,3,4.7,1,12.4,5,5.2,6
produz a mesma sada que a especificao de formato:
10 FORMAT(1X,F10.3,I5,F10.3,I5/F10.3,I5,F10.3,I5)
10.4. Posicionando pelo uso de Controle de Formato
10.4 Positioning by format control
Depois de cada descritor de edio de dado ou descritor de edio de cadeia de caractere (character string
edit descriptor), o arquivo posicionado depois do ltimo caractere lido ou registo no registro atual.
Depois de cada descritor de edio T, TL, TR ou X ser processado, o arquivo posicionado como descrito
em 10.7.1. Depois cada descritor de edio barra (slash), o arquivo posicionado como descrito em 10.7.2.
Durante sada de fluxo formatada, o processamento de um descritor de edio A pode causar o
posicionamento do arquivo (10.6.3).
Se o controle do formato reverte como descrito em 10.3, o arquivo posicionado de uma maneira idntica a
forma como ele posicionado quando um descritor de edio barra (slash) processado (10.7.2).
Durante a operao de leitura, quaisquer caracteres no processado do registro atual so pulados cada vez
que o prximo registro lido.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 245
10.5. Smbolo Decimal
10.5 Decimal symbol
O smbolo decimal (decimal symbol) o caractere que separa a parte inteira da parte fracionria em uma
representao decimal de um nmero rela em um arquivo interno ou externo. Quando o modo de edio decimal
(decimal edit mode) POINT, o smbolo decimal um ponto decimal. Quando o modo de edio decimal
COMMA, o smbolo decimal uma vrgula.
10.6. Descritores de Edio de Dados
10.6 Data edit descriptors
Descritores de edio de dados produz a converso de dados para ou da sua representao interna; durante
sada em fluxo formatada (formatted stream output), o descritor de edio A pode tambm causar um posicionamento
de arquivo. Na entrada, a varivel especificada se torna definida a menos que uma condio de erro, uma condio
de fim-de-arquivo ou uma condio de fim-de-registro ocorra. Na sada, a expresso especificada avaliada.
Durante a entrada vindo de um arquivo Unicode,
1. caracteres no registro que correspondem a uma varivel caractere ASCII tem que ter uma posio na
sequncia de arrumao de caracteres do conjunto de caracteres ISO 10646 de 127 ou menores e
2. caracteres no registro que corresponde a uma varivel caractere default tem que ser representvel no
conjunto de caracteres default
Durante a entrada vindo de um arquivo no Unicode,
1. caracteres no registro que correspondem a uma varivel caractere tem que ter o subtipo (kind) da varivel
caractere e
2. caracteres no registro que corresponde a uma varivel numrica ou lgica tem que ser do tipo caractere
default
Durante sada para um arquivo Unicode, todos os caracteres transmitidos para o registro so do tipo
caractere ISO 10646. Se um item caractere da lista de entrada/sada ou descritor de edio cadeias de caractere
contm um caractere que no representvel no tipo caractere ISO 10646, o resultado dependente do
processador.
Durante a sada para um arquivo no Unicode, caracteres transmitidos para o registro como o resultado do
processamento se um descritor de edio cadeias de caractere ou como um resultado de uma avaliao numrica,
lgica ou entidade de dado caractere default so do tipo caractere default.
10.6.1 Edio Numrica
10.6.1 Numeric editing
Os descritores de edio I, B, O, Z, F, E, EN, ES, D e G podem ser usados para especificar a entrada/sada
de dado inteiro, dado real e dado complexo. As seguintes regras gerais se aplicam:
1. na entrada, brancos anteriores no so significativos. Quando o campo de entrada no uma especificao
de exceo IEEE (IEEE exceptional specifiation) (10.6.1.2.1), a interpretao de brancos, diferente de brancos
anteriores, determinada pelo modo interpretao branco (blank interpretation mode) (10.7.6). Sinal de mais
pode ser omitido Um campo contendo somente brancos considerado zero.
2. Na entrada, edies com F, E, EN, ES, D e G, um smbolo decimal aparecendo no campo de entrada
sobrescreve a poro de um descritor de edio que especifica a localizao do smbolo decimal. O campo
de entrada pode ter mais dgitos que o processador usa para aproximar o valor do datum
3. Na sada, edies com I, F, E, EN, ES, D e G a representao de um valor positivo ou zero interno no
campo pode ser prefixada com um sinal mais, como controlada pelos descritores de edio S, SP ou SS ou
pelo processador. A representao de um valor interno negativo no campo tem que ser prefixada com um
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 246
sinal de menos
4. Na sada, a representao justificada direita no campo. Se o nmero de caracteres produzidos pela
edio menor que a largura do campo, brancos anteriores so inseridos no campo
5. Na sada, se o nmero de caracteres produzido excede a largura do campo ou se um expoente excede seu
comprimento especificado usando o descritor de edio Ew.dEe, ENw.dEe, Esw.dEe ou Gw.dEe o
processador pode encher a toda a largura do campo w com asteriscos. Entretanto, o processador no pode
produzir asteriscos se a largura do campo no excedeu quando caracteres opcionais so omitidos
Nota 10.7
Quando um descritor de edio SP est em uso, o sinal de mais opcional
6. Na sada, edies com I, B, O, Z e F, o valor especificado do campo com largura w pode ser zero. Nestes
casos, o processador seleciona a menor largura de campo atual que no resulte em um campo cheio de
asteriscos. O valor especificado w no pode ser zero na entrada
10.6.1.1 Edio de Inteiro
10.6.1.1 Integer editing
Os descritores de edio Iw, Iw.m, Bw, Bw.m, Ow, Ow.m, Zw e Zw.m indicam que o campo a ser editado
ocupam w posies, exceto quando w zero. Quando w zero, o processador seleciona a largura de campo. Na
entrada, w no pode ser zero. Um item especificado da lista de entrada/sada tem que ser do tipo inteiro. O descritor
de edio G tambm pode ser usado para editar dados inteiros (10.6.4.1.1).
Na entrada, m no tem efeito.
No campo de entrada para o descritor de edio I, a cadeia de caracteres (character string) tem que ser um
signed-digit-string (R408), exceto para a interpretao de brancos. Para os descritores de edio B, O e Z, a
cadeia de caracteres tem que consistir de dgitos binrios, octal ou hexadecimal (R412, R413, R414) nos
respectivos campos de entrada. Os dgitos hexadecimais em letras minsculas a at f no campo de entrada
hexadecimal so equivalentes ao correspondente dgito hexadecimal em letras maisculas.
O campo de sada para o descritor de edio Iw consiste de zero ou mais brancos anteriores seguidos pelo
sinal de menos se o valor do dado interno negativo ou um sinal opcional de mais caso contrrio, seguido pela
magnitude do valor interno como um digit-string sem zeros anteriores.
Nota 10.8
Uma digit-string sempre consiste de pelo menos um dgito
O campo de sada dos descritores Bw, Ow e Zw consiste de zero ou mais brancos anteriores seguido pelo
valor interno em uma forma idntica aos dgitos de uma constante binria, octal ou hexadecimal, respectivamente,
com o mesmo valor e sem zeros precedentes.
Nota 10.9
Uma constante binria, octal ou hexadecimal sempre consiste de pelo menos um dgito
O campo de sada para o descritor de edio Iw.m, Bw.m, Ow.m e Zw.m o mesmo que os dos descritores
de edio Iw, Bw, Ow e Zw, respectivamente, exceto que a digit-string consiste de pelo menos m dgitos. Se
necessrio, suficientes zeros precedentes so includos para chegar ao valor mnimo de m dgitos. O valor de m no
pode exceder o valor de w, exceto quando w zero. Se m zero e o valor do interno dado zero, o campo de sada
consiste somente de caracteres brancos, independente do controle de sinal em efeito. Quando m e w so ambos zero
e o valor do dado interno zero, um caractere branco produzido.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 247
10.6.1.2 Edio de Real e Complexo
10.6.1.2 Real and complex editing
Os descritores de edio F, E, EN, ES e D especificam a edio de dado reais e complexos. Um item da
lista de entrada/sada correspondendo a um descritor de edio F, E, EN, ES ou D tem que ser real ou complexo. O
descritor de edio G tambm pode ser usado para editar dado real ou complexo (10.6.4.1.2).
Letras minsculas equivalente a correspondente letra maiscula em uma especificao de exceo IEEE
(IEEE exceptional specifiation) ou o expoente em em um campo de entrada numrico.
10.6.1.2.1 Edio F
10.6.1.2.1 F editing
O descritor de edio Fw.d indica que o campo ocupa w posies e a parte fracionaria consiste de d dgitos.
Quando w zero, o processador seleciona a largura do campo. Na sada, w no pode ser zero.
O campo de entrada consiste de uma especificao de exceo IEEE (IEEE exceptional specifiation) ou
consiste de um sinal opcional, seguido por uma cadeia de um ou mais dgitos opcionalmente contendo um smbolo
decimal, incluindo quaisquer brancos interpretado como zeros. O d no tem efeito na entrada se o campo de entrada
contm um smbolo decimal. Se o smbolo decimal omitido, os d dgitos mais a direita da cadeia, com zeros
anteriores se necessrio, so interpretados como a parte fracionria do valor representado. A cadeia de dgitos pode
conter mais dgitos do que aqueles que o processador usa para aproximar o valor. A forma bsica pode ser seguida
por um expoente de uma das seguintes formas:
1. um sinal seguido por uma cadeia de dgitos (digit-string)
2. E seguido por zero ou mais brancos, seguido por uma cadeia de dgitos contendo sinal (signed-digit-
string)
3. D seguido por zero ou mais brancos, seguido por uma signed-digit-string
Um expoente contendo um D processado identicamente como um expoente contendo um E.
Nota 10.10
Se um campo de entrada no contm um expoente, o efeito como se a forma bsica fosse seguida por um
expoente com o valor -k , onde k o valor de escala utilizado (10.7.5)
Um campo que uma especificao de exceo IEEE (IEEE exceptional specifiation) consiste de brancos
opcionais, seguido por um dos casos
1. um sinal opcional, seguido pelo string INF ou o string INFINITY ou
2. um sinal opcional, seguido pelo string NAN, opcionalmente seguido por zero ou mais caracteres
alfanumrico envolvido em parnteses
opcionalmente seguido de brancos.
O valor especificado pela forma (1) um infinito IEEE (IEEE infinity); esta forma no pode ser usada se o
processador no suporta infinitos IEEE para a varivel de entrada. O O valor especificado pela forma (2) um NaN
IEEE (IEEE NaN Not a Number no um nmero); esta forma no pode ser usada se o processador no suporta o
valor NaN IEEE para a varivel de entrada. O valor NaN um NaN quieto (quiet NaN sem levantar um condio) se
o nico caractere no branco no campo NAN ou NAN(); caso contrrio, o valor NaN dependente do
processador. A interpretao do sinal em uma campo de entrada NaN dependente do processador.
Para um valor interno que um infinito IEEE, o campo de sada consiste de brancos, se necessrio, seguido
pelo sinal menos para infinito negativo ou opcionalmente um sinal mais, caso contrrio, seguido pelas letras Inf
ou Infinity, justificada a direita dentro do campo. Se w menor que 3, o campo preenchido com asteriscos; caso
contrrio, se w menor que 8, Inf utilizado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 248
Para um valor interno que uma NaN IEEE, o campo de sada consiste de brancos, se necessrio, seguido
pelas letras NaN e opcionalmente seguido por um at w 5 caracteres alfanumricos dependente do processador
envolvidos em parntese, justificado a direita dentro do campo. Se w menor que 3, o campo preenchido com
asteriscos.
Nota 10.11
Os caracteres dependente do processador seguindo NaN pode conter informao adicional sobre este NaN
particular
Para um valor interno que no um infinito IEEE nem um NaN, o campo de sada consiste de brancos, se
necessrio, seguido do sinal menos se o valor interno negativo ou um sinal de mais opcional caso contrrio,
seguido por uma cadeia de dgitos que contm o smbolo decimal e representa a magnitude do valor interno,
modificado pelo fator de escala e arredondado para d dgitos fracionrios. Zeros antecedentes no so permitidos
exceto para um zero opcional imediatamente esquerda do smbolo decimal se a magnitude do valor no campo de
sada menor que um. O zero opcional tem que aparecer se no houver dgitos no campo de sada.
10.6.1.2.2 Edio E e D
10.6.1.2.2 E and D editing
Os descritores de edio Ew.d, Dw.d e Ew.dEe indicam que o campo externo ocupa w posies, a parte
fracionria consiste de d dgitos, a menos que um fator de escala maior que um esteja em uso e que a parte
fracionria consiste de e dgitos. O e no tem efeito na entrada.
A forma e interpretao do campo de entrada o mesma que para a edio Fw.d (10.6.1.2.1).
Para um valor interno que um infinito IEEE ou NaN, a forma do campo de sada a mesma que a usada
em Fw.d.
Para um valor interno que no um infinito IEEE nem um NaN, a forma do campo de sada para o fator de
escala zero :
!|0|. x
1
x
2
.x
d
exp
onde
! significa o sinal mais ou o sinal menos
. significa o smbolo decimal (10.5)
x
1
x
2
.x
d
so os d dgitos mais significativos do valor interno depois do arredamento
exp o expoente decimal tendo uma das seguintes formas:
Descritor de edio Valor absoluto do
expoente
Forma do expoente
Ew.d
|exp|99 E!z
1
z
2
ou 0!z
1
z
2
99<|exp|999 !z
1
z
2
z
3
Ew.dEe |exp|10
e
1 E!z
1
z
2
.z
e
Dw.d
|exp|99 D!z
1
z
2
ou E!z
1
z
2
ou
0!z
1
z
2
99<|exp|999 !z
1
z
2
z
3

onde cada z um dgito
O sinal no expoente utilizado. Um sinal mais utilizado se o valor do expoente zero. As formas do
descritor de edio Ew.d e Dw.d no podem ser usadas se |exp|>999.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 249
O fator de escala k controla a normalizao decimal (10.2.1, 10.7.5). Se dk<0 , o campo de sada
contm exatamente |k| zeros precedentes e d|k| dgitos significantes depois do smbolo decimal. Se
0kd+2 , o campo de sada contm exatamente k dgitos s a esquerda do smbolo decimal e d k+1
dgitos significantes a direita do smbolo decimal. Outros valores de k no so permitidos.
10.6.1.2.3 Edio EN
10.6.1.2.3 EN editing
O descritor de edio EN produz um campo de sada na forma do nmero real na representao de
engenharia tal que o expoente decimal divisvel por trs e o valor absoluto do significando (significand) (R418)
maior que ou igual a 1 e menor que 1000, exceto quando o valor se sada zero. O fator de escala no tem efeito na
sada.
As formas do descritor de edio so ENw.d e ENw.dEe indicando que o campo externo ocupa w posies,
a parte fracionaria consiste de d dgitos e a parte do expoente de e dgitos.
A forma e interpretao do campo de entrada so as mesmas que as da edio Fw.d (10.6.1.2.1).
Para um valor interno que um infinito IEEE ou NaN, a forma do campo de sada a mesma que a de
Fw.d.
Para um valor interno que no um infinito IEEE ou um NaN, a forma do campo de sada :
!| yyy . x
1
x
2
.x
d
exp
onde
! significa o sinal mais ou o sinal menos
yyy so de 1 a 3 dgitos representando os dgitos mais significativos do valor interno depois de
arredondados (yyy um inteiro tal que 1yyy<1000 ou se o valor de sada zero yyy=0)
. significa o smbolo decimal (10.5)
x
1
x
2
.x
d
so os prximos d dgitos mais significantes do valor interno depois do arredondamento
exp o expoente decimal, divisvel por 3, tendo uma das seguintes formas:
Descritor de edio Valor absoluto do
expoente
Forma do expoente
ENw.d
|exp|99 E!z
1
z
2
ou 0!z
1
z
2
99<|exp|999 !z
1
z
2
z
3
ENw.dEe |exp|10
e
1 E!z
1
z
2
.z
e

onde cada z um dgito
O sinal no expoente utilizado. Um sinal mais utilizado se o valor do expoente zero. A forma do
descritor de edio ENw.d no pode ser usada se |exp|>999.
Nota 10.12
Exemplos:
Valor interno Campo de sada usando SS, EN12.3
6.421 6.421E+00
-.5 -500.000E-03
.00217 2.170E-03
4721.3 4.721E+03
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 250
10.6.1.2.4 Edio ES
10.6.1.2.4 ES editing
O descritor de edio ES produz um campo de sada na forma de um nmero real na notao cientfica tal
que o valor absoluto do significando (significand) (R418) maior que ou igual a 1 e menor que 10, exceto quando o
valor se sada zero. O fator de escala no tem efeito na sada.
As formas do descritor de edio so ESw.d e ESw.dEe indicando que o campo externo ocupa w posies,
a parte fracionaria consiste de d dgitos e a parte do expoente de e dgitos.
A forma e interpretao do campo de entrada so as mesmas que as da edio Fw.d (10.6.1.2.1).
Para um valor interno que um infinito IEEE ou NaN, a forma do campo de sada a mesma que a de
Fw.d.
Para um valor interno que n~ao um infinito IEEE nem um NaN, a forma do campo de sada :
!| y . x
1
x
2
.x
d
exp
onde
! significa o sinal mais ou o sinal menos
y o dgitos decimal representando o dgito mais significativo do valor interno depois de arredondado
. significa o smbolo decimal (10.5)
x
1
x
2
.x
d
so os prximos d dgitos mais significantes do valor interno depois do arredondamento
exp o expoente decimal tendo uma das seguintes formas:
Descritor de edio Valor absoluto do
expoente
Forma do expoente
ESw.d
|exp|99 E!z
1
z
2
ou 0!z
1
z
2
99<|exp|999 !z
1
z
2
z
3
ESw.dEe |exp|10
e
1 E!z
1
z
2
.z
e

onde cada z um dgito
O sinal no expoente utilizado. Um sinal mais utilizado se o valor do expoente zero. A forma do
descritor de edio ESw.d no pode ser usada se |exp|>999.
Nota 10.13
Exemplos:
Valor interno Campo de sada usando SS, ES12.3
6.421 6.421E+00
-.5 -5.000E-01
.00217 2.170E-03
4721.3 4.721E+03
10.6.1.2.5 Edio de Complexo
10.6.1.2.5 Complex editing
Um datum complexo consiste de um par de dados reais separados. A edio de um datum tipo complexo
especificado por dois descritores de edio cada um especificando a edio de um dado real. O primeiro descritor
de edio especifica a parte real, o segundo especifica a parte imaginria. Os dois descritores de edio podem ser
diferentes. Controle e descritor de edio de cadeia de caracteres (character string edit descriptor) podem ser
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 251
processados entre os descritores de edio para a parte real e o descritor de edio para a parte imaginria.
10.6.1.2.6 Modo de Arredondamento
10.6.1.2.6 Rounding mode
O modo arredondamento pode ser especificado por uma instruo OPEN (9.4.1), uma instruo de
transferncia de entrada/sada de dado (9.5.1.12) ou um descritor de edio (10.7.7).
No que segue, o termo valor decimal (decimal value) significa o nmero decimal exato como dado por uma
cadeia de caracteres, enquanto o termo valor interno (internal value) significa o nmero realmente guardado
(number actually stored) (tipicamente na forma binria) no processador. Por exemplo, ao lidar com a constante
decimal 0.1, o valor decimal a quantidade matemtica exata 1/10, que no tem representao na maioria dos
processadores. Sada formatada de dado real envolve converso de um valor interno para um valor decimal; entrada
formatada envolve converso do valor decimal para um valor interno.
Quando o modo E/S arredondado (I/O rounding mode) UP, o valor resultante vindo da converso o menor
valor representvel que maior ou igual que o valor original. Quando o modo E/S arredondado DOWN, o valor
resultante vindo da converso o maior valor representvel que menor que ou igual que o valor original. Quando
o modo E/S arredondado ZERO, o valor resultante vindo da converso tem que ser o valor mais prximo do
original e no maior em magnitude que o valor original. Quando o modo E/S arredondado NEAREST, o valor
resultante vindo da converso o valor mais prximo de dois valores representveis prximos se um mais
prximo que o outro. Se os dois valores representveis mais prximos so equidistantes do valor original,
dependente do processador a escolha de qual deles utilizar. Quando modo E/S arredondado COMPATIBLE, o
valor resultante vindo da converso o valor mais prximo de dois valores representveis mais prximos ou um
valor afastado de zero se estiver no meio entre eles. Quando o modo E/S arredondado PROCESSOR_DEFINED,
arredondamento durante a converso o modo default dependente do processador, que pode corresponder a um dos
outros modos.
Nos processadores que suportam o arredondamento IEEE (IEEE rounding) nas converso, NEAREST tem
que corresponder ao arredondamento para o mais perto,, como especificado no padro IEEE.
Nota 10.14
Nos processadores que suportam arredondamento IEEE na converso, os modos E/S arredondado COMPATIBLE
e NEAREST iro produzir os mesmos resultados exceto quando o datum est no meio entre os dois valores
representveis. Neste caso, NEAREST ir pegar o valor par, mas COMPATIBLE ir pegar o valor afastado de
zero. Os modos E/S arredondado UP, DOWN e ZERO tm o mesmo efeito que aqueles especificados no padro
IEEE para arredondamento para +, arredondamento para e arredondamento para 0, respectivamente.
10.6.2 Edio do Tipo Lgico
10.6.2 Logical editing
O descritor de edio Lw indica que o campo ocupa w posies. Um item da lista de entrada/sada
especificada tem que ser do tipo lgico. O descritor de edio G tambm pode ser usado para edio de dado lgico
(10.6.4.2).
O campo de entrada consiste de brancos opcionais, opcionalmente seguidos por um ponto decimal, seguido
por um T para verdadeiro (true) ou F para falso (false). O T ou F pode ser seguido por caracteres adicionais no
campo, que so ignorados.
Uma letra maiscula equivalente correspondente letra minscula em um campo de entrada lgico.
Nota 10.15
As constantes lgicas .TRUE. e .FALSE. so formas aceitveis de entrada
O campo de sada consiste de w-1 brancos seguidos por um T ou F, dependendo se o valor interno
verdadeiro (true) ou falso (false), respectivamente.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 252
10.6.3 Edio de Caractere
10.6.3 Character editing
O descritor de edio A[w] usado como um item de lista da entrada e sada do tipo caractere. O descritor
de edio G tambm pode ser usado para editar dados caractere (10.6.4.3). O parmetro de tipo subtipo (kind type
parameter) de todos os caracteres transferidos e convertidos sob o controle de um descritor de edio A ou G
obtido pelo subtipo item na lista correspondente.
Se a largura de um campo w especificada com o descritor de edio A, o campo consiste de w caracteres.
Se a largura do campo w no especificada com o descritor de edio A, o nmero de caracteres no campo o
comprimento do correspondente item da lista, qualquer que seja o valor do seu parmetro de tipo subtipo.
Seja len o comprimento de um item da listra de entrada/sada. Se a largura w do campo especificada para
um descritor de edio A correspondendo a um item de entrada maior maior ou igual a len, os len caracteres mais
a direita sero pegos do campo de entrada. Se o comprimento do campo w especificado menor que len, os w
caracteres iro aparecer justificados a esquerda com len-w brancos posteriores no valor interno.
Se a largura w do campo especificada para um descritor de edio A correspondendo a um item de sada
maior que len, o campo de sada ir consistir de w-len brancos seguidos por len caracteres vindos do valor interno.
Se o comprimento do campo especificado w menor que ou igual a len, o campo de sada consistir dos w
caracteres mais a esquerda vindos do valor interno.
Nota 10.16
Para tipos caractere no default, o preenchimento de branco dependente do processador
Se o arquivo est conectado para acesso em fluxo (stream access), a sada pode ser dividida entre mais de
um registro se ela contm caracteres newline. Um caractere newline um caractere no branco retornado pela
funo intrnseca NEW_LINE. Iniciando com o primeiro caractere do campo de sada, cada caractere que no um
newline escrito no registro atual em posies sucessivas; cada caractere newline produz posicionamento de
arquivo naquele ponto como se uma edio barra (slash editing) tivesse sido encontrada (o registro atual terminado
naquele ponto, um novo registro vazio criado depois do registro atual, este novo registro se torna o ltimo e atual
registro e o arquivo posicionado no incio deste novo registro).
Nota 10.17
Se a funo intrnseca NEW_LINE retorna um caractere branco para um subtipo particular de caractere, ento o
processador no suporta o uso de um caractere deste subtipo e isto causa o trmino do registro em um arquivo de
fluxos formatado
10.6.4 Edio Generalizada
10.6.4 Generalized editing
Os descritores de edio Gw.d e Gw.dEe so usados com um item da lista de entrada/sada de qualquer tipo
intrnseco. Estes descritores de edio indicam que o campo externo ocupa w posies, a parte fracionria consiste
de no mximo d dgitos e a parte exponencial consiste de e dgitos. Quando estes descritores de edio so usados
para especificar entrada/sada de dado inteiro, lgico ou caractere d e e no tem efeito.
10.6.4.1 Edio Numrica Generalizada
10.6.4.1 Generalized numeric editing
Quando usada para especificar uma entrada/sada de dado inteiro, real e complexo, o descritor de edio
Gw.d e Gw.dEe seguem regras gerais para a edio numrica (10.6.1).
Nota 10.18
O descritor de edio Gw.dEe segue quaisquer regras adicionais para o descritor de edio Ew.dEe
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 253
10.6.4.1.1 Edio de Tipo Inteiro Generalizada
10.6.4.1.1 Generalized integer editing
Quando usada para especificar uma entrada/sada de dado inteiro o descritor de edio Gw.d e Gw.dEe
segue as regras do descritor de edio Iw (10.6.1.1), exceto que w no pode ser zero.
10.6.4.1.2 Edio de Tipo Real e Complexo Generalizada
10.6.4.1.2 Generalized real and complex editing
A forma e interpretao do campo de entrada a mesma da edio Fw.d (10.6.1.2.1).
Para um valor interno que um infinito IEEE ou NaN, a forma do campo de sada a mesma de Fw.d.
Caso contrrio, o mtodo de representao no campo de sada depende da magnitude do valor interno que
est sendo editado. Seja N a magnitude do valor interno r o valor do modo de arredondamento na tabela que segue.
Se
0N0.1r 10
d1
ou
N10
d
r
ou N identicamente 0 e d 0, a edio de sada Gw.d a
mesma que a edio de sada k Pew.d e a edio de sada Gw.d a mesma que a edio de sada k Pew.dEe, onde k
o fator de escala (10.7.5) em uso. Se
0.1r10
d1
<N<10
d
r
ou N identicamente 0 e d no zero, o
fator de escala no tem efeito e o valor de N determina a edio como segue:
Magnitude do Dado Converso equivalente
N=0
F(w-n).(d-1), n('b')
0.1r10
d1
<N10r10
d F(w-n).d, n('b')
1r10
d
<N10r10
d+1 F(w-n).(d-1), n('b')
10r 10
d+1
<N100r10
d+2 F(w-n).(d-2), n('b')

10
d2
r10
2
<N10
d1
r10
1 F(w-n).1, n('b')
10
d1
r10
1
<N10
d
r
F(w-n).1, n('b')
onde b um branco, n vale 4 para Gw.d e vale e+2 para Gw.dEe e r definido para cada modo de arredondamento
como segue:
Modo de arredondamento E/S r
COMPATIBLE 0.5
NEAREST 0.5 se o valor mais alto par
0.5 se o valor mais baixo par
UP 1
DOWN 0
ZERO 1 se o valor interno negativo
0 se o valor interno positivo
O valor de w n tem que ser positivo.
Nota 10.19
O fator de escala no tem efeito na sada a menos que a magnitude do datum a ser editado est fora do intervalo
que permite efetivo uso da edio F
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 254
10.6.4.2 Edio de Tipo Lgico Generalizada
10.6.4.2 Generalized logical editing
Quando usada para especificar a entrada/sada de dado lgico, os descritores de edio Gw.d e Gw.dEe
seguem as regras para o descritor de edio Lw (10.6.2).
10.6.4.3 Edio de Tipo Caractere Generalizada
10.6.4.3 Generalized character editing
Quando usada para especificar a entrada/sada de dado caractere, os descritores de edio Gw.d e Gw.dEe
seguem as regras do descritor de edio Aw (10.6.3).
10.6.5 Edio de Tipo Derivado Definido pelo Usurio
10.6.5 User-defined derived-type editing
O descritor de edio DT permite que um procedimento provido pelo usurio seja usado no lugar da
formatao de entrada/sada default do processador para processar a lista de itens do tipo derivado.
O descritor de edio DT pode incluir uma constante literal caractere. O valor caractere DT concatenado
com a constante literal caractere passada para o procedimento de entrada/sada tipo derivado definido pelo
usurio (user-defined derived-type input/output procedure) como o argumento iotype (9.5.3.7). Os valores v do
descritor de edio so passados para a procedimento de entrada/sada tipo derivado definido pelo usurio como
uma lista v do argumento matricial.
Nota 10.20
Para o descritor de edio DTLink List (10, 4, 2), iotype "DTLink List" e a lista v (/10, 4, 2/)
A varivel tipo derivado ou valor correspondente a um descritor de edio DT, tem que ser uma interface
acessvel para um procedimento de entrada/sada tipo derivado correspondente para este tipo derivado (9.5.3.7).
Um descritor de edio DT no pode corresponde a um item da lista no um tipo derivado.
10.7 Descritores de Edio de Controle
10.7 Control edit descriptors
Um descritor de edio de controle (control edit descriptor) no causa uma transferncia de dados nem uma
converso de dados de ou para a representao interna, mas pode ter efeito na converso realizada por descritores
de edio de dados subsequentes.
10.7.1 Edio de Posio
10.7.1 Position editing
Os descritores de edio T, TL, TR e X especificam a posio na qual o prximo caractere ser transmitido
para ou do registro. Se algum caractere pulado por um descritor de edio T, TL, TR e X do tipo caractere no
default e a unidade um arquivo interno do tipo caractere default ou um arquivo externo no Unicode, o resultado
da edio da posio dependente do processador.
A posio especificada por um descritor de edio T pode ser em uma das duas direes partindo da
posio atual. Na entrada, ele permite pores do registro ser processado mais de uma vez, possivelmente com
diferentes edies.
A posio especificada por um descritor de edio X realizada para diante da posio atual. Na entrada, a
posio alm do ltimo caractere do registro pode ser especificada se nenhum caracteres so transmitidos a partir
desta posio.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 255
Nota 10.21
Um descritor de edio nX tem o mesmo efeito que um descritor de edio Tn
Na sada, um descritor de edio T, TL, TR ou X no pode por si s causar a transmisso de caractere e
portanto no pode por si s afetar o comprimento do registro. Se caracteres so transmitidos para as posies ou
posio posterior especificada pelo descritor de edio T, TL, TR ou X, posies puladas e no previamente
preenchidas so preenchidas com brancos. O resultado como se o registro inteiro fosse inicial mente preenchido
com brancos.
Na sada, um caractere em um registro pode ser trocado. Entretanto, um descritor de edio T, TL, TR ou X
nunca faz com que um caractere j colocado no registro ser trocado. Estes tipos de descritores de edio pode
resultar em posicionamento de forma tal que edio subsequente causa uma troca.
10.7.1.1 Edio T, TL e TR
10.7.1.1 T, TL, and TR editing
O limite esquerdo de tabulao (left tab limit) afeta o posicionamento do arquivo pelo uso dos descritores
de edio T e TL. Imediatamente antes da transferncia de dados, o limite esquerdo de tabulao se torna definido
como sendo a posio do caractere do registro atual ou a posio atual no arquivo de fluxos (stream file). Se durante
a transferncia de dado, o arquivo posicionado em outro registro, o limite esquerdo de tabulao se torna definido
como posio caractere um do registro atual.
O descritor de edio Tn indica que a transmisso do prximo caractere para ou do registro para ocorrer
na posio caractere ensima do registro, relativo ao limite esquerdo de tabulao.
O descritor de edio TLn indica que a transmisso do prximo caractere para ou do registro para ocorrer
na posio n caracteres voltando (backward) a partir da posio atual. Entretanto, se n maior que a diferena entre
a posio atual e o limite esquerdo de tabulao, o descritor de edio Tln indica que a transmisso do prximo
caractere de ou para o registro para ocorrer na posio do limite esquerdo de tabulao.
O descritor de edio TRn indica que a transmisso do prximo caractere para ou do registro para ocorrer
na posio n caracteres adiante da posio atual.
Nota 10.22
O n no descritor de edio Tn, TLn ou TRn tem que ser especificado e tem que ser maior que zero
10.7.1.2 Edio X
10.7.1.2 X editing
O descritor de edio nX indica que a transmisso do prximo caractere para ou do registro para ocorrer
na posio n caracteres adiante da posio atual.
Nota 10.23
O n no descritor de edio nX tem que ser especificado e tem que ser maior que zero
10.7.2 Edio Barra
10.7.2 Slash editing
O descritor de edio barra (slash) indica o fim da transferncia de dados para ou do registro atual.
Na entrada vindo de um arquivo conectado para acesso sequencial, a poro restante do registro atual
pulada e o arquivo posicionado no incio do prximo registro. Este registro se torna o registro atual. Na sada para
um arquivo conectado para acesso sequencial ou acesso em fluxo (stream access), um novo registro vazio criado
depois do registro atual; este novo registro ento se torna o ltimo e o registro atual do arquivo e o arquivo
posicionado no incio do registro atual.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 256
Para o arquivo conectado para acesso direto, o nmero do registro incrementado de um e o arquivo
posicionado no incio do registro que possu este nmero, se existe este registro, e este registro se torna o registro
atual.
Nota 10.24
Um registro que no contm caracteres pode ser escrito na sada. Se o arquivo um arquivo interno ou um
arquivo conectado para acesso direto, o registro preenchido com caracteres brancos.
Um registro inteiro pode ser pulado na entrada
Uma especificao de repetio opcional no descritor de edio barra. Se ela no especificada, o valor
default um.
10.7.3 Edio Dois Pontos
10.7.3 Colon editing
O descritor de edio dois pontos (colon) termina o controle de formato se no existe mais itens efetivos na
lista de entrada/sada (9.5.2). O descritor de edio dois pontos no tem efeito se existem mais itens efetivos na lista
de entrada/sada.
10.7.4 Edio SS, SP e S
10.7.4 SS, SP, and S editing
Os descritores de edio SS, SP e S podem temporariamente mudar (9.4.1) o modo sinalizado (sign mode)
(9.4.5.14, 9.5.1.13) para a conexo. Os descritores de edio SS, SP e S ajusta o modo sinalizado correspondente
para o valor do especificador SIGN=SUPPRESS, PLUS e PROCESSOR_DEFINED, respectivamente.
O modo sinalizado (sign mode) controla caracteres opcionais mais nos campos de sada numricos. Quando
o modo sinalizado PLUS, o processador tem que utilizar um sinal mais em qualquer posio que normalmente
contm um sinal mais opcional. Quando o modo sinalizado SUPPRESS, o processador no pode utilizar um sinal
mais nestas posies. Quando o modo sinalizado PROCESSOR_DEFINED, o processador tem a opo de utilizar
ou no um sinal mais nesta posio, obedecendo as regras em 10.6.1(5).
Os descritores de edio SS, SP e S afetam somente as edies I, F, E, EN, ES, D e G durante a execuo
de uma instruo de sada. Os descritores de edio SS, SP e S no tem efeito durante a execuo de uma instruo
de entrada.
10.7.5 Edio P
10.7.5 P editing
O descritor de edio kP muda temporariamente (9.4.1) o fator de escala de uma conexo para k. O fator de
escala afeta a edio de F, E, EN, ES, D e G para quantidades numricas.
O fator de escala k afeta a edio apropriada da seguinte maneira:
1. na entrada, com edies F, E, EN, ES, D e G (desde que no exista expoente no campo) e edio de sada
F, o efeito do fator de escala faz com que a representao externa iguale a representao interna
multiplicada por 10
k
2. na entrada, com edies F, E, EN, ES, D e G, o fator de escala no tem efeito se h um expoente no campo
3. na sada, com edies E e D, o a parte significando (significand) (R418) da quantidade a ser produzida
multiplicada por 10
k
e o expoente reduzido de k
4. na sada, com a edio G, o efeito do fator de escala suspenso a menos que a magnitude do datum que
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 257
est sendo editado esteja fora do intervalo permitido pelo uso de uso da edio F. Se a edio E requerida,
o fator de escala tem o mesmo efeito que na edio E de sada
5. na sada, com as edies EN e ES, o fator de escala no tem efeito
Se modo E/S arredondado (I/O rounding mode) UP, DOWN, ZERO ou NEAREST I/O est em efeito ento
1. na entrada, o fator de escala aplicado ao valor decimal externo e ento este convertido usando o modo
E/S arredondado atual
2. na sada, o valor interno convertido usando o modo E/S arredondado atual e ento o fator de escala
aplicado ao valor decimal convertido
10.7.6 Edio BN e BZ
10.7.6 BN and BZ editing
Os descritores de edio BN e BZ temporariamente mudam (9.4.1) o modo interpretao branco (blank
interpretation mode) (9.4.5.4, 9.5.1.5) para a conexo. Os descritores de edio BN e BZ ajusta o modo interpretao
branco correspondente para o valor do especificador BLANK=NULL e ZERO, respectivamente.
O modo interpretao branco controla a interpretao de brancos no inicias em campos de entrada
numrica. Tais caracteres brancos so interpretados como zeros quando o modo interpretao branco tem o valor
ZERO; eles so ignorados quando o modo interpretao branco tem o valor NULL. O efeito de ignorar brancos
tratar o campo de entrada como se os brancos tivessem sidos removidos, a parte restante do campo justificado a
direita e os brancos trocados como brancos anteriores. Entretanto, um campo contendo somente brancos tem o
valor zero.
O modo interpretao branco afeta somente a edio numrica (10.6.1) e edio numrica generalizada
(10.6.4.1) na entrada. Ele no tem efeito na sada.
10.7.7 Edio RU, RD, RZ, RN, RC e RP
10.7.7 RU, RD, RZ, RN, RC, and RP editing
Os descritores de edio arredondamento (round edit descriptors) mudam temporariamente (9.4.1) a conexo
do modo E/S arredondado (I/O rounding mode) (9.4.5.13, 9.5.1.12, 10.6.1.2.6). Os descritores de edio
arredondamento RU, RD, RZ, RN, RC e RP ajusta o modo E/S arredondado correspondente para o valor do
especificador ROUND=UP, DOWN, ZERO, NEAREST, COMPATIBLE e PROCESSOR_DEFINED,
respectivamente. O modo E/S arredondado afeta a converso de valores reais e complexos na entrada/sada
formatada. Eles afetam somente as edies D, E, EN, ES, F e G.
10.7.8 Edio DC e DP
10.7.8 DC and DP editing
Os descritores de edio decimal (decimal edit descriptors) mudam temporariamente (9.4.1) modo de edio
decimal (decimal edit mode) (9.4.5.5, 9.5.1.6) para a conexo. Os descritores de edio DC e DP ajusta o modo
edio decimal correspondente para o valor do especificador DECIMAL= COMMA e POINT, respectivamente.
O modo edio decimal controla a representao do smbolo decimal (10.5) durante a converso de valores
reais e complexos na entrada/sada formatada. O modo edio decimal afeta somente a edio D, E, EN, ES, F e G.
Se o modo COMMA durante entrada e sada lista dirigida (list-directed input/output), o caractere usado como o
valor separador (value separator) um ponto e vrgula (semicolon) no lugar da vrgula.
10.8 Descritores de Edio de Cadeia de Caracteres
10.8 Character string edit descriptors
Um descritor de edio de cadeia de caractere (character string edit descriptor) no pode ser usado na entrada.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 258
O descritor de edio de cadeia de caractere faz com que caracteres sejam escritos no descritor de edio
sejam escritos, incluindo brancos. Para um descritor de edio de cadeia de caractere, o comprimento do campo o
nmero de caracteres entre os delimitadores de caractere. Dentro do campo, dois caracteres delimitadores
consecutivos so contados como sendo um caractere nico.
Nota 10.25
O delimitador para o descritor de edio de cadeia de caractere um apstrofo ou uma aspa
10.9 Formatao Lista dirigida
10.9 List-directed formatting
Lista dirigida (list-directed) permite edio de dados de acordo com o tipo do item da lista em vez de pela
especificao de formato. Isto tambm possibilita que os dados sejam livres do campo (free-field), isto , separados
por vrgulas (ou ponto e vrgula ) ou brancos.
Os caracteres em um ou mais registro de uma lista dirigida consiste numa sequncia de valores e
separadores de valores. O fim de um registro tem o mesmo efeito que um caractere branco, a menos que ele esteja
dentro de uma constante caractere. Qualquer sequncia de dois ou mais brancos consecutivos tratada como um
branco nico, a menos que ela esteja dentro de uma constante caractere.
Cada valor um valor nulo ou uma das formas:
c
r *c
r*
onde c uma constante literal, opcionalmente com sinal se inteiro ou real, ou uma constante caractere no
delimitada e r um constante literal inteira no zero e sem sinal. Nem c nem r podem ter o parmetro de tipo
subtipo especificado. A constante c interpretada como se tivesse o mesmo parmetro de subtipo que o
correspondente item na lista. A forma r*c equivalente a r sucessivas aparies da constante c e a forma r*
equivalente a r sucessivas aparies do valor nulo. Nenhuma destas formas podem conter brancos, exceto quando
permitido dentro da constante c.
Um separador de valor (value separator)
1. uma vrgula opcional precedida por um ou mais brancos consecutivos e opcionalmente seguido por um ou
mais brancos consecutivos, a menos que o modo de edio decimal seja COMMA, neste caso um ponto e
vrgula usado no lugar da vrgula
2. uma barra opcional precedida por um ou mais brancos consecutivos e opcionalmente seguido por um ou
mais brancos consecutivos
3. um ou mais brancos consecutivos entre dois valores no brancos ou seguindo o ltimo valor no branco,
onde um valor no branco uma constante, uma forma r*c ou uma forma r*
Nota 10.26
Apesar de uma barra encontrada em um registro de entrada ser referenciado como um separador, ela realmente
causa o trmino da lista dirigida e da instrues de entrada lista de nomes (namelist); ela realmente no separa
dois valores
Nota 10.27
Se nenhum item da lista especificado na instruo de entrada/sada lista dirigida , um registro de entrada
pulado ou um registro vazio de sada escrito
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 259
10.9.1 Entrada Lista Dirigida
10.9.1 List-directed input
Formas aceitveis de entrada para os descritores de edio para um dado tipo so aceitveis para a
formatao lista dirigida , exceto como citado adiante. A forma do valor de entrada tem que ser aceitvel para o
prximo item efetivo na lista. Brancos nunca so usados como zeros e brancos no so permitidos em constantes,
exceto dentro de constantes caracteres e constantes complexas como especificado a seguir.
Para a forma r*c de um valor de entrada, a constante c interpretada como uma constante caractere no
delimitada se o primeiro item da lista correspondente a este valor um caractere do tipo default, ASCII ou ISO
10646, existe um caractere no branco imediatamente depois de r*, e o caractere no um apstrofo ou uma aspas;
caso contrrio, c interpretado como uma constante literal.
Nota 10.28
O fim de um registro tem o efeito de um branco, exceto quando ele aparece dentro de constante caractere
Quando o prximo item efetivo do tipo inteiro, o valor no registro de entrada interpretado como se um
descritor de edio Iw com um valor adequado de w quando usado.
Quando o prximo item efetivo do tipo real, o valor do registro de entrada aquele do campo de entrada
numrico. Um campo de entrada numrico um campo adequado para a edio F (10.6.1.2.1) que assumido no
ter dgito na parte fracionria, a menos que o smbolo decimal aparea dentro do campo.
Quando o prximo item efetivo do tipo complexo, a forma de entrada consiste de um parntese esquerdo
seguido por um par ordenado de campos de entrada numrico separado por um separador e seguido por um
parntese direito. O primeiro campo de entrada numrico a parte real da constante complexa e o segundo a parte
imaginria. Cada um dos campos de entrada numrico pode ser precedido ou ser seguido por qualquer nmero de
brancos e fim de registros. O separador uma vrgula se o modo de edio decimal POINT; um ponto e
vrgula se o modo de edio decimal COMMA. O fim de um registro pode ocorrer entre a parte real e o separador
ou entre a separador e a parte imaginria.
Quando o prximo item efetivo do tipo lgico, a entrada no pode incluir separadores de valor entre os
caracteres opcionais permitido para a edio L.
Quando o prximo item efetivo do tipo caractere, a forma de entrada consiste de uma possvel sequncia
de zero delimitada ou mais rep-char s cujo parmetro de tipo subtipo obtido do subtipo do item efetivo na lista.
Sequncia de caracteres podem ser continuadas do fim de um registro at o incio do prximo registro, mas o fim
de registro no pode ocorrer entre um apstrofo duplo em uma sequncia de caracteres delimitada por apstrofo,
nem entre aspas duplas em uma sequncia de caracteres delimitada por aspas. O fim de registro no faz com que
um branco ou outro caractere se torne parte da sequncia de caracteres. A sequncia de caracteres pode ser
continuada em quantos registros sejam necessrios. O caractere branco, vrgula, ponto e vrgula e barra pode
aparecer em sequncias de caracteres default, ASCII ou ISO 10646.
Se o prximo item efetivo do tipo caractere default, ASCII ou ISO 10646 e
1. a sequncia de caracteres no contm separadores de valor
2. a sequncia de caracteres no cruza os limites de um registro
3. o primeiro caractere no branco no uma aspas ou apstrofo
4. os primeiros caracteres no so dgitos seguido por um asterisco
5. a sequncia de caracteres contm ao menos um caractere
o delimitador apstrofo ou aspa no so requeridos. Se os delimitadores so omitidos, a sequncia de caracteres
terminada pelo primeiro branco, vrgula, barra ou fim-de-registro; neste caso apstrofos e aspas dentro do datum
no so dobrados
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 260
Seja len o comprimento do prximo item efetivo e seja w o comprimento da sequncia de caracteres. Se len
menor que ou igual a w, os len caracteres mais a esquerda da sequncia so transmitidos para o prximo item
efetivo. Se len maior que w, a sequncia transmitida dos w caracteres mais a esquerda do prximo item efetivo e
os restantes len-w caracteres do prximo item efetivo so completados com brancos. O efeito como se a
sequncia fosse atribuda ao prximo item efetivo em uma instruo de atribuio de caractere (7.4.1.3).
10.9.1.1 Valores Nulos
10.9.1.1 Null values
Um valor nulo (null) especificado por
1. uma forma r*
2. nenhum caracteres entre separadores de valor consecutivos
3. nenhum caracteres antes do primeiro separador de valor no primeiro registro lido por cada execuo de
uma instruo de entrada lista dirigida
Nota 10.29
O fim de um registro seguido por qualquer outro separador de valor (value separator), com ou sem brancos
separadores, no especifica um valor nulo em uma lista dirigida entrada
Um valor nulo no tem efeito na definio do estado do prximo item efetivo. Um valor nulo no pode ser
usado para a parte real ou parte imaginria de uma constante complexa, mas um valor nulo nico pode representar
uma entidade complexa constante.
Uma barra encontrada como um separador de valor durante a execuo de uma instruo lista dirigida
entrada termina a execuo da instruo de entrada depois da atribuio do valor prvio. Quaisquer caracteres
restantes no registo atual so ignorados. Se existem itens adicionais na lista de entrada, o efeito como se valores
nulos tivessem sido fornecidos para eles. Qualquer do-variable na lista de entrada definida como se suficientes
valores nulos tivessem sido fornecidos para os restantes itens da lista de entrada.
Nota 10.30
Todos os brancos em um registro de entrada lista dirigida so considerados como parte de algum separador de
valor, exceto para o que segue:
(1) brancos dentro de um sequncia de caracteres
(2) brancos dentro envolvendo a parte real ou imaginria de uma constante complexa
(3) brancos anteriores no primeiro registro lido por cada execuo de instruo de entrada lista dirigida , a menos
que seguida imediatamente por barra ou vrgula
Nota 10.31
Exemplo de entrada lista dirigida :
INTEGER I; REAL X (8); CHARACTER (11) P;
COMPLEX Z; LOGICAL G
...
READ *, I, X, P, Z, G
...
Os registros de entrada so:
12345,12345,,2*1.5,4*
ISNT_BOBS,(123,0),.TEXAS$
os resultados so:
Varvel Valor
I 12345
X (1) 12345.0
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 261
X (2) imutvel
X (3) 1.5
X (4) 1.5
X (5) X (8) imutvel
P ISNT BOBS
Z (123.0,0.0)
G verdadeiro
10.9.2 Sada Lista Dirigida
10.9.2 List-directed output
A forma dos valores produzidos a mesma que aquela requerida para a entrada, exceto onde especificado
diferente. Com a exceo da sequncia de caracteres adjacentes no delimitado, os valores so separados por um ou
mais brancos ou por uma vrgula, ou um ponto e vrgula se o modo de edio decimal vrgula, opcionalmente
precedida por um ou mais brancos e opcionalmente seguido por um ou mais brancos.
O processador pode iniciar novos registros quando necessrio, mas o fim de registro no ocorre dentro de
uma constante exceto para constantes complexas e sequncia de caracteres. O processador no pode inserir brancos
dentro de sequncias caractere ou dentro de constantes, exceto para constantes complexa.
Valores de sada lgicos so T para o valor verdadeiro e F para o valor falso.
Constantes inteiras de sada so produzidas sob o efeito do descritor de edio Iw.
Constantes reais so produzidas sob o efeito do descritor de edio F ou do descritor de edio E,
dependendo da magnitude de x do valor e do intervalo
10
d
1
<x10
d
2
onde, d
1
e d
2
so inteiros
dependente do processador. Se a magnitude de x est dentro do intervalo, a constante criada usando 0PFw.d, caso
contrrio usado 1PEw.dEe.
Para uma sada numrica, valores adequados dependente do processador de w, d e e so usados para cada
sada numrica constante.
Constantes complexas so envolvidas por parnteses com um separador entre a parte real e a parte
imaginria, cada uma criada como definido acima (anteriormente) para constantes reais. O separador um a vrgula
se o modo de edio decimal POINT; ele um ponto e vrgula se o de edio decimal COMMA. O fim de um
registro pode ocorrer entre o separador e a parte imaginria somente se a constante toda to longa quanto ou
maior que, um registro inteiro. Os nicos brancos permitidos dentro da constante complexa so aqueles entre o
separador e o fim de registro e um branco no incio do prximo registro.
Sequencia de caracteres produzidas quando o modo delimitado tem o valor NONE
1. no so delimitado por apstrofos ou aspas
2. no so separados um dos outros por valor separador
3. tem cada apstrofo interno ou aspas representados externamente por um apstrofo ou uma aspas
4. tem um caractere branco inserido pelo processador no incio de qualquer registro que inicia com a
continuao de uma sequncia de caracteres do registro precedente
Sequncias de caracteres produzida quando o modo delimitado tem o valor QUOTE so delimitados por
aspas (quotes), so precedidos e seguidos por um separador de valor e tem cada aspas interna representada num
meio externo por duas aspas consecutivas.
Sequncias de caracteres produzida quando o modo delimitado tem o valor APOSTROPHE so delimitados por
apstrofos, so precedidos e seguidos pelo separador de valor e tem cada apstrofo interno representado no meio
externo por dois apstrofos consecutivos.
Se dois ou mais valores sucessivos em um registro de sada tem valores idnticos, o processador tem a
opo de criar uma constante de reproduo na forma r*c em vez de uma sequncia de valores idnticos.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 262
Barras, como separadores de valor e valores nulos no so produzidos como sada por formatao lista
dirigida .
Exceto para a continuao de sequncias de caracteres delimitadores, cada registro de sada inicia com um
caractere branco.
Nota 10.32
Os comprimentos de registros de sada no so especificados exatamente e podem ser dependente do processador
10.10 Formatao Lista de Nomes
10.10 Namelist formatting
Entrada/sada lista de nomes (Namelist input/output) permite edio de dados com subsequentes
NAME=value. Isto facilita a documentao de arquivos de entrada e sada e entrada mais flexveis.
Os caracteres em um ou mais registros lista de nomes (namelist) constitui uma subsequncias de valores
com nome (name-value subsequences), cada uma delas consistindo de um designador de objeto seguido por um
igual e seguido por um ou mais valores e separadores de valores. Os iguais podem opcionalmente ser precedido ou
seguido por um ou mais de um brancos consecutivos. O fim de um registro tem o mesmo efeito que um caractere
branco, a menos que ele esteja dentro de uma constante caractere. Qualquer sequncia de dois ou mais brancos
consecutivos tratada como um branco nico, a menos que ele esteja dentro de uma constante caractere.
Um nome pode ser qualquer nome na namelist-group-object-list (5.4).
Cada valor um valor nulo (10.10.1.4) ou uma das formas
c
r *c
r*
onde c uma constante literal, opcionalmente com sinal se inteiro ou real e r um constante literal inteira no zero
sem sinal. Nem c nem r podem ter o parmetro de tipo subtipo especificado. A constante c interpretada como se
tivesse o mesmo parmetro de tipo subtipo que o correspondente item na lista. A forma r*c equivalente a r
aparies sucessivas da constante c e a forma r* equivalente a r aparies sucessivas do valor nulo. Nenhuma
destas formas pode conter brancos, exceto quando permitido dentro da constante c.
Um separador de valores para a formatao lista de nomes (namelist) a mesma que a da formatao lista
dirigida (10.9).
10.10.1 Entrada Lista de Nomes
10.10.1 Namelist input
Entrada para uma instruo de entrada lista de nomes (namelist input statement) consiste de
1. brancos opcionais e comentrios lista de nomes (namelist comments)
2. o caractere & seguido imediatamente por um namelist-group-name como especificado na instruo
NAMELIST
3. um ou mais brancos
4. uma sequncia de zeros ou mais subsequncias de valores com nome (name-value subsequences) separados
por separadores de valores
5. uma barra (slash) para terminar uma entrada lista de nomes (namelist input)
Nota 10.33
Uma barra (slash) encontrada em um registro de entrada lista de nomes (namelist input record) faz com que a
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 263
instruo de entrada termine. A barra no pode ser usada para separar dois valores em uma instruo de entrada
lista de nomes
Em cada subsequncia de valores com nome (name-value subsequence), o nome tem que ser o nome de um
item da lista de objetos do grupo da lista de nomes (namelist group object list item) com uma qualificao opcional e o
nome com a qualificao opcional no pode ser uma matriz de tamanho zero, uma seo de matriz de tamanho
zero ou um string caractere de comprimento zero. A qualificao opcional, se existir, no pode conter um subscrito
vetor.
Um nome de grupo ou nome de objeto no diferencia letras maisculas de letras minsculas.
10.10.1.1 Nomes de Objetos no Grupo Lista de Nomes
10.10.1.1 Namelist group object names
Dentro dos dados de entrada, cada nome deve corresponder a um nome do objeto no grupo lista de nomes
(namelist group object name). Subscritos, passos e expresses de intervalo de subscrito usado para qualificar nomes
de objetos no grupo (group object names) tem que ser opcionalmente constantes literais inteira com sinal sem
especificao de parmetros de tipo subtipo. Se um objeto no grupo lista de nomes (namelist group object) uma
matriz, o registro de entrada correspondendo a ele pode conter um nome de matriz ou um designador de um
subobjeto desta matriz, usando a sintaxe de designador de objeto (R603). Se o nome do objeto no grupo lista de
nomes (namelist group object name) o nome de uma varivel o nome de uma varivel do tipo derivado, o nome no
registro de entrada pode ser o nome de um avarivel ou um designador de um de seus componentes, indicada pelo
qualificao do nome da varivel com o nome do componente apropriado. Qualificaes sucessivas podem ser
aplicadas quando apropriado para a forma e tipo da varivel representada.
A ordem de nomes no registro de entrada no necessita ser a mesma ordem dos itens do grupo de objetos da
lista de nomes (namelist group object items). Os registros de entrada no necessitam conter todos os nomes dos itens
do grupo de objetos da lista de nomes. O estado de definio de quaisquer nomes vindos da namelist-group-
object-list que no ocorre no registro de entrada permanece inalterado. No registro de entrada, cada objeto com
nome ou designador de objeto pode ser precedido ou seguido por um ou mais brancos opcionais, mas no pode
conter brancos.
10.10.1.2 Valores na Entrada Lista de Nomes
10.10.1.2 Namelist input values
O datum c (10.10) qualquer valor de entrada aceitvel de especificao de formato para um dado tipo,
exceto por restrio na forma dos valores de entrada correspondendo a itens de lista do tipo lgico, inteiro e
caractere como especificado em 10.10.1.3. A forma de um valor real ou complexo dependente do modo de edio
decimal em uso (10.7.8). A for,a de um valor de entrada tem que ser aceitvel para o item do grupo de objetos da
lista de nomes (namelist group object list item). O nmero e formas dos valores de entrada que podem ser colocados
depois dos iguais em uma subsequncia de valores com nome (name-value subsequence) depende da forma e do tipo
do objeto representado pelo nome no registro de entrada. Quando o nome no registro de entrada o de uma
varivel escalar de um tipo intrnseco, os iguais no podem ser seguidos por mais de um valor. Brancos nunca so
usados como zeros e brancos embutidos no so permitidos em constantes, exceto dentro de constantes caracteres e
constantes complexas como especificado em 10.10.1.3.
As subsequncias de valores com nome (name-value subsequences) so avaliadas sequencialmente, na
ordem da esquerda para a direita. Um designador de objeto do grupo da lista de nomes (namelist group object
designator) pode aparecer em mais que uma subsequncia de valores com nome (name-value subsequence).
Quando o nome em um registro de entrada representa uma varivel matricial ou uma varivel de tipo
derivado, o efeito como se a varivel representada fosse expandida em uma sequencia de itens de lista escalar de
tipos de dados intrnsecos, na mesma forma que os itens de uma lista de entrada/sada formatada so expandidos
(9.5.2). Cada valor de entrada seguido os iguais tem que ter uma forma aceitvel para a especificao de formato
para o tipo intrnseco do item da lista na posio correspondente na sequncia expandida , exceto como assinalado
em 10.10.1.3. O nmero de valores seguindo os sinais de igual no pode exceder o nmero de itens da lista na
sequncia expandida, mas pode ser menor; neste ltimo caso, o efeito como se suficientes valores nulos tivesse
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 264
sido agregado ao final (appended) para coincidir com quaisquer itens restantes na lista na sequncia expandida.
Nota 10.34
Por exemplo, se o nome no registro de entrada o nome de uma matriz inteira de tamanho 100, pelo menos 100
valores, cada um deles sendo uma sequncia de dgitos ou um valor nulo, pode seguir os iguais; estes valores tm
que ser atribudos aos elementos da matriz na ordem dos elementos da matriz
Uma barra encontrada como um separador de valor durante a execuo de uma instruo de entrada lista de
nomes (namelist) causa o trmino da execuo da instruo de entrada depois da atribuio do valor anterior. Se
existem itens adicionais no grupo de objetos da lista de nome sendo transferidos, o efeito como se valores nulos
tivessem sido fornecidos eles.
Um comentrio na lista de nomes (namelist comment) pode aparecer depois de qualquer valor separador,
exceto uma barra. Um comentrio na lista de nomes tambm permitido iniciar em uma posio no branca de um
registro de entrada, exceto dentro de constante literal caractere.
Registros lista de nomes sucessivos so lidos pela entrada lista de nomes at uma barra ser encontrada; o
restante do registro ignorado e no necessita seguir as regras para valores de entrada lista de nomes.
10.10.1.3 Itens da Lista de Objetos do Grupo da Lista de Nomes
10.10.1.3 Namelist group object list items
Quando o prximo item efetivo do grupo de objetos da lista de nomes (effective namelist group object list item)
do tipo real, a forma de entrada do valor de entrada aquela do campo numrico de entrada. Um campo de
entrada numrico um campo adequado para edio F (10.6.1.2.1) que assumida no ter dgito fracionrio a
menos que um smbolo decimal aparea dentro do campo.
Quando o prximo item efetivo do tipo complexo, a forma de entrada do valor de entrada consiste de um
parntese esquerdo seguido por um par ordenado de campos numricos separados por uma vrgula e seguido por
um parntese direito. O primeiro campo numrico a parte real da constante complexa e a segunda parte a parte
imaginria. Cada um dos campos numricos de entrada pode ser precedido ou seguido por qualquer nmero de
brancos e fins de registros. O fim de um registro pode ocorrer entre a parte real e a vrgula ou entre a vrgula e a
parte imaginria.
Quando o prximo item efetivo do tipo lgico, a forma de entrada do valor de entrada no pode incluir
iguais ou separadores de valores entre os caracteres opcionais permitidos para a edio L (10.6.2).
Quando o prximo item efetivo do tipo inteiro, o valor no registro de entrada interpretado como se fosse
um descritor de edio Iw com um valor adequado de w fosse usado.
Quando o prximo item efetivo do tipo caractere, a forma de entrada consiste de uma sequncia
delimitada de zeros ou mais rep-char s cujos parmetros de tipo subtipo obtido do subtipo correspondente do
item da lista. Este tipo de sequncia pode ser continuada do fim de um registro para o incio do prximo registro,
mas o fim de registro no pode acontecer entre apstrofo duplos em uma sequncia delimitada por apstrofos, nem
entre aspas duplas em uma sequncia delimitada por aspas. O fim de registro no causa um branco ou qualquer
outro caractere se tornar parte da sequncia. A sequncia pode ser continuada com quantos registros forem
necessrios. Os caracteres brancos, vrgula e barra podem aparecer neste tipo de sequncia de caracteres.
Nota 10.35
Uma sequncia de caractere correspondendo a um item de entrada lista de nomes (namelist) do tipo caractere
delimitada com apstrofo ou com aspa. O delimitador requerido para evitar ambiguidades entre sequncias de
caracteres no delimitadas e objetos com nomes. O valor do especificador DELIM=, se existir, em uma instruo
OPEN para um arquivo externo ignorado durante uma entrada lista de nomes (9.4.5.6)
Seja len o comprimento do prximo item efetivo e seja w o comprimento da sequncia de caracteres. Se len
menor que ou igual a w, os len caracteres mais a esquerda da sequncia so transmitidos para o prximo item
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 265
efetivo. Se len maior que w, a constante transmitida para os w caracteres mais a esquerda do prximo item
efetivo e os len-w caracteres restantes do prximo item efetivo so preenchidos com brancos. O efeito como se a
sequncia tivesse sido atribuda ao prximo item efetivo em uma instruo de atribuio caractere (7.4.1.3).
10.10.1.4 Valores Nulos
10.10.1.4 Null values
Um valor nulo especificado por
1. a forma r*
2. brancos entre dois separador de valor (value separator) consecutivos seguido por um igual
3. zero ou mais brancos precedendo o primeiro separador de valor e seguido por um igual
4. dois separadores de valor no brancos consecutivos
Um valor nulo no tem efeito na definio do estado do item correspondente na lista de entrada. Se um
item do grupo de objetos da lista de nomes (namelist group object list item) definido, ele retem seu valor prvio; se
ele indefinido, ele retem a indefinio. Um valor nulo no pode ser usado como a parte real ou parte imaginria
de uma constante complexa, mas um nico valor nulo pode representar uma constante complexa inteira.
Nota 10.36
O fim de registro seguindo um valor separador, com ou sem brancos entre eles, no pode especificar um valor
nulo em uma entrada lista de nomes
10.10.1.5 Brancos
10.10.1.5 Blanks
Todos os brancos em um registro de entrada lista de nomes so considerados como parte de algum
separador de valor, exceto para
1. brancos colocados numa constante caractere
2. brancos interiores envolvendo a parte real ou a parte imaginria de uma constante complexa
3. brancos anteriores seguindo os iguais a menos que seguido imediatamente por uma barra ou vrgula ou
ponto e vrgula se o modo de edio decimal vrgula
4. brancos entre um nome e o iguais que seguem
10.10.1.6 Comentrios na Lista de Nomes
10.10.1.6 Namelist Comments
Exceto dentro de constante literal caractere, o caractere ! depois de um separador de valor ou em na
primeira posio no branca de um registro de entrada lista de nomes inicia um comentrio. O comentrio estende-
se at o fim do registro de entrada atual e pode conter qualquer caractere grfico do conjunto de caracteres
dependente do processador. O comentrio ignorado. Uma barra dentro de um comentrio lista de nomes no
termina a execuo da instruo de entrada lista de nomes. Comentrios lista de nomes no so permitidos em
entrada em fluxo (stream input) porque comentrios dependem da estrutura do registro.
Nota 10.37
Exemplo de entrada lista de nomes:
INTEGER I; REAL X(8); CHARACTER(11) P; COMPLEX Z;
LOGICAL G
NAMELIST / TODAY / G, I, P, Z, X
READ(*, NML = TODAY)
Os registros de dados de entrada so:
&TODAY I = 12345, X(1) = 12345, X(3:4) = 2*1.5, I=6, ! Isto um comentrio
P = ISNT_BOBS, Z = (123,0)/
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 266
Os resultados guardados so:
Varivel Valor
I 6
X (1) 12345.0
X (2) no trocado
X (3) 1.5
X (4) 1.5
X (5) X (8) no trocado
P ISNT BOBS
Z (123.0,0.0)
G no trocado
10.10.2 Sada Lista de Nomes
10.10.2 Namelist output
A forma da sada produzida a mesma que a requerida para a entrada, exceto para as formas de valores
reais, caracteres e lgicos. O nome na sada em letras maisculas. Com exceo dos valores de caracteres
adjacentes no delimitados, os valores so separados por um ou mais brancos ou por vrgula ou um ponto e vrgula
se o modo de edio decimal COMMA, opcionalmente precedido por um ou mais brancos e opcionalmente
sucedida por um ou mais brancos.
Sada lista de nomes no pode incluir comentrios lista de nomes.
O processador pode iniciar novo registro quando necessrio. Entretanto, exceto por constantes complexas e
valores caracteres o fim de um registro no pode acontecer dentro da constante, valor caractere ou nome e brancos
no podem aparecer dentro de constantes, valor caractere ou nome.
Nota 10.38
O comprimento dos registros de sada no especificado exatamente e pode ser dependente do processador
10.10.2.1 Edio de Sada de Lista de Nomes
10.10.2.1 Namelist output editing
Valores de sada lgicos so T para o valor verdade e F para o valor falso.
Constantes de sada inteiras so produzidas sob o controle do descritor de edio Iw.
Constantes reais so produzidas sob o controle do descritor de edio F ou do descritor de edio E,
dependendo da magnitude do valor de x e do intervalo
10
d
1
<x10
d
2
onde, d
1
e d
2
so inteiros
dependente do processador. Se a magnitude de x est dentro deste intervalo ou zero, a constante criada usando
0PFw.d, caso contrrio, 1PEw.dEe usado.
Para uma sada numrica, valores inteiros adequados dependente do processador de w, d e e so usados
para cada sada numrica constante.
Constantes complexas so envolvidas por parnteses com um separador entre a parte real da parte
imaginria, cada uma criada como definido anteriormente para constantes reais. O separador uma vrgula se o
modo de edio decimal POINT; um ponto e vrgula se o modo de edio decimal COMMA. O fim de um
registro pode ocorrer dentre o separador e a parte imaginria somente de a constante inteira to longa quanto ou
maior que um registro inteiro. Os nicos brancos permitidos dentro da constante complexa so aqueles entre o
separador e o fim de um registro e um branco no incio do prximo registro.
Sequncias de caracteres produzidas quando o modo delimitado tem o valor NONE
1. no so delimitado por apstrofo ou aspas
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 267
2. no so separados um dos outros por separadores de valor
3. tem cada apstrofo interno ou aspas representado externamente por um apstrofo ou aspa
4. tem um caractere branco inserido pelo processador no incio de qualquer registro que inicia com a
continuao de uma sequncia de caracteres vindo do registro precedente
Nota 10.39
Registros de sada lista de nomes produzidos com o especificador DELIM= com o valor NONE e que contm uma
sequncia de caracteres pode no ser aceita como um registro de entrada lista de nomes
Sequncias de caracteres produzida quando o modo delimitado tem o valor QUOTE so delimitados por
aspas, so precedidos e seguidos por um separador de valor e tem cada aspas interna representado no meio externo
por duas aspas contguas.
Sequncias de caracteres produzida quando o modo delimitado tem o valor APOSTROPHE so delimitados
por apstrofos, so precedidos e seguidos por um separador de valor e tem cada apstrofos interna representado no
meio externo por duas apstrofos contguas.
10.10.2.2 Registros de Sada de Lista de Nomes
10.10.2.2 Namelist output records
Se dois ou mais valores sucessivos em uma matriz em um registro de sada produzido tem valores
idnticos, o processador tem a opo de produzir uma constante de repetio da forma r*c em vez de uma
sequncia de valores idnticos.
O nome de cada item do grupo de objetos da lista de nomes (namelist group object list item) colocado no
registro de sada seguido por um igual e a lista de valores do item do grupo de objetos da lista de nomes.
Um caractere e-comercial (ampersand) seguido imediatamente pelo um namelist-group-name ser
produzido pela formatao lista de nomes no incio do primeiro registro de sada para indicar qual grupo especfico
de objetos de dados est saindo. Uma barra produzido pelo formato lista de nomes para indicar o fim de um a
formatao lista de nomes.
Um valor nulo no produzido por uma formatao lista de nomes (namelist formatting)
Exceto para continuao de sequncias de caracteres delimitadas, cada registro inicia com um caractere
branco.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 268
11. Unidades de Programa
Section 11: Program units
Os termos e conceitos bsicos de unidade de programa foram introduzidos em 2.2. Uma unidade de
programa um programa principal, um subprograma externo, um mdulo ou uma unidade programa dados em
bloco (block data).
Esta seo descreve programas principal, mdulos e unidade programa dados em bloco, seo 12 descreve
subprogramas externos.
11.1 Programa Principal
11.1 Main program
Um programa principal (main program) uma unidade de programa que no contm uma instruo
SUBROUTINE, FUNCTION, MODULE ou BLOCK DATA como sua primeira instruo.
R1101 main-program is [program-stmt]
[specification-part]
[execution-part]
[internal-subprogram-part]
end-program-stmt
R1102 program-stmt is PROGRAM program-name
R1103 end-program-stmt is END[PROGRAM[program-name]]
C1101 (R1101) Em um main-program, a execution-part no pode conter uma instruo RETURN ou uma
instruo ENTRY
C1102 (R1101) O program-name pode ser includo na end-program-stmt somente se a program-stmt
opcional foi usada, se includa, tem que ser idntica ao program-name especificado na program-stmt
C1103 (R1101) Um objeto automtico no pode aparecer na specification-part (R204) de um programa
principal
Nota 11.1
O nome do programa global para o programa (16.1). Para informaes explanatrias sobre o uso de nome de
programa, ver seo C.8.1
Nota 11.2
Um exemplo de um programa principal :
PROGRAM ANALYZE
REAL A, B, C (10,10) ! parte de especificao
CALL FIND ! parte de execuo
CONTAINS
SUBROUTINE FIND ! subprograma interno
...
END SUBROUTINE FIND
END PROGRAM ANALYZE
O programa principal pode ser definido por outros meios que no o Fortran; neste caso, o programa no
pode conter um unidade de programa programa principal.
A referncia a um programa principal Fortran no pode aparecer em qualquer unidade de programa no
programa, incluindo o prprio.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 269
11.2 Mdulos
11.2 Modules
Um mdulo (module) contm especificaes e definies que so para serem tornadas acessveis a outra
unidade de programa. Um mdulo que provido como uma parte herdada do processador um mdulo intrnseco
(intrinsic module). Um mdulo no intrnseco (nonintrinsic module) definido por um unidade de programa mdulo
ou por outros meios que no o Fortran.
Procedimentos e tipos definidos em um mdulo intrnseco no so por si prprios intrnsecos.
R1104 module is module-stmt
[specification-part]
[module-subprogram-part]
end-module-stmt
R1105 module-stmt is MODULE module-name
R1106 end-module-stmt is END[MODULE[module-name]]
R1107 module-subprogram-part is contains-stmt
module-subprogram
[module-subprogram]...
R1108 module-subprogram is function-subprogram
or subroutine-subprogram
C1104 (R1104) Se o module-name especificado em uma end-module-stmt, ele tem que ser idntico ao
module-name especificado na module-stmt
C1105 (R1104) Uma specification-part de um mdulo no pode conter uma format-stmt
C1106 (R1104) Um objeto automtico no pode aparecer em uma specification-part de um mdulo
C1107 (R1104) Se um objeto do tipo para o qual component-initialization especificada (R444)
aparece em uma specification-part de um mdulo e no tem o atributo ALLOCATABLE ou POINTER, o
objeto tem que ter o atributo SAVE
Nota 11.3
O nome do mdulo global para o programa (16.1)
Nota 11.4
Apesar de definies de funo instruo, instrues ENTRY e instrues FORMAT no poderem aparecer na
parte de especificao de um mdulo, elas podem aparecer na parte de especificao de um subprograma mdulo
dentro do mdulo.
Um mdulo um hospedeiro (host) para quaisquer subprogramas mdulo (12.1.2.2) que ele contm e as entidades
no mdulo so portanto acessveis aos subprogramas mdulo por associao de hospedagem
Nota 11.5
Para uma discusso sobre o impacto de mdulos na compilao pendente, veja seo C.8.2
Nota 11.6
Para exemplos de uso do mdulos, veja seo C.8.3
Se um procedimento declarado em um unidade de escopo de um mdulo tem uma interface implcita, ele
tem que ter o atributo EXTERNAL nesta unidade de escopo; se ele uma funo, seu tipo e parmetros de tipo tm
que ser explicitamente declarados em uma instruo de declarao de tipo nesta unidade de escopo.
Se um procedimento explcito declarado em uma unidade de escopo de um mdulo, ele tem que ter o
atributo INTRINSIC nesta unidade de escopo ou ser usado como um procedimento intrnseco nesta unidade de
escopo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 270
11.2.1 Instruo Uso e Associao de Uso
11.2.1 The USE statement and use association
Uma instruo uso (USE statement) especifica associao de uso (use association). Uma instruo uso
uma referncia um mdulo (module reference) que ela especifica. No instante (At the time) em que uma instruo
de uso (use statement) processada, as partes pblicas do mdulo especificado tem que estar acessveis. Um
mdulo no pode referenciar a si prprio, direta ou indiretamente.
A instruo uso (USE statement) prov o mecanismo pelo qual a unidade de escopo acessa objetos de
dados com nome (named data objects), tipos derivados, blocos de interface (interface blocks), procedimentos,
interfaces abstrata (abstract interfaces), identificadores genricos (12.3.2.1) e grupos na lista de nomes (namelist
groups) em um mdulo. As entidades na unidade de escopo so ditas estar associadas para uso (use associated )
com as entidades no mdulo. As entidades acessadas tm os atributos especificados no mdulo. As entidades feitas
acessveis so identificadas pelos seus nomes ou identificadores genricos usados para identific-las no mdulo.
Por default, elas so identificadas pelos mesmos identificadores na unidade de escopo contendo a instruo de uso,
mas possvel especificar que diferentes identificadores locais esto sendo usados.
Nota 11.7
A acessibilidade de entidades do mdulo pode ser controlada por atributos de acessibilidade (4.5.1.1, 5.1.2.1) e a
opo ONLY da instruo USE. A possibilidade de se definir uma entidades do mdulo pode ser controlada pelo
atributo PROTECTED (5.1.2.12)
R1109 use-stmt is USE[[,module-nature]::]module-name[,rename-list]
or USE[[,module-nature]::]module-name,
ONLY:[only-list]
R1110 module-nature is INTRINSIC
or NON INTRINSIC
R1111 rename is local-name => use-name
or OPERATOR(local-defined-operator) =>
OPERATOR(use-defined-operator)
R1112 only is generic-spec
or only-use-name
or rename
R1113 only-use-name is use-name
C1108 (R1109) Se module-nature INTRINSIC, module-name tem que ser o nome de um mdulo
intrnseco
C1109 (R1109) Se module-nature NON INTRINSIC, module-name tem que ser o nome de um mdulo no
intrnseco
C1110 (R1109) A unidade de escopo no pode acessar um mdulo intrnseco e mdulo no intrnseco de
mesmo nome
C1111 (R1111) OPERATOR(use-defined-operator) no pode identificar uma generic-binding
C1112 (R1112) A generic-spec no pode identificar uma generic-binding
Nota 11.8
A duas restries acima no previne uma generic-spec que declarada por um bloco de interface (interface
block), ainda que a generic-binding tenha a mesma generic-spec
C1113 (R1112) Cada generic-spec tem que ser uma entidade pblica no mdulo
C1114 (R1113) Cada use-name tem que ser o nome de uma entidade pblica no mdulo
R1114 local-defined-operator is defined-unary-op
or defined-binary-op
R1115 use-defined-operator is defined-unary-op
or defined-binary-op
C1115 (R1115) Cada use-defined-operator tem que ser uma entidade pblica no mdulo
Uma use-stmt sem um module-nature prove acesso a um mdulo intrnseco ou a um mdulo no
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 271
intrnseco. Se o module-name o nome de um mdulo intrnseco e um mdulo no intrnseco, o mdulo no
intrnseco acessado.
A instruo USE sem a opo ONLY prov acesso a todas as entidades pblicas no mdulo especificado.
A instruo USE com a opo ONLY prov acesso somente quelas entidades que aparecem como como
generic-specs, use-names ou use-defined-operators na only-list.
Mais de uma instruo USE para um dado mdulo pode aparecer em uma unidade de escopo. Se uma das
instrues USE est sem o qualificador ONLY, todas as entidades pblicas no mdulo so acessveis. Se todas as
instrues USE possuem o qualificador ONLY, somente aquelas entidades em uma ou mais das only-list so
acessveis.
Uma entidade acessvel no mdulo referenciado tem um ou identificadores locais. Estes identificadores so
1. o identificador da entidade no mdulo referenciado se este identificador aparece como um only-use-name
ou como o defined-operator de uma generic-spec em qualquer only para este mdulo
2. cada um dos local-names ou local-defined-operators que dada entidade em qualquer renomeao
para este mdulo
3. o identificador da entidade no mdulo referenciado se este identificador no aparece como como um use-
name ou user-defines-operators em qualquer renomeao para este mdulo
Duas ou mais entidades acessveis, diferente de interfaces genricas ou operadores definidos, podem ter o
mesmo identificador somente se o identificador no usado para referenciar uma entidade no escopo da unidade.
Interface genrica e operadores definidos so manipulados como descrito em 16.2.3. Exceto para estes casos, o
identificador local de qualquer entidade acessvel pela instruo de uso (USE statement) tem que ser diferente dos
nomes locais de todas as outras entidades acessveis na unidade de escopo por meio da instruo de uso e de
qualquer outra forma.
Nota 11.9
No h proibio contra um use-name ou user-defined-operator aparecer mltiplas vezes em uma instruo
USE ou mltiplas instrues USE envolvendo o mesmo mdulo. Como resultado. possvel para uma entidade
associada por uso ser acessada por mais de um identificador local
O identificador local de uma entidade feita acessvel por associao de uso no pode aparecer em qualquer
outra instruo no executvel que faa qualquer atributo (5.1.2) da entidade ser especificada no escopo da unidade
que contm a instruo USE, exceto que ela pode aparecer na instruo PUBLIC ou PRIVATE no escopo da
unidade de um mdulo e ela pode receber o atributo ASYNCHRONOUS ou VOLATILE.
A utilizao de um identificador local em uma instruo PUBLIC em um mdulo faz com que a entidade
acessvel por associao de uso se torne uma entidade pblica neste mdulo. Se o identificador aparece em uma
instruo PRIVATE no mdulo, a entidade no uma entidade pblica neste mdulo. Se o identificador local no
aparece na instruo PUBLIC ou na instruo PRIVATE, ele assume a acessibilidade default (5.2.1) da unidade de
escopo.
Nota 11.10
As restries nas sees 5.5.1, 5.5.2 e 5.4 probem o local-name aparecer como um common-block-object em
uma instruo COMMON, um equivalence-object em uma instruo EQUIVALENCE ou um namelist-
group-name em uma instruo NAMELIST, respectivamente. No h proibio contra o local-name aparecer
como um common-block-name ou um namelist-group-object
Nota 11.11
Para uma discusso do impacto da clusula ONLY e renomeao na compilao pendente, ver seo C.8.2.1
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 272
Nota 11.12
Exemplos:
USE STATS_LIB
prov acesso a todas as entidades pblicas no mdulo STATS LIB
USE MATH_LIB; USE STATS_LIB, SPROD => PROD
faz todas as entidades pblicas tanto em MATH LIB quanto em STATS LIB acessveis. Se MATH LIB contm
uma entidade chamada PROD, ela acessvel pelo uso de seu prprio nome enquanto a entidade PROD de STATS
LIB acessvel pelo nome SPROD
USE STATS_LIB, ONLY: YPROD; USE STATS_LIB, ONLY : PROD
faz a entidade pblica YPROD e PROD em STATS_LIB acessveis
USE STATS_LIB, ONLY : YPROD; USE STATS_LIB
faz todas as entidades pblicas em STATS_LIB acessveis
11.3 Unidades de Programa Dados em Bloco
11.3 Block data program units
Uma unidade de programa dados em bloco (block data program unit) utilizada para prover valores
iniciais para objetos de dados em blocos comuns com nome (named common blocks).
R1116 block-data is block-data-stmt
[specification-part]
end-block-data-stmt
R1117 block-data-stmt is BLOCK DATA[block-data-name]
R1118 end-block-data-stmt is END[BLOCK DATA[block-data-name]]
C1116 (R1116) Um block-data-name tem que ser includo na end-block-data-stmt somente se foi ele
provido em uma block-data-stmt e, se includo, tem que ser idntico ao block-data-name na block-
data-stmt
C1117 (R1116) A block-data specification-part tem que conter somente definies de derived-type
e instrues de declaraes de tipo ASYNCHRONOUS, BIND, COMMON, DATA, DIMENSION, EQUIVALENCE,
IMPLICIT, INTRINSIC, PARAMETER, POINTER, SAVE, TARGET, USE e VOLATILE
C1118 (R1116) Uma instruo de declarao de tipo em uma block-data specification-part no pode
conter especificador de atributo ALLOCATABLE, EXTERNAL ou BIND
Nota 11.13
Para informaes explicativas sobre o uso de block-data-name, ver a seo C.8.1
Se um objeto em um bloco comum com nome (named common block) inicialmente definido, todas as
unidades de armazenamento na sequncia de armazenamento do bloco comum tem que ser especificada mesmo se
elas todas no tenham sido inicialmente definidas. Mais de um bloco comum com nome pode ter objetos
inicialmente definidos em uma nica unidade de programa dados em bloco (block data program unit).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 273
Nota 11.14
No exemplo
BLOCK DATA INIT
REAL A, B, C, D, E, F
COMMON /BLOCK1/ A, B, C, D
DATA A /1.2/, C /2.3/
COMMON /BLOCK2/ E, F
DATA F /6.5/
END BLOCK DATA INIT
blocos comuns BLOCK1 e BLOCK2 ambos tem objetos que esto sendo inicializados em uma nica unidade de
programa dados em bloco (block data program unit). B, D e E no so inicializadas, mas eles precisam ser
especificados como parte dos blocos comuns
Somente um objeto em um bloco comum com nome (named common block) podem ser inicialmente
definidos em uma unidade de programa dados em bloco (block data program unit).
Nota 11.15
Objetos associados com um objeto em um bloco comum so considerados estar naquele bloco comum
O mesmo blocos comuns com nome no pode aparecer em mais do que uma unidade de programa dados
em bloco (block data program unit) em um programa.
No pode haver mais de uma unidade de programa dados em bloco sem nome (unnamed block data program
unit) em um programa.
Nota 11.16
Um exemplo de unidade de programa dados em bloco :
BLOCK DATA WORK
COMMON /WRKCOM/ A, B, C (10, 10)
REAL :: A, B, C
DATA A /1.0/, B /2.0/, C /100 * 0.0/
END BLOCK DATA WORK
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 274
12. Procedimentos
Section 12: Procedures
O conceito de procedimento foi introduzido em 2.3.3. Esta seo contm uma descrio completa de
procedimentos. As aes especificadas por um procedimento so realizadas quando o procedimento invocada
(invoked) para execuo por uma referncia a ele.
A sequncia de aes encapsulada poro um procedimento tem acesso as entidades na unidade de escopo
que invoca (invoking scoping unit) por meio da associao de argumentos (12.4.1). Um argumento mudo (dummy
argument) um nome que aparece na instruo SUBROUTINE, FUNCTION ou ENTRY na declarao do
procedimento (R1233). Argumento mudo so tambm especificados para procedimentos intrnsecos e
procedimentos em mdulos intrnsecos nas sees 13, 14 e 15.
As entidades na unidade de escopo que invoca (entities in the invoking scoping unit) so especificadas por
argumentos reais. Um argumento real (actual argument) um entidade que aparece em uma referncia a um
procedimento (R1221).
Um procedimento pode tambm ter acesso a entidades em outra unidade de escopo, no necessariamente a
unidade de escopo que invoca (invoking scoping unit), por associao de uso (use association) (16.4.1.2), associao
de hospedagem (host association) (16.4.1.3), associao de ligao (linkage association) (16.4.1.4), associao de
armazenamento (storage association) (16.4.3) ou por referncia a procedimentos externos (5.1.2.6).
12.1 Classificao de Procedimentos
12.1 Procedure classifications
Um procedimento classificado de acordo com a forma de sua referncia e a forma como ele foi definido.
12.1.1 Classificao de Procedimento por Referncia
12.1.1 Procedure classification by reference
A definio de um procedimento especifica o procedimento como funo ou sub-rotina. Uma referncia a
uma funo aparece explicitamente como um primrio dentro de uma expresso ou implcita por uma operao
definida (7.1.3) dentro de uma expresso. Uma referncia a uma sub-rotina a instruo CALL ou uma instruo
de atribuio definida (7.4.1.4).
Um procedimento classificado como elementar (elemental) se ele um procedimento que pode ser
referenciado elementarmente (12.7).
12.1.2 Classificao de Procedimento por meio da Definio
12.1.2 Procedure classification by means of definition
Um procedimento um procedimento intrnseco (intrinsic procedure), um procedimento externo (external
procedure), um procedimento mdulo (module procedure), um procedimento interno (internal procedure), um
procedimento mudo (dummy procedure) (que pode ser um ponteiro de procedimento mudo), um ponteiro de
procedimento no mudo (nondummy procedure pointer) ou uma funo instruo.
12.1.2.1 Procedimentos Intrnsecos
12.1.2.1 Intrinsic procedures
Um procedimento que provido como uma parte inerente do processador um procedimento intrnseco
(intrinsic procedure).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 275
12.1.2.2 Procedimentos Externo, Interno e Mdulo
12.1.2.2 External, internal, and module procedures
Um procedimento externo (external procedure) um procedimento que definido por um subprograma
externo ou por outros meios que no o Fortran.
Um procedimento interno (internal procedure) um procedimento que definido por um subprograma
interno. Subprogramas interno podem aparecer num programa principal, em um subprograma externo ou em um
subprograma mdulo. Subprogramas interno no pode aparecer em outro subprograma interno. Subprograma
interno so o mesmo que subprogramas externos exceto que o nome de um procedimento interno no uma
entidade global, um subprograma interno no pode conter a instruo ENTRY, o nome do subprograma interno no
pode ser associado por argumento com um argumento mudo (12.4.1.3) e o subprograma interno tem acesso as
entidades do hospedeiro (host) por associao de hospedagem (host association).
Um procedimento mdulo (module procedure) um procedimento que definido por um subprograma
mdulo.
Um subprograma define um procedimento para a instruo SUBROUTINE ou FUNCTION. Se o
subprograma tem uma ou mais instrues ENTRY, ele tambm define um procedimento para cada uma delas.
12.1.2.3 Procedimentos Mudos
12.1.2.3 Dummy procedures
Um argumento mudo que especificado como um procedimento ou aparece em uma referncia de
procedimento um procedimento mudo (dummy procedure). Um procedimento com o atributo POINTER um
ponteiro de procedimento mudo.
12.1.2.4 Ponteiros de Procedimento
12.1.2.4 Procedure pointers
Um ponteiro de procedimento (procedure pointer) um procedimento que tem os atributos EXTERNAL e
POINTER; ele pode ser um ponteiro associado com um procedimento externo (external procedure), um
procedimento mdulo (module procedure), um procedimento intrnseco (intrinsic procedure) ou um procedimento
mudo (dummy procedure) que no um ponteiro de procedimento.
12.1.2.5 Funes Instruo
12.1.2.5 Statement functions
A funo que definida por uma nica instruo uma funo instruo (statement function) (12.5.4).
12.2 Caractersticas dos Procedimentos
12.2 Characteristics of procedures
As caractersticas de um procedimento (characteristics of a procedure) so as classificaes do
procedimento como um funo ou sub-rotina, se ela pura, se ela elementar, se ela tem o atributo BIND, as
caractersticas dos seus argumentos mudos e as caractersticas do seu valor resultado se ele uma funo.
12.2.1 Caractersticas dos Argumentos mudos
12.2.1 Characteristics of dummy arguments
Cada argumento mudo tem as caractersticas que um um objeto de dado mudo (dummy data object), um
procedimento mudo (dummy procedure), um ponteiro de procedimento mudo (dummy procedure pointer), ou um asterisco
(indicador de retorno alternativo). Um argumento mudo diferente de um asterisco pode ser especificado com o atributo
OPTIONAL. Este atributo significa que o argumento mudo no necessita estar associado com um argumento real
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 276
para qualquer referncia particular deste procedimento.
12.2.1.1 Caractersticas dos Objetos de Dados Mudos
12.2.1.1 Characteristics of dummy data objects
As caractersticas de um objeto de dado mudo (dummy data object), so seu tipo, seus parmetros de tipo (se
existirem), sua forma, sua inteno (5.1.2.7, 5.2.7), se ele opcional (5.1.2.9, 5.2.8), se ele alocvel (5.1.2.5.3), se
ele tem o atributo VALUE (5.1.2.15), ASYNCHRONOUS (5.1.2.3) ou VOLATILE (5.1.2.16), se ele polimrfico
e se ele um ponteiro (5.1.2.11, 5.2.10) ou um alvo (5.1.2.14, 5.2.13). Se um parmetro de tipo de um objeto ou um
limite de uma matriz no uma expresso de inicializao, a dependncia exata das entidades na expresso uma
caracterstica. Se a forma, tamanho ou parmetro de tipo assumido ou postergado, isto uma caracterstica.
12.2.1.2 Caractersticas dos Procedimentos Mudos e Ponteiros de Procedimentos Mudos
12.2.1.2 Characteristics of dummy procedures and dummy procedure pointers
As caractersticas de um procedimento mudo so as caractersticas de sua interface (12.3.1), suas
caractersticas como um procedimento se a interface explcita, se ele um ponteiro e se ele opcional (5.1.2.9,
5.2.8).
12.2.1.3 Caractersticas dos Argumentos Mudos Asterisco
12.2.1.3 Characteristics of asterisk dummy arguments
Um asterisco como um argumento mudo no tem caractersticas.
12.2.2 Caractersticas dos Resultados de Funo
12.2.2 Characteristics of function results
As caractersticas de um resultado de funo so seu tipo, parmetros de tipo (se existir), nmero de
dimenses (rank), se ele polimrfico, se ele alocvel, se ele um ponteiro e se um ponteiro de procedimento.
Se o resultado de funo uma matriz que no alocvel ou um ponteiro, sua forma uma caracterstica. Se um
parmetro de tipo do resultado da funo ou um limite do resultado de funo matricial no uma expresso de
inicializao, a dependncia exata das entidades na expresso uma caracterstica. Se os parmetros de tipo de um
resultado de funo so postergados, quais parmetros so postergados uma caracterstica. Se o comprimento de um
resultado de funo assumido, isto uma caracterstica.
12.3 Interface de Procedimento
12.3 Procedure interface
A interface (interface) de um procedimento determina as formas de referncia atravs das quais ele podem
ser invocado. A interface do procedimento consiste de sua interface abstrata (abstract interface), seu nome, seu rtulo
de ligao (binding label) se existir e os identificadores genricos do procedimento, se existir. A caractersticas de um
procedimento so fixas, mas o restante da interface pode diferir em diferentes unidades de escopo.
Uma interface abstrata (abstract interface) consiste de caractersticas do procedimento e dos nomes dos
argumentos mudos.
Nota 12.1
Para mais informaes explanatrias sobre interface procedimento, ver C.9.3
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 277
12.3.1 Interfaces Implcitas e Explcitas
12.3.1 Implicit and explicit interfaces
Se um procedimento acessvel em uma unidade de escopo, sua interface explcita ou implcita (explicit
ou implicit) nesta unidade de escopo. A interface de um procedimento interno, procedimento mdulo ou
procedimento intrnseco so sempre explcitas neste tipo de unidade de escopo. A interface de uma sub-rotina ou
uma funo com um nome do resultado separado explcita dentro do subprograma que as define. A interface de uma
funo instruo sempre implcita. A interface de um procedimento externo ou procedimento mudo explicita em uma
unidade de escopo diferente que o seu prprio se um corpo de interface (interface body) (12.3.2.1) para o
procedimento fornecido ou acessvel, e implcito de outra forma.
A interface de um procedimento externo ou procedimento mudo explcita em uma unidade de escopo
diferente da sua prpria se um corpo de interface (12.3.2.1) para o procedimento fornecido ou acessvel, e
implcito de outra forma.
Nota 12.2
Por exemplo, a sub-rotina LLS de C.8.3.5 tem uma interface explicita
12.3.1.1 Interface Explcita
12.3.1.1 Explicit interface
Um procedimento diferente de funo instruo tem que ter uma interface explcita se ele referenciado e
1. a referncia do procedimento aparece
(a) com uma palavra-chave no argumento (12.4.1),
(b) como uma referncia usando o nome genrico (12.3.2.1),
(c) como uma atribuio definida (sub-rotina somente)
(d) em uma expresso como um operador definido (funo somente)
(e) em um contexto que requeira que ele seja puro
2. o procedimento tem um argumento mudo que
(a) tem o atributo ALLOCATABLE, ASYNCHRONOUS, OPTIONAL, POINTER, TARGET, VALUE ou
VOLATILE
(b) uma matriz de forma assumida (assumed-shape array)
(c) um tipo derivado parametrizado
(d) polimrfica
3. o procedimento tem um resultado que
(a) uma matriz
(b) um ponteiro ou alocvel
(c) tem um valor de parmetro de tipo no assumido que no uma expresso de inicializao
4. o procedimento elementar
5. o procedimento tem o atributo BIND
12.3.2 Especificao da Interface de Procedimento
12.3.2 Specification of the procedure interface
A interface de um procedimento interno, externo, mdulo ou mudo especificada por uma instruo
FUNCTION, SUBROUTINE ou ENTRY e pelas instrues de especificao para os argumentos mudos e o
resultado da funo. Estas instrues podem aparecer em uma definio de procedimento, em um corpo de
interface (interface body) ou em ambos, exceto que a instruo ENTRY que no pode aparecer em um corpo de
interface.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 278
Nota 12.3
Um corpo de interface no pode ser usado para descrever a interface de um procedimento interno, procedimento
mdulo ou um procedimento intrnseco porque as interfaces destes procedimentos j so explcitas. Entretanto, o
nome de um procedimento pode aparecer em uma instruo PROCEDURE em um bloco de interface (interface
block) (12.3.2.1)
12.3.2.1 Bloco de Interface
12.3.2.1 Interface block
R1201 interface-block is interface-stmt
[interface-specification]...
end-interface-stmt
R1202 interface-specification is interface-body
or procedure-stmt
R1203 nterface-stmt is INTERFACE[generic-spec]
or ABSTRACT INTERFACE
R1204 end-interface-stmt is END INTERFACE[generic-spec]
R1205 interface-body is function-stmt
[specification-part]
end-function-stmt
or subroutine-stmt
[specification-part]
end-subroutine-stmt
R1206 procedure-stmt is [MODULE]PROCEDURE procedure-name-list
R1207 generic-spec is generic-name
or OPERATOR(defined-operator)
or ASSIGNMENT(=)
or dtio-generic-spec
R1208 dtio-generic-spec is READ(FORMATTED)
or READ(UNFORMATTED)
or WRITE(FORMATTED)
or WRITE(UNFORMATTED
R1209 import-stmt is IMPORT[[::]import-name-list]
C1201 (R1201) Um interface-block em um subprograma no pode conter uma interface-body para um
procedimento definido por este subprograma
C1202 (R1201) A generic-spec tem que ser includa na end-interface-stmt somente se ela provida na
interface-stmt. Se a end-interface-stmt inclu generic-name, a interface-stmt tem que especificar
o mesmo generic-name. Se a end-interface-stmt inclu ASSIGNMENT(=), a interface-stmt especifica
ASSIGNMENT(=). Se a end-interface-stmt inclu dtio-generic-spec, a interface-stmt tem que
especificar o mesmo dtio-generic-spec. Se a end-interface-stmt inclu OPERATOR(defined-operator), a
interface-stmt especicifc o mesmo defined-operator. Se um defined-operator .LT., .LE.,
.GT., .GE., .EQ. Ou .NE., o outro permitido ser o operador correspondente <, <=, >, >=, == ou /=
C1203 (R1203) Se a interface-stmt ABSTRACT INTERFACE, ento o function-name na function-
stmt ou o subroutine-name na subroutine-stmt no pode ser o mesmo que a palavra-chave que
especifica um tipo intrnseco
C1204 (R1202) Uma procedure-stmt permitida somente em um bloco de interface que tem uma generic-
spec
C1205 (R1205) Um interface-body de um procedimento puro tem que especificar as intenes de todos os
argumentos mudos exceto ponteiro, retorno alternativo e argumentos procedimento
C1206 (R1205) Um interface-body no pode conter uma entry-stmt, data-stmt, format-stmt, ou
stmt-function-stmt
C1207 (R1206) O procedure-name tem que ter uma interface explcita e tem que referi-se a um ponteiro de
procedimento acessvel, procedimento externo, procedimento mudo ou procedimento mdulo
C1208 (R1206) Se MODULE aparece em uma procedure-stmt, cada procedure-name nesta instruo tem
que ser acessvel no escopo atual como um procedimento mdulo
C1209 (R1206) Um procedure-name no pode especificar um procedimento que foi especificado previamente
em qualquer procedure-stmt em qualquer interface acessvel com o mesmo identificador genrico
C1210 (R1209) A instruo IMPORT permitida em um interface-body
C1211 (R1209) Cada import-name tem que ser o mesmo de uma entidade em uma unidade de escopo
hospedeira
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 279
Um subprograma externo ou mdulo especifica uma interface especfica (specific interface) para os
procedimentos definidos neste subprograma. Esta interface explcita explcita para procedimentos mdulo e
implcita para procedimentos externos.
Um bloco de interface (interface block) introduzida por uma ABSTRACT INTERFACE um bloco de
interface abstrato (abstract interface block). Um corpo de interface (interface body) um bloco de interface abstrato
especifica uma interface abstrata (abstract interface). Um bloco de interface com uma especificao genrica um
bloco de interface genrico (generic interface block). Um bloco de interface sem uma especificao ABSTRACT
nem uma especificao genrica um bloco de interface especfico (specific interface block).
O nome de uma entidade declarada em um corpo de interface e o function-name na function-stmt ou o
subroutine-name na subroutine-stmt que inicia o corpo de interface.
Um corpo de interface em um bloco de interface especfica ou genrica especifica o atributo EXTERNAL e
a interface especfica explcita para um procedimento externo ou um procedimento mudo. Se o mone do
procedimentos declarado o do argumento mudo em um subprograma contendo o corpo de interface, o
procedimento um procedimento mudo; caso contrrio, um procedimento externo.
Um corpo de interface especifica todas as caractersticas de uma interface especfica explcita ( explicit
specific interface) ou interface abstrata (abstract interface). A parte de especificao de um corpo de interface pode
especificar atributos ou definir valores para as entidades de dados que no determinam caractersticas do
procedimento. Estas especificaes no tem efeito.
Se uma interface especfica explcita especificada por um corpo de interface ou uma instruo de
declarao de procedimento (12.3.2.3) para um procedimento externo, as caractersticas tm que ser consistentes
com aqueles especificados na definio do procedimento, exceto que a interface pode especificar um procedimento
como no puro se o procedimento definido como puro. Uma interface para um procedimento nomeado pro uma
instruo ENTRY pode ser especificada pelo uso do nome na instruo entry (entry name) como o nome do
procedimento no corpo da interface. Uma interface especfica explcita pode ser especificada por um corpo de
interface para um procedimento externo que no existe em um programa se o procedimento nunca usado de
qualquer forma. Um procedimento no pode ter mais de uma interface especfica explcita em uma dada unidade de
escopo.
Nota 12.4
Os nomes de argumentos mudos podem ser diferentes porque o nome de um argumento mudo no uma
caracterstica
A instruo IMPORT especifica que a entidade com nome vindo da unidade de escopo hospedeira so
acessveis no corpo da interface por associao de hospedagem. Uma entidade que importada desta maneira e
definida na unidade de escopo hospedeira tem que ser explicitamente declarada antes do corpo da interface. O
nome de uma entidade feita acessvel por uma instruo IMPORT no pode aparecer em qualquer contexto descrito
em 16.4.1.3 que faz a entidade do hospedeiro (host entity) com este nome se tornar inacessvel.
Dentro de um corpo de interface, se uma instruo IMPORT sem import-name-list aparece, cada
entidade do hospedeiro no listada na instruo IMPORT tambm feita acessvel por associao de hospedagem
se seu nome no aparece no contexto descrito em 16.4.1.3 que faz a entidade do hospedeiro com este nome se
tornar inacessvel.
Nota 12.5
Um exemplo de um bloco de interface sem uma especificao genrica :
INTERFACE
SUBROUTINE EXT1(X, Y, Z)
REAL, DIMENSION(100, 100) :: X, Y, Z
END SUBROUTINE EXT1
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 280
SUBROUTINE EXT2(X, Z)
REAL X
COMPLEX(KIND = 4) Z (2000)
END SUBROUTINE EXT2
FUNCTION EXT3(P, Q)
LOGICAL EXT3
INTEGER P(1000)
LOGICAL Q(1000)
END FUNCTION EXT3
END INTERFACE
Este bloco de interface especifica interfaces explcitas para trs procedimentos externos EXT1, EXT2 e EXT3.
Invocao destes procedimentos podem usar palavras-chaves de argumentos (argument keywords) (12.4.1); por
exemplo:
EXT3(Q=P_MASK(N+1:N+1000),P=ACTUAL_P)
Nota 12.6
A instruo IMPORT pode ser usada para permitir que os procedimentos mdulos tenham argumentos mudos que
so procedimentos com argumentos de forma assumida do tipo opaco. Por exemplo:
MODULE M
TYPE T
PRIVATE ! T um tipo opaco
...
END TYPE
CONTAINS
SUBROUTINE PROCESS(X,Y,RESULT,MONITOR)
TYPE(T),INTENT(IN) :: X(:,:),Y(:,:)
TYPE(T),INTENT(OUT) :: RESULT(:,:)
INTERFACE
SUBROUTINE MONITOR(ITERATION_NUMBER,CURRENT_ESTIMATE)
IMPORT T
INTEGER,INTENT(IN) :: ITERATION_NUMBER
TYPE(T),INTENT(IN) :: CURRENT_ESTIMATE(:,:)
END SUBROUTINE
END INTERFACE
...
END SUBROUTINE
END MODULE
O procedimento mudo MONITOR requer uma interface explcita porque ele tem um argumento matricial de
forma assumida , mas TYPE(T) no pode estar disponvel dentro do corpo de interface sem a instruo IMPORT
Um bloco de interface genrico especifica uma interface genrica (generic interface) para cada
procedimento no bloco de interface. A instruo PROCEDURE lista ponteiros de procedimento (procedure pointers),
procedimentos externos, procedimentos mudos ou procedimentos mdulo que tm esta interface genrica. Uma
interface genrica sempre explcita.
Qualquer procedimento pode ser referenciado via sua interface explcita se a interface explcita est
acessvel. Ele tambm pode ser referenciado via uma interface genrica. A generic-spec em uma interface-
stmt um identificador genrico (generic identifier) para todos os procedimentos no bloco de interfaces. As regras
especificando como qualquer dois procedimentos com o mesmo identificador genrico diferem dada em 16.2.3.
Elas garantem que qualquer invocao genrica aplica-se ao procedimentos mais especfico.
Um nome genrico especifica um nome nico para referenciar todos os nomes de procedimentos do bloco
de interface. Um nome genrico pode ser o mesmo qe qualquer um dos nomes de procedimentos no bloco de
interface ou o mesmo que qualquer nome genrico.
Um nome genrico (generic name) pode ser o mesmo que o nome de um tipo derivado, e neste caso todos
os procedimentos no bloco de interface tm que ser funes.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 281
Nota 12.7
Um exemplo de interface de procedimento genrica :
INTERFACE SWITCH
SUBROUTINE INT_SWITCH(X, Y)
INTEGER, INTENT(INOUT) :: X, Y
END SUBROUTINE INT_SWITCH
SUBROUTINE REAL_SWITCH(X, Y)
REAL, INTENT(INOUT) :: X, Y
END SUBROUTINE REAL_SWITCH
SUBROUTINE COMPLEX_SWITCH (X, y)
COMPLEX, INTENT(INOUT) :: X, Y
END SUBROUTINE COMPLEX_SWITCH
END INTERFACE SWITCH
Qualquer destas trs sub-rotinas (INT_SWITCH, REAL_SWITCH, COMPLEX_SWITCH) pode ser referenciada
com o nome genrico SWITCH, como tambm pelos seus nomes especficos. Por exemplo, uma referncia a
INT_SWITCH pode ter a forma:
CALL SWITCH(MAX_VAL, LOC_VAL) ! MAX_VAL e LOC_VAL so do tipo inteiro
Uma interface-stmt tendo uma dtio-generic-spec uma interface para um procedimento de
entrada/sada tipo derivado definido pelo usurio (user-defined derived-type input/output procedure) ((9.5.3.7).
12.3.2.1.1 Operaes Definidas
12.3.2.1.1 Defined operations
Se OPERATOR especificado em uma especificao genrica, todos os procedimentos especificados na
interface genrica tm que ser funes que possam ser referenciadas como operaes definidas (7.1.3, 7.1.8.7, 7.2,
12.4). No caso de funes com dois argumentos, notao de operador binrio entre argumentos implcita. No caso
de funes de um argumento, notao de operador prefixado implcita. OPERATOR no pode ser especificado
para funes sem argumentos ou funes para funo com mais de dois argumentos. Os argumentos mudos no
podem ser objetos de dados mudos no opcionais e tem que ser especificados com INTENT(IN). O resultado da funo
(function result) no pode ter comprimento de caractere assumido. Se o operador um intrinsic-operator (R310) o nmero
de argumentos da funo tem que ser consistente com o uso intrnseco deste operador e os tipos, parmetros de tipo
subtipo ou os nmeros de dimenses dos argumentos mudos tem que diferir daqueles requeridos para a operao
intrnseca (7.1.2).
A operao definida tratada como uma referncia a uma funo. Para uma operao definida unria, o
operando corresponde ao argumento mudo da funo; para uma operao binria, o operando colocado esquerda
corresponde ao primeiro argumento mudo da funo e o colocado direita corresponde ao segundo argumento
mudo.
Nota 12.8
Um exemplo de uma especificao genrica de um OPERATOR :
INTERFACE OPERATOR( * )
FUNCTION BOOLEAN_AND(B1, B2)
LOGICAL, INTENT(IN) :: B1(:), B2(SIZE(B1))
LOGICAL :: BOOLEAN_AND(SIZE(B1))
END FUNCTION BOOLEAN_AND
END INTERFACE OPERATOR (* )
Isto permite, por exemplo
SENSOR(1:N) * ACTION(1:N)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 282
como uma alternativa a uma invocao de funo com a instruo CALL
BOOLEAN_AND(SENSOR(1:N),ACTION(1:N)) ! SENSOR e ACTION so do tipo lgico
Um dado operador definido pode, da mesma forma que nomes genricos, aplicar a mais de uma funo, e
neste caso ele genrico em exata analogia com os nomes de procedimentos genricos. Para smbolos de
operadores intrnsecos, as propriedades genricas inclu as operaes intrnsecas que elas representam. Porque as
duas formas de cada operador relacional tem a mesma interpretao (7.2), estender uma forma (tal como <=) tem o
efeito de definir ambas as formas (<= e .LE.).
Nota 12.9
No Fortran 90 e Fortran 95, no era possvel definir operadores sobre ponteiros porque argumentos mudos
ponteiros (pointer dummy arguments) no eram permitidos ter um atributo INTENT. A restrio contra INTENT
para argumentos mudo ponteiro agora disponvel, ento operaes definidas para ponteiros so agora possveis.
Entretanto, o atributo POINTER no pode ser usado para resolver procedimentos genrico (16.2.3), ento no
possvel definir um operador genrico que tem um procedimento para ponteiros e outro procedimento para no
ponteiro
12.3.2.1.2 Atribuies Definidas
12.3.2.1.2 Defined assignments
Se ASSIGNMENT(=) especificada em uma especificao genrica. Todos os procedimentos na interface
genrica tem que ser sub-rotinas que possam ser referenciadas como atribuio definida (7.4.1.4). Atribuio
definida pode, tal qual nomes genricos, aplicada a mais de uma sub-rotina, e neste caso ele genrico em exata
analogia com os nomes de procedimentos genricos.
Cada uma destas sub-rotinas tm que ter exatamente dois argumentos mudos. Cada argumento tem que ser
no opcional. O primeiro argumento tem que ter INTENT(OUT) ou INTENT(INOUT) e o segundo argumento tem
que ter INTENT(IN). Ou o segundo argumento tem que ser uma matriz cujo rank (nmero de dimenses) difere
daquele do primeiro argumento, os tipos declarados e parmetros de tipo subtipo dos argumentos no podem ser
conforme especificado na tabela 7.8 ou o primeiro argumento tem que ser do tipo derivado. Uma atribuio
definida tratada como uma referncia a uma sub-rotina, com o lado esquerdo sendo o primeiro argumento e o lado
direito envolvido em parnteses como segundo argumento. A especificao genrica ASSIGNMENT especifica que
esta atribuio estendida ou redefinida.
Nota 12.10
Um exemplo de uso da uma especificao genrica :
INTERFACE ASSIGNMENT( = )
SUBROUTINE LOGICAL_TO_NUMERIC(N, B)
INTEGER, INTENT(OUT) :: N
LOGICAL, INTENT(IN) :: B
END SUBROUTINE LOGICAL_TO_NUMERIC
SUBROUTINE CHAR_TO_STRING(S, C)
USE STRING_MODULE
! contm definio do tipo STRING
TYPE(STRING), INTENT(OUT) :: S ! um string de comprimento varivel string
CHARACTER(*), INTENT(IN) :: C
END SUBROUTINE CHAR_TO_STRING
END INTERFACE ASSIGNMENT( = )
Exemplo de atribuio so:
KOUNT = SENSOR (J) ! CALL LOGICAL_TO_NUMERIC(KOUNT,(SENSOR(J)))
NOTE = 89AB ! CALL CHAR_TO_STRING(NOTE,(89AB))
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 283
12.3.2.1.3 Interfaces de Procedimento de Entrada/Sada Tipo Derivado Definido pelo
Usurio
12.3.2.1.3 User-defined derived-type input/output procedure interfaces
Todos os procedimentos especificados em um bloco de interface para um procedimento de entrada/sada
tipo derivado definido pelo usurio (user-defined derived-type input/output procedure) tem que ser sub-rotinas que tem
interfaces como descritas em 9.5.3.7.2.
12.3.2.2 Instruo Externa
12.3.2.2 EXTERNAL statement
Uma instruo EXTERNAL (EXTERNAL statement ) especifica o atributo EXTERNAL (5.1.2.6) para a
lista de nomes.
R1210 external-stmt is EXTERNAL[::]external-name-list
Cada external-name tem que ser o nome de um procedimento externo, um argumento mudo, um ponteiro
de procedimento (procedure pointer) ou uma unidade de programa dados em bloco (block data program unit)
ou uma unidade de programa dados em bloco (block data). Em um subprograma externo, uma instruo
EXTERNAL no pode especificar o nome de um procedimento definido por um subprograma.
A utilizao do nome de uma unidade de programa dados em bloco em uma instruo EXTERNAL
confirma que a unidade de programa dados em bloco uma parte do programa.
Nota 12.11
Para informaes explanatrias sobre potencias problemas de portabilidade com procedimentos externos ver C.9.1
Nota 12.12
Um exemplo de uma instruo EXTERNAL :
EXTERNAL FOCUS
12.3.2.3 Instruo Declarao de Procedimento
12.3.2.3 Procedure declaration statement
A instruo de declarao de procedimento (procedure declaration statement) declara declares ponteiros de
procedimento (procedure pointers), procedimentos mudo (dummy procedures) e procedimentos externo (external
procedures). Ela especifica o atributo EXTERNAL (5.1.2.6) para todas as entidades procedimento na proc-decl-
list.
R1211 procedure-declaration-stmt is PROCEDURE([proc-interface])
or [[,proc-attr-spec]...::]proc-decl-list
R1212 proc-interface is interface-name
or declaration-type-spec
R1213 proc-attr-spec is access-spec
or proc-language-binding-spec
or INTENT(intent-spec)
or OPTIONAL
or POINTER
or SAVE
R1214 proc-decl is procedure-entity-name[ => null-init]
R1215 interface-name is name
C1212 (R1215) O nome tem que ser o nome de uma interface abstrata ou de um procedimento que tem uma
interface explcita. Se o nome declarado por uma procedure-declaration-stmt ele tem que ser
previamente declarado. Se o nome representa um procedimento intrnseco ele tem que ser um dos listados em
13.6 e no marcado com um ponto lista ()
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 284
C1213 (R1215) O nome no pode ser o nome de uma palavra-chave que especifica um tipo intrnseco
C1214 Se a entidade procedimento tem o atributo INTENT ou atributo SAVE, ela tambm tem o atributo
POINTER
C1215 (R1211) Se uma proc-interface descreve um procedimento elementar, cada procedure-entity-
name tem que especificar um procedimento externo
C1216 (R1214) Se => aparece em proc-decl, a entidade procedimento tem que ter o atributo POINTER
C1217 (R1211) Se proc-language-binding-spec com um NAME= especificado, a proc-decl-list
tem que conter exatamente uma proc-decl, que nunca tem o atributo POINTER nem um procedimento mudo
C1218 (R1211) Se proc-language-binding-spec especificado, a proc-interface tem que aparecer,
ela tem um interface-name e um interface-name tem que ser declarado com uma proc-language-
binding-spec
Se proc-interface aparece e consiste de um interface-name, ela especifica uma interface especfica
explcita (explicit specific interface)(12.3.2.1) para os procedimentos declarados ou ponteiros de procedimento
(procedure pointers). A interface abstrata (12.3) aquela especificada pela interface nomeada por um interface-
name.
Se proc-interface aparece e consiste de uma declaration-type-spec, ela especifica que os
procedimentos declarados ou ponteiros de procedimento so funes tendo interfaces implcitas e o tipo
especificado pelo resultado. Se um tipo especificado para uma funo externa, sua definio da funo (12.5.2.1)
tem que especificar o mesmo tipo de resultado e parmetros de tipo.
Se proc-interface no aparece, a instruo de declarao do procedimento no especifica se os
procedimentos declarados ou ponteiros de procedimentos so sub-rotinas ou funes.
Se a proc-attr-spec diferente de uma proc-language-binding-spec aparece, ela especifica que os
procedimentos declarados ou ponteiros de procedimentos tem aquele atributo. Estes atributos so descritos em
5.1.2. Se a proc-language-binding-spec com NAME= aparece, ela especifica um rtulo de ligao (binding label)
como descrito em 15.4.1. Uma proc-language-binding-spec sem um NAME= permitida, mas ela redundante
com a proc-interface requerida por C1218.
Se => null-init aparece em uma proc-decl em uma procedure-declaration-stmt, ele especifica que
o estado de associao inicial da entidade procedimento correspondente est desassociado. Ele tambm implica no
atributo SAVE, que pode ser reafirmado pelo explcito de um atributo SAVE em uma procedure-declaration-
stmt ou por uma instruo SAVE.
Nota 12.13
Em contraste com uma instruo EXTERNAL, no possvel usar uma instruo PROCEDURE para identificar
um subprograma dados em bloco (BLOCK DATA)
Nota 12.14
O cdigo que segue ilustra a instruo PROCEDURE. Nota 7.43 ilustra o uso de P e BESSEL definidos neste
cdigo
ABSTRACT INTERFACE
FUNCTION REAL_FUNC(X)
REAL, INTENT(IN) :: X
REAL :: REAL_FUNC
END FUNCTION REAL_FUNC
END INTERFACE
INTERFACE
SUBROUTINE SUB(X)
REAL, INTENT(IN) :: X
END SUBROUTINE SUB
END INTERFACE
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 285
!-- Alguns procedimentos externos ou mudos com interfaces explcitas
PROCEDURE (REAL_FUNC) :: BESSEL, GAMMA
PROCEDURE (SUB) :: PRINT_REAL
!-- Alguns ponteiros de procedimento com interface explcita, um inicializado com NULL()
PROCEDURE (REAL_FUNC), POINTER :: P, R => NULL()
PROCEDURE (REAL_FUNC), POINTER :: PTR_TO_GAMMA
!-- Um tipo derivado com componente ponteiro de procedimento...
TYPE STRUCT_TYPE
PROCEDURE (REAL_FUNC), POINTER :: COMPONENT
END TYPE STRUCT_TYPE
!-- ... e uma varivel deste tipo
TYPE(STRUCT_TYPE) :: STRUCT
!-- Uma funo externa ou muda com interfaces implcitas
PROCEDURE (REAL) :: PSI
12.3.2.4 Instruo Intrnseca
12.3.2.4 INTRINSIC statement
Uma instruo INTRINSIC (INTRINSIC statement) especifica uma lista de nomes que tem o atributo
INTRINSIC (5.1.2.8).
R1216 intrinsic-stmt is INTRINSIC[::]intrinsic-procedure-name-list
C1219 (R1216) Cada intrinsic-procedure-name tem que ser o nome de um procedimento intrnseco
Nota 12.15
O m=nome no pode ser especificado explicitamente como tendo os atributos EXTERNAL e INTRINSIC
simultaneamente na mesma unidade de escopo
12.3.2.5 Especificao Interface Implcita
12.3.2.5 Implicit interface specification
No escopo de uma unidade onde a interface de uma funo implcita, o tipo e parmetros de tipo do
resultado da funo so especificados por uma especificao de tipo implcita ou explcita no nome da funo. O
tipo, parmetros de tipo e forma dos argumentos mudos do procedimento referenciado em uma unidade de escopo
onde a interface do procedimento implcita tem que ser tal que o argumento real sejam consistentes com as
caractersticas dos argumentos mudos.
12.4 Referncia de Procedimento
12.4 Procedure reference
A forma de uma referncia de procedimento (procedure reference) dependente da interface do
procedimento ou ponteiro de procedimento (procedure pointer), mas independente dos meios utilizados para definir
o procedimento. As formas de referncias dos procedimentos so:
R1217 function-reference is procedure-designator([actual-arg-spec-list])
C1220 (R1217) O procedure-designator tem que designar uma funo
C1221 (R1217) O actual-arg-spec-list no pode conter uma alt-return-spec
R1218 call-stmt is CALL procedure-designator[([actual-arg-spec-list])]
C1222 (R1217) O procedure-designator tem que designar uma sub-rotina
R1219 procedure-designator is procedure-name
or proc-component-ref
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 286
or data-ref % binding-name
C1223 (R1219) Um procedure-name tem que ser o nome de um procedimento ou ponteiro de procedimento
C1224 (R1219) O binding-name tem que ser um nome ligado (4.5.4) de um tipo declarado na data-ref
Resolver referncia de procedimentos ligado ao tipo (type-bound procedures) descrito em 12.4.5.
Uma funo pode tambm ser referenciada como uma operao definida (12.3.2.1.1). Uma sub-rotina pode
tambm ser referenciada como uma atribuio definida (12.3.2.1.2).
R1220 actual-arg-spec is [keyword=]actual-arg
R1221 actual-arg is expr
or variable
or procedure-name
or proc-component-ref
or alt-return-spec
R1222 alt-return-spec is * label
C1225 (R1220) O keyword = no pode aparecer se a interface do procedimento implcita na unidade de
escopo
C1226 (R1220) O keyword = no pode ser omitido em uma actual-arg-spec a menos que ele seja omitido
em cada actual-arg-spec precedente na lista de argumentos
C1227 (R1220) cada palavra-chave tem que ser o nome de um argumento mudo na interface explcita do
procedimento
C1228 (R1221) Um procedimento elementar no intrnseco no pode ser usada como um argumento real
C1229 (R1221) O procedure-name tem que ser o nome de um procedimento externo, um procedimento
mudo, um procedimento mdulo, um ponteiro de procedimento ou uma funo intrnseca especfica que est
listada em 13.6 e no marcada com um ponto lista ()
Nota 12.16
Este padro no permite que procedimentos internos sejam usados como argumento real, em parte para simplificar
o problema de garantir que procedimentos internos com acesso de hospedagem recursivo acessem entidades da
instncia correta (12.5.2.3) do hospedeiro. Se, como em uma extenso, um processador permite que
procedimentos internos sejam usados como argumentos reais, a instncia correta neste caso a instncia na qual o
procedimento fornecido como um argumento real, mesmo se o argumento mudo correspondente esteja sendo
invocado vindo de uma instncia diferente
C1230 (R1221) Em uma referncia a um procedimento puro, o procedure-name actual-arg tem que ser o
nome de um procedimento puro (12.6)
Nota 12.17
Esta restrio garante que a pureza de um procedimento no seja indeterminada por permitir que ele chame um
procedimento no puro
C1231 (R1222) O rtulo em uma alt-return-spec tem que ser o rtulo de instruo de uma instruo alvo de desvio que
aparece na mesma unidade de escopo que a call-stmt
Nota 12.18
Vrgulas sucessivas no pode ser usadas para omitir argumentos opcionais
Nota 12.19
Exemplos de referncia de procedimento usando ponteiro de procedimento:
P => BESSEL
WRITE(*, *) P(2.5) !-- BESSEL(2.5)
S => PRINT_REAL
CALL S(3.14)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 287
12.4.1 Argumentos Reais, Mudos e Associao Argumento
12.4.1 Actual arguments, dummy arguments, and argument association
Em uma referncia a sub-rotina ou a funo, a lista de argumentos reais identifica a correspondncia entre o
argumento real fornecido e os argumentos mudos do procedimento. Esta correspondncia pode ser estabelecida por
uma palavra-chave ou pela posio. Se uma palavra-chave de argumento aparece, o argumento real associado
com o argumento mudo cujo nome o mesmo que a palavra-chave de argumento (usando os nomes dos
argumentos mudos da interface acessvel na unidade de escopo contendo a referncia do procedimento). Na
ausncia de uma palavra-chave de argumento, um argumento real associado com o argumento mudo ocupando a
posio correspondente na lista de argumentos mudo reduzidos, isto , o primeiro argumento real associado ao
primeiro argumento mudo na lista reduzida, o segundo argumento real associado ao segundo argumento mudo na
lista reduzida, etc.. A lista de argumentos mudos reduzida (reduced dummy argument list) a lista de argumentos
mudos completa ou, se existe um argumento mudo objeto passado (passed-object dummy argument) (4.5.3.3), a lista
de argumentos mudos com o argumento mudo objeto passado omitido. Exatamente um argumento real tem que ser
associado com cada argumento mudo no opcional. No mximo um argumento real pode estar associado com cada
argumento mudo opcional. Cada argumento real tem que ser associado com um argumento mudo.
Nota 12.20
Por exemplo, o procedimento definido por
SUBROUTINE SOLVE(FUNCT, SOLUTION, METHOD, STRATEGY, PRINT)
INTERFACE
FUNCTION FUNCT(X)
REAL FUNCT, X
END FUNCTION FUNCT
END INTERFACE
REAL SOLUTION
INTEGER, OPTIONAL :: METHOD, STRATEGY, PRINT
...
pode ser invocado com
CALL SOLVE(FUN, SOL, PRINT = 6)
garantido que sua interface explcita; se a interface especificada por um bloco de interface (interface block), o
nome do ltimo argumento tem que ser PRINT
12.4.1.1 O Argumento Mudo Objeto Passado e Associao Argumento
12.4.1.1 The passed-object dummy argument and argument association
Em uma referncia de um procedimento ligado ao tipo (type-bound procedure) que tem um argumento mudo
objeto passado (passed-object dummy argument) (4.5.3.3), a data-ref de uma function-reference ou call-stmt
associada, como um argumento real, com o argumento mudo objeto passado.
12.4.1.2 Argumento Real Associado com Objetos de Dados Mudo
12.4.1.2 Actual arguments associated with dummy data objects
Se um argumento mudo no alocvel nem um ponteiro, ele tem que ser compatvel em tipo ( type
compatible) (5.1.1.2) com o argumento real associado. Se o argumento mudo alocvel ou ponteiro, o argumento
real associado tem que ser polimrfico se e somente se o argumento mudo polimrfico e o tipo declarado do
argumento real tem que ser o mesmo que o tipo declarado do argumento mudo.
Nota 12.21
O tipo dinmico de um alocvel polimrfico (polymorphic allocatable) ou argumento mudo ponteiro (pointer dummy
argument) pode mudar como resultado da execuo de uma instruo de alocao ou atribuio de ponteiro em um
subprograma. Por este motivo o argumento real correspondente tem que ser polimrfico e e ter um tipo declarado
que igual ao tipo declarado do argumento mudo ou uma extenso deste tipo. Entretanto, a compatibilidade de
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 288
tipo requer que o tipo declarado para o argumento mudo seja o mesmo ou uma extenso do, tipo do argumento
real. Portanto, os argumentos mudo e real tm que ter o mesmo tipo declarado.
Informao do tipo dinmico no mantido para argumento mudo alocvel no polimrfico ou ponteiro.
Entretanto, atribuio de ponteiro ou alocao deste tipo de argumento mudo requer a manuteno desta
informao se o argumento mudo correspondente polimrfico. Portanto, o argumento mudo correspondente
necessita ser no polimrfico
Os valores dos parmetros de tipo do argumento real tm que concordar com os parmetros
correspondentes do argumento mudo que no so assumidos ou postergados, exceto para o caso do parmetro de
comprimento caractere de um argumento real do tipo caractere default associado com o argumento mudo que no
de forma assumida.
Se o argumento mudo escalar do tipo caractere default, o comprimento len do argumento mudo tem que
ser menor ou igual ao comprimento do argumento real. O argumento mudo se torna associado com os len caracteres
mais a esquerda do argumento real. Se um argumento mudo matricial do tipo caractere default e no tem forma
assumida, ele se torna associado com os caracteres mais a esquerda da sequncia de elementos do argumento real
(12.4.1.5) e ele no se estende alm do fim desta sequncia.
Os valores dos parmetros de tipo assumidos de um argumento mudo so assumidos dos correspondentes
parmetros de tipo do argumento real associado.
Um argumento real associado com um argumento mudo que alocvel ou ponteiro tem que ter postergado
os mesmos parmetros de tipo que os do argumento mudo.
Se um argumento mudo um ponteiro, o argumento real tem que ser um ponteiro e os parmetros de tipo
no postergados e nmeros de dimenses tem que concordar. Se o argumento mudo alocvel, o argumento real
tem que ser alocvel e os parmetros de tipo no postergados e nmeros de dimenses tem que concordar.
permitido para um argumento real ter um estado de alocao de no alocado.
Na invocao do procedimento, o estado de associao do ponteiro de um argumento real associado com
um ponteiro argumento mudo se torna indefinido se o argumento mudo tem INTENT(OUT).
Exceto em referncias a funes inquisitrias intrnsecas, se o argumento mudo no um ponteiro e o
correspondente argumento real um ponteiro, o argumento real tem que estar associado com um alvo e o
argumento mudo se torna associado com este alvo.
Exceto em referncias a funes inquisitrias intrnsecas, se o argumento mudo no alocvel e o
argumento real alocvel, o argumento real tem que estar alocado.
Se uma argumento mudo tem o atributo VALUE ele se torna associado com um objeto de dado annimo
definvel (definable anonymous data object) cujo valor inicial aquele do argumento real. Subsequente mudanas no
valor ou estado de definio do argumento mudo no afeta o argumento real.
Nota 12.22
Associao de argumento Fortran usualmente similar a chamar por referncia (call by reference) e chamar por
resultado (call by value-result). Se o atributo VALUE especificado, o efeito como se o argumento real atribudo
a um temporrio, e o temporrio ento associado com o argumento mudo. O mecanismo real pelo qual isto
acontece determinado pelo processador
Se um argumento mudo no tem o atributo TARGET ou POINTER, quaisquer ponteiros associados com o
argumento real no se torna associado com o argumento mudo correspondente na invocao do procedimento. Se
este argumento mudo est associado com um argumento real que um argumento mudo que tem o atributo
TRAGET, se quaisquer ponteiros associados com o argumento real original se torna associado com o argumento
mudo com o atributo TARGET dependente do processador.
Se o argumento mudo tem o atributo TARGET, no tem o atributo VALUE e se um escalar ou uma matriz
de forma assumida e o argumento real correspondente tem o atributo TARGET mas no uma seo de matriz com
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 289
um vetor subscrito ento
1. quaisquer ponteiros associado com o argumento real se torna associado com o argumento mudo
correspondente na invocao do procedimento
2. quando execuo do procedimento fica completa, quaisquer ponteiros que no se tornaram indefinidos
(16.4.2.1.3) e esto associados com os argumentos mudos permanecem associados com o argumento real
Se o argumento mudo tem o atributo TARGET e uma matriz de forma explcita ou uma matriz de
tamanho assumido e o correspondente argumento real tem o atributo TARGET mas no uma seo de matriz com
um subscrito vetor ento
1. Na invocao do procedimento, se quaisquer ponteiros associado como argumento real se tornam
associados com o argumento mudo correspondente dependente do processador
2. quando execuo do procedimento fica completa, o estado de associao do ponteiro de qualquer ponteiro
que um ponteiro associado com um argumento mudo dependente do processador
Se o argumento mudo tem o atributo TARGET e o correspondente argumento real no tem o atributo
TARGET ou uma seo de matriz com um subscrito vetor, quaisquer ponteiros associados com o argumento
mudo se torna indefinido quando a execuo do procedimento se completa.
Se o argumento mudo tem o atributo TARGET e o atributo VALUE, quaisquer ponteiros associados com o
argumento mudo se torna indefinido quando a execuo do procedimento fica completa.
Se um argumento real escalar, o argumento mudo correspondente tem que ser um escalar a menos que o
argumento real seja do tipo caractere default ou tipo caractere com o subtipo caractere C ( C character kind) (15.1) ou
um elemento ou substring de um elemento de uma matriz que no uma matriz de forma assumida ou matriz
ponteiro. Se o procedimento no elementar e referenciado por um nome genrico ou como um operador
definido ou atribuio definida, o rank (nmero de dimenses) dos argumentos reais e argumentos mudos
correspondentes tm que concordarem.
Se um argumento mudo um uma matriz de forma assumida, o rank (nmero de dimenses) do argumento
real tem que ser o mesmo que o rank do argumento mudo; o argumento real no pode ser uma matriz de tamanho
assumido (incluindo um designador de elemento de matriz ou um designador substring de elemento de matriz).
Exceto quando a referncia do procedimento elementar (12.7), cada elemento de um argumento real
matricial ou uma sequncia em uma associao de sequncia (12.4.1.5) associada com o elemento da matrz muda
que tem a mesma posio na ordem doa elementos da matriz(6.2.2.2).
Nota 12.23
Para associaes de tipo sequncia caractere default, a interpretao dos elementos destacada em 12.4.1.5
Um argumento mudo de um procedimento no elementar pode ser associada somente com um argumento
real escalar.
Se o argumento mudo tem INTENT(OUT) ou INTENT(INOUT), o argumento real tem que ser definvel.
Se o argumento mudo tem INTENT(OUT), o argumento real correspondente se torna indefinido no momento em
que a associao estabelecida, exceto para componentes de um objeto do tipo derivado para o qual inicializao
default foi especificada. Se o argumento mudo polimrfico e o tipo do argumento real um tipo extenso do tipo
do argumento mudo, somente a parte do argumento real que do mesmo tipo que o argumento mudo se torna
indefinida.
Se o argumento real uma seo de matriz tendo um subscrito vetor, o argumento mudo no definvel e
no pode ter os atributos INTENT(OUT) ou INTENT(INOUT), VOLATILE ou ASYNCHRONOUS.
Nota 12.24
Especificaes de inteno de argumentos serve a vrios propsitos. Ver nota 5.14
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 290
Nota 12.25
Para mais informaes explanatria sobre associao de argumentos e avaliao, ver C.9.5. Para mais informaes
explanatria sobre ponteiros e alvos como argumentos mudos, ver seo C.9.6
C1232 (R1221) Se um argumento real uma seo de matriz ou uma matriz de forma assumida e o argumento
mudo correspondente tem o atributo VOLATILE ou ASYNCHRONOUS, o argumento mudo tem que ser uma matriz
de forma assumida
C1233 (R1221) Se um argumento real uma matriz ponteiro e o argumento mudo correspondente tem o
atributo VOLATILE ou ASYNCHRONOUS, o argumento mudo tem que ser uma matriz de forma assumida ou uma
matriz ponteiro
Nota 12.26
As restries nos argumentos mudos que correspondem a um argumento mudo com o atributo
ASYNCHRONOUS ou VOLATILE so projetadas para evitar forar o processador a usar o chamado mecanismo
de passagem copia para dentro/copia para fora (the so-called copy-in/copy-out argument passing mechanism). Fazer a
cpia de um argumento cujos valores esto possibilitados a mudar devido a realizao de uma operao E/S
assncrona (asynchronous I/O operation) ou de alguma maneira no previsvel ir fazer que os novos valores seja
perdidos quando o procedimento retornar e a escrita (copy-out) sobrescreve o argumento real
12.4.1.3 Argumentos Reais Associados com Entidades Procedimento Mudo
12.4.1.3 Actual arguments associated with dummy procedure entities
Se uma argumento mudo um ponteiro de procedimento, o argumento real associado tem que ser um
ponteiro de procedimento, uma referncia a uma funo que retorna um ponteiro de procedimento ou uma
referncia a funo intrnseca NULL.
Se o argumento mudo um procedimento mudo sem o atributo POINTER, o argumento real associado
tem que ser o nome especfico de um procedimento externo, mdulo, mudo ou intrnseco, um ponteiro de
procedimento associado ou a referncia de funo que retorna um ponteiro de procedimento associado. Os nicos
procedimentos intrnsecos permitidos so aqueles listados em 13.6 e no marcados com um ponto lista (). Se o
nome especfico tambm um nome genrico, somente o procedimento especfico associado com o argumento
mudo.
Se o nome de um procedimento externo ou o nome de um procedimento mudo usado como um
argumento real, sua interface tem que ser explcita ou ele tem que ser explicitamente declarado com o atributo
EXTERNAL.
Se a interface de um argumento mudo explcita, as caractersticas listadas em 12.2 tem que ser as mesmas
para o argumento real associado e o argumento mudo correspondente, exceto que um argumento real puro pode ser
associado com um argumento mudo que no puro e uma procedimento real intrnseco elementar pode ser
associado com um procedimento mudo (o qual de se tornar elementar).
Se a interface de um argumento mudo implcita e o nome do argumento mudo explicitamente escrito
ou referenciado como uma funo, o argumento mudo no pode ser referenciado como uma sub-rotina e p
argumento real tem que ser uma funo, ponteiro de procedimento funo ou procedimento mudo.
Se a interface de um argumento mudo implcita e a referncia a ela aparece como uma referncia de sub-
rotina, o argumento real tem que ser uma sub-rotina, ponteiro de procedimento sub-rotina ou procedimento mudo.
12.4.1.4 Argumentos Reais Associados com Indicadores Alternativos de Retorno
12.4.1.4 Actual arguments associated with alternate return indicators
Se um argumento mudo um asterisco(12.5.2.2), o argumento real associado tem que ser um especificador de retorno
alternativo(12.4).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 291
12.4.1.5 Associao Sequncia
12.4.1.5 Sequence association
Um argumento real representa um sequncia de elementos se ele uma expresso matricial, um designador
de elemento de matriz, um escalar do tipo caractere default ou um escalar do tipo caractere com subtipo caractere C
(C character kind) (15.1.1). Se o argumento real uma expresso matricial, a sequncia de elementos (element
sequence) consiste dos elementos da matriz na ordem da matriz. Se argumento real um designador de matriz, o
elemento sequncia consiste este elemento da matriz e cada elemento que segue ele na ordem dos elementos da
matriz.
Se o argumento real do tipo caractere default ou do tipo caractere com subtipo caractere C (C character
kind) e uma expresso matricial, elemento de matriz ou designador de substring elemento de matriz (array element
substring designator), a sequncia de elementos (element sequence) consiste das unidades de armazenamento
iniciando com a primeira unidade de armazenamento do argumento real e continuando at o fim da matriz. As
unidades de armazenamento de uma designador de substring elemento de matriz so vistas como elementos de
matriz consistindo de grupos de unidade de armazenamento consecutivas tendo o comprimento de caractere do
argumento mudo.
Se o argumento real do tipo caractere default ou do tipo caractere com subtipo caractere C (C character
kind) e um escalar que no um elemento de matriz ou designador de substring elemento de matriz, o elemento
sequncia consiste das unidades de armazenamento do argumento real.
Nota 12.27
Alguns dos elementos na sequncia de elementos (element sequence) pode consistir de unidades de
armazenamento vindo de diferentes elementos da matriz original
Um argumento real que representa uma sequncia de elementos (element sequence) e corresponde a um
argumento mudo que uma matriz uma sequncia associada com o argumento mudo se o argumento mudo uma
matriz de forma explcita ou matriz de forma assumida. O rank (nmero de dimenses) e forma de um argumento
real no necessita concordar com o rank e forma de um argumento mudo, mas o nmero de elementos em um
argumento mudo no pode exceder o nmero de elementos em uma sequncia de elementos (element sequence) do
argumento real. Se o argumento mudo de tamanho assumido, o nmero de elementos no argumento mudo
exatamente o nmero de elementos na sequncia.
12.4.1.6 Restries para os Argumentos Mudos no Presentes
12.4.1.6 Restrictions on dummy arguments not present
Um argumento mudo ou uma entidade que associada por hospedagem (host associated) com um
argumento mudo no est presente se o argumento mudo
1. no est associado com o argumento real
2. est associada com o argumento rela que no est presente
De outra forma, ele est presente. Um argumento mudo que no opcional tem que estar presente. Um argumento
mudo opcional que no est presente sujeito as seguintes restries:
1. se ele um objeto de dado. Ele no pode ser referenciado ou estar definido. Se ele de um tipo para o qual
inicializao default especificada para algum componente, a inicializao no tem efeito
2. ele no pode ser usado como data-target ou proc-target de uma atribuio ponteiro
3. se ele um procedimento ou ponteiro de procedimento, ele no pode ser invocado
4. ele no pode ser fornecido como um argumento real correspondendo a um argumento mudo no opcional
diferente de um argumento da funo intrnseca PRESENT ou como um argumento de uma referncia de
funo que satisfaz os requerimentos de (6) ou (8) em 7.1.7
5. o designador com o qual ele como objeto base e com pelo menos um seletor de componente, seletor de
seo de matriz, seletor de elemento de matriz ou seletor de substring no pode ser usado como um
argumento real
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 292
6. se ele uma matriz, ele no pode ser usado como um argumento real de um procedimento elementar a
menos que uma matriz de mesmo rank (nmero de dimenses) seja usada como um argumento real
correspondendo a um argumento mudo no opcional deste procedimento elementar
7. se ele um ponteiro, ele no pode estar alocado, desalocado nulificado, pointer-assigned ou usado como
um argumento real correspondendo a um argumento mudo no ponteiro no opcional
8. se ele alocvel, ele no pode estar alocado, desalocado ou usado como uma argumento real
correspondendo a um argumento mudo no alocvel opcional
9. se ele tem parmetros de tipo comprimento, eles no podem ser submetidos a uma inquisio
10. ele no pode ser usado como o seletor em uma construo SELECT TYPE ou ASSOCIATE
Exceto como citado acima, ele pode ser usado como um argumento real correspondendo a um argumento
mudo opcional, que ento tambm considerado no estar associado com um argumento real.
12.4.1.7 Restries para as Entidades com Argumentos Mudos
12.4.1.7 Restrictions on entities associated with dummy arguments
Enquanto uma entidade est associada com um argumento mudo, as seguintes restries valem:
1. aes que afetam o estado de alocao da entidade ou um subobjeto deste podem ser feitas no argumento
mudo. Ao que afeta o valor da entidade ou qualquer subobjeto dela s pode ser feita no argumento mudo.
A menos que
(a) o argumento mudo tenha o atributo POINTER
(b) o argumento mudo tenha o atributo TARGET, o argumento mudo no tenha INTENT (IN), o argumento
mudo seja um objeto escalar ou matriz de forma assumida e o argumento real seja um alvo diferente de
uma seo de matriz com um subscrito vetor
Nota 12.28
Em
SUBROUTINE OUTER
REAL, POINTER :: A (:)
...
ALLOCATE (A(1:N))
...
CALL INNER(A)
...
CONTAINS
SUBROUTINE INNER (B)
REAL :: B(:)
...
END SUBROUTINE INNER

SUBROUTINE SET(C, D)
REAL, INTENT(OUT) :: C
REAL, INTENT(IN) :: D
C = D
END SUBROUTINE SET
END SUBROUTINE OUTER
uma instruo de atribuio tal como
A(1) = 1.0
no pode ser permitida durante a execuo de INNER porque isto pode mudar A sem usar B, mas instrues tais
como
B(1) = 1.0
ou
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 293
CALL SET(B(1), 1.0)
podem ser permitidas. Similarmente
DEALLOCATE(A)
no permitido porque isto afeta a alocao de B sem usar B. Neste caso,
DEALLOCATE(B)
tambm no permitido. Se B foi declarada com o atributo POINTER, uma das instrues
DEALLOCATE(A)
e
DEALLOCATE (B)
pode ser permitida, mas no ambas
Nota 12.29
Se h uma superposio (overlap) parcial ou completo entre os argumentos reais associados com dois argumentos
mudos diferente do mesmo procedimento e os argumentos mudos no possu o atributo POINTER nem o o
atributo TARGET, as pores sobrepostas no podem ser definidas, redefinidas ou se tornar indefinidas durante a
execuo do procedimento. Por exemplo, em
CALL SUB(A(1:5), A(3:9))
A (3:5) no pode ser definida, redefinida ou se tornar indefinida usando o primeiro argumento porque ele parte
do argumento associado com o segundo argumento mudo e no pode ser definido, redefinido ou se tornar
indefinido usando o segundo argumento mudo porque ele parte do argumento associado com o primeiro
argumento mudo. A (1:2) permanece definvel por meio do primeiro argumento mudo e A (6:9) permanece
definvel por meio do segundo argumento mudo
Nota 12.30
Esta restrio aplica-se igualmente a algos de ponteiros. Em
REAL, DIMENSION(10), TARGET :: A
REAL, DIMENSION(:), POINTER :: B, C
B => A(1:5)
C => A(3:9)
CALL SUB(B, C) ! Os argumentos mudos de SUB no so ponteiros nem alvos
B(3:5) no pode ser definida porque ela parte da associao de argumento com o segundo argumento mudo.
C(1:3) no pode ser definida porque ela parte da associao de argumento com o primeiro argumento mudo.
A(1:2) [que igual a B(1:2)] permanece definvel por meio do primeiro argumento mudo e A(6:9) [que igual a
C(4:7)] permanece definvel por meio do segundo argumento mudo
Nota 12.31
Porque um argumento mudo no ponteiro declarado com INTENT(IN) no pode ser usado para mudar o
argumento real associado, o argumento real associado permanece constante ao longo da execuo do
procedimento
2. Se o estado de alocao da entidade ou do subobjeto deste afetado afetado por meio do argumento
mudo, ento a qualquer tempo durante a execuo do procedimento, antes ou depois da alocao ou
desalocao, ele pode ser referenciado somente usando o argumento mudo. Se o valor da entidade ou
qualquer subobjeto dele afetado por meio do argumento mudo, ento ento a qualquer tempo durante a
execuo do procedimento, antes ou depois da definio, ele pode ser referenciado somente por deste
argumento mudo a menos que
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 294
(a) o argumento mudo tenha o atributo POINTER
(b) o argumento mudo tenha o atributo TARGET, o argumento mudo no tenha INTENT (IN), o
argumento mudo seja um objeto escalar ou uma matriz de forma assumida e o o argumento real seja um
alvo diferente de uma seo de matriz com um vetor subscrito
Nota 12.32
Em
MODULE DATA
REAL :: W, X, Y, Z
END MODULE DATA
PROGRAM MAIN
USE DATA
...
CALL INIT(X)
...
END PROGRAM MAIN
SUBROUTINE INIT(V)
USE DATA
...
READ(*, *) V
...
END SUBROUTINE INIT
a varivel X no pode ser diretamente referenciada a qualquer tempo durante a execuo de INIT porque ela est
sendo definida por meio do argumento mudo V. X pode ser (indiretamente) referenciada por meio de V. W, Y e Z
podem ser referenciadas indiretamente. X pode, claro, ser diretamente referenciada depois que a execuo de INIT
foi concluda
Nota 12.33
As restries para as entidades associadas com argumentos mudos existem para facilitar a variedade de
otimizaes na transao dos subprogramas, incluindo implementaes de associao de argumentos na qual o
valor de argumento real que no um ponteiro nem um alvo mantida em um registrador ou em um local de
armazenamento
12.4.2 Referncia de Funo
12.4.2 Function reference
Uma funo invocada durante a avaliao de uma expresso por uma referencia funo ou por uma
operao definida (7.1.3). Quando ela invocada, todos as expresses argumentos reais so avaliados, ento os
argumentos so associados e a funo executada. Quando a execuo da funo est completa, o valor do
resultado da funo est disponvel para uso na expresso que fez a funo ser invocada. As caractersticas do
resultado da funo (12.2.2) so determinadas pela interface da funo. A referncia a uma funo elementar (12.7)
uma referncia elementar se um ou mais argumentos reais so matrizes e todas as matrizes tm a mesma forma.
12.4.3 Referncia de Sub-rotina
12.4.3 Subroutine reference
Uma sub-rotina invocada pela execuo da instruo CALL, execuo de uma instruo de atribuio
definida (7.4.1.4), entrada/sada tipo derivado definido pelo usurio (user-defined derived-type input/output)
(9.5.3.7.1) ou finalizao (4.5.5). Quando a sub-rotina invocada, todos as expresses nos argumentos reais so
avaliadas e ento a sub-rotina executada. Quando as aes especificadas pela sub-rotina foram completadas, a
execuo da instruo CALL, a execuo da instruo de atribuio definida ou o processamento de um item da
lista de sada ou entrada est tambm completado. Se a instruo CALL inclui um ou mais especificadores de retorno alternativos
entre seus argumentos, o controle pode ser transferido para uma das instrues indicadas, dependendo das aes especificadas pela sub-
rotina. Uma referncia a uma sub-rotina elementar (12.7) uma referncia elementar se existe ao menos um
argumento real correspondendo a um argumento mudo INTENT(OUT) ou INTENT(INOUT), toso estes
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 295
argumentos reais so matrizes e todos os argumentos reais so conformes.
12.4.4 Resolvendo Referncias de Procedimentos com Nome
12.4.4 Resolving named procedure references
As regras para interpretao de uma referncia de procedimento dependem se o nome do procedimento em
uma referncia estabelecido por declaraes disponveis e especificaes que so genricas no escopo da unidade
contendo a referncia, esta estabelecida para ser somente especfica na unidade de escopo contendo a referncia ou
no est estabelecida.
1. O nome do procedimento est estabelecido para ser genrico em uma unidade de escopo
(a) se esta unidade de escopo contm um bloco de interface (interface block) com este nome
(b) se esta unidade de escopo contm uma especificao de atributo INTRINSIC para o nome e ela o
nome de um procedimento intrnseco genrico
(c) se esta unidade de escopo contm uma instruo USE que torna este nome de procedimento acessvel e
o correspondente nome em um mdulo estabelecido como sendo genrico
(d) se esta unidade de escopo no contm uma declarao com este nome, que a unidade de escopo tem
uma unidade de hospedagem e este nome est estabelecido para ser genrico na unidade de escopo
hospedeira
2. um nome de procedimento est estabelecido como sendo o nico especificador na unidade de escopo se ele
est estabelecido para ser especfico e no estabelecido para ser genrico. Ele est estabelecido para ser
especfico
(a) se esta unidade de escopo contm um subprograma mdulo, subprograma interno ou funo instruo que
define um procedimento com este nome
(b) se esta unidade de escopo contm uma especificao de atributo INTRINSIC para este nome e se ela
o nome de um procedimento intrnseco especfico
(c) se esta unidade de escopo contm uma especificao de atributo EXTERNAL (5.1.2.6) para este nome
(d) se esta unidade de escopo contm uma instruo USE que faz este nome de procedimento acessvel e o
correspondente nome no mdulo est estabelecido para se especfico
(e) se esta unidade de escopo no contm declaraes deste nome, esta unidade de escopo tem uma unidade
de escopo hospedeira e este nome no est estabelecido na unidade de escopo hospedeira
3. um nome de procedimento no est estabelecido na unidade de escopo se ele no genrico nem
estabelecido para ser especfico
12.4.4.1 Resolvendo Referncias de Procedimento para Nomes Estabelecidos para serem
Genricos
12.4.4.1 Resolving procedure references to names established to be generic
1. se a referncia consistente com uma referncia no elementar para uma das interfaces especficas de uma
interface genrica que tem este nome e se est no escopo da unidade na qual a referncia aparece ou feita
acessvel pelo uso de uma instruo USE no escopo da unidade, a referncia para o procedimento
especfico no bloco de interface que prov esta interface. As regras em 16.2.3 garantem que pode existir no
mximo um deste procedimento especfico
2. se (1) no se aplica, se a referncia consistente com uma referncia elementar para uma das interfaces
especficas de uma interface genrica que tem este nome e est no escopo da unidade na qual a referncia
aparece ou feita acessvel por uma instruo USE no escopo da unidade, a referncia para o
procedimento elementar especfico no bloco de interface que prov esta interface. As regras em 16.2.3
garantem que pode existir no mximo um deste procedimento especfico
Nota 12.34
Estas regras permite que instncias particulares de uma funo genrica seja utilizada para algumas dimenses de
matriz particulares e a verso elementar geral seja utilizada por outras dimenses. Dado um bloco de interface
como o que segue:
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 296
INTERFACE RANF
ELEMENTAL FUNCTION SCALAR_RANF(X)
REAL X
END FUNCTION SCALAR_RANF

FUNCTION VECTOR_RANDOM(X)
REAL X(:)
REAL VECTOR_RANDOM(SIZE(X))
END FUNCTION VECTOR_RANDOM
END INTERFACE RANF
e uma declarao que segue:
REAL A(10,10), AA(10,10)
ento a instruo
A = RANF(AA)
uma referncia elementar para SCALAR RANF. A instruo
A = RANF(AA(6:10,2))
uma referncia no elementar para VECTOR RANDOM
3. se (1) e (2) no se aplica, se a unidade de escopo contm uma especificao de atributo INTRINSIC para
este nome ou uma instruo USE que faz este nome acessvel em um mdulo no qual o nome
correspondente especificado com o atributo INTRINSIC e se a referncia consistente com a interface
deste procedimento intrnseco, a referncia para procedimento intrnseco
Nota 12.35
Na instruo USE caso, isto seja possvel, por causa da caracterstica de renomeao, para o nome na referncia
ser diferente do nome do procedimento intrnseco
4. se (1), (2) e (3) no se apliquem, se a unidade de escopo tem uma unidade de escopo hospedeira, se o
nome estabelecido para ser genrico nesta unidade de escopo e se h um acordo entre a unidade de
escopo e a unidade de escopo hospedeira para se o nome um nome de funo ou nome de uma sub-rotina,
o nome resolvido pela aplicao das regaras nesta seo para a unidade de escopo hospedeira
12.4.4.2 Resolvendo Referncias de Procedimento para Nomes Estabelecidos para serem
somente Especficos
12.4.4.2 Resolving procedure references to names established to be only specific
1. se a unidade de escopo contm um corpo de interface ou uma especificao de atributo EXTERNAL para
um nome, se a unidade de escopo um subprograma e se o nome o nome de um argumento mudo deste
subprograma. Isto , o procedimento invocado pela execuo desta referncia o procedimento fornecido
como argumento real correspondente a esta procedimento mudo
2. se a unidade de escopo contm um corpo de interface ou uma especificao de atributo EXTERNAL para
um nome se (1) no se aplica, a referncia para um procedimento externo com este nome
3. se a unidade de escopo contm um subprograma mdulo, subprograma interno ou funo instruo que
define um procedimento com o nome, a referncia para o procedimento assim definido
4. se a unidade de escopo contm uma especificao de atributo INTRINSIC para o nome, a referncia para
este nome
5. se a unidade de escopo contm uma instruo USE que torna acessvel um procedimento pelo nome, a
referncia para este procedimento
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 297
Nota 12.36
Por causa da facilidade de renomeao na instruo USE, o nome na referncia pode ser diferente do nome
original do procedimento
6. Se nenhuma dos itens acima se aplica, a unidade de escopo tem que ter um unidade de escopo e a
referncia resolvida pela aplicao das regras deste seo unidade de escopo
12.4.4.3 Resolvendo Referncias de Procedimento para Nomes No Estabelecidos
12.4.4.3 Resolving procedure references to names not established
1. se a unidade de escopo um subprograma e se o nome o nome de um argumento mudo deste
procedimento, o argumento mudo um procedimento mudo e a referncia para este procedimento mudo.
Isto , o procedimento invocado pela execuo deste referncia o procedimento fornecido como
argumento real correspondendo a este procedimento mudo
2. se (1) no se aplica, se o nome o nome de um procedimento intrnseco e se h acordo entre a referncia e
o estado do procedimento intrnseco como sendo uma funo ou sub-rotina, a referncia para este
procedimento intrnseco
3. se (1) e (2) no se aplica, a referncia para um procedimento esterno com este nome
12.4.5 Resolvendo Referncias de Procedimento Ligado ao Tipo
12.4.5 Resolving type-bound procedure references
Se um nome ligado (binding-name) em um procedure-designator (R1219) um especfico procedimento
ligado ao tipo (type-bound procedure), o procedimento referenciado um ligado a este nome para o tipo dinmico da
data-ref.
Se o binding-name em um procedure-designator o de um procedimento ligado ao tipo genrico
(generic type-bound procedure), a ligao genrica com este nome no tipo declarado de data-ref usada para
selecionar uma ligao especfica:
1. se a referncia consistente com uma das ligaes especficas desta ligao genrica, esta ligao genrica
selecionada
2. caso contrrio, a referncia tem que ser consistente com uma referncia elementar para uma das ligaes
especficas desta ligao genrica; esta ligao especfica selecionada
A referncia para a ligao procedimento com o mesmo nome que a ligao especfica selecionada no
tipo dinmico da data-ref.
12.5 Definio de Procedimento
12.5 Procedure definition
12.5.1 Definio de Procedimento Intrnseco
12.5.1 Intrinsic procedure definition
Procedimentos intrnsecos so definidos como uma parte inerente do processador. Um processador
conforme com o padro (standard-conforming processor) tem que incluir os procedimentos descritos em na seo 13,
mas pode incluir outras. Entretanto, um programa conforme com o padro no pode fazer uso de procedimentos
intrnsecos diferentes dos descritos na seo 13.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 298
12.5.2 Subprogramas definidos por Procedimentos
12.5.2 Procedures defined by subprograms
Quando um procedimento definido por um subprograma invocado, uma instncia (12.5.2.3) do
subprograma criado e executado. Execuo inicia com a primeira construo executvel seguindo a instruo
FUNCTION, SUBROUTINE ou ENTRY que especifica o procedimento invocado.
12.5.2.1 Subprograma Funo
12.5.2.1 Function subprogram
Um subprograma funo (function subprogram) um subprograma que tem a instruo FUNCTION
como sua primeira instruo.
R1223 function-subprogram is function-stmt
[specification-part]
[execution-part]
[internal-subprogram-part]
end-function-stmt
R1224 function-stmt is [prefix]FUNCTION function-name
([dummy-arg-name-list])[suffix]
C1234 (R1224) Se RESULT especificado, result-name no pode ser o mesmo que function-name e no
pode ser o mesmo que entry-name em qualquer instruo ENTRY no subprograma
C1235 (R1224) Se RESULT especificado, o function-name no pode aparecer em qualquer instruo de
especificao na unidade de escopo do subprograma funo
R1225 proc-language-binding-spec is language-binding-spec
C1236 (R1225) A proc-language-binding-spec com um especificador NAME= no pode ser especificada
na function-stmt ou subroutine-stmt de um corpo de interface de uma interface abstrata ou um
procedimento mudo
C1237 (R1225) A proc-language-binding-spec no pode ser especificada para um procedimento interno
C1238 (R1225) Se proc-language-binding-spec especificada para um procedimento, cada um dos
argumentos mudos s procedimento tem que ser uma varivel interopervel no opcional (15.2.4, 15.2.5) ou um
procedimento interopervel (15.2.6). Se proc-language-binding-spec especificada para uma funo , o
resultado de funo tem que ser uma varivel interopervel
R1226 dummy-arg-name is name
C1239 (R1226) O dummy-arg-name tem que ser o nome de um argumento mudo
R1227 prefix is prefix-spec [prefix-spec]...
R1228 prefix-spec is declaration-type-spec
or RECURSIVE
or PURE
or ELEMENTAL
C1240 (R1227) Um prefixo tem que conter no mximo um do prefix-spec
C1241 (R1227) Um prefixo no pode especificar ELEMENTAL e RECURSIVE ao mesmo tempo
C1242 (R1227) Um prefixo no pode especificar ELEMENTAL se proc-language-binding-spec aparece
em uma function-stmt ou subroutine-stmt
R1229 suffix is proc-language-binding-spec [RESULT(result-name)]
or RESULT(result-name) [proc-language-binding-spec]
R1230 end-function-stmt is END [FUNCTION[function-name]]
C1243 (R1230) FUNCTION tem que aparecer em uma end-function-stmt de uma funo interna ou mdulo
C1244 (R1223) Um subprograma funo interno no pode conter uma instruo ENTRY
C1245 (R1223) Um subprograma funo interno no pode conter uma internal-subprogram-part
C1246 (R1230) Se um function-name aparece em uma end-function-stmt, Ele tem que ser idntico ao
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 299
function-name especificado na function-stmt
O nome da funo function-name.
O tipo e parmetros de tipo (se existir) do resultado da funo definida por uma subprograma funo pode
ser especificado por uma especificao de tipo na instruo FUNCTION ou pelo nome da varivel resultado
aparecendo em uma instruo de declarao tipo na parte de declarao do subprograma funo. Eles no podem
ser especificados usando-se as duas forma. Se eles no so especificados de nenhuma destas formas, eles so
determinados pela regra implcita de tipo em uso no subprograma funo. Se o resultado da funo uma matriz,
alocvel ou um ponteiro, isto tem que ser especificado pela especificao do nome da varivel resultado dentro do
corpo da funo. As especificaes dos atributos do resultado da funo, a especificao dos atributos dos
argumentos mudos e as informaes na linha cabealho do procedimento coletivamente definem as caractersticas
da funo (12.2).
A especificao de prefixo RECURSIVE (prefix-spec RECURSIVE) tem que aparecer na funo diretamente
ou indiretamente invocar ela mesmo ou a funo definida por uma instruo ENTRY no mesmo subprograma.
Similarmente, RECURSIVE tem que aparecer se a funo definida por uma instruo ENTRY em um subprograma
direta ou indiretamente invoca ela mesmo, outra funo definida por uma instruo ENTRY no subprograma ou a
funo definida pela instruo FUNCTION.
Se RESULT especificado, o nome da varivel resultado da funo result-name e todas as ocorrncias
do nome da funo na parte das instrues de execuo (execution-part statements) no escopo da unidade so
referncias da funo a si mesmo. Se RESULT no especificada, a varivel resultado function-name e todas as
ocorrncias do nome da funo na parte das instrues de execuo na unidade de escopo so referncias varivel
resultado. As caractersticas (12.2.2) do resultado da funo so aquelas da varivel resultado. Ao completar a
execuo da funo, o valor retornado aquele contido na varivel resultado. Se o resultado da funo um
ponteiro, a forma do valor retornado determinado pela forma da varivel resultado quando a a funo est
terminada. Se o resultado da funo no um, seu valor definido pela funo. Se o resultado da funo um
ponteiro, a funo tem que associar o alvo com o ponteiro varivel resultado ou fazer com que o estado de
associao deste ponteiro se torne definido como desassociado.
Nota 12.37
A varivel resultado similar a qualquer outra varivel local do subprograma funo. Sua existncia inicia quando
a execuo da funo iniciada e termina quando a execuo da funo termina. Entretanto, porque o valor final
desta varivel usado subsequentemente na avaliao da expresso que invocou a funo, uma implementao
pode desejar adiar a liberao do armazenamento ocupado por esta varivel ate depois que seu valor tenha sido
usado na expresso
Se a prefix-spec PURE ou ELEMENTAL aparece, o subprograma um subprograma puro e tem que
respeitar as restries adicionais de 12.6.
Se a prefix-spec ELEMENTAL aparece, o subprograma um subprograma elementar e tem que respeitar
as restries adicionais de 12.7.1.
Nota 12.38
Um exemplo de funo recursiva :
RECURSIVE FUNCTION CUMM_SUM(ARRAY) RESULT(C_SUM)
REAL, INTENT (IN), DIMENSION(:) :: ARRAY
REAL, DIMENSION(SIZE(ARRAY)) ::C_SUM
INTEGER N
N = SIZE(ARRAY)
IF (N <= 1) THEN
C_SUM = ARRAY
ELSE
N = N / 2
C_SUM(:N) = CUMM_SUM(ARRAY(:N))
C_SUM(N+1:) = C_SUM(N) + CUMM_SUM(ARRAY(N+1:))
END IF
END FUNCTION CUMM_SUM
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 300
Nota 12.39
O que segue um exemplo de uma declarao de um corpo de interface com o atributo BIND e a referncia ao
procedimento declarado
USE, INTRINSIC :: ISO_C_BINDING
INTERFACE
FUNCTION JOE(I, J, R), BIND(C,NAME="FrEd")
USE, INTRINSIC :: ISO_C_BINDING
INTEGER(C_INT) :: JOE
INTEGER(C_INT), VALUE :: I, J
REAL(C_FLOAT), VALUE :: R
END FUNCTION JOE
END INTERFACE
INT = JOE(1_C_INT, 3_C_INT, 4.0_C_FLOAT)
END PROGRAM
A invocao da funo JOE resulta na referncia a uma funo com o rtulo de ligao (binding label) "FrEd". FrEd
pode se uma funo C descrita por um prottipo C (C prototype)
int FrEd(int n, int m, float x);
12.5.2.2 Subprograma Sub-rotina
12.5.2.2 Subroutine subprogram
Um subprograma sub-rotina (subroutine subprogram) um subprograma que tem a instruo
SUBROUTINE como sua primeira instruo.
R1231 subroutine-subprogram is subroutine-stmt
[specification-part]
[execution-part]
[internal-subprogram-part]
end-subroutine-stmt
R1232 subroutine-stmt is [prefix]SUBROUTINE subroutine-name
[([dummy-arg-list])[proc-language-binding-spec]]
C1247 (R1232) O prefixo de uma subroutine-stmt no pode conter uma declaration-type-spec
R1233 dummy-arg is dummy-arg-name
or *
R1234 end-subroutine-stmt is END [SUBROUTINE[subroutine-name]]
C1248 (R1234) SUBROUTINE tem que aparecer em uma end-subroutine-stmt de uma sub-rotina interna
ou mdulo
C1249 (R1231) Um subprograma sub-rotina interno no pode conter uma instruo ENTRY
C1250 (R1231) Um subprograma sub-rotina interno no pode conter uma internal-subprogram-part
C1251 (R1234) Se o subroutine-name aparece em uma end-subroutine-stmt, ele tem que ser idntico
ao subroutine-name especificado na subroutine-stmt
O nome de uma sub-rotina subroutine-name.
A prefix-spec RECURSIVE tem que aparecer se a sub-rotina invoca direta ou indiretamente ela mesmo
ou uma sub-rotina definida por uma instruo ENTRY no mesmo subprograma. Similarmente, RECURSIVE tem
que aparecer se uma sub-rotina definida pela instruo ENTRY em um subprograma invoca direta ou indiretamente
ela mesmo, outra sub-rotina definida por uma instruo ENTRY neste subprograma ou sub-rotina definida pela
instruo SUBROUTINE.
Se a prefix-spec PURE ou ELEMENTAL aparece , o subprograma um subprograma puro e tem que
respeitar as restries adicionais de 12.6.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 301
Se a prefix-spec ELEMENTAL aparece , o subprograma um subprograma elementar e tem que
respeitar as restries adicionais de 12.7.1.
12.5.2.3 Instncias de um Subprograma
12.5.2.3 Instances of a subprogram
Quando a funo ou sub-rotina definida por um subprograma invocada, uma instncia deste subprograma
criado. Quando uma funo instruo invocada, uma instncia desta funo instruo criada.
Cada instncia tem uma sequncia independente de execuo e um conjunto independente de argumentos
mudos e objetos de dados locais no salvos. Se um procedimento interno ou funo instruo no subprograma
invocada diretamente de uma instncia do subprograma ou de um subprograma interno ou funo instruo que tem
acesso s entidades desta instncia, a instncia criada do subprograma interno ou funo instruo tambm tem acesso
as entidades desta instncia do subprograma hospedeiro.
Todas as outras entidades so compartilhadas por todas as instncias do subprograma.
Nota 12.40
O valor de um objeto de dado salvo aparecendo em uma instncia pode ter sido definido em uma instncia prvia
ou por inicializao em uma instruo DATA ou instruo de especificao de tipo
12.5.2.4 Instruo Entra
12.5.2.4 ENTRY statement
Uma instruo entra (ENTRY statement) permite uma referncia de procedimento iniciar em uma
declarao executvel particular dentro da funo ou subprograma sub-rotina na qual a instruo entra ( ENTRY)
aparece.
R1235 entry-stmt is ENTRY entry-name[([dummy-arg-list])[suffix]]
C1252 (R1235) Se RESULT especificado, o entry-name no pode aparecer em qualquer especificao ou
instruo type-declaration no escopo da unidade de um programa funo
C1253 (R1235) Uma entry-stmt s pode aparecer em um external-subprogram ou module-
subprogram. Uma entry-stmt no pode aparecer dentro de uma executable-construct
C1254 (R1235) RESULT s pode aparecer se a entry-stmt um subprograma funo
C1255 (R1235) Dentro de um subprograma contendo a entry-stmt, o entry-name no pode aparecer como
um argumento mudo em uma instruo FUNCTION ou SUBROUTINE ou outra instruo ENTRY nem aparecer
em uma instruo EXTERNAL, INTRINSIC ou PROCEDURE
C1256 (R1235) Um dummy-arg no pode ser um indicador de retorno alternativo se a instruo ENTRY est em um
subprograma funo
C1257 (R1235) Se RESULT especificado, result-name no pode ser o mesmo que o function-name na
instruo FUNCTION e no pode ser o mesmo que o entry-name em qualquer instruo ENTRY no
subprograma
Opcionalmente. Um subprograma pote ter uma ou mais instrues ENTRY.
Se a instruo ENTRY est em um subprograma funo, uma funo adicional definida por este
subprograma. O nome da funo entry-name e o nome de sua varivel resultado result-name ou entry-
name se result-name no provido. As caractersticas do resultado da funo so especificadas pelas
especificaes da varivel resultado. Os argumentos mudos da funo so aqueles especificados da instruo
ENTRY. Se as caractersticas do resultado da funo com nome na instruo FUNCTION, suas variveis resultados
identificam a mesma varivel, ainda que seus nomes no necessitam ser os mesmos. Caso contrrio, eles so
associados por armazenamento (storage associated) e todos tem que ser no ponteiros, escalares no alocveis do
tipo inteiro default, real de preciso dupla, complexo default ou lgico default.
Se a instruo ENTRY um subprograma sub-rotina, uma sub-rotina adicional definida pelo
subprograma. O nome da sub-rotina entry-name. Os argumentos mudos da sub-rotina so aqueles especificado
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 302
na instruo ENTRY.
A ordem, nmero, tipo, parmetros de tipo subtipo (kind type parameters) e nomes dos argumentos mudos
em uma instruo ENTRY pode diferir da ordem, nmero, parmetros de tipo subtipo e nomes dos argumentos
mudos na instruo FUNCTION ou SUBROUTINE no subprograma que contm a instruo.
Porque uma instruo ENTRY define uma funo adicional ou uma sub-rotina adicional ela referenciada
da mesma maneira que qualquer outra funo ou sub-rotina (12.4).
Em um subprograma o nome que aparece como um argumento mudo em uma instruo ENTRY no pode
aparecer em uma instruo executvel precedendo esta instruo ENTRY, a menos que ele tambm aparea em uma
instruo FUNCTION, SUBROUTINE ou ENTRY que preceda a instruo executvel.
Em um subprograma, o nome que aparece como um argumento mudo em uma instruo ENTRY no pode aparecer em uma
expresso de uma funo instruo a menos que o nome seja tambm um argumento mudo de uma funo instruo, aparea em uma
instruo FUNCTION ou SUBROUTINE ou aparea em uma instruo ENTRY que preceda a instruo funo instruo.
Se um argumento mudo aparece como uma instruo executvel, a execuo da instruo executvel
permitida durante a execuo da referncia funo ou sub-rotina somente se o argumento mudo aparece na lista
de argumento mudo no nome do procedimento referenciado.
Se um argumento mudo usado em uma expresso para especificar um limite de matriz ou comprimento
caractere de um objeto, a utilizao do objeto em uma instruo que executada durante a referncia do
procedimento permitido somente se o argumento mudo aparece na lista de argumento mudo do nome do
procedimento referenciado e ele est presente (12.4.1.6).
Uma unidade de escopo contendo uma referncia a um procedimento definido por uma instruo ENTRY
pode pode ter acesso a um corpo de interface para o procedimento. O cabealho do procedimento (procedure
header) para o corpo da interface tem que ser uma instruo FUNO para um entrada (entry) em um subprograma
funo e tem que ser uma instruo SUBROUTINE para uma entrada (entry) em um subprograma sub-rotina.
A palavra-chave RECURSIVE no usada em uma instruo ENTRY. Em vez disto, a presena ou
ausncia de RECURSIVE na instruo inicial de uma SUBROUTINE ou FUNCTION controla se o procedimento
definido por uma instruo ENTRY permitido referir-se a si mesmo.
A palavra-chave PURE no usada em uma instruo ENTRY. Em vez disto, o procedimento definido pela
instruo ENTRY puro se e somente se PURE ou ELEMENTAL especificado na instruo SUBROUTINE ou
FUNCTION.
A palavra-chave ELEMENTAL no usada em uma instruo ENTRY. Em vez disto, o procedimento
definido pela instruo ENTRY elementar se e somente se ELEMENTAL especificado na instruo
SUBROUTINE ou FUNCTION.
12.5.2.5 Instruo Retorna
12.5.2.5 RETURN statement
R1236 return-stmt is RETURN[scalar-int-expr ]
C1258 (R1236) A return-stmt tem que ser uma unidade de escopo de um subprograma funo ou sub-rotina
C1259 (R1236) A scalar-int-expr permitida somente no escopo da unidade de um subprograma sub-rotina
Execuo da instruo retorna (RETURN statement) completa execuo de uma instncia de um
subprograma onde aparece. Se a expresso aparece em uma sub-rotina e tem o valor n entre 1 e o nmero de asteriscos em uma lista de
argumentos mudos, a instruo CALL que invocou a sub-rotina transfere o controle para a instruo identificada pelo especificador de
retorno alternativo ensimo (nth alternate return specifier) na lista de argumentos reais. Se a expresso omitida ou tem um valor fora do
intervalo requerido no h transferncia do controle para um retorno alternativo.
Execuo de uma end-function-stmt ou end-subroutine-stmt equivalente a executar uma instruo
RETURN sem expresso.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 303
12.5.2.6 Instruo Contm
12.5.2.6 CONTAINS statement
R1237 contains-stmt is CONTAINS
A instruo contm (CONTAINS statement) separa o corpo do programa principal, mdulo ou subprograma
de quaisquer subprogramas internos ou mdulo que ele pode conter ou ela introduz a parte procedimento ligado ao
tipo (type-bound procedure part) de uma definio de tipo derivado (4.5.1). A instruo CONTAINS no executvel.
12.5.3 Definindo e Invocando Procedimentos por outros meios que no o
Fortran
12.5.3 Definition and invocation of procedures by means other than Fortran
Um procedimento pode ser definido por outro meio diferente do Fortran. A interface de um procedimento
definido por outro meio que no o Fortran pode ser especificada poro um bloco de interface. Se a interface deste
tipo de procedimento no tem uma proc-language-binding-spec, os meios pelo qual o procedimento definido
so dependentes do processador. Uma referncia deste tipo de procedimento feita como se ela fosse definida por
um subprograma externo.
Se a interface de um procedimento tem uma proc-language-binding-spec, o procedimento
interopervel (interoperable) (15.4).
Interoperao com funes C descrito em 15.4.
Nota 12.41
Para informaes explanatrias sobre definio de procedimentos por outros meios que no o Fortran, veja a
seo C.9.2
12.5.4 Funo Instruo
12.5.4 Statement function
Uma funo instruo uma funo definida por uma declarao nica.
R1238 stmt-function-stmt is function-name([dummy-arg-name-list])=scalar-expr
C1260 (R1238) As primarias de uma scalar-expr tem que ser constantes (literal e com nome), referencias para variveis,
referncias para funes e procedimentos mudos funo e operaes intrnsecas. Se scalar-expr contm uma referncia a
uma funo ou procedimento mudo funo, a referncia no pode requerer uma interface explcita, a funo no pode
requerer uma interface explcita a menos que ela seja intrnseca, a funo no pode ser uma transformacional intrnseca e o
resultado tem que ser escalar. Se um argumento para a funo ou procedimento mudo funo uma matriz, ele tem que ser o
nome de uma matriz. Se a referncia para uma funo instruo aparece em scalar-expr, sua definio no pode ter sido
fornecida antes na unidade de escopo e no pode ser o nome de uma funo instruo que esteja sendo definida
C1261 (R1238) Constantes com nome em uma scalar-expr tem que ter sido declaradas antes na unidade de escopo ou
feita acessvel por associao de uso ou hospedagem. Se elementos de matriz aparece na scalar-expr, a matriz tem que ter
sido declarada como uma matriz antes na unidade de escopo ou feita acessvel por associao de uso ou hospedagem
C1262 (R1238) Se um dummy-arg-name, varivel, funo, referncia ou referncia de funo muda tem seu tipo definido
pela regra de tipo implcita, sua apario em qualquer instruo de declarao de tipo subsequente tem que confirmar este tipo
implcito e os valores de quaisquer parmetros de tipo implcitos
C1263 (R1238) O function-name e cada dummy-arg-name tem que ser especificado, explicitamente ou implicitamente,
como escalar
C1264 (R1238) Um dado dummy-arg-name no pode aparecer mais de uma vez em qualquer dummy-arg-name-list
C1265 (R1238) Cada referncia de varivel em uma scalar-expr pode ser uma referncia para um argumento mudo da
funo instruo ou uma referncia para a varivel acessvel na mesma unidade de escopo que a instruo funo instruo
A definio de uma funo declarao com o mesmo nome que uma entidade acessvel num hospedeiro (host) tem que ser
precedida por uma declarao do seu tipo em uma instruo de declarao de tipo.
O argumento mudo tem o escopo da instruo funo instruo. Cada argumento mudo tem o mesmo tipo e parmetros de tipo que
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 304
a entidade de mesmo nome na unidade de escopo contendo a funo instruo.
Uma funo instruo no pode ser fornecida como um argumento de procedimento.
O valor de uma referncia de funo instruo obtido pela avaliao da expresso usando os valores doa argumento reais para os
correspondentes argumentos mudos e, se necessrio, convertendo o resultado para o tipo declarado e atributos de tipo da funo.
Uma referncia de funo em uma expresso escalar no pode fazer com que o argumento mudo da funo instruo seja
redefinido ou indefinido.
12.6 Procedimentos Puros
12.6 Pure procedures
Um procedimento puro
1. uma funo intrnseca pura (13.1)
2. uma sub-rotina intrnseca pura (13.1)
3. definida por um subprograma puro
4. uma funo instruo que referencia somente funes puras
Um subprograma puro um subprograma que tem o prefix-spec PURO ou ELEMENTAL. As restries
adicionais que seguem aplicam-se aos subprogramas puros.
C1266 A specification-part de um subprograma puro tem que especificar que todos os objetos de dados
mudos no ponteiros tem INTENT(IN)
C1267 A specification-part de um subprograma sub-rotina puro tem que especificar que as intenes de
todos os seus objetos de dados mudos no ponteiros
C1268 Uma varivel local declarada na specification-part ou internal-subprogram-part de um
subprograma puro no pode ter o atributo SAVE
Nota 12.42
Inicializao de varivel em uma type-declaration-stmt ou uma data-stmt implica no uso do atributo SAVE,
portanto , esta inicializao tambm no permitida
C1269 A specification-part de um subprograma puro tem que especificar que todos os seus procedimentos
mudos so puros
C1270 Se um procedimento que no um procedimento intrnseco nem uma funo instruo usada em um
contexto que requer que ele seja puro, ento sua interface tem que ser explcita no escopo que ele usa. A interface
tem que especificar que o procedimento puro
C1271 Todos os subprogramas internos em um subprograma puro tm que ser puros
C1272 Em um subprograma puro qualquer designador com um objeto base que est em um comum ou acessado
por associao de uso ou hospedagem, um argumento mudo de uma funo pura, um argumento mudo com
INTENT (IN) de uma sub-rotina pura ou um objeto que est associado por armazenamento com qualquer destas
variveis, no pode ser usado nos seguintes contextos:
1. em um contexto de definio de varivel (16.5.7)
2. como um data-target em uma pointer-assignment-stmt
3. como a expr correspondendo a um componente com o atributo POINTER em um structure-
constructor
4. como a expr de uma instruo de atribuio intrnseca na qual a varivel do tipo derivado se o tipo
derivado tem um componente ponteiro em qualquer nvel de seleo de componente
Nota 12.43
Isto requer que o processadores tenham a capacidade de determinar se entidades com a tributo PRIVATE ou com
componentes particulares tem um componente ponteiro
5. como um argumento real associado com um argumento mudo com INTENT(OUT) ou
INTENT(INOUT) ou com o atributo POINTER
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 305
C1273 Qualquer procedimento referenciado em um subprograma puro, incluindo aquele referenciado via uma
operao definida, atribuio ou finalizao, tem que ser puro
C1274 Um procedimento puro no pode conter uma print-stmt, open-stmt, close-stmt, backspace-
stmt, endfile-stmt, rewind-stmt, flush-stmt, wait-stmt ou inquire-stmt
C1275 Um subprograma puro no pode conter uma read-stmt ou write-stmt cuja io-unit um file-
unit-number ou *
C1276 Um subprograma puro no pode conter uma stop-stmt
Nota 12.44
As restries citadas so projetadas garantir que um procedimento puro seja livre de efeitos colaterais ( side effects)
(modificaes da dados visveis fora do procedimento), o que significa que referenciar o procedimento em
construes tal como uma FORALL assignment-stmt onde no h ordem explcita de avaliao.
As restries nos subprogramas puros podem parecer complicadas, mas no so necessariamente para um
programador intimamente familiarizado com elas. Do ponto de vista de um programador, estas restries podem
ser sumarizadas como segue: um subprograma puro no pode conter qualquer operao possvel que possa iniciar
(ou originar) em uma atribuio ou atribuio de ponteiro para uma varivel num comum (common), uma varivel
acessada por meio de associao de uso ou hospedagem ou um argumento mudo com INTENT(IN); nem pode um
subprograma puro conter qualquer operao que possa iniciar qualquer entrada/sada num arquivo externo ou uma
operao de parada (STOP). Note o uso da palavra iniciar (conceivably = iniciar ou originar de uma forma
especfica); ela no suficiente para garantir que um subprograma puro esteja livre de efeitos colaterais na prtica.
Por exemplo, a funo que contm uma atribuio para uma varivel global, mas em um bloco que no
executado em qualquer invocao da funo todavia uma funo no pura. A excluso das funes desta
natureza requerida se verificaes estritas feito pelo compilador vai ser usada.
esperado que a maioria dos procedimentos da biblioteca sejam conforme com estas restries de procedimentos
puros e que possam ser declaradas puras e referenciadas em instrues FORALL e construes dentro de
procedimentos puros definidos pelos usurios
Nota 12.45
Sub-rotinas puras so includas para permitir chamadas de sub-rotinas em procedimentos puros em um modo
seguro e para permitir forall-assignment-stmts sejam atribuies definidas. As restries para sub-rotinas
puras so baseadas nos mesmos princpios que as das funes puras, exceto que efeitos colaterais para
INTENT(OUT), INTENT(INOUT) e argumentos mudos ponteiros so permitidos
12.7 Procedimentos Elementares
12.7 Elemental procedures
12.7.1 Declarao de Procedimento Elementar e Interface
12.7.1 Elemental procedure declaration and interface
Um procedimento elementar um procedimento intrnseco elementar ou um procedimento que definido
por um subprograma elementar.
Um subprograma elementar tem a prefix-spec ELEMENTAL. Um subprograma elementar um
subprograma puro. Uma PURE prefix-spec no necessita aparecer; ela implcita no uso da ELEMENTAL
prefix-spec. As restries adicionais que seguem aplicam-se aos subprogramas elementar
C1277 Todos os argumentos de um procedimento elementar tem que ser objetos de dados mudo escalar e no ter
o atributo POINTER ou ALLOCATABLE
C1278 A varivel resultado de uma funo elementar tem que ser escalar e no pode ter o o atributo POINTER ou
ALLOCATABLE
C1279 No escopo da unidade de um subprograma elementar, um designador de objeto com um argumento mudo
como objeto base no pode aparecer em uma specification-expr exceto como o argumento de uma das
funes intrnsecas BIT_SIZE, KIND, LEN ou funes inquisitrias numricas (13.5.6)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 306
Nota 12.46
Um subprograma elementar um subprograma puro e todas as restries de subprogramas puros tambm se
aplicam
Nota 12.47
A restrio sobre argumento mudo nas expresses de especificao so impostas primariamente para facilitar
otimizao. Um exemplo de uso que no permitido
ELEMENTAL REAL FUNCTION F(A, N)
REAL, INTENT(IN) :: A
INTEGER, INTENT(IN) :: N
REAL :: WORK_ARRAY(N)
! Invlido
...
END FUNCTION F
Um exemplo de uso que permitido
ELEMENTAL REAL FUNCTION F(A)
REAL, INTENT(IN) :: A
REAL(SELECTED_REAL_KIND (PRECISION(A)*2)) :: WORK
...
END FUNCTION F
12.7.2 Argumento Real de Funo Elementar e Resultados
12.7.2 Elemental function actual arguments and results
Se um nome genrico ou um nome especifico usado para referenciar uma funo elementar, a forma do
resultado a mesma que a forma do argumento real com o maior rank (nmero de dimenses). Se no existe
argumentos reais ou os argumentos reais so todos escalares, o resultado escalar. Para aquelas funes
elementares que tem mais de um argumento, todos os argumentos tm que ser conformes. No caso matricial, os
valores dos elementos da matriz, se existirem, do resultado so os mesmos como se tivessem sido obtidos com a
aplicao da funo escalar separadamente, em qualquer ordem, aos elementos correspondentes de cada argumento
real da matriz.
Nota 12.48
Um exemplo de uma referncia elementar da funo intrnseca elementar MAX:
se X e Y so matrizes de forma (M, N)
MAX(X, 0.0, Y)
uma expresso matricial de forma (M, N) cujos elementos tm valores
MAX(X(I, J), 0.0, Y(I, J)), I = 1, 2, ..., M, J = 1,2, ..., N
12.7.3 Argumento Real de Sub-rotina Elementar
12.7.3 Elemental subroutine actual arguments
Uma sub-rotina elementar aquela que tem somente argumentos mudos escalares, mas podem ter
argumentos reais matriciais. Em uma referncia a uma sub-rotina elementar, todos os argumentos reais so
escalares ou todos os argumentos reais associados com argumentos mudos INTENT(OUT) e INTENT(INOUT)
tem que ser matrizes de mesma forma e os restantes dos argumentos reais tem que serem conformes com eles. No
caso dos argumentos reais associados com os argumentos mudos com INTENT(OUT) e INTENT(INOUT) serem
matrizes os valores dos elementos, se existirem, dos resultados so os mesmos obtidos como se tivessem sido
obtidos com a aplicao da sub-rotina separadamente, em qualquer ordem, ao correspondentes elementos de cada
argumento real matricial.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 307
Em uma referncia a uma sub-rotina intrnseca MVBITS, os argumentos reais correspondendo aos
argumentos mudos TO e FROM podem ser as mesmas variveis e podem ser associadas a variveis escalares ou
variveis matriciais associadas todas cujos elementos correspondentes esto associados. Alm disto, os argumentos
reais em uma referncia a uma sub-rotina elementar tem que satisfazer as restries em 12.4.1.7.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 308
13. Procedimentos Intrnsecos e Mdulos
Section 13: Intrinsic procedures and modules
Existem quatro classes de procedimentos intrnsecos: funes inquisitrias (inquiry functions), funes
elementares (elemental functions), funes transformacionais (transformational functions) e sub-rotinas (subroutines).
Algumas sub-rotinas intrnsecas so elementares.
Existe trs conjuntos de mdulos intrnsecos padro: um mdulo de ambiente Fortran (Fortran environment
module) (13.8.2), mdulos para dar suporte a manipulao de excees (modules to support exception handling) e
aritmtica IEEE (IEEE arithmetic) e um mdulo para dar suporte a interoperacionalidade (interoperability) com a
linguagem de programao C. Os ltimos dois conjuntos de mdulos so descritos nas sees 14 e 15,
respectivamente.
13.1 Classes de Procedimentos Intrnsecos
13.1 Classes of intrinsic procedures
Uma funo inquisitria (inquiry function ) aquela cujo resultado depende das propriedades de um ou
mais de seus argumentos em vez dos seus valores; de fato, estes valores dos argumentos podem ser indefinidos. A
menos que a descrio de uma funo inquisitria estabelea o contrrio, estes argumentos so permitidos ser
alocveis no alocados ou ponteiros que no esto associados. Uma funo intrnseca elementar (elemental
intrinsic function ) uma que especificada por argumentos escalares, mas pode ser aplicada a argumentos
matriciais como escrito em 12.7. Todas as outras funes intrnsecas so funes transformacionais
(transformational functions ); quase todas elas tm um ou mais argumentos matriciais ou resultado matricial. Todas
as funes intrnsecas padro so puras.
A sub-rotina MOVE_ALLOC e a sub-rotina elementar MVBITS so puras. Nenhuma outra sub-rotina
padro pura.
Nota 13.1
Como as sub-rotinas elementares escrita pelo usurio (user-written elemental subroutines), uma sub-rotina intrnseca
elementar pura. Os efeitos de MOVE_ALLOC so limitados a seus argumentos. Todas as restantes sub-rotinas
intrnsecas no elementares tem efeitos colaterais (colaterias side effects) (ou reflete efeitos colaterais do sistema) e
portanto no so puras
Nomes genricos (generic names) de procedimentos intrnsecos padro so listados em 13.5. Nas maiorias
dos casos, funes aceitam argumentos de mais de um tipo e o tipo do resultado o mesmo tipo que o dos
argumentos. Nomes especficos (specific names) de funes intrnsecas padro que corresponde a nomes genricos
so listadas em 13.6.
Se uma funo intrnseca usada como um argumento real em um procedimento, seu nome especfico tem
que ser utilizado e ela pode ser referenciado no procedimento que chamou somente com argumentos escalares. Se
uma funo intrnseca no tem um nome especfico, ela no pode ser utilizada como argumento real (12.4.1.3).
Procedimentos intrnsecos se comportam como descrito em 12.7.
13.2 Argumentos para os Procedimentos Intrnsecos
13.2 Arguments to intrinsic procedures
Todos os procedimentos intrnsecos podem ser invocados com argumentos posicionais ou palavras-chaves
de argumentos (12.4). As descries de 13.5 at 13.7 fornecem os nomes das palavras-chaves dos argumentos e a
sequncia posicional para os procedimentos intrnsecos padro.
Vrios dos argumentos intrnsecos possuem argumentos opcionais. Estes argumentos so identificados pela
notao opcional nas descries dos argumentos. Alm disto, os nomes dos argumentos opcionais so envolvidos
em colchetes (square brackets) nos cabealhos descritivos e nas listas de procedimentos. As formas vlidas de
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 309
referncia dos procedimentos com argumentos opcionais so descritos em 12.4.1.
Nota 13.2
O texto CMPLX (X [, Y, KIND]) indica que Y e KIND so ambos argumentos opcionais. Formas de referncias
vlidas incluem CMPLX(x), CMPLX(x, y), CMPLX(x, KIND=kind), CMPLX(x, y, kind) e
CMPLX(KIND=kind, X=x, Y=y)
Nota 13.3
Alguns procedimentos intrnsecos impem requerimentos adicionais nos seus argumentos opcionais. Por exemplo,
SELECTED_REAL_KIND requer que pelo menos um de seus argumentos opcionais esteja presente e
RANDOM_SEED requer que no mximo um dos seus argumentos opcionais esteja presente
Os argumentos mudos dos procedimentos intrnsecos especficos em 13.6 tem INTENT(IN). Os
argumentos mudos dos procedimentos intrnsecos genricos em 13.7 tem INTENT(IN) se a inteno no
explicitamente declarada.
O argumento real associado com um argumento mudo de funo intrnseca chamado KIND tem que ser
uma expresso de inicializao inteira escalar e tem que especificar um mtodo de representao para o resultado
da funo que existe no processador.
Sub-rotinas intrnsecas que atribu valores a argumentos do tipo caractere fazem isto em acordo com as
regras de atribuio intrnseca(7.4.1.3).
13.2.1 A Forma de Argumentos Matriciais
13.2.1 The shape of array arguments
A menos que especificado de outra forma, as funes intrnsecas inquisitrias aceitam argumentos
matriciais nos quais a forma no necessita estar definida. A forma dos argumentos matriciais para funes
transformacionais e e funes intrnsecas elementar tem que ser definidas.
13.2.2 Argumentos Mscara
13.2.2 Mask arguments
Algumas funes intrnsecas matriciais tm um argumento opcional MASK do tipo lgico que usado pela
funo para selecionar os elementos de um ou mais argumentos que sero operados pela funo. Qualquer
elemento no selecionado pela mscara (mask) no precisa estar definido no momento em que a funo invocada.
A MASK afeta somente os valores da funo e no afeta a avaliao, antes da funo ser invocada, dos
argumentos que so expresses matriciais.
13.3 Modelo de Bit
13.3 Bit model
Os procedimentos de manipulao de bit so dez funes elementares e uma sub-rotina elementar.
Operaes lgicas sobre bits so disponibilizadas pelas funes elementares IOR, IAND, NOT e IEOR. Operaes
de deslocamento (shift operations) so disponibilizadas pelas funes elementares ISHFT e ISHFTC. Subcampos de
bits (bit subfields) podem ser referenciados pela funo elementar IBITS e pela sub-rotina elementar MVBITS.
Processamento de um nico bit disponibilizado pelas funes elementares BTEST, IBSET e IBCLR.
Para os propsitos destes procedimentos, um bit definido como sendo um dgito binrio w localizado na
posio k de um objeto escalar inteiro no negativo em um modelo de inteiro no negativo definido por
j=

k=0
z1
w
k
2
k
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 310
e para o qual w
k
pode ter o valor 0 e 1. Um exemplo de um modelo compatvel com os exemplos usados em
13.4 pode ser z = 32, o que define um inteiro de 32-bit.
Uma funo inquisitria BIT_SIZE est disponvel para determinar o parmetro z do modelo.
Efetivamente, este modelo define um objeto inteiro sendo constitudo de uma sequncia de z bits numerada
da direita para a esquerda partindo de 0 at z-1. Este modelo vlido somente no contexto do uso deste objeto
como argumento ou resultado de um dos procedimentos de manipulao de bit. Em todos os outros contextos, o
modelo definido para um inteiro em 13.4 aplicado. Em particular, onde os modelos so idnticos para
w
z1
=0 , eles no correspondem para w
z1
=1 e a interpretao dos bits nestes objetos dependente do
processador.
13.4 Modelos Numricos
13.4 Numeric models
A manipulao numrica e funes inquisitrias so descritas em termos do modelo de representao e
comportamento dos nmeros em um processador. O modelo tem parmetros que so determinados de forma tal que
faz o melhor ajuste na mquina na qual os programas so executados.
O conjunto de inteiros do modelo definido por
i=s

k=0
q1
w
k
r
k
onde r um inteiro excedendo um, q um inteiro positivo, cada w
k
um inteiro no negativo menor que r e
vale +1 ou 1.
O conjunto de reais x do modelo definido por
x=

0 ou
sb
e

k=1
p
f
k
b
k
onde b e p so inteiros excedendo um; cada f
k
um inteiro no negativo menor que b; com f
1
no
zero; s vale (+1) ou (1) e e um inteiro que fica entre algum inteiro mximo e
max
e algum inteiro mnimo
e
min
inclusive. Para x = 0, seu expoente e e dgitos f
k
so definidos como zeros. Os parmetros inteiros r e q
determinam o conjunto de inteiros do modelo e os parmetros inteiros b, p,
e
min
e e
max
determinam o conjunto
de nmeros de ponto flutuante do modelo. Os parmetros dos inteiros e reais do modelo so disponveis para cada
tipo inteiro e real implementado pelo processador. Os parmetros caracterizam o conjunto de nmeros disponveis
na definio do modelo. As funes de manipulao de ponto flutuante (13.5.10) e funes inquisitrias numrica
(13.5.6) prov valores para alguns parmetros e outras valores relacionadas com o modelo.
Nota 13.4
Exemplos desta funes em 13.7 usa os modelos
i=s

k=0
30
w
k
2
k
e
x=0 ou s2
e

(
1
2
+

k=2
24
f
k
2
k
)
, 126<e<127
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 311
13.5 Procedimentos Intrnsecos Genricos Padro
13.5 Standard generic intrinsic procedures
Para todas os procedimentos intrnsecos padro, os argumentos mostrados so os nomes que tem que ser
usados para as palavras-chaves dos argumentos se a palavra-chave usada nos argumentos reais.
Nota 13.5
Por exemplo, uma referncia a CMPLX pode ser escrita na forma CMPLX(A, B, M) ou na forma
CMPLX (Y = B, KIND = M, X = A)
Nota 13.6
Vrios das palavras-chaves tm nomes que so indicativo de seu uso. Por exemplo:
KIND descreve o parmetro de tipo subtipo (kind type parameter) do resultado
STRING, STRING_A um string caractere arbitrrio
BACK controla a direo do escaneamento (scan) (para frente ou para trs)
MASK uma mascara que pode ser aplicada aos argumentos
DIM uma dimenso selecionada de um argumento matricial
13.5.1 Funes Numricas
13.5.1 Numeric functions
ABS(A) valor absoluto
AIMAG(Z) parte imaginria de um nmero complexo
AINT(A[,KIND]) truncado para um nmero inteiro
ANINT(A[,KIND]) nmero inteiro mais prximo
CEILING(A[,KIND]) menor inteiro maior que ou igual ao nmero
CMPLX(X[,Y,KIND]) converso para tipo complexo
CONJG(Z) conjugado de um nmero complexo
DBLE(A) converso para tipo real preciso dupla
DIM(X,Y) diferena positiva
DPROD(X,Y) produto real de preciso dupla
FLOOR(A[,KIND]) maior inteiro menor ou igual ao nmero
INT(A[,KIND]) converso para tipo inteiro
MAX(A1,A2[,A3,...]) valor mximo
MIN(A1,A2[,A3,...]) valor mnimo
MOD(A,P) funo resto
MODULO(A,P) funo mdulo
NINT(A[,KIND]) inteiro mais perto
REAL(A[,KIND]) converso para tipo real
SIGN(A,B) transfere sinal
13.5.2 Funes Matemticas
13.5.2 Mathematical functions
ACOS(X) arco cosseno
ASIN(X) arco seno
ATAN(X) arco tangente
ATAN2(Y,X) arco tangente
COS(X) cosseno
COSH(X) cosseno hiperblico
EXP(X) exponencial
LOG(X) logaritmo natural
LOG10(X) logaritmo comum (base 10)
SIN(X) seno
SINH(X) seno hiperblico
SQRT(X) raiz quadrada
TAN(X) tangente
TANH(X) tangente hiperblica
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 312
13.5.3 Funes Caractere
13.5.3 Character functions
ACHAR(I[,KIND]) caractere em um a dada posio da sequncia de
arrumao ASCII
ADJUSTL(STRING) ajuste a esquerda
ADJUSTR(STRING) ajuste a direita
CHAR(I[,KIND]) caractere em uma dada posio na sequncia de arrumao
do processador
IACHAR(C[,KIND]) posio de um caractere na sequncia de arrumao ASCII
ICHAR(C[,KIND]) posio de um caractere na sequncia de arrumao do
do processador
INDEX(STRING,SUBSTRING[,BACK,KIND]) posio inicial de um substring
LENTRIM(STRING[,KIND]) comprimento sem caracteres brancos posteriores
LGE(STRING_A,STRING_B) lexicalmente maior que ou igual
LGT(STRING_A,STRING_B) lexicalmente maior que
LLE(STRING_A,STRING_B) lexicalmente menor que ou igual
LLT(STRING_A,STRING_B) lexicalmente menor que
MAX(A1,A2[,A3,...]) valor mximo
MIN(A1,A2[,A3,...]) valor mnimo
REPEAT(STRING,NCOPIES) concatenao repetida
SCAN(STRING,SET[,BACK,KIND]) escaneia um string procurando um caractere no conjunto
TRIM(STRING) Remove caracteres brancos posteriores
VERIFY(STRING,SET[,BACK,KIND]) Verifica o conjunto de caracteres em um string
13.5.4 Funes Subtipo
13.5.4 Kind functions
KIND(X) valor do parmetro de subtipo (Kind type parameter value)
SELECTED_CHAR_KIND(NAME) valor do parmetro de subtipo caractere, dado nome conjunto
de caracteres
SELECTED_INT_KIND(R) valor do parmetro de subtipo inteiro, dado um intervalo
SELECTED_REAL_KIND([P,R]) valor do parmetro de subtipo real, dado a preciso e
intervalo
13.5.5 Miscelnea de Funes Converso de Tipo
13.5.5 Miscellaneous type conversion functions
LOGICAL(L[,KIND]) converso entre objetos do tipo lgico com diferente
parmetros de tipo subtipo (kind type parameters)
TRANSFER(SOURCE,MOLD[,SIZE]) trata primeiro argumento como se fosse do tipo do segundo
argumento
13.5.6 Funes Inquisio Numrica
13.5.6 Numeric inquiry functions
DIGITS(X) nmero de dgitos significantes do modelo
EPSILON(X) nmero que quase desprezvel comparado com um
HUGE(X) maior nmero do modelo
MAXEXPONENT(X) expoente mximo do modelo
MINEXPONENT(X) expoente mnimo do modelo
PRECISION(X) preciso decimal
RADIX(X) base do modelo
RANGE(X) intervalo do expoente decimal
TINY(X) menor nmero positivo do modelo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 313
13.5.7 Funes Inquisio de Matriz
13.5.7 Array inquiry functions
LBOUND(ARRAY[,DIM,KIND]) menor limite inferior na dimenso de uma matriz
SHAPE(SOURCE[,KIND]) forma de uma matriz ou escalar
SIZE(ARRAY[,DIM,KIND]) nmero total de elementos em uma matriz
UBOUND(ARRAY[,DIM,KIND]) limite superior na dimenso de uma matriz
13.5.8 Outras Funes de Inquisio
13.5.8 Other inquiry functions
ALLOCATED(ARRAY) ou ALLOCATED(SCALAR) estado de alocao
ASSOCIATED(POINTER[,TARGET]) inquisio do estado de associao ou comparao
BIT SIZE(I) nmero de bits do modelo
EXTENDS_TYPE_OF(A,MOLD) mesmo tipo dinmico ou uma extenso
LEN(STRING[,KIND]) comprimento de uma entidade caractere
NEW_LINE(A) caractere nova linha
PRESENT(A) argumento presente
SAME_TYPE_AS(A,B) mesmo tipo dinmico
13.5.9 Procedimentos de Manipulao de Bit
13.5.9 Bit manipulation procedures
BTEST(I,POS) testando o bit
IAND(I,J) AND bit a bit
IBCLR(I,POS) limpa o bit
IBITS(I,POS,LEN) extra o bit
IBSET(I,POS) entra com valor no bit
IEOR(I,J) OU exclusivo
IOR(I,J) OU inclusivo
ISHFT(I,SHIFT) deslocamento lgico
ISHFTC(I,SHIFT[,SIZE]) deslocamento circular
MVBITS(FROM,FROMPOS,LEN,TO,TOPOS) copia bits de um inteiro em outro
NOT(I) complemento bit a bit
13.5.10 Funes de Manipulao de Ponto Flutuante
13.5.10 Floating-point manipulation functions
EXPONENT(X) parte expoente do modelo numrico
FRACTION(X) parte fracionaria de um nmero
NEAREST(X,S) diferena mais prxima de um nmero do processador em uma dada direo
RRSPACING(X) recproco do espaamento relativo do modelo de nmeros perto de um dado
nmero
SCALE(X,I) multiplica um real pela sua base elevado a uma potncia inteira
SET_EXPONENT(X,I) entra com a parte exponencial de um nmero
SPACING(X) espaamento absoluto do modelo de nmeros perto de um nmero dado
13.5.11 Funes de Multiplicao de Vetor e Matriz
13.5.11 Vector and matrix multiply functions
DOT_PRODUCT(VECTOR_A,VECTOR_B) produto escalar de duas matrizes unidimensionais
MATMUL(MATRIX_A,MATRIX_B) multiplicao de matriz
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 314
13.5.12 Funes de Reduo de Matriz
13.5.12 Array reduction functions
ALL(MASK[,DIM]) verdadeiro se todos os valores so
verdadeiros
ANY(MASK[,DIM]) verdadeiro se qualquer valor
verdadeiro
COUNT(MASK[,DIM,KIND]) nmero de elementos verdadeiros
em uma matriz
MAXVAL(ARRAY,DIM[,MASK]) ou MAXVAL(ARRAY[,MASK]) valor mximo em uma matriz
MINVAL(ARRAY,DIM[,MASK]) ou MINVAL(ARRAY[,MASK]) valor mnimo em uma matriz
PRODUCT(ARRAY,DIM[,MASK]) ou PRODUCT(ARRAY[,MASK]) produto dos elementos de uma matriz
SUM(ARRAY,DIM [,MASK]) ou SUM(ARRAY[,MASK]) soma dos elementos de uma matriz
13.5.13 Funes de Construo de Matriz
13.5.13 Array construction functions
CSHIFT(ARRAY,SHIFT[,DIM]) deslocamento circular
EOSHIFT(ARRAY,SHIFT[,BOUNDARY,DIM]) Fim do deslocamento
MERGE(TSOURCE,FSOURCE,MASK) combina sob controle da marcara
PACK(ARRAY,MASK[,VECTOR]) coloca uma matriz em uma matriz unidimensional sob
controle da mascara
RESHAPE(SOURCE,SHAPE[,PAD,ORDER]) reformata uma matriz
SPREAD(SOURCE,DIM,NCOPIES) repete uma matriz adicionando uma dimenso
TRANSPOSE(MATRIX) transposta de uma matriz de duas dimenses
UNPACK(VECTOR,MASK,FIELD) descompacta uma matriz unidimensional em uma matriz sob
controle da mascara
13.5.14 Funes de Localizao de Matriz
13.5.14 Array location functions
MAXLOCARRAY,DIM[,MASK,KIND]) ou MAXLOC(ARRAY[,MASK,KIND])
localiza o valor mximo em uma matriz
MINLOCARRAY,DIM[,MASK,KIND]) ou MINLOC(ARRAY[,MASK,KIND])
localiza o valor mnimo em uma matriz
13.5.15 Funo Nulo
13.5.15 Null function
NULL([MOLD]) retorna desassociao ou resultado no alocado
13.5.16 Procedimento de Transferncia de Alocao
13.5.16 Allocation transfer procedure
MOVE_ALLOC(FROM,TO) move um alocvel de um objeto alocvel para outro
13.5.17 Sub-rotina Nmero Aleatrio
13.5.17 Random number subroutines
RANDOM_NUMBER(HARVEST) retorna nmero pseudo-aleatrio
RANDOM_SEED([SIZE,PUT,GET]) inicializa ou reinicia o gerador de nmero pseudo-aleatrio
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 315
13.5.18 Procedimentos Sistema Ambiente
13.5.18 System environment procedures
COMMAND_ARGUMENT_COUNT () nmero de argumentos no comando
CPU_TIME(TIME) obtm tempo de uso do processador
DATE_AND_TIME([DATE,TIME,ZONE,VALUES]) obtm data e tempo
GET_COMMAND([COMMAND,LENGTH,STATUS]) retorna comando completo
GET_COMMAND_ARGUMENT(NUMBER[,VALUE,LENGTH,STATUS])
retorna o argumento do comando
GET_ENVIRONMENT_VARIABLE(NAME[,VALUE,LENGTH,STATUS,TRIM_NAME])
obtm o valor de uma varivel de ambiente
IS_IOSTAT_END(I) teste para o valor fim-de-arquivo
IS_IOSTAT_EOR(I) teste para o valor fim-de-registro
SYSTEM_CLOCK([COUNT,COUNT_RATE,COUNT_MAX]) obtm dados do relgio do sistema
13.6 Nomes Especficos para Funes Intrnsecas Padro
13.6 Specific names for standard intrinsic functions
Exceto para AMAX0, AMIN0, MAX1 e MIN1, o tipo do resultado de uma funo especfica o mesmo
que o tipo do resultado da funo genrica correspondente teria se ela fosse invocada com os mesmos argumentos
que a funo especfica.
Nome especfico Nome genrico Tipo do argumento
ABS ABS real default
ACOS ACOS real default
AIMAG AIMAG complexo default
AINT AINT real default
ALOG LOG real default
ALOG10 LOG10 real default
AMAX0(...) REAL(MAX(...)) inteiro default
AMAX1 MAX real default
AMIN0(...) REAL(MIN(...)) inteiro default
AMIN1 MIN real default
AMOD MOD real default
ANINT ANINT real default
ASIN ASIN real default
ATAN ATAN real default
ATAN2 ATAN2 real default
CABS ABS complexo default
CCOS COS complexo default
CEXP EXP complexo default
CHAR CHAR complexo default
CLOG LOG complexo default
CONJG CONJG complexo default
COS COS real default
COSH COSH real default
CSIN SIN complexo default
CSQRT SQRT complexo default
DABS ABS real preciso dupla
DACOS ACOS real preciso dupla
DASIN ASIN real preciso dupla
DATAN ATAN real preciso dupla
DATAN2 ATAN2 real preciso dupla
DCOS COS real preciso dupla
DCOSH COSH real preciso dupla
DDIM DIM real preciso dupla
DEXP EXP real preciso dupla
DIM DIM real default
DINT AINT real preciso dupla
DLOG LOG real preciso dupla
DLOG10 LOG10 real preciso dupla
DMAX1 MAX real preciso dupla
DMIN1 MIN real preciso dupla
DMOD MOD real preciso dupla
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 316
DNINT ANINT real preciso dupla
DPROD DPROD real default
DSIGN SIGN real preciso dupla
DSIN SIN real preciso dupla
DSINH SINH real preciso dupla
DSQRT SQRT real preciso dupla
DTAN TAN real preciso dupla
DTANH TANH real preciso dupla
EXP EXP real default
FLOAT REAL inteiro default
IABS ABS inteiro default
ICHAR ICHAR caractere default
IDIM DIM inteiro default
IDINT INT real preciso dupla
IDNINT NINT real preciso dupla
IFIX INT real default
INDEX INDEX caractere default
INT INT real default
ISIGN SIGN inteiro default
LEN LEN caractere default
LGE LGE caractere default
LGT LGT caractere default
LLE LLE caractere default
LLT LLT caractere default
MAX0 MAX inteiro default
MAX1(...) INT(MAX(...)) real default
MIN0 MIN inteiro default
MIN1(...) INT(MIN(...)) real default
MOD MOD inteiro default
NINT NINT real default
REAL REAL inteiro default
SIGN SIGN real default
SIN SIN real default
SINH SINH real default
SNGL REAL real preciso dupla
SQRT SQRT real default
TAN TAN real default
TANH TANH real default
Uma funo intrnseca especfica marcada com um ponto lista (bullet) () no pode ser usada como um
argumento real ou como um alvo em uma instruo de atribuio ponteiro de procedimento.
13.7 Especificaes dos Procedimentos Intrnsecos Padro
13.7 Specifications of the standard intrinsic procedures
Especificaes detalhadas dos procedimentos intrnsecos genricos padro so providas aqui em ordem
alfabtica.
Os tipos e parmetros de tipo dos argumentos dos procedimentos intrnsecos padro e resultados de funo
so determinados por estas especificaes. Os pargrafos Argumento(s). especifica(m) requerimentos nos
argumentos reais dos procedimentos. As caractersticas do resultado so vrias vezes especificados em termos das
caractersticas dos argumentos mudos. Um programa est proibido de invocar um procedimento intrnseco sob
circunstncias onde o valor a ser retornar em um argumento de sub-rotina ou resultado de funo esteja fora do
intervalo de valores representados representveis pelos objetos do tipo especificado e parmetros de tipo, a menos
que o mdulo intrnseco IEEE_ARITHMETIC (seo 14) esteja acessvel e haja suporte para um resultado infinito
ou NaN, onde apropriado. Se um resultado infinito retornado, a bandeira (flag) IEEE_OVERFLOW ou
IEEE_DIVIDE_BY_ZERO tem que ser usada, isto , indicar a ocorrncia deste evento; se o resultado NaN
retornado, a bandeira (flag) IEEE_INVALID tem que ser usada. Se todos os resultados so normais, estas bandeiras
(flags) tem que ter o mesmo estado de quando o procedimento intrnseco foi invocado.
Flag bandeira indicador; sinalizador
Em informtica, uma flag (bandeira) um mecanismo lgico que funciona como semforo,
isto , uma entidade (objeto) que detm um dado valor se uma certa caracterstica
associada a essa bandeira est presente. muito comum o uso da expresso inglesa flag
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 317
13.7.1 ABS(A)
13.7.1 ABS (A)
Descrio. Valor absoluto
Classe. Funo elementar
Argumento(s). A tem que ser do tipo inteiro, real ou complexo
Caractersticas do Resultado. Mesmo que A exceto que se A complexo, o resultado real
Valor do Resultado. Se A do tipo inteiro ou real, o valor do resultado |A|; se A complexo com valor (x, y), o
resultado igual a aproximao dependente do processador
.x
2
+y
2
Exemplo. ABS ( (3.0, 4.0) ) tem o valor 5.0 (aproximadamente)
13.7.2 ACHAR(I[,KIND])
13.7.2 ACHAR (I [, KIND])
Descrio. Retorna o caractere em uma posio especfica da sequncia de arrumao ASCII. o inverso da
funo IACHAR
Classe. Funo elementar
Argumento(s).
I Tem que ser do tipo inteiro
KIND (opcional) Tem que ser uma expresso de inicializao inteira escalar
Caractersticas do Resultado. Caractere de comprimento um. Se KIND est presente, o parmetro de tipo
subtipo (kind type parameter) aquele especificado pelo valor de KIND; caso contrrio, o parmetro
de tipo subtipo o do tipo caractere default
Valor do Resultado. Se I tem um valor no intervalo 0 I 127, o resultado o caractere na posio I da
sequncia de arrumao ASCII, garantido que o processador capaz de representar este caractere
no tipo caractere do resultado; caso contrrio, o resultado dependente do processador.
ACHAR(IACHAR (C)) tem que ter o valor C para qualquer caractere C capaz de representao no
tipo caractere default
Exemplo. ACHAR (88) tem o valor X
13.7.3 ACOS(X)
13.7.3 ACOS (X)
Descrio. Funo arco cosseno (inverso do cosseno)
Classe. Funo elementar
Argumento(s). X tem que ser do tipo rela com um valor que satisfaz a desigualdade |X| 1
Caractersticas do Resultado. Mesmo que X
Valor do Resultado. O resultado tem um valor igual a uma aproximao dependente do processador de arco
cosseno(X), expresso em radianos. Ele est entre 0 ACOS(X)
Exemplo. ACOS(0.54030231) tem o valor 1.0 (aproximadamente)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 318
13.7.4 ADJUSTL(STRING)
13.7.4 ADJUSTL (STRING)
Descrio. Ajusta esquerda, removendo brancos anteriores e inserindo brancos posteriores
Classe. Funo elementar
Argumento(s). STRING tem que ser do tipo caractere
Caractersticas do Resultado. Caractere do mesmo comprimento e parmetro de tipo subtipo (kind type
parameter) que STRING
Valor do Resultado. O valor do resultado o mesmo que STRING exceto que quaisquer brancos anteriores
foram removidos e o mesmo nmero de brancos posteriores foram inserido s
Exemplo. ADJUSTL( WORD) tem o valor WORD
13.7.5 ADJUSTR(STRING)
13.7.5 ADJUSTR (STRING)
Descrio. Ajusta direita, removendo brancos posteriores e inserindo brancos anteriores
Classe. Funo elementar
Argumento(s). STRING tem que ser do tipo caractere
Caractersticas do Resultado. Caractere do mesmo comprimento e parmetro de tipo subtipo (kind type
parameter) que STRING
Valor do Resultado. O valor do resultado o mesmo que STRING exceto que quaisquer brancos posteriores
foram removidos e o mesmo nmero de brancos anteriores foram inseridos
Exemplo. ADJUSTR(WORD ) tem o valor WORD
$$$$$$$$$$$$$$
FAZER: Completar as funes
13.7.6 AIMAG(Z)
13.7.6 AIMAG(Z)
Descrio.
Classe.
Argumento(s).
Caractersticas do Resultado.
Valor do Resultado.
Exemplo.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 319
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 320
13.8 Mdulos Intrnsecos Padro
13.8 Standard intrinsic modules
Este padro define vrios mdulos intrnsecos padro. Um processador pode estender os mdulos
intrnsecos padro para prover entidade pblicas neles em adio aquelas especificadas neste padro.
Nota 13.18
Para evitar potencial conflito de nomes com entidades de programas, recomendado que o programa usa a opo
ONLY em qualquer instruo de uso (USE statement) que acesse o mdulo intrnseco padro
13.8.1 Os Mdulos IEEE
13.8.1 The IEEE modules
Os mdulos intrnsecos IEEE_EXCEPTIONS, IEEE_ARITHMETIC e IEEE_FEATURES so descritos na
seo 14.
13.8.2 O Mdulo Intrnseco ISO_FORTRAN_ENV
13.8.2 The ISO_FORTRAN_ ENV intrinsic module
O mdulo intrnseco ISO_FORTRAN_ENV prov entidade pblicas relacionadas ao ambiente Fortran.
O processador tem que prover as constantes com nome descritas nas subclusulas que segue.
13.8.2.1 CHARACTER_STORAGE_SIZE
13.8.2.1 CHARACTER_STORAGE_SIZE
O valor da constante escalar inteira default CHARACTER_STORAGE_SIZE o tamanho expresso em
bits da unidade de armazenamento caractere (16.4.3.1).
13.8.2.2 ERROR_UNIT
13.8.2.2 ERROR_UNIT
O valor da constante escalar inteira default ERROR_UNIT identifica a unidade externa pr-conectada
dependente do processador usada para propsitos de reportar erro (9.4). Esta unidade pode ser a mesma que
OUTPUT_UNIT. O valor no pode ser -1.
13.8.2.3 FILE_STORAGE_SIZE
13.8.2.3 FILE_STORAGE_SIZE
O valor da constante escalar inteira default FILE_STORAGE_SIZE o tamanho expresso em bits da
unidade de armazenamento de arquivo (9.2.4).
13.8.2.4 INPUT_UNIT
13.8.2.4 INPUT_UNIT
O valor da constante escalar inteira default INPUT_UNIT identifica a mesma unidade externa pr-
conectada dependente do processador que aquela identificada por um asterisco na instruo READ (9.4). O valor
no pode ser -1.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 321
13.8.2.5 IOSTAT_END
13.8.2.5 IOSTAT_END
O valor da constante escalar inteira default IOSTAT_END atribudo varivel especificada em um
especificador IOSTAT= (9.10.4) se uma condio fim-de-arquivo ocorre durante a execuo de uma instruo de
entrada/sada e nenhuma condio de erro ocorre. Este valor tem que ser negativo.
13.8.2.6 IOSTAT_EOR
13.8.2.6 IOSTAT_EOR
O valor da constante escalar inteira default IOSTAT_EOR atribudo varivel especificada em um
especificador IOSTAT= (9.10.4) e uma condio fim-de-registro ocorre durante a execuo de uma instruo de
entrada/sada e nenhuma condio de erro ocorre. Este valor tem que ser negativo e diferente do valor de
IOSTAT_END.
13.8.2.7 NUMERIC_STORAGE_SIZE
13.8.2.7 NUMERIC_STORAGE_SIZE
O valor da constante escalar inteira default NUMERIC_STORAGE_SIZE o tamanho expresso em bits da
unidade de armazenamento de numrica (16.4.3.1).
13.8.2.8 OUTPUT_UNIT
13.8.2.8 OUTPUT_UNIT
O valor da constante escalar inteira default OUTPUT_UNIT identifica a mesma unidade externa pr-
conectada dependente do processador que aquela identificada por um asterisco na instruo WRITE (9.4). O valor
no pode ser -1.
13.8.3 O Mdulo ISO_C_BINDING
13.8.3 The ISO_C_BINDING module
O mdulo intrnseco ISO_C_BINDING descrito na seo 15.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 322
14. Excees e Aritmtica IEEE
Section 14: Exceptions and IEEE arithmetic
Os mdulos intrnsecos IEEE_EXCEPTIONS, IEEE_ARITHMETIC e IEEE_FEATURES proveem
suporte para as excees e aritmtica IEEE. Se os mdulos so providos isto dependente do processador. Se o
mdulo IEEE_FEATURES provido, quais constantes com nomes definidas neste padro dependente do
processador. O mdulo IEEE_ARITHMETIC se comporta como se ele contivesse uma instruo de uso ( USE
statement) para o IEEE_EXCEPTIONS; tudo o que pblico em IEEE_EXCEPTIONS pblico em
IEEE_ARITHMETIC.
Nota 14.1
Os tipos e procedimentos definidos nestes mdulos no so intrnsecos
Se IEEE_EXCEPTIONS ou IEEE_ARITHMETIC acessvel em uma unidade de escopo,
IEEE_OVERFLOW e IEEE_DIVIDE_BY_ZERO so suportadas na unidade de escopo para todos os subtipos (all
kinds) de dados reais e complexos. Quais outras excees so suportadas pode ser determinado pela funo
IEEE_SUPPORT_FLAG (14.10.26); se o controle de parada (control of halting) suportado pode ser determinado
pela funo IEEE_SUPPORT_HALTING. A extenso do suporte de outras excees pode ser influenciado pela
acessibilidade das constantes com nome IEEE_INEXACT_FLAG, IEEE_INVALID_FLAG e
IEEE_UNDERFLOW_FLAG do mdulo IEEE_FEATURES. Se a unidade de escopo tem acesso a
IEEE_UNDERFLOW_FLAG de IEEE_FEATURES, dentro da unidade de escopo do processador tem que suportar
underflow e retornar verdadeiro (true) para IEEE_SUPPORT_FLAG(IEEE_UNDERFLOW, X) para ao menos
um subtipo (kind) do real. Similarmente, se IEEE_INEXACT_FLAG ou IEEE_INVALID_FLAG est acessvel,
dentro da unidade de escopo do processador tem que suportar a exceo e retornar verdadeiro ( true) vindo da
inquisio correspondente para pelo menos um subtipo (kind) do rea. Tambm, se IEEE_HALTING est acessvel,
dentro da unidade de escopo do processador tem que suportar controle de parada (control of halting) e retornar
verdadeiro (true) para IEEE_SUPPORT_HALTING(FLAG) para a bandeira (flag).
Underflow subtransbordamento; capacidade curta
underflow a condio que ocorre quando o valor de um nmero menor em magnitude que
o menor valor representvel do ponto flutuante (isto , perto do valor zero)
Nota 14.2
IEEE_INVALID no requerido ser suportado quando IEEE_EXCEPTIONS acessado. Isto para permitir que
um processador no-IEEE prover suporte para overflow e diviso por zero. Numa mquina IEEE, invlido
uma condio igualmente sria
overflow transbordamento, excedente
overflow a condio que ocorre quando o valor de um nmero maior em magnitude que o
maior valor representvel do ponto flutuante (isto , perto do fim da escala)
Nota 14.3
O mdulo IEEE_FEATURES provido para permitir uma razovel quantidade de colaborao entre o
programador e o processador que controla a extenso do suporte aritmtica IEEE. Em alguns processadores
algumas caractersticas (features) so naturais para o processador suportar. Se IEEE_FEATURES no usado, o
processador ir suportar somente as operaes naturais. Com IEEE_FEATURES o processador ir definir
constantes com nome (14.1) correspondendo a caractersticas que gastaro um certo tempo ( time-consuming
features) (da mesma forma que as naturais gastam para finalizar sua ao) mas no ir definir constantes com
nome correspondendo as caractersticas impossveis. Se o programador acessa IEEE_FEATURES, o processador
tem que prover suporte para todas as IEEE_FEATURES que so razoavelmente possveis. Se o programador usar
uma clusula ONLY na instruo de uso (USE statement) para acessar um nome particular da caracterstica, o
processador tem que prover suporte para a caracterstica correspondente ou emitir uma mensagem de erro
salvando o nome que no est definido no mdulo. Quando usado desta manira, as constantes com nome em
IEEE_FEATURES so similares ao que frequentemente chamado de chaves de comando de linha (command line
switches) para o compilador. Elas podem especificar opes de compilao em uma maneira razoavelmente
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 323
porttil
Se a unidade de escopo no acessa IEEE_FEATURES, IEEE_EXCEPTIONS ou IEEE_ARITHMETIC, o
nvel de suporte dependente do processador e no necessita incluir suporte para qualquer exceo. Se a bandeira
sinalizada (flag is signaling) na entrada para esta unidade de escopo, o processador garante que ela sinalizada na
sada. Se a bandeira (flag) quieta na entrada para esta unidade de escopo, se ela sinalizada na sada dependente
do processador.
Alm disto suporte IEEE disponvel no mdulo IEEE_ARITHMETIC. A extenso do suporte pode ser
influenciada pela acessibilidade das constantes com nome do mdulo IEEE_FEATURES. Se a unidade de escopo
tem acesso a IEEE_DATATYPE de IEEE_FEATURES, dentro da unidade de escopo do processador tem que
suportar aritmtica IEEE e retornar verdadeiro vindo de IEEE_SUPPORT_DATATYPE(X) (14.10.23) para pelo
menos um subtipo de real. Similarmente, se IEEE_DENORMAL, IEEE_DIVIDE, IEEE_INF, IEEE_NAN,
IEEE_ROUNDING ou IEEE_SQRT acessvel, dentro do escopo da unidade o processador tem que suportar a
caracterstica e retornar verdadeiro vindo da funo inquisitria correspondente para pelo menos um subtipo do
real. No ocaso de IEEE_ROUNDING, ele tem que retornar verdadeiro para todos os modelos de arredondamento
IEEE_NEAREST, IEEE_TO_ZERO, IEEE_UP e IEEE_DOWN.
Execuo pode ser reduzida em alguns processadores pelo suporte de algumas caractersticas (features). Se
IEEE_EXCEPTIONS ou IEEE_ARITHMETIC acessado mas IEEE_FEATURES no acessado, o subconjunto
suportado de caractersticas dependente do processador. O mais completo suporte do processador provido
quando todas as IEEE_FEATURES so acessadas em
USE, INTRINSIC :: IEEE_ARITHMETIC; USE, INTRINSIC :: IEEE_FEATURES
mas execuo pode ser reduzido pela presena de uma caracterstica que no necessria. Em todos os casos, a
extenso do suporte pode ser determinada por funes de inquisio.
14.1 Tipos Derivados e Constantes definidas nos Mdulos
14.1 Derived types and constants defined in the modules
Os mdulos IEEE_EXCEPTIONS, IEEE_ARITHMETIC e IEEE_FEATURES definem cinco tipos
derivados, cujos componentes so todos particulares (private).
O mdulo IEEE_EXCEPTIONS define
IEEE_FLAG_TYPE, para identificar uma bandeira (flag) de exceo. Seus nicos valores possveis so
aqueles das constantes com nome definidas no mdulo: IEEE_INVALID, IEEE_OVERFLOW,
IEEE_DIVIDE_BY_ZERO, IEEE_UNDERFLOW e IEEE_INEXACT. O mdulo tambm define as
constantes com nome matriciais IEEE_USUAL = (/ IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO,
IEEE_INVALID /) e IEEE_ALL = (/ IEEE_USUAL, IEEE_UNDERFLOW, IEEE_INEXACT /)
IEEE_STATUS_TYPE, para salvar o estado do ponto flutuante atual
O mdulo IEEE_ARITHMETIC define
IEEE_CLASS_TYPE, para identificar a classe de valores dos floating-point. Seus nicos valores
possveis so aqueles das constantes com nome definidas no mdulo: IEEE_SIGNALING_NAN,
IEEE_QUIET_NAN, IEEE_NEGATIVE_INF, IEEE_NEGATIVE_NORMAL,
IEEE_NEGATIVE_DENORMAL, IEEE_NEGATIVE ZERO, IEEE_POSITIVE_ZERO,
IEEE_POSITIVE_DENORMAL, IEEE_ POSITIVE_NORMAL, IEEE_POSITIVE_INF e
IEEE_OTHER_VALUE
IEEE_ROUND_TYPE, para identificar o modo de arredondamento particular. Seu nicos valores possveis
so aqueles das constantes com nome definidas no mdulo: IEEE_NEAREST, IEEE_TO_ZERO, IEEE_UP
e IEEE_DOWN para os modos IEEE; e IEEE_OTHER para qualquer outro modo
o operador elementar == para dois valores de um destes tipos retorna verdadeiro se os valores so os
mesmos e falso caso contrrio
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 324
o operador elementar /= para dois valores de um destes tipos retorna verdadeiro se os valores so
diferentes e falso caso contrrio
O mdulo IEEE_FEATURES define
IEEE_FEATURES_TYPE, para expressar a necessidade de caractersticas (features) IEEE particulares. Seu
nicos valores possveis so aqueles das constantes com nome definidas no mdulo: IEEE_DATATYPE,
IEEE_DENORMAL, IEEE_DIVIDE, IEEE_HALTING, IEEE_INEXACT_FLAG, IEEE_INF,
IEEE_INVALID_FLAG, IEEE_NAN, IEEE_ROUNDING, IEEE_SQRT e IEEE_UNDERFLOW_FLAG
14.2 As Excees
14.2 The exceptions
A excees so
IEEE_OVERFLOW
Esta exceo ocorre quando o resultado de uma operao real intrnseca ou atribuio tem um valor
absoluto maior que o limite dependente s processador ou a parte real ou imaginria do resultado de uma
operao complexa intrnseca tem um valor absoluto maior que o limite dependente do processador
IEEE_DIVIDE_BY_ZERO
esta exceo ocorre quando a diviso real ou complexa tem numerado no zero e denominados zero
IEEE_INVALID
esta exceo ocorre quando uma operao real ou complexo ou atribuio invlida; exemplos possveis
so SQRT(X) quando X real e tem um valor negativo no zero e converso para um inteiro (por
atribuio, um procedimento intrnseco ou procedimento definido poro um mdulo intrnseco) quando o
resultado muito grande para ser representado
IEEE_UNDERFLOW
esta exceo ocorre quando o resultado para uma operao real intrnseca ou atribuio tem um valor
absoluto menor que o limite dependente do processador e perda de acurcia detectada ou a parte real ou
imaginria do resultado para uma operao complexa intrnseca ou atribuio tem um valor absoluto menor
que o limite dependente do processador e perda de acurcia detectada
IEEE_INEXACT
esta exceo ocorre quando o resultado de uma operao real ou complexa ou atribuio no exata
Cada exceo tem uma bandeira (flag) cujo valor quieto ou sinalizado. O valor pode ser determinado pela
funo IEEE_GET_FLAG. Seu valor inicial quieto e sinalizado quando uma exceo associada ocorre. Seu
estado tambm pode ser trocado pela sub-rotina IEEE_SET_FLAG ou pela sub-rotina IEEE_SET_STATUS. Uma
vez sinalizado dentro de um procedimento, ela permanece sinalizada a menos que mudada para quieta por uma
invocao por uma invocao da sub-rotina IEEE_SET_FLAG ou da sub-rotina IEEE_SET_STATUS.
A bandeira sinalizada na entrada de um procedimento, o processador ir colocar ela em quieta na entrada
e restaur-la no retorno.
Nota 14.4
Se uma bandeira sinalizada durante a execuo de um procedimento, o processador no pode mudar seu estado
para quieto no retorno
Avaliao de uma expresso de especificao pode causar um exceo no sinal.
Em uma unidade de escopo que tem acesso a IEEE_EXCEPTIONS ou IEEE_ARITHMETIC, se uma
procedimento intrnseco ou um procedimento definido em um mdulo intrnseco executa normalmente, os valores
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 325
da bandeiras IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO e IEEE_INVALID tm que ser como na entrada do
procedimento, mesmo se um ou mais sinalizam durante os clculos. Se um resultado real ou complexo muito
grande para o procedimento manipular, IEEE_OVERFLOW pode sinalizar. Se o resultado real ou complexo um
NaN por causa de uma operao invlida (por exemplo, LOG(-1.0)), IEEE_INVALID pode sinalizar. Regras
similares aplicam-se ao processamento de formato e a operaes intrnsecas: nenhuma bandeira sinalizada pode ser
colocada como quieta e nenhuma bandeira quieta pode ser colocada como sinalizada por causa de um clculo
intermedirio que no afeta o resultado.
Nota 14.5
Uma implementao pode prover uma verses alternativas de um procedimento intrnseco. Um exemplo prtico
deste tipo de alternativa pode ser uma vero adaptvel para uma chamada em uma unidade de escopo com acesso
a IEEE_EXCEPTIONS ou IEEE_ARITHMETIC e uma para outros casos
Em uma sequncia de instrues que no tem invocao de IEEE_GET_FLAG, IEEE_SET_FLAG,
IEEE_GET_STATUS, IEEE_SET_HALTING ou IEEE_SET_STATUS, se a execuo de uma operao pode
causara a sinalizao de uma exceo mas depois da sequncia nenhum valor da varivel depende da operao, se a
exceo sinalizada dependente do processador. Por exemplo, quando Y tem o valor zero, quando o cdigo
X = 1.0/Y
X = 3.0
sinaliza IEEE_DIVIDE_BY_ZERO dependente do processador. Outro exemplo o que segue:
REAL, PARAMETER :: X=0.0, Y=6.0
IF(1.0/X == Y) PRINT *,Hello world
onde o processador permitido desconsiderar a instruo IF porque a expresso lgica no pode nunca ser
verdadeira e nenhum valor da varivel depende dela
Uma expresso no pode sinalizar se ela pode acontecer somente durante a execuo de uma operao alm
deste requerimentos ou permitida pelo padro. Por exemplo, a instruo
IF(F(X)>0.0) Y = 1.0/Z
no pode sinalizar IEEE_DIVIDE_BY_ZERO quando F(X) e Z so zeros e a instruo
WHERE(A>0.0) A = 1.0/A
no pode sinalizar IEEE_DIVIDE_BY_ZERO. Por outro lado, quando X tem o valor 1.0 e Y tem o valor 0.0, a
expresso
X>0.00001 .OR. X/Y>0.00001
permitida causar a sinalizao de IEEE_DIVIDE_BY_ZERO.
O processador no necessita suportar IEEE_INVALID, IEEE_UNDERFLOW e IEEE_INEXACT. Se uma
exceo no suportada, sua bandeira sempre quieta. A funo IEEE_SUPPORT_FLAG pode ser usada para
inquirir se uma bandeira em particular suportada.
14.3 Os Modos de Arredondamento
14.3 The rounding modes
O padro IEEE especifica quatro modos de arredondamento:
IEEE_NEAREST arredonda resultado exato para o valor mais prximo representvel
IEEE_TO_ZERO arredonda resultado exato na direo de zero para o prximo valor representvel
IEEE_UP arredonda resultado exato na direo +infinito para o prximo valor representvel
IEEE_DOWN arredonda resultado exato na direo -infinito para o prximo valor representvel
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 326
A funo IEEE_GET_ROUNDING_MODE pode ser utilizada para inquiri sobre o modo de
arredondamento que est em operao. Seu valor um dos quatro acima (anteriores) ou IEEE_OTHER se o modo
de arredondamento no est de acordo com o padro IEEE.
Se o processador suporta a alterao do modo de arredondamento durante a execuo da sub-rotina
IEEE_SET_ROUNDING_MODE pode se usada para alter-lo. A funo IEEE_SUPPORT_ROUNDING pode ser
usada para inquirir se esta facilidade est disponvel para um modo particular. A funo IEEE_SUPPORT_IO pode
ser usada para inquirir se arredondamento para converso da base na entrada/sada formatada (9.4.5.13, 9.5.1.12,
10.6.1.2.6) est como especificado no padro IEEE.
Em um procedimento diferente de IEEE_SET_ROUNDING_MODE ou IEEE_SET_STATUS, o
processador no pode mudar o modo de arredondamento na entrada e no retorno deve garantir que o modo de
arredondamento o mesmo que era na entrada.
Nota 14.6
Dentro de um programa, todas as constantes literais que tem a mesma forma tem o mesmo valor (4.1.2). Portanto,
o valor de uma constante literal no afetada pelo modo de arredondamento
14.4 Modo Subtransbordamento
14.4 Underflow mode
Alguns processadores permitem controle durante a execuo do programa se o subtransbordamento
(underflow) produz um nmero no normalizado (denormalized number) em acordo com o padro IEEE
(subtransbordamento gradual) ou produz zero poro outro lado (subtransbordamento abupto). Em alguns outros
processadores, performance de ponto flutuante tipicamente melhor no modo subtransbordamento abrupto (abrupt
underflow mode) que no modo subtransbordamento gradual (gradual underflow mode).
Controle sobre o modo subtransbordamento (underflow mode) exercido pela invocao de
IEEE_SET_UNDERFLOW_MODE. A funo IEEE_GET_UNDERFLOW_MODE pode ser usada para inquerir
qual modo de subtransbordamento (underflow mode) est em operao. A funo
IEEE_SUPPORT_UNDERFLOW_MODE pode ser usada para inquerir se esta facilidade est disponvel. O modo
de subtransbordamento (underflow mode) inicial dependente do processador. Em um procedimento diferente de
IEEE_SET_UNDERFLOW_MODE ou IEEE_SET_STATUS, o processador no pode mudar o modo de
subtransbordamento na entrada e no retorno tem que garantir que o modo de subtransbordamento o mesmo que na
entrada.
O modo de subtransbordamento (underflow mode) afeta somente os clculos de ponto flutuante cujos tipos
tal que um X para o qual IEEE_SUPPORT_UNDERFLOW_CONTROL retorna verdadeiro.
14.5 Parada
14.5 Halting
Alguns processadores permitem controle durante a execuo de abortar ou continuar a execuo depois de
uma exceo. Este tipo de controle exercido pelo invocao da sub-rotina IEEE_SET_HALTING_MODE. Parada
(Halting) no definido e pode ocorrer a qualquer tempo depois da exceo ter ocorrido. A funo
IEEE_SUPPORT_HALTING pode ser usada para inquerir se esta facilidade est disponvel. O modo de
subtransbordamento (underflow mode) inicial dependente do processador. Em um procedimento diferente de
IEEE_SET_HALTING MODE ou IEEE_SET_STATUS, o processador no pode mudar o modo de
subtransbordamento na entrada e no retorno tem que garantir que o modo de subtransbordamento o mesmo que na
entrada.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 327
14.6 O Estado do Ponto Flutuante
14.6 The floating point status
Os valores de todas as bandeiras suportadas (supported flags) para excees, modo de arredondamento,
modo de subtransbordamento (underflow mode) e parada (halting) so chamadas o estado do ponto flutuante. O
estado do ponto flutuante pode ser salvo em uma varivel escalar do tipo TYPE(IEEE_STATUS_TYPE) com a
sub-rotina IEEE_GET_STATUS e restaurado com a sub-rotina IEEE_SET_STATUS. No h facilidades para
encontrar valores de bandeiras particulares mantidas dentro desta varivel. Pores do estado de ponto flutuante
pode ser salvo com as sub-rotinas IEEE_GET_FLAG, IEEE_GET_HALTING_MODE e
IEEE_GET_ROUNDING_MODE e ajustada com as sub-rotinas IEEE_SET_FLAG,
IEEE_SET_HALTING_MODE e IEEE_SET_ROUNDING_MODE.
Nota 14.7
Alguns processadores mantm todas estas bandeiras (flags) em um registrador de estado de ponto flutuante que
pode ser salvo e restaurado como um todo muito mais rpido que as bandeiras individuais podem ser salvas e
restauradas. Estes procedimentos so disponibilizados para explorar estas caracterstica
Nota 14.8
Se requer que o processador garanta que a chamada de um procedimento Fortran no mude o estado de ponto
flutuante diferente de ajustar as bandeiras de excees de sinalizao
14.7 Valores das Excees
14.7 Exceptional values
O padro IEEE especifica os seguintes valores de exceo de ponto flutuante:
valores no normalizado (denormalized values) tm valores absolutos muito pequeno e baixa preciso
valores infinito (+infinito e -infinito) so criados por transbordamento (overflow) ou diviso por zero
valores no-um-nmero (NaN Not-a-Number) ( NaN) so valores indefinidos ou valores criados por uma
operao invlida
Neste padro, o termo normal usado para valores que no esto numa destas classes de exceo.
As funes IEEE_IS_FINITE, IEEE_IS_NAN, IEEE_IS_NEGATIVE e IEEE_IS_NORMAL so providas
para testar se o valor infinito, NaN, negativo ou normal. A funo IEEE_VALUE provida para gerar um nmero
IEEE de qualquer classe, incluindo um infinito ou um NaN. As funes IEEE_SUPPORT_DENORMAL,
IEEE_SUPPORT_INF e IEEE_SUPPORT_NAN so providas para determinar se estas facilidades esto
disponveis para um subtipo particular de um real (particular kind of real).
14.8 Aritmtica IEEE
14.8 IEEE arithmetic
A funo IEEE_SUPPORT_DATATYPE pode ser usada para inquirir se a aritmtica IEEE (IEEE arithmetic)
suportada para um subtipo (kind) particular do real. Conformidade completa com o padro IEEE no requerida,
mas os nmeros normalizados tem que ser exatamente aqueles de um formato ponto flutuante IEEE; as operaes
de adio, subtrao e multiplicao tm que ser implementadas com pelo menos um dos modos de
arredondamento IEEE; a operao IEEE rem tem que ser provida pela funo IEEE_REM; e as funes IEEE
copysign, scalb, logb, nextafter e unordered tem que ser providas pelas funes IEEE_COPY_SIGN,
IEEE_SCALB, IEEE_LOGB, IEEE_NEXT_AFTER e IEEE_UNORDERED, respectivamente. A funo de
inquisio IEEE_SUPPORT_DIVIDE provida se o processador suporta diviso com a acurcia especificada pelo
padro IEEE. Para cada uma das operaes de adio, subtrao e multiplicao, o resultado tem que ser como
especificado no padro IEEE sempre que o resultado IEEE normalizado e os operandos so normalizados (se
ponto flutuante) ou so vlidos dentro do intervalo (se de outro tipo).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 328
A funo inquisitria IEEE_SUPPORT_NAN provida para inquirir se o processador suporta NaN IEEE.
Onde eles so suportados, seus comportamentos para operaes unrias e binrias, incluindo aquelas definidas por
funes intrnsecas e por funes nos mdulos intrnsecos, tm que ser consistentes com as especificaes do
padro IEEE.
A funo inquisitria IEEE_SUPPORT_INF provida para inquirir se o processador suporta infinitos
IEEE. Onde ela suportada, seu comportamento para operaes unrias e binrias, incluindo aquelas definidas por
funes intrnsecas e por funes nos mdulos intrnsecos, tem que ser consistente com as especificaes do padro
IEEE.
A funo inquisitria IEEE_SUPPORT_DENORMAL provida para inquirir se o processador suporta
IEEE no normalizado (denormais IEEE IEEE denormals). Onde ela suportada, seu comportamento para operaes
unrias e binrias, incluindo aquelas definidas por funes intrnsecas e por funes nos mdulos intrnsecos, tem
que ser consistente com as especificaes do padro IEEE.
O padro IEEE especifica uma funo raiz quadrada que retorna -0.0 para a raiz quadrada de -0.0 e tem
certos requerimentos de acurcia. A funo IEEE_SUPPORT_SQRT pode ser usada para inquirir se SQRT est
implantado de acordo com o padro IEEE para um subtipo particular do real (for a particular kind of real).
A funo inquisitria IEEE_SUPPORT_STANDARD provida para inquirir se o processador suporta
todas as facilidades IEEE neste padro para um tipo particular de subtipo do real.
14.9 Tabelas de Procedimentos
14.9 Tables of the procedures
Para todos os procedimentos definidos nos mdulos, os argumentos mostrados so os nomes que devem ser
usados para as palavras-chaves dos argumentos (argument keywords) se a palavra-chave usada para os argumentos
reais.
Os termos de classificao de procedimento funo de inquisio (inquiry function) e funo
transformacional (transformational function) so usados aqui com os mesmos significados que em 13.1.
14.9.1 Funes de Inquisio
14.9.1 Inquiry functions
O mdulo IEEE_EXCEPTIONS contm as seguintes funes inquisitrias:
IEEE_SUPPORT_FLAG(FLAG[, X]) As excees IEEE so suportadas?
IEEE_SUPPORT_HALTING(FLAG) O controle de parada suportado?
O mdulo IEEE_ARITHMETIC contm as seguintes funes inquisitrias:
IEEE_SUPPORT_DATATYPE([X]) A aritmtica IEEE suportada?
IEEE_SUPPORT_DENORMAL([X]) Nmeros IEEE no normalizados so suportados?
IEEE_SUPPORT_DIVIDE([X]) Diviso IEEE suportada?
IEEE_SUPPORT_INF([X]) Infinito IEEE suportado?
IEEE_SUPPORT_IO([X]) Formatao IEEE suportada?
IEEE_SUPPORT_NAN([X]) NaN IEEE so suportados?
IEEE_SUPPORT_ROUNDING(ROUND VALUE[,X]) Arredondamento IEEE so suportados?
IEEE_SUPPORT_SQRT([X]) Raiz quadrada IEEE suportada?
IEEE_SUPPORT_STANDARD([X]) Todas as facilidades IEEE so suportadas?
IEEE_SUPPORT_UNDERFLOW_CONTROL([X]) Controle de subtransbordamento suportado?
14.9.2 Funes Elementares
14.9.2 Elemental functions
O mdulo IEEE_ARITHMETIC contm as seguintes funes elementares para os reais X e Y para os quais
IEEE_SUPPORT_DATATYPE(X) e IEEE_SUPPORT_DATATYPE(Y) so verdadeiros:
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 329
IEEE_CLASS(X) Classe IEEE
IEEE_COPY_SIGN(X,Y) Funo copysign IEEE
IEEE_IS_FINITE(X) Determine se o valor infinito
IEEE_IS_NAN(X) Determine se o valor um no-um-nmero IEEE
IEEE_IS_NORMAL(X) Determine se o valor normal, isto , nem infinito nem NaN
nem no normalizado (desnormalizado)
IEEE_IS_NEGATIVE(X) Determine se o valor negativo
IEEE_LOGB(X) Expoente no deslocado no formato ponto flutuante IEEE
IEEE_NEXT_AFTER(X,Y) Retorna o prximo vizinho de X na direo de Y
IEEE_REM(X,Y) Funo REM IEEE, que vale X - Y*N, onde N o inteiro mais perto do
valor exato de X/Y
IEEE_RINT(X) Arredonda para um valor inteiro de acordo com o modo de
arredondamento em vigor
IEEE_SCALB(X,I) Retorna
X 2
I

IEEE_UNORDERED(X,Y) Funo no ordenada IEEE. Verdadeiro se X ou Y um NaN e falso em
caso contrrio
IEEE_VALUE(X,CLASS) gera um valor IEEE
14.9.3 Funo Subtipo
14.9.3 Kind function
O mdulo IEEE_ARITHMETIC contm as seguinte funo transformacional:
IEEE_SELECTED_REAL_KIND([P, R]) Parmetro de tipo subtipo para uma dada preciso e intervalo
14.9.4 Sub-rotinas Elementares
14.9.4 Elemental subroutines
O mdulo IEEE_EXCEPTIONS contm as seguintes sub-rotinas elementares:
IEEE_GET_FLAG(FLAG,FLAG VALUE) Obtm uma bandeira de exceo
IEEE_GET_HALTING_MODE(FLAG, HALTING) Obtm o modo parada para uma exceo
14.9.5 Sub-rotinas No Elementares
14.9.5 Nonelemental subroutines
O mdulo IEEE_EXCEPTIONS contm as seguintes sub-rotinas no elementares:
IEEE_GET_STATUS(STATUS VALUE) Obtm o estado atual do ambiente de ponto flutuante
IEEE_SET_FLAG(FLAG,FLAG VALUE) Ajusta uma bandeira de exceo
IEEE_SET HALTING_MODE(FLAG, HALTING) Continua com o controle ou para numa exceo
IEEE_SET_STATUS(STATUS VALUE) restabelece o estado do ambiente de ponto flutuante
O mdulo IEEE_ARITHMETIC contm as seguintes sub-rotinas no elementares:
IEEE_GET_ROUNDING_MODE(ROUND VALUE) Obtm o modo de arredondamento IEEE atual
IEEE_GET_UNDERFLOW_MODE(GRADUAL) Obtm o modo de subtransbordamento atual
IEEE_SET_ROUNDING_MODE(ROUND VALUE) Ajusta o modo de arredondamento IEEE atual
IEEE_SET_UNDERFLOW_MODE(GRADUAL) Ajusta o modo de subtransbordamento atual
14.10 Especificaes dos Procedimentos
14.10 Specifications of the procedures
Nas descries detalhadas que segue, nomes dos procedimentos so genricos e no especficos. Todas as
funes so puras. Os argumentos mudos dos procedimentos dos mdulos intrnsecos em 14.9.1, 14.9.2 e 14.9.3
tm INTENT(IN). Os argumento mudos dos procedimentos dos mdulos intrnsecos em 14.9.4 e 14.9.5 tm
INTENT(IN) se a inteno no fornecida explicitamente. Nos exemplos, assumido que o processador suporta a
aritmtica IEEE para real default.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 330
Nota 14.9
esperado que o processador no verifique uma condio fornecida dada no pargrafo rotulado Restrio
(Restriction) quando estiver compilando (at compile time), mas preferencialmente pode depender dos cdigos
escritos pelo programador tais como
IF (IEEE_SUPPORT_DATATYPE(X)) THEN
C = IEEE_CLASS(X)
ELSE
.
.
ENDIF
para evitar que uma chamada seja feita no processador para a qual a condio violada
Para as funes elementares de IEEE_ARITHMETIC, as tabuladas em 14.9.2, se X ou Y tem um valor que
um infinito ou um NaN, o resultado tem que ser consistente com as regras gerais em 6.1 e 6.2 do padro IEEE.
Por exemplo, o resultado para um infinito tem que ser construdo como o caso limite do resultado com um valor
arbitrrio de magnitude muito grande, se este limite existe.
14.10.1 IEEE_CLASS(X)
14.10.1 IEEE_CLASS(X)
Descrio. Funo classe IEEE
Classe. Funo elementar
Argumento(s). X tem que ser do tipo real
Restrio. IEEE_CLASS(X) no pode ser invocada se IEEE_SUPPORT_DATATYPE(X) tem o valor falso
Caractersticas do Resultado. TYPE(IEEE_CLASS_TYPE)
Valor do Resultado. O valor do resultado tem que ser IEEE_SIGNALING_NAN ou IEEE_QUIET_NAN se
IEEE_SUPPORT_NAN(X) tem o valor verdadeiro (true) e o valor de X um NaN sinalizado ou
quieto, respectivamente. O valor do resultado tem que ser IEEE_NEGATIVE_INF ou
IEEE_POSITIVE_INF se IEEE_SUPPORT_INF(X) tem o valor verdadeiro (true) e o valor de X
negativo ou infinito positivo, respectivamente. O valor do resultado tem que ser
IEEE_NEGATIVE_DENORMAL ou IEEE_ POSITIVE_DENORMAL se
IEEE_SUPPORT_DENORMAL(X) tem o valor verdadeiro (true) e o valor de X um valor
desnormalizado (denormalized value) negativo ou positivo, respectivamente. O valor do resultado tem
que ser IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO ou
IEEE_POSITIVE_NORMAL se o valor de X negativo normal, zero negativo, seropositivo ou
normalpositivo, respectivamente. Caso contrrio, o valor do resultado IEEE_OTHER_VALUE.
Exemplo. IEEE_CLASS(-1.0) tem o valor IEEE_NEGATIVE_NORMAL
Nota 14.10
O valor do resultado IEEE_OTHER_VALUE necessrio para implementar o mdulo nos sistemas que so
basicamente IEEE, mas no implementa todo ele. Ele pode ser necessrio, por exemplo, se uma arquivo no
formatado foi escrito com um programa executando com subtransbordamento gradual (gradual underflow) ativado e
lido com ele desativado
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 331
14.10.2 IEEE_COPY_SIGN(X, Y)
14.10.2 IEEE_COPY_SIGN(X, Y)
Descrio. Funo IEEE copia sinal (copysign)
Classe. Funo elementar
Argumento(s). Os argumentos tem que ser do tipo real
Restrio. IEEE_COPY_SIGN(X,Y) no pode ser invocado se IEEE_SUPPORT_DATA TYPE(X) ou
IEEE_SUPPORT_DATATYPE(Y) tem o valor falso
Caractersticas do Resultado. Mesmo de X
Valor do Resultado. O resultado tem o valor de X com o sinal de Y. Isto verdadeiro mesmo para os valores
especiais de IEEE, como um NaN ou um infinito (nos processadores suportando tais valores)
Exemplo. O valor de IEEE_COPY_SIGN(X,1.0) ABS(X) mesmo quando X vale NaN
14.10.3 IEEE_GET_FLAG(FLAG, FLAG VALUE)
14.10.3 IEEE_GET_FLAG(FLAG, FLAG VALUE)
Descrio. Obtm uma bandeira (flag) de exceo
Classe. Sub-rotina elementar
Argumento(s).
FLAG tem que ser do tipo TYPE(IEEE_FLAG_TYPE). Ele especifica a bandeira IEEE que ser
obtida
FLAG_VALUE tem que ser do tipo lgico default. Ele um argumento INTENT(OUT). Se o valor de FLAG
IEEE_INVALID, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, IEEE_UNDERFLOW ou
IEEE_INEXACT, o valor do resultado verdadeiro (true) se a bandeira da exceo correspondente
sinalizada e falsa (false) caso contrria
Exemplo. Depois de CALL_IEEE_GET_FLAG(IEEE_OVERFLOW,FLAG_VALUE), FLAG_VALUE verdadeiro
(true) se a bandeira IEEE_OVERFLOW sinalizada e falsa (false) se ela quieta
14.10.4 IEEE_GET_HALTING_MODE(FLAG, HALTING)
14.10.4 IEEE_GET_HALTING_MODE(FLAG, HALTING)
Descrio. Obtm o modo parada (halting mode) para uma exceo
Classe. Sub-rotina elementar
Argumento(s).
FLAG tem que ser do tipo TYPE(IEEE_FLAG_TYPE). Ele especifica a bandeira (flag) IEEE. Ele
tem que ter um dos valores IEEE_INVALID, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO,
IEEE_UNDERFLOW ou IEEE_INEXACT
HALTING tem que ser do tipo lgico default. Ele tem INTENT(OUT). O valor verdadeiro (true) se a
exceo especificada por FLAG causa um aparada. Caso contrrio , o valor falso (false)
Exemplo. Para guardar o modo de parada (halting mode) para IEEE_OVERFLOW, faa um clcilo sem a
parada e restabelea o modo de parada depois:
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 332
USE, INTRINSIC :: IEEE_ARITHMETIC
LOGICAL HALTING
...
CALL IEEE_GET_HALTING_MODE(IEEE_OVERFLOW,HALTING) ! Guarda modo parada
CALL IEEE_SET_HALTING_MODE(IEEE_OVERFLOW,.FALSE.) ! sem parada
... ! clculo sem parada
CALL IEEE_SET_HALTING_MODE(IEEE_OVERFLOW,HALTING) ! restabelece o modo parada
14.10.5 IEEE_GET_ROUNDING_MODE(ROUND_VALUE)
14.10.5 IEEE_GET_ROUNDING_MODE(ROUND_VALUE)
Descrio. Obtm o modo de arredondamento IEEE atual
Classe. Sub-rotina
Argumento(s). ROUND_VALUE tem que ser do tipo TYPE(IEEE_ROUND_TYPE). Ele tem argumento
INTENT(OUT) e retorna o modo de arredondamento de ponto flutuante, com valor IEEE_NEAREST,
IEEE_TO_ZERO, IEEE_UP ou IEEE_DOWN se um dos modos IEEE est em operao e
IEEE_OTHER caso contrrio
Exemplo. Para guardar o modo de arredondamento , faa um clculo que arredonde para o mais prximo e
restabelea o modo de arredondamento depois
USE, INTRINSIC :: IEEE_ARITHMETIC
TYPE(IEEE_ROUND_TYPE) ROUND_VALUE
...
CALL IEEE_GET_ROUNDING_MODE(ROUND_VALUE) ! guarda o modo de arredondamento
CALL IEEE_SET_ROUNDING_MODE(IEEE_NEAREST)
... ! clculo que arredonda para o mais prximo
CALL IEEE_SET_ROUNDING_MODE(ROUND_VALUE) ! restabelece o modo de arredondamento
14.10.6 IEEE_GET_STATUS(STATUS_VALUE)
14.10.6 IEEE_GET_STATUS(STATUS_VALUE)
Descrio. Obtm o valor atual do estado do ponto flutuante (14.6)
Classe. Sub-rotina
Argumento(s). STATUS_VALUE tem que ser escalar do tipo TYPE(IEEE_STATUS_TYPE). Ele um
argumento INTENT(OUT) e retorna o estado do ponto flutuante (floating point status)
Exemplo. Guarda todas as bandeiras (flags) de excees, faa um clculo envolvendo manipulao de
exceo e restabelea depois:
USE, INTRINSIC :: IEEE_ARITHMETIC
TYPE(IEEE_STATUS_TYPE) STATUS_VALUE
...
CALL IEEE_GET_STATUS(STATUS_VALUE) ! obtm as bandeiras
CALL IEEE_SET_FLAG(IEEE_ALL,.FALSE.) ! Faa as bandeiras quietas
... ! clculos envolvendo manipulao de excees
CALL IEEE_SET_STATUS(STATUS_VALUE) ! restabelece as bandeiras
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 333
14.10.7 IEEE_GET_UNDERFLOW_MODE(GRADUAL)
14.10.7 IEEE_GET_UNDERFLOW_MODE(GRADUAL)
Descrio. Obtm o modo subtransbordamento atual (current underflow mode) (14.4)
Classe. Sub-rotina
Argumento(s). GRADUAL tem que ser do tipo lgico default. Ele um argumento INTENT(OUT). O valor
verdadeiro (true) se o modo de subtransbordamento (underflow mode) atual subtransbordamenteo
gradual (gradual underflow) e falso (false) se o modo de subtransbordamento subtransbordamento
abrupto
Restrio. IEEE_GET_UNDERFLOW_MODE no pode ser invocado a menos que
IEEE_SUPPORT_UNDERFLOW_CONTROL(X) seja verdadeiro (true) para algum X
Exemplo. Depois de CALL IEEE_SET_UNDERFLOW_MODE(.FALSE.), uma subsequente
CALL IEEE_GET_UNDERFLOW_MODE(GRADUAL) ir colocar GRADUAL como falso
14.10.8 IEEE_IS_FINITE(X)
14.10.8 IEEE_IS_FINITE(X)
Descrio. Determina se um valor infinito
Classe. Funo elementar
Argumento(s). X tem que ser do tipo real
Restrio. IEEE_IS_FINITE(X) no pode ser invocado se IEEE_SUPPORT_DATATYPE(X) tem o valor falso
Caractersticas do Resultado. Lgico default
Valor do Resultado. O resultado tem o valor verdadeiro (true) se o valor de X finito, isto , IEEE_CLASS(X) tem
um dos valores IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_DENORMAL,
IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO, IEEE_POSITIVE_DENORMAL ou
IEEE_POSITIVE_NORMAL; caso contrrio, o resultado tem o valor falso
Exemplo. IEEE_IS_FINITE(1.0) tem o valor verdadeiro (true)
14.10.9 IEEE_IS_NAN(X)
14.10.9 IEEE_IS_NAN(X)
Descrio. Determina se o valor um no-um-nmeto IEEE (IEEE Not-a-Number)
Classe. Funo elementar
Argumento(s). X tem que ser do tipo real
Restrio. IEEE_IS_NAN(X) no pode ser invocado se IEEE_SUPPORT_NAN(X) tem o valor falso
Caractersticas do Resultado. Lgico default
Valor do Resultado. O resultado tem o valor verdadeiro (true) se o valor de X uma IEEE NaN; caso contrrio,
ele tem o valor falso
Exemplo. IEEE_IS_NAN(SQRT(-1.0)) tem o valor verdadeiro (true) se IEEE_SUPPORT_SQRT(1.0) tem o
valor verdadeiro (true)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 334
14.10.10 IEEE_IS_NEGATIVE(X)
14.10.10 IEEE_IS_NEGATIVE(X)
Descrio. Determina se um valor negativo
Classe. Funo elementar
Argumento(s). X tem que ser do tipo real
Restrio. IEEE_IS_NEGATIVE(X) no pode ser invocado se IEEE_SUPPORT_DATATYPE(X) tem o valor
falso
Caractersticas do Resultado. Lgico default
Valor do Resultado. O resultado tem o valor verdadeiro (true) se IEEE_CLASS(X) tem um dos valores
IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_DENORMAL, IEEE_NEGATIVE_ZERO ou
IEEE_NEGATIVE_INF; caso contrrio, o resultado tem o valor falso
Exemplo. IEEE_IS_NEGATIVE(0.0)) tem o valor falso
14.10.11 IEEE_IS_NORMAL(X)
14.10.11 IEEE_IS_NORMAL(X)
Descrio. Determina se um valor normal, isto , no um infinito, um NaN nem desnormalizado
(denormalized)
Classe. Funo elementar
Argumento(s). X tem que ser do tipo real
Restrio. IEEE_IS_NORMAL(X) no pode ser invocado se IEEE_SUPPORT_DATATYPE(X) tem o valor falso
Caractersticas do Resultado. Lgico default
Valor do Resultado. O resultado tem o valor verdadeiro (true) se IEEE_CLASS(X) tem um dos valores
IEEE_NEGATIVE_NORMAL, IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO ou
IEEE_POSITIVE_NORMAL; caso contrrio , o resultado tem o valor falso
Exemplo. IEEE_IS_NORMAL(SQRT(-1.0)) tem o valor falso se IEEE_SUPPORT_SQRT(1.0) tem o valor
verdadeiro (true)
14.10.12 IEEE_LOGB(X)
14.10.12 IEEE_LOGB(X)
Descrio. Expoente no deslocado (unbiased exponent) no formato ponto flutuante IEEE
Classe. Funo elementar
Argumento(s). X tem que ser do tipo real
Restrio. IEEE_LOGB(X) no pode ser invocado se IEEE_SUPPORT_DATATYPE(X) tem o valor falso
Caractersticas do Resultado. Mesmo que X
Valor do Resultado.
caso (i) : se o valor de X no zero, infinito nem NaN, o resultado tem o valor de o expoente no deslocado
(unbiased exponent) de X. Nota: este valor igual a EXPONENT(X)-1
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 335
caso (ii): se X==0, o resultado -infinito se IEEE_SUPPORT_INF(X) verdadeiro (true) e -HUGE(X) caso
contrrio; IEEE_DIVIDE_BY_ZERO sinaliza
Exemplo. IEEE LOGB(-1.1) tem o valor 0.0.
14.10.13 IEEE_NEXT_AFTER(X, Y)
14.10.13 IEEE_NEXT_AFTER(X, Y)
Descrio. Retorna o prximo vizinho representvel de X na direo progressiva Y
Classe. Funo elementar
Argumento(s). Os argumentos tem que ser do tipo real
Restrio. IEEE_NEXT_AFTER(X,Y) no pode ser invocado se IEEE_SUPPORT_DATATYPE(X) ou
IEEE_SUPPORT_DATATYPE(Y) tem o valor falso
Caractersticas do Resultado. Mesmo que X
Valor do Resultado.
caso(i): se X == Y, o resultado X e nenhuma exceo sinalizada
caso(ii): ae X/=Y, o resultado tem o valor do vizinho mais prximo representvel de X na direo de Y. O
vizinho de zero (com qualquer sinal) so ambos no zero. IEEE_OVERFLOW sinalizado quando X
finito mas IEEE_NEXT_AFTER(X,Y) infinito; IEEE_UNDERFLOW sinalizado quando
IEEE_NEXT_AFTER(X,Y) desnormalizado (denormalized); e, ambos os casos, IEEE_INEXACT
sinaliza
Exemplo. O valor de IEEE_NEXT_AFTER(1.0,2.0) 1.0 + EPSILON(X)
14.10.14 IEEE_REM(X, Y)
14.10.14 IEEE_REM(X, Y)
Descrio. Funo IEEE REM
Classe. Funo elementar
Argumento(s). Os argumentos tem que ser do tipo real
Restrio. IEEE_REM(X,Y) no pode ser invocado se IEEE_SUPPORT_DATATYPE(X) ou
IEEE_SUPPORT_DATATYPE(Y) tem o valor falso
Caractersticas do Resultado. Real com o parmetro de tipo subtipo (kind type parameter) daquele
argumento que tem a maior preciso
Valor do Resultado. O valor do resultado, independente do modo de arredondamento, tem que ser exatamente
X Y*N, onde N o inteiro mais prximo do valor exato X/Y; quando |N - X/Y| = 1/2, N tem que ser
par. Se o valor do resultado zero, o sinal tem que ser o de X
Exemplo. O valor de IEEE_REM(4.0,3.0) 1.0, o valor de IEEE_REM(3.0,2.0) -1.0 e o valor de
IEEE_REM(5.0,2.0) 1.0
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 336
14.10.15 IEEE_RINT(X)
14.10.15 IEEE_RINT(X)
Descrio. Arredonda para um valor inteiro de acordo com o mtodo de arredondamento atual
Classe. Funo elementar
Argumento(s). X tem que ser do tipo real
Restrio. IEEE_RINT(X) no pode ser invocada se IEEE_SUPPORT_DATATYPE(X) tem o valor falso
Caractersticas do Resultado. Mesmo que X
Valor do Resultado. O valor do resultado o valor de X arredondado para um inteiro de acordo com o modo de
arredondamento atual. Se o resultado tem o valor zero, o sinal o de X
Exemplo. Se o modo de arredondamento atual arredondar para o mais prximo ( round to nearest), o valor de
IEEE_RINT(1.1) 1.0. Se o modo de arredondamento atual arredonda para cima ( round up), o
valor de IEEE_RINT(1.1) 2.0
14.10.16 IEEE_SCALB(X, I)
14.10.16 IEEE_SCALB(X, I)
Descrio. Retorna X 2
I

Classe. Funo elementar
Argumento(s).
X tem que ser do tipo real
I tem que ser do tipo inteiro
Restrio. IEEE_SCALB(X) no pode ser invocado se IEEE_SUPPORT_DATATYPE(X) tem o valor falso
Caractersticas do Resultado. Mesmo que X
Valor do Resultado.
caso(i): se
X 2
I
representvel como um nmero normal, o resultado tem este valor
caso(ii): se X finito e X 2
I
muito grande, a exceo IEEE_OVERFLOW pode ocorrer. Se
IEEE_SUPPORT_INF(X) verdadeiro (true), o valor do resultado infinito com o sinal de X; caso
contrrio, o valor do resultado SIGN(HUGE(X),X)
caso(iii): se
X 2
I
muito pequeno e existe perda de acurcia, a exceo IEEE_UNDERFLOW tem que
ocorrer. O resultado o nmero representvel que tem a magnitude mais prxima de |2I | e mesmo
sinal que X
caso(iv): se X infinito, o resultado o mesmo que X; sem sinal de exceo
Exemplo. O valor de IEEE_SCALB(1.0,2) 4.0
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 337
14.10.17 IEEE_SELECTED_REAL_KIND([P, R])
14.10.17 IEEE_SELECTED_REAL_KIND([P, R])
Descrio. Retorna o valor do parmetro de tipo subtipo (kind type parameter) de um dado tipo real IEEE com
preciso decimal de pelo menos P dgitos e intervalo exponencial decimal de pelo menos R. Para
objetos de dados deste tipo, IEEE_SUPPORT_DATATYPE(X) tem o valor verdadeiro (true)
Classe. Funo transformacional
Argumento(s). Ao menos um argumento tem que estar presente
P (opcional) tem que ser escalar e do tipo inteiro
R (opcional) tem que ser escalar e do tipo inteiro
Caractersticas do Resultado. Inteiro default escalar
Valor do Resultado. O resultado tem um valor igual a um valor do parmetro de tipo subtipo de um tipo real IEEE
com preciso decimal, como retornado pela funo PRECISION, de pelo menos P dgitos e um
intervalo exponencial decimal, como retornado pela funo RANGE, de pelo menos R, ou se este
tipo de parmetro de tipo subtipo no est disponvel no processador, o resultado -1 se a preciso
no est disponvel, -2 se o intervalo exponencial no est disponvel e -3 se nenhum deles est
disponvel. Se mais de um valor de parmetro de tipo subtipo atende ao critrio, o valor retornado
aquele com a menor preciso decimal, a menos que exista vrios valores, quando ento o menor
dos valores do subtipo ser retornado
Exemplo. IEEE_SELECTED_REAL_KIND(6,30) tem o valor KIND(0.0) numa mquina que suporta aritmtica
de preciso simples IEEE para seu mtodo de aproximao real default
14.10.18 IEEE_SET_FLAG(FLAG, FLAG_VALUE)
14.10.18 IEEE_SET_FLAG(FLAG, FLAG_VALUE)
Descrio. Atribu um valor a uma bandeira de exceo
Classe. Sub-rotina
Argumento(s).
FLAG tem que ser um escalar ou matriz do tipo TYPE(IEEE_FLAG_TYPE). Se o valor de FLAG
IEEE_INVALID, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, IEEE_UNDERFLOWou
IEEE_INEXACT, a bandeira da exceo correspondente sinalizada com um valor. Dois elementos
de FLAG no podem ter o mesmo valor
FLAG_VALUE tem que ser um escalar ou matriz do tipo lgico default. Tem que ser conforme com FLAG.
Se um elemento tem o valor verdadeiro (true), a bandeira correspondente ajustada para sinalizar;
caso contrrio, a bandeira ajustada para quieta
Exemplo. CALL IEEE_SET_FLAG(IEEE_OVERFLOW,.TRUE.) faz com que a bandeira IEEE_OVERFLOW
seja sinalizada
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 338
14.10.19 IEEE_SET_HALTING_MODE(FLAG, HALTING)
14.10.19 IEEE_SET_HALTING_MODE(FLAG, HALTING)
Descrio. Continua com o controle ou para depois de uma exceo
Classe. Sub-rotina
Argumento(s).
FLAG tem que ser um escalar ou matriz do tipo TYPE(IEEE_FLAG_TYPE). Tem que ter somente um dos
valores IEEE_INVALID, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, IEEE_UNDERFLOW ou
IEEE_INEXACT. Dois elementos de FLAG no podem ter que ter o mesmo valor
HALTING tem que ser um escalar ou uma matriz do tipo lgico default. Tem que ser conforme com FLAG. Se
um elemento tem o valor verdadeiro (true), a exceo correspondente especificada por FLAG ir
causar um aparada. Caso contrrio, a execuo continua depois desta exceo
Restrio. IEEE_SET_HALTING_MODE(FLAG,HALTING) no pode ser invocada se
IEEE_SUPPORT_HALTING(FLAG) tem o valor falso
Exemplo. CALL IEEE_SET_HALTING_MODE(IEEE_DIVIDE_BY_ZERO,.TRUE.) causa a parada depois de
uma exceo diviso por zero
Nota 14.11
O modo de parada inicial dependente do processador. Parada no preciso e pode ocorrer algumas vezes depois
da exceo ter ocorrido
14.10.20 IEEE_SET_ROUNDING_MODE(ROUND VALUE)
14.10.20 IEEE_SET_ROUNDING_MODE(ROUND VALUE)
Descrio. Ajusta o modo arredondamento IEEE atual
Classe. Sub-rotina
Argumento(s). ROUND_VALUE tem que ser escalar e do tipo TYPE(IEEE_ROUND_TYPE). Se especifica o
modo a ser ajustado
Restrio. IEEE_SET_ROUNDING_MODE(ROUND_VALUE) no pode ser invocado a menos que
IEEE_SUPPORT_ROUNDING(ROUND_VALUE,X) seja verdadeiro (true) para algum X tal que
IEEE_SUPPORT_DATATYPE(X) seja verdadeiro (true)
Exemplo. Para guardar o modo de arredondamento, faa um clculo com o arredondamento para o mais
prximo (to nearest) e restabelea o modo de arredondamento depois
14.10.21 IEEE_SET_STATUS(STATUS_VALUE)
14.10.21 IEEE_SET_STATUS(STATUS_VALUE)
Descrio. Restabelece o valor do estado do ponto flutuante (14.6)
Classe. Sub-rotina
Argumento(s). STATUS_VALUE tem que ser escalar e do tipo TYPE(IEEE_STATUS_TYPE). Seu valor tem
que ter sido ajustado em uma invocao prvia de IEEE_GET_STATUS
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 339
Exemplo. Para guardar todas as bandeiras de excees, faa um invocao de clculo envolvendo a
manipulao de exceo e restabelea-as depois:
USE, INTRINSIC :: IEEE_EXCEPTIONS
TYPE(IEEE_STATUS_TYPE) STATUS_VALUE
...
CALL IEEE_GET_STATUS(STATUS_VALUE) ! guarda as bandeiras
CALL IEEE_SET_FLAGS(IEEE_ALL,.FALSE.) ! ajusta para quieto
... ! clculo envolvendo manipulao de excees
CALL IEEE_SET_STATUS(STATUS_VALUE) ! restabelece as bandeiras
Nota 14.12
Em alguns processadores esta maneira pode ser um processo muito lento
14.10.22 IEEE_SET_UNDERFLOW_MODE (GRADUAL)
14.10.22 IEEE_SET_UNDERFLOW_MODE (GRADUAL)
Descrio. Ajusta o modo de subtransbordamento (underflow mode) atual
Classe. Sub-rotina
Argumento(s). GRADUAL tem que ser do tipo lgico default. Se verdadeiro (true), o modo de
subtransbordamento atual ajustado para subtransbordamento gradual. Se falso, o modo de
subtransbordamento atual ajustado para subtransbordamento abrupto
Restrio. IEEE_SET_UNDERFLOW_MODE no pode ser invocado a menos que
IEEE_SUPPORT_UNDERFLOW_CONTROL(X) seja verdadeiro (true) para algum X
Exemplo. Realizar alguns clculos com o modo de subtransbordamento abrupto e ento restaura para o modo
prvio:
USE,INTRINSIC :: IEEE_ARITHMETIC
LOGICAL SAVE_UNDERFLOW_MODE
...
CALL IEEE_GET_UNDERFLOW_MODE(SAVE_UNDERFLOW_MODE)
CALL IEEE_SET_UNDERFLOW_MODE(GRADUAL=.FALSE.)
... ! realiza alguns clculos com subtransbordamento abrupto(abrupt underflow )
CALL IEEE_SET_UNDERFLOW_MODE(SAVE_UNDERFLOW_MODE)"
14.10.23 IEEE_SUPPORT_DATATYPE() ou IEEE_SUPPORT_DATATYPE(X)
14.10.23 IEEE_SUPPORT_DATATYPE() ou IEEE_SUPPORT_DATATYPE(X)
Descrio. Inquire se o processador suporta aritmtica IEEE
Classe. Funo inquisitria
Argumento(s). X tem que ser do tipo real. Pode ser um escalar ou uma matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado. O resultado tem o valor verdadeiro (true) se o processador suporta aritmtica IEEE para
todos os reais (X ausente) ou para a varivel real de mesmo parmetro de tipo subtipo (kind type
parameter) que X; caso contrrio, ela tem o valor falso. Aqui, suporte como foi definido no primeiro
pargrafo de 14.8.
Exemplo. Se reais default so implementados como no padro IEEE exceto que valores em falta
(subtransbordados underflow) descarregam (flush) para zero em vez de se tornarem desnormal
(instead of being denormal), IEEE_SUPPORT_DATATYPE(1.0) tem o valor verdadeiro (true)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 340
14.10.24 IEEE_SUPPORT_DENORMAL() ou IEEE_SUPPORT_DENORMAL(X)
14.10.24 IEEE_SUPPORT_DENORMAL() or IEEE_SUPPORT_DENORMAL(X)
Descrio. Inquire se o processador suporta nmeros denormalizados IEEE
Classe. Funo de inquisio
Argumento(s). X tem que ser do tipo real. Pode ser escalar ou matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado.
caso(i): IEEE_SUPPORT_DENORMAL(X) tem o valor verdadeiro (true) se IEEE_SUPPORT_DATATYPE(X)
tem o valor verdadeiro e o processador suportar operaes aritmticas e atribuies com nmeros
denormalizados (expoente deslocado e = 0 e frao f = 0, ver seo 3.2 do padro IEEE) para
variveis reais de mesmo parmetro de tipo subtipo (kind type parameter) que X; caso contrrio, ele
tem o valor falso
caso(ii): IEEE_SUPPORT_DENORMAL() tem o valor verdadeiro (true) se e somente se
IEEE_SUPPORT_DENORMAL(X) tem o valor verdadeiro (true) para todo real X
Exemplo. IEEE_SUPPORT_DENORMAL(X) tem o valor verdadeiro (true) se o processador suporta nmero
desnormalizado para X
Nota 14.13
Os nmeros desnormalizados no so includos no modelo 13.4 para nmeros reais; eles satisfazem a
desigualdade ABS(X) < TINY(X). Eles usualmente ocorrem como resultado de uma operao aritmtica cujo
resultado exato menor que TINY(X). Este tipo de operao causa a sinalizao de IEEE_UNDERFLOW a
menos que o resultado seja exato. IEEE_SUPPORT_DENORMAL(X) falso se o processador nunca retorna um
nmero denormalizado como resultado de uma operao aritmtica
14.10.25 IEEE_SUPPORT_DIVIDE() ou IEEE_SUPPORT_DIVIDE(X)
14.10.25 IEEE_SUPPORT_DIVIDE() or IEEE_SUPPORT_DIVIDE(X)
Descrio. Inquire se o processador suporta diviso com a acurcia especificada pelo padro IEEE
Classe. Funo de inquisio
Argumento(s). X tem que ser do tipo rela. Ele pode ser um escalar ou uma matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado.
caso(i): IEEE_SUPPORT_DIVIDE(X) tem o valor verdadeiro (true) se o processador suporta diviso com a
acurcia especificada pelo padro IEEE para variveis reais de mesmo parmetro de tipo subtipo
(kind type parameter) que X; caso contrrio, ele tem o valor falso
caso(ii); IEEE_SUPPORT_DIVIDE() tem o valor verdadeiro (true) se e somente se
IEEE_SUPPORT_DIVIDE(X) tem o valor verdadeiro (true) para todo X real
Exemplo. IEEE_SUPPORT_DIVIDE(X) tem o valor verdadeiro (true) se o processador suporta diviso IEEE
para X
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 341
14.10.26 IEEE_SUPPORT_FLAG(FLAG) ou IEEE_SUPPORT_FLAG(FLAG, X)
14.10.26 IEEE_SUPPORT_FLAG(FLAG) or IEEE_SUPPORT_FLAG(FLAG, X)
Descrio. Inquire se o processador suporta uma exceo
Classe. Funo de inquisio
Argumento(s).
FLAG tem que ser escalar e do tipo TYPE(IEEE_FLAG_TYPE). Seu valor tem que ser IEEE_INVALID,
IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, IEEE_UNDERFLOW ou IEEE_INEXACT
X tem que ser do tipo real. Pode ser um escalar ou matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado.
caso(i): IEEE_SUPPORT_FLAG(FLAG, X) tem o valor verdadeiro (true) se o processador suporta deteco
da exceo especificada para variveis reais de mesmo parmetro de tipo subtipo (kind type
parameter) que X; caso contrrio, ele tem o valor falso
caso(ii): IEEE_SUPPORT_FLAG(FLAG) tem o valor verdadeiro (true) se e somente se
IEEE_SUPPORT_FLAG(FLAG, X) tem o valor verdadeiro (true) para todo X real
Exemplo. IEEE_SUPPORT_FLAG(IEEE INEXACT) tem o valor verdadeiro (true) se o processador suporta
exceo inexata
14.10.27 IEEE_SUPPORT_HALTING(FLAG)
14.10.27 IEEE_SUPPORT_HALTING(FLAG)
Descrio. Inquire se o processador suporta a habilidade de controle durante a execuo do programa, se
aborta ou continua execuo depois de uma exceo
Classe. Funo de inquisio
Argumento(s). FLAG tem que ser escalar do tipo TYPE(IEEE_FLAG_TYPE). Seu valor tem que ser
IEEE_INVALID, IEEE_OVERFLOW, IEEE_DIVIDE_BY_ZERO, IEEE_UNDERFLOW ou
IEEE_INEXACT
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado. O resultado tem o valor verdadeiro (true) se o processador suporta a habilidade de controle
durante a execuo se aborta ou continua execuo depois da exceo especificada FLAG; caso
contrrio, ele tem o valor falso. Suporte inclu a habilidade de mudar o modo por
CALL IEEE_SET_HALTING(FLAG)
Exemplo. IEEE_SUPPORT_HALTING(IEEE_OVERFLOW) tem o valor verdadeiro (true) se o processador
suporta controle de parada depois de um transbordamento (overflow)
14.10.28 IEEE_SUPPORT_INF() ou IEEE_SUPPORT_INF(X)
14.10.28 IEEE_SUPPORT_INF() or IEEE_SUPPORT_INF(X)
Descrio. Inquire se o processador suporta a facilidade infinito IEEE
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 342
Classe. Funo de inquisio
Argumento(s). X tem que ser do tipo real. Pode ser um escalar ou uma matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado.
caso(i): IEEE_SUPPORT_INF(X) tem o valor verdadeiro (true) se o processador suporta infinitos IEEE
(positivo e negativo) para as variveis reais de mesmo parmetro de tipo subtipo (kind type parameter)
que X; caso contrrio, ele tem o valor falso
caso(ii): IEEE_SUPPORT_INF() tem o valor verdadeiro (true) se e somente se IEEE_SUPPORT_INF(X) tem
o valor verdadeiro (true) para todo X real
Exemplo. IEEE_SUPPORT_INF(X) tem o valor verdadeiro (true) se o processador suporta infinitos IEEE para
X
14.10.29 IEEE_SUPPORT_IO() ou IEEE_SUPPORT_IO(X)
14.10.29 IEEE_SUPPORT_IO() or IEEE_SUPPORT_IO(X)
Descrio. Inquire se o processador suporta converso de arredondamento de base IEEE durante
entrada/sada formatada (9.4.5.13, 9.5.1.12, 10.6.1.2.6)
Classe. Funo de inquisio
Argumento(s). X tem que ser do tipo real. Pode ser um escalar ou uma matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado.
caso(i): IEEE_SUPPORT_IO(X) tem o valor verdadeiro (true) se o processador suporta converso de base
IEEE durante entrada/sada formatada (9.4.5.13, 9.5.1.12, 10.6.1.2.6) como descrito no padro IEEE
para os modos UP, DOWN, ZERO e NEAREST para as variveis reais de mesmo parmetro de tipo
subtipo (kind type parameter) que X; caso contrrio, ele tem o valor falso
caso(ii): IEEE_SUPPORT_IO() tem o valor verdadeiro (true) se e somente se IEEE_SUPPORT_IO(X) tem o
valor verdadeiro (true) para todos os X reais
Exemplo. IEEE_SUPPORT_IO(X) tem o valor verdadeiro (true) se o processador suportar converso de base
IEEE para X
14.10.30 IEEE_SUPPORT_NAN() ou IEEE_SUPPORT_NAN(X)
14.10.30 IEEE_SUPPORT_NAN() or IEEE_SUPPORT_NAN(X)
Descrio. Inquire se o processador suporta a facilidade no-um-nmero IEEE
Classe. Funo de inquisio
Argumento(s). X tem que ser do tipo real. Pode ser um escalar ou uma matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado.
caso(i): IEEE_SUPPORT_NAN(X) tem o valor verdadeiro (true) se o processador suporta no-um-nmero
IEEE (IEEE NaNs) para variveis reais de mesmo parmetro de tipo subtipo (kind type parameter) que
X; caso contrrio, tem o valor falso
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 343
caso(ii): IEEE_SUPPORT_NAN() tem o valor verdadeiro (true) se e somente se IEEE_SUPPORT_NAN(X)
tem o valor verdadeiro (true) para todos X reais
Exemplo. IEEE_SUPPORT_NAN(X) tem o valor verdadeiro (true) se o processador suporta no-um-nmero
IEEE para X
14.10.31 IEEE_SUPPORT_ROUNDING(ROUND_VALUE) ou
IEEE_SUPPORT_ROUNDING(ROUND_VALUE, X)
14.10.31 IEEE_SUPPORT_ROUNDING(ROUND_VALUE) or
IEEE_SUPPORT_ROUNDING(ROUND_VALUE, X)
Descrio. Inquire se o processador suporta um modo particular de arredondamento IEEE
Classe. Funo de inquisio
Argumento(s).
ROUND_VALUE tem que ser do tipo TYPE(IEEE_ROUND_TYPE)
X tem que ser do tipo real. Pode ser um escalar ou uma matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado.
caso(i): IEEE_SUPPORT_ROUNDING(ROUND_VALUE, X) tem o valor verdadeiro (true) se o processador
suporta o modo definido por ROUND_VALUE para variveis reais de mesmo parmetro de tipo
subtipo (kind type parameter) que X; caso contrrio, ele possu o valor falso. Suporte inclu a
habilidade de mudar o modo por CALL IEEE_SET_ROUNDING_MODE(ROUND_VALUE)
caso(ii): IEEE_SUPPORT_ROUNDING(ROUND_VALUE) tem o valor verdadeiro (true) se e somente se
IEEE_SUPPORT_ROUNDING(ROUND_VALUE, X) tem o valor verdadeiro (true) para todo X real
Exemplo. IEEE_SUPPORT_ROUNDING(IEEE_TO_ZERO) tem o valor verdadeiro (true) se o processador
suporta arredondamento para zero para todos s reais
14.10.32 IEEE_SUPPORT_SQRT() ou IEEE_SUPPORT_SQRT(X)
14.10.32 IEEE_SUPPORT_SQRT() or IEEE_SUPPORT_SQRT(X)
Descrio. Inquire se o processador implementa SQRT de acordo com o padro IEEE
Classe. Funo de inquisio
Argumento(s). X tem que ser do tipo real. Pode ser um escalar ou uma matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado.
caso(i): IEEE_SUPPORT_SQRT(X) tem o valor verdadeiro (true) se o processador implementa SQRT de
acordo com o padro IEEE para variveis reais de mesmo parmetro de tipo subtipo (kind type
parameter) que X; caso contrrio, ele tem o valor falso
caso(ii): IEEE_SUPPORT_SQRT() tem o valor verdadeiro (true) se e somente se IEEE_SUPPORT_SQRT(X)
tem o valor verdadeiro (true) para todo X real
Exemplo. IEEE_SUPPORT_SQRT(X) tem o valor verdadeiro (true) se o processador implementa SQRT(X) de
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 344
acordo com o padro IEEE. Em todos estes casos, SQRT(-0.0) tem o valor -0.0
14.10.33 IEEE_SUPPORT_STANDARD() ou IEEE_SUPPORT_STANDARD(X)
14.10.33 IEEE_SUPPORT_STANDARD() or IEEE_SUPPORT_STANDARD(X)
Descrio. Inquire se o processador suporta todas as facilidades IEEE definidas neste padro
Classe. Funo de inquisio
Argumento(s). X tem que ser s tipo real. Pode ser um escalar ou uma matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado.
caso(i): IEEE_SUPPORT_STANDARD(X) tem o valor verdadeiro (true) se o resultado de todas as funes
IEEE_SUPPORT_DATATYPE(X), IEEE_SUPPORT_DENORMAL(X), IEEE_SUPPORT_DIVIDE(X),
IEEE_SUPPORT_FLAG(FLAG,X) para uma FLAG vlida, IEEE_SUPPORT_HALTING(FLAG) para
uma FLAG vlida, IEEE_SUP_PORT_INF(X), IEEE_SUPPORT_NAN(X),
IEEE_SUPPORT_ROUNDING(ROUND_VALUE,X) para ROUND_VALUE vlido e
IEEE_SUPPORT_SQRT (X) para todos os verdadeiros (true); caso contrrio, o resultado tem o valor
falso
caso(ii): IEEE_SUPPORT_STANDARD() tem o valor verdadeiro (true) se e somente se
IEEE_SUPPORT_STANDARD(X) tem o valor verdadeiro (true) para todo X real
Exemplo. IEEE_SUPPORT_STANDARD() tem o valor falso se o processador suporta subtipos IEEE e
no-IEEE para os reais
14.10.34 IEEE_SUPPORT_UNDERFLOW_CONTROL() ou
IEEE_SUPPORT_UNDERFLOW_CONTROL(X)
14.10.34 IEEE_SUPPORT_UNDERFLOW_CONTROL() or
IEEE_SUPPORT_UNDERFLOW_CONTROL(X)
Descrio. Inquire se o procedimento suporta a habilidade de controle do modo subtransbordamento (underflow
mode) durante a execuo do programa
Classe. Funo de inquisio
Argumento(s). X tem que ser do tipo real. Pode ser um escalar ou uma matriz
Caractersticas do Resultado. Escalar lgico default
Valor do Resultado.
caso(i): IEEE_SUPPORT_UNDERFLOW_CONTROL(X) tem o valor verdadeiro (true) se o processador
suporta controle do modo subtransbordamento (underflow mode) para clculos de ponto flutuante
com o mesmo tipo que X e falso em caso contrrio
caso(ii): IEEE_SUPPORT_UNDERFLOW_CONTROL() tem o valor verdadeiro (true) se o processador
suporta controle do modo subtransbordamento (underflow mode) para todos os clculos de ponto
flutuante e falso em caso contrrio
Exemplo. IEEE_SUPPORT_UNDERFLOW_CONTROL(2.5) tem o valor verdadeiro (true) se o processador
suporta controle do modo subtransbordamenet (underflow mode) para o tipo real default
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 345
14.10.35 IEEE_UNORDERED(X, Y)
14.10.35 IEEE_UNORDERED(X, Y)
Descrio. Funo no ordenada IEEE. Verdadeiro (true) se X ou Y um NaN e falso caso contrrio
Classe. Funo elementar
Argumento(s). Os argumentos tem que ser do tipo real
Restrio. IEEE_UNORDERED(X,Y) no pode ser invocada se IEEE_SUPPORT_DATA_TYPE(X) ou
IEEE_SUPPORT_DATATYPE(Y) tem o valor falso
Caractersticas do Resultado. Lgico default
Valor do Resultado. O resultado tem o valor verdadeiro (true) se X ou Y um NaN ou ambos so NaNs; caso
contrrio, ele tem o valor falso
Exemplo. IEEE_UNORDERED(0.0,SQRT(-1.0)) tem o valor verdadeiro (true) se IEEE_SUPPORT_SQRT(1.0)
tem o valor verdadeiro (true)
14.10.36 IEEE_VALUE(X, CLASS)
14.10.36 IEEE_VALUE(X, CLASS)
Descrio. Gera um valor IEEE
Classe. Funo elementar
Argumento(s).
X tem que ser do tipo real
CLASS tem que ser do tipo TYPE(IEEE_CLASS_TYPE). O valor permitido ser: IEEE_SIGNALING_NAN
ou IEEE_QUIET_NAN se IEEE_SUPPORT_NAN(X) tem o valor verdadeiro (true),
IEEE_NEGATIVE_INF ou IEEE_POSITIVE_INF se IEEE_SUPPORT_INF(X) tem o valor verdadeiro
(true), IEEE_NEGATIVE_DENORMAL ou IEEE_POSITIVE_DENORMAL se
IEEE_SUPPORT_DENORMAL(X) tem o valor verdadeiro (true), IEEE_NEGATIVE_NORMAL,
IEEE_NEGATIVE_ZERO, IEEE_POSITIVE_ZERO ou IEEE_POSITIVE_NORMAL
Restrio. IEEE_VALUE(X,CLASS) no pode ser invocado se IEEE_SUPPORT_DATA_TYPE(X) tem o valor
falso
Caractersticas do Resultado. Mesmo que X
Valor do Resultado. O valor do resultado um valor IEEE como especificado por CLASS. Ainda que em muitos
casos o valor dependente do processador, o valor no pode variar entre invocaes para qualquer
parmetro de tipo subtipo particular de X e valor de CLASS
Exemplo. IEEE_VALUE(1.0,IEEE_NEGATIVE_INF) tem o valor -infinito
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 346
14.11 Exemplos
14.11 Examples
Nota 14.14
MODULE DOT
! Mdulo para produto escalar (dot product) de duas matrizes reais unidimensionais (rank 1).
! Quem chama necessita garantir que as excees no causem parada (exceptions do not cause
! halting).
USE, INTRINSIC :: IEEE_EXCEPTIONS
LOGICAL :: MATRIX_ERROR = .FALSE.
INTERFACE OPERATOR(.dot.)
MODULE PROCEDURE MULT
END INTERFACE
CONTAINS
REAL FUNCTION MULT(A,B)
REAL, INTENT(IN) :: A(:),B(:)
INTEGER I
LOGICAL OVERFLOW
IF(SIZE(A)/=SIZE(B)) THEN
MATRIX_ERROR = .TRUE.
RETURN
END IF
! O processador garante que IEEE_OVERFLOW quieto
MULT = 0.0
DO I = 1, SIZE(A)
MULT = MULT + A(I)*B(I)
END DO
CALL IEEE_GET_FLAG(IEEE_OVERFLOW,OVERFLOW)
IF(OVERFLOW) MATRIX_ERROR = .TRUE.
END FUNCTION MULT
END MODULE DOT
Este mdulo prov o produto escalar (dot product) de duas matrizes reais unidimensionais (rank 1). Se os tamanhos
das matrizes so diferentes, uma retorno imediato ocorre com MATRIX_ERROR verdadeiro. Se um erro de
transbordamento (overflow) ocorre durante os clculos atuais, a bandeira IEEE_OVERFLOW ser sinalizada e
MATRIX_ERROR ser verdadeiro
Nota 14.15
USE, INTRINSIC :: IEEE_EXCEPTIONS
USE, INTRINSIC :: IEEE_FEATURES, ONLY: IEEE_INVALID_FLAG
! As outras excees de IEEE_USUAL (IEEE_OVERFLOW e IEEE_DIVIDE_BY_ZERO) esto sempre
! disponveis com as excees IEEE
TYPE(IEEE_STATUS_TYPE) STATUS_VALUE
LOGICAL, DIMENSION(3) :: FLAG_VALUE
...
CALL IEEE_GET_STATUS(STATUS_VALUE)
CALL IEEE_SET_HALTING_MODE(IEEE_USUAL,.FALSE.) ! Necessria para o caso do default no
! processador seja parar nas excees
CALL IEEE_SET_FLAG(IEEE_USUAL,.FALSE.)
! primeiro tente o algoritmo rpido para inverter matrix
MATRIX1 = FAST_INV(MATRIX) ! isto no pode alterar MATRIX
CALL IEEE_GET_FLAG(IEEE_USUAL,FLAG_VALUE)
IF (ANY(FLAG_VALUE)) THEN
! algoritmo "rpido" falhou; tente um lento
CALL IEEE_SET_FLAG(IEEE_USUAL,.FALSE.)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 347
MATRIX1 = SLOW_INV(MATRIX)
CALL IEEE_GET_FLAG(IEEE_USUAL,FLAG_VALUE)
IF (ANY(FLAG_VALUE)) THEN
WRITE (*, *) matrix no pode ser invertida
STOP
END IF
END IF
CALL IEEE_SET_STATUS(STATUS_VALUE)
Neste caso, a funo FAST_INV pode causar uma condio para ser sinalizada. Se ela o faz, outra tentativa feita
com SLOW_INV. Se este ainda falha, uma mensagem mostrada e o programa para. Note, que importante
ajustara as bandeiras para quieta antes da segunda tentativa. O estado de todas as bandeiras so guardadas e
restauradas
Nota 14.16
USE, INTRINSIC :: IEEE_EXCEPTIONS
LOGICAL FLAG_VALUE
...
CALL IEEE_SET_HALTING_MODE(IEEE_OVERFLOW,.FALSE.)
! primeiro tente um algoritmo rpido para inverso de matrix
CALL IEEE_SET_FLAG(IEEE_OVERFLOW,.FALSE.)
DO K = 1, N
...
CALL IEEE_GET_FLAG(IEEE_OVERFLOW,FLAG_VALUE)
IF (FLAG_VALUE) EXIT
END DO
IF (FLAG_VALUE) THEN
! Cdigo alternativo que sabe que K-1 passos foram executados normalmente
...
END IF
Aqui o cdigo para a inverso de matrix est em linha (sem desvio) e a transferncia feita mais precisa pela
adio de testes extras sobre a bandeira
Nota 14.17
REAL FUNCTION HYPOT(X, Y)
! Em raras circunstncias isto pode levar a uma sinalizao de IEEE_OVERFLOW
! Quem chama necessita garantir que as excees no causem parada
USE, INTRINSIC :: IEEE_ARITHMETIC
USE, INTRINSIC :: IEEE_FEATURES, ONLY: IEEE_UNDERFLOW_FLAG
! IEEE_OVERFLOW est sempre disponvel com IEEE_ARITHMETIC
REAL X, Y
REAL SCALED_X, SCALED_Y, SCALED_RESULT
LOGICAL, DIMENSION(2) :: FLAGS
TYPE(IEEE_FLAG_TYPE), PARAMETER, DIMENSION(2) :: &
OUT_OF_RANGE = (/ IEEE_OVERFLOW, IEEE_UNDERFLOW /)
INTRINSIC SQRT, ABS, EXPONENT, MAX, DIGITS, SCALE
! O processador limpa as bandeiras na entrada
! Tenta primeiro o algoritmo rpido
HYPOT = SQRT( X**2 + Y**2 )
CALL IEEE_GET_FLAG(OUT_OF_RANGE,FLAGS)
IF( ANY(FLAGS) ) THEN
CALL IEEE_SET_FLAG(OUT_OF_RANGE,.FALSE.)
IF( X==0.0 .OR. Y==0.0 ) THEN
HYPOT = ABS(X) + ABS(Y)
ELSEIF( 2*ABS(EXPONENT(X)-EXPONENT(Y)) > DIGITS(X)+1 ) THEN
HYPOT = MAX( ABS(X), ABS(Y) ) ! um deles, X ou Y pode ser ignorado
ELSE ! escala de tal forma que ABS(X) est prximo de 1
SCALED_X = SCALE( X, -EXPONENT(X) )
SCALED_Y = SCALE( Y, -EXPONENT(X) )
SCALED_RESULT = SQRT( SCALED_X**2 + SCALED_Y**2 )
HYPOT = SCALE( SCALED_RESULT, EXPONENT(X) ) ! pode causar transbordamento
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 348
END IF
END IF
! O processador inicializa (resets) qualquer bandeira que foi sinalizada na entrada
END FUNCTION HYPOT
Uma tentativa feita para avaliar esta funo diretamente do modo mais rpido possvel. Isto ir trabalhar quase
todas as vezes, mas se uma exceo ocorrer durante a os clculos rpidos, um modo seguro porm lento pode ser
calcular a funo. Esta avaliao lenta pode envolver mudana de escala ou no uso de escala (scaling and
unscaling) e em (muitos raros) casos extremos este no uso de escala pode causar transbordamento ( overflow)
(depois de tudo, um resultado verdadeiro pode transbordar se X e Y so ambos prximos do limite de
transbordamento). Se as bandeiras IEEE_OVERFLOW ou IEEE_UNDERFLOW so sinalizadas na entrada, elas
so ajustadas no retorno pelo processador, ento as excees anteriores no so perdidas
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 349
15. Interoperabilidade com o C
Section 15: Interoperability with C
Fortran prove um meio de referenciar procedimentos que so definidos por meio da linguagem de
programao C ou procedimentos que podem ser descritos por prottipos C como definido em 6.7.5.3 do padro C,
mesmo se no so realmente definidas por meio da linguagem C. Inversamente, existem meios de especificar que
procedimentos definidos por um subprograma Fortran pode ser referenciado por meio da linguagem C. Alm disto,
existem meios de declarar variveis globais que so ligadas com variveis C que tem ligaes externas como
definido em 6.2.2 no padro C.
O mdulo ISO_C_BINDING prov acesso a constantes com nome que representam parmetros de tipo
subtipo (kind type parameters) de representaes de dados compatveis com os tipos C. O Fortran tambm prov
facilidade para definir tipos derivados (4.5) e enumeraes (4.6) que correspondem a tipos do C.
15.1 O Mdulo Intrnseco ISO_C_BINDING
15.1 The ISO_C_BINDING intrinsic module
O processador tem que prover o mdulo intrnseco ISO_C_BINDING. Este mdulo tem que tornar
acessvel as seguintes entidades: constantes com nome com os nomes listados na segunda coluna da tabela 15.2 e a
primeira coluna da tabela 15.1, os procedimentos especificados em 15.1.2, C_PTR, C_FUNPTR, C_NULL_PTR e
C_NULL_FUNPTR. O processador pode prover outras entidades pblicas no mdulo intrnseco ISO_C_BINDING
em adio a estes listados aqui.
Nota 15.1
Para evitar potencial conflito de nomes com as entidades dos programas, recomendado que o programa use a
opo ONLY na instruo de uso (USE statement) que acessa o mdulo intrnseco ISO_C_BINDING
15.1.1 Constantes com Nome e Tipos Derivados no Mdulo
15.1.1 Named constants and derived types in the module
As entidades listadas na segunda coluna da tabela 15.2, tem que ser constantes com nome do tipo inteiro
default.
O valor de C_INT tem que ser um valor vlido para um parmetro de subtipo inteiro no processador. Os
valores C_SHORT, C_LONG, C_LONG_LONG, C_SIGNED_CHAR, C_SIZE_T, C_INT8_T, C_INT16_T,
C_INT32_T, C_INT64_T, C_INT_LEAST8_T, C_INT_LEAST16_T, C_INT_LEAST32_T, C_INT_LEAST64_T,
C_INT_FAST8_T, C_INT_FAST16_T, C_INT_FAST32_T, C_INT_FAST64_T, C_INTMAX_T e C_INTPTR_T
tem que ser cada um um valor vlido para um parmetro de tipo subtipo de inteiro ( kind type parameter) no
processador ou ser -1 se o processador associado C (companion C processor) define o tipo correspondente e no h o
subtipo processador Fortran interoperado ou -2 se o processador no define o tipo C correspondente.
Os valores de C_FLOAT, C_DOUBLE e C_LONG_DOUBLE tm que ser valores vlidos cada um para o
parmetro de tipo subtipo real no processador ou ser -1 se o tipo do processador no tem a preciso igual a preciso
de quaisquer subtipos reais do processador Fortran, -2 se o tipo do processador C no tem um intervalo igual ao
intervalo de quaisquer dos subtipos reais do processador Fortran, -3 se o tipo do processador C no tem nem a
preciso nem o intervalo de quaisquer subtipos reais o processador Fortran e igual a -4 se no h subtipo
processador Fortran interoperado por outras razes. Os valores de C_COMPLEX, C_DOUBLE_COMPLEX e
C_LONG_DOUBLE_COMPLEX tm que ser os mesmos que os C_FLOAT, C_DOUBLE e C_LONG_DOUBLE,
respectivamente.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 350
Nota 15.2
Se o processador C suporta mais de uma variedade de ponto flutuante, duplo ou duplo longo ( double or long
double), o processador Fortran pode achar til selecionar entre mais de um mdulo ISO_C_BINDING por meios
dependente do processador
O valor de C_BOOL tem que ser um valor vlido para o parmetro de subtipo lgico ( logical kind parameter)
no processador ou tem que ser -1.
O valor de C_CHAR tem que ser um valor vlido para o parmetro de subtipo caractere (character kind type
parameter) no processador ou tem que ser -1. O valor de C_CHAR conhecido como o subtipo caractere C.
As entidades que seguem tm que ser constantes com nome do tipo caractere com parmetro de
comprimento um. O valor do parmetro de subtipo (kind parameter value)tem que ser igual ao valor de C_CHAR a
menos que C_CHAR = 1, e neste caso o valor do parmetro de subtipo tem que ser o mesmo que o do subtipo
default. Os valores destas constantes so especificados na tabela 15.1. No caso de C_CHAR = 1 o valor
especificado usando a sintaxe C. As semnticas destes valores so explicadas em 5.2.1 e 5.2.2 do padro C.
Nome Definio C
Valor
C_CHAR = 1 C_CHAR 1
C_NULL_CHAR
C_ALERT
C_BACKSPACE
C_FORM_FEED
C_NEW_LINE
C_ CARRIAGE_RETURN
C_HORIZONTAL_TAB
C_VERTICAL_TAB
null character
alert
backspace
form feed
new line
carriage return
horizontal tab
vertical tab
CHAR(0)
CHAR(7)
CHAR(8)
CHAR(12)
CHAR(10)
CHAR(13)
CHAR(9)
CHAR(11)
\0
\a
\b
\f
\n
\r
\t
\v
Tabela 15.1 Nomes dos caracteres C com semntica especial
Nota 15.3
O valor de NEW_LINE(C_NEW_LINE) o C_NEW_LINE (13.7.85)
As entidades C_PTR e C_FUNPTR so descritas em 15.2.2.
A entidade C_NULL_PTR tem que ser constante com nome do tipo C_PTR. O valor de C_NULL_PTR
tem que ser o mesmo que o valor NULL em C. A entidade C_NULL_FUNPTR tem que ser uma constante com
nome do tipo C_FUNPTR. O valor de C_NULL_FUNPTR tem que ser o de um ponteiro nulo para uma funo em
C.
15.1.2 Procedimentos no Mdulo
15.1.2 Procedures in the module
Nas descries detalhadas a seguir, os nomes dos procedimentos so genricos e no especficos.
Um argumento de procedimento C frequentemente definido em termos de um endereo C. As funes
C_LOC e C_FUNLOC so providas de forma que aplicaes Fortran podem determinar o valor apropriado para
uso com as facilidade em C. A funo C_ASSOCIATED provida de forma que os programas Fortran podem
comparar endereos C. As sub-rotinas C_F_POINTER e C_F_PROCPOINTER proveem um meio de associao de
um ponteiro Fortran com um alvo de um ponteiro C.
15.1.2.1 C_ASSOCIATED (C_PTR_1 [, C_PTR_2])
15.1.2.1 C_ASSOCIATED (C_PTR_1 [, C_PTR_2])
Descrio. Indica o estado de associao de C_PTR_1 ou indica se C_PTR_1 e C_PTR_2 esto associados
com a mesma entidade
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 351
Classe. Funo de Inquisio
Argumento(s).
C_PTR_1 tem que ser um escalar do tipo C_PTR ou C_FUNPTR
C_PTR_2 tem que ser um escalar do mesmo tipo que C_PTR_1
(opcional)
Caractersticas do Resultado. Escalar default lgico
Valor do Resultado.
caso (i) se C_PTR_2 est ausente, o resultado falso se C_PTR_1 um ponteiro C nulo e verdadeiro caso
contrrio
caso (ii) se C_PTR_2 est presente, o resultado falso se C_PTR_1 um ponteiro C nulo. Caso contrrio, o
resultado verdadeiro se C_PTR_1 igual a C_PTR_2 no sentido de 6.3.2.3 e 6.5.9 do padro C e
falso caso contrrio
Nota 15.4
O exemplo que segue ilustra o uso de C_LOC e C_ASSOCIATED
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_FLOAT, C_ASSOCIATED, C_LOC
INTERFACE
SUBROUTINE FOO(GAMMA), BIND(C)
IMPORT C_PTR
TYPE(C_PTR), VALUE :: GAMMA
END SUBROUTINE FOO
END INTERFACE
REAL(C_FLOAT), TARGET, DIMENSION(100) :: ALPHA
TYPE(C_PTR) :: BETA
...
IF (.NOT. C_ASSOCIATED(BETA)) THEN
BETA = C_LOC(ALPHA)
ENDIF
CALL FOO(BETA)
15.1.2.2 C_F_POINTER (CPTR, FPTR [, SHAPE])
15.1.2.2 C_F_POINTER (CPTR, FPTR [, SHAPE])
Descrio. Associa um ponteiro de dado com o alvo de um ponteiro C e especifica sua forma
Classe. Sub-rotina
Argumento(s).
CPTR tem que ser um escalar do tipo C_PTR. um argumento INTENT(IN). Seus valores tem que ser:
(1) um endereo C de uma entidade de dado interopervel
(2) o resultado de uma referncia de C_LOC com argumento no interopervel
O valor de CPTR no pode ser um endereo C de uma varivel Fortran que no tem o atributo
TARGET
FPTR tem que ser um ponteiro. um argumento INTENT(OUT)
(1) se o valor de CPTR o endereo C de uma entidade de dado interopervel, FPTR tem que
ser um ponteiro de dado com tipo e parmetros de tipo interopervel com o tipo da entidade.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 352
Neste caso, FPTR se torna uma associao de ponteiro com o alvo de CPTR. Se FPTR uma
matriz, sua forma especificada por SHAPE e cada limite inferior 1
(2) se o valor de CPTR o resultado de uma referncia de C_LOC com argumento no
interopervel X, FPTR tem que ser um ponteiro escalar no com o mesmo tipo e parmetros de
tipo que X. Neste caso, X ou seus alvo se ele um ponteiro no pode estar desalocado ou ter
se tornado indefinido por causa da execuo de uma instruo RETURN ou END desce a
referncia. FPTR se torna um ponteiro associado com X ou seu alvo
SHAPE (opcional tem que ser do tipo inteiro e unidimensional (rank one). um argumento INTENT(IN).
SHAPE tem que estar presente se e somente se FPTR uma matriz; seu tamanho tem que ser
igual ao nmero de dimenses (rank) de FPTR
15.1.2.3 C_F_PROCPOINTER (CPTR, FPTR)
15.1.2.3 C_F_PROCPOINTER (CPTR, FPTR)
Descrio. Associa um procedimento com um alvo de uma funo ponteiro C
Classe. Sub-rotina
Argumento(s).
CPTR tem que ser do tipo C_FUNPTR. um argumento INTENT(IN). Seu valor tem que ser um endereo
C de um procedimento que interopervel
FPTR tem que ser um ponteiro de procedimento. um argumento INTENT(OUT). A interface para FPTR
tem que ser interopervel com o prottipo que descreve o alvo de CPTR. FPTR se torna ponteiro
associado com o alvo de CPTR
Nota 15.5
O termo alvo (target) na descrio de C_F_POINTER e C_F_PROCPOINTER denota a entidade referenciada
por um ponteiro C, como descrito em 6.2.5 do padro C
15.1.2.4 C_FUNLOC(X)
15.1.2.4 C_FUNLOC(X)
Descrio. Retorna o endereo C de um argumento
Classe. Funo de inquisio
Argumento(s). X tem que ser um endereo de um procedimento que interopervel ou um procedimento
associado com um procedimento interopervel
Caractersticas do Resultado. Escalar do tipo C_FUNPTR.
Valor do Resultado.
O valor do resultado ser descrito usando o nome resultado CPTR. O resultado determinado como
se C_FUNPTR fosse um tipo derivado contendo um componente ponteiro de procedimento com
interface implcita PX e a atribuio de ponteiro CPTR%PX => X fosse executada
O resultado um valor que pode ser usado como um argumento real CPTR em uma chamada de
C_F_PROCPOINTER onde FPTR tem atributos que podem permitir a atribuio de ponteiro
FPTR => X. Este tipo de chamada de C_F_PROCPOINTER tem o efeito da atribuio de ponteiro
FPTR => X
15.1.2.5 C_LOC(X)
15.1.2.5 C_LOC(X)
Descrio. Retorna o endereo C de um argumento
Classe. Funo inquisio
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 353
Argumento(s). X tem que ser um dos
(1) ter tipo interopervel e parmetros de tipo e ser
(a) uma varivel que tem atributo TARGET e interopervel
(b) uma varivel alocvel alocada que tem o atributo TARGET e no uma matriz de tamanho zero
(c) um ponteiro escalar associado, ou
(2) ser um escalar polimrfico, no ter parmetros de tipo comprimento e ser
(a) uma varivel no alocvel, no ponteiro que tem o atributo TARGET
(b) uma varivel alocvel alocada que tem o atributo TARGET
(c) um ponteiro associado
Caractersticas do Resultado. Escalar do tipo C_PTR
Valor do Resultado.
O valor do resultado ser descrito pelo nome resultado CPTR
(1) se X uma entidade de dado escalar, o resultado determinado como se C_PTR fosse um tipo
derivado contendo um componente ponteiro escalar PX do tipo r parmetros de tipo de X e a
atribuio de ponteiro CPTR%PX => X fosse escutada
(2) se X uma entidade de dado matricial, o resultado determinado como se C_PTR fosse do tipo
derivado contendo um componente ponteiro escalar PX do tipo e parmetros de tipo de X e a
atribuio de ponteiro CPTR%PX para i primeiro elemento de X fosse executada
Se X uma entidade de dado que interopervel ou tem tipo interopervel e parmetros de tipo, o
resultado o valor que o processador C retorna como o resultado da aplicao do operador unrio
& (como definido no padro C, 6.5.3.2) para o alvo de CPTR
O resultado um valor que pode ser usado como um argumento real CPTR em uma chamada de
C_F_POINTER onde FPTR tem os atributos que permite a atribuio de ponteiro FPTR => X. Este
tipo de chamada de C_F_POINTER tem o efeito da atribuio de ponteiro FPTR => X
Nota 15.6
Onde o argumento real do tipo interopervel ou parmetros de tipo, o resultado de C_LOC prov um
manipulador (handle) opaco para ele. Em uma implementao real, este manipulador pode ser o endereo C do
argumento; entretanto, funes C portveis devem tratar isto como um ponteiro C void (generic) que no pode ser
desreferenciado (dereferenced) (6.5.3.2 no padro C)
15.2 Interoperabilidade entre Entidades do Fortran e C
15.2 Interoperability between Fortran and C entities
A subclusulas que sequem definem as condies soba as quais uma entidade Fortran interopervel. Se
uma entidade Fortran interopervel, uma entidade equivalente pode ser definida por meio do C e a entidade
Fortran dita ser interopervel, com a entidade C. Pode no haver uma entidade C interopervel.
Nota 15.7
Uma entidade Fortran pode ser interopervel com mais de uma entidade C
15.2.1 Interoperabilidade de Tipos Intrnsecos
15.2.1 Interoperability of intrinsic types
A tabela 15.2 mostra a interoperabilidade entre tipos intrnsecos Fortran e tipos C. Um tipo intrnseco
Fortran com valores particulares de parmetros de tipo interopervel com um tipo C se o tipo e valor do
parmetro de tipo subtipo (type and kind type parameter value) so listados na tabela na mesma coluna que o tipo C;
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 354
se o tipo caractere, interoperabilidade tambm requer que o parmetro de tipo comprimento seja omitido oi seja
especificado por uma expresso de inicializao cujo valor um. Uma combinao de tipo e parmetro de tipo
Fortran que interopervel com um tipo C na tabela tambm interopervel com qualquer tipo C no qualificado
que seja compatvel com o tipo C listado.
A segunda coluna da tabela refere-se s constantes com nome feitas acessveis pelo mdulo intrnseco
ISO_C_BINDING. Se o valor de qualquer destas constantes com nome negativo, no existe combinao do tipo e
parmetros de tipo Fortran com o tipo C nesta linha.
Uma combinao de tipo e parmetros de tipo interopervel se ele interopervel com um tipo C.
Tipo Fortran
Constante com nome no mdulo ISO_C_BINDING
(parmetro de tipo subtipo se o valor positivo)
Tipo C
Inteiro
C_INT int
C_SHORT short int
C_LONG long int
C_LONG_LONG long long int
C_SIGNED_CHAR
signed char
unsigned char
C_SIZE_T size_t
C_INT8_T int8_t
C_INT16_T int16_t
C_INT32_T int32_t
C_INT64_T int64_t
C_INT_LEAST8_T int_least8_t
C_INT_LEAST16_T int_least16_t
C_INT_LEAST32_T int_least32_t
C_INT_LEAST64_T int_least64_t
C_INT_FAST8_T int_fast8_t
C_INT_FAST16_T int_fast16_t
C_INT_FAST32_T int_fast32_t
C_INT_FAST64_T int_fast64_t
C_INTMAX_T intmax_t
C_INTPTR_T intptr_t
Real
C_FLOAT float
C_DOUBLE double
C_LONG_DOUBLE long double
Complexo
C_FLOAT_COMPLEX float _Complex
C_DOUBLE_COMPLEX double _Complex
C_LONG_DOUBLE_COMPLEX long double _Complex
Lgico C_BOOL _Bool
Caractere C_CHAR char
Os tipos C mencionado acima so definidos no padro C, clausulas 6.2.5, 7.17 e 7.18.1
Tabela 15.2 Interoperabilidade entre Tipos Fortran e C
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 355
Nota 15.8
Por exemplo, o tipo inteiro com um parmetro de tipo subtipo igual a C_SHORT interopervel com o tipo C
short ou qualquer tipo derivado C (via typedef) de short
Nota 15.9
O padro C especifica que a representao para inteiros sinalizados no negativos so os mesmos que os valores
correspondentes de inteiros no sinalizados. Porque o Fortran no prove suporte direto para subtipos de inteiros
no sinalizados, o mdulo ISO_C_BINDING no faz acessvel constantes com nome para estes valores de
parmetro de tipo subtipo (kind type parameter values). Em vez disto, um usurio pode usar os subtipos inteiros
sinalizados para interoperar com os tipo no sinalizados e todas as suas verses qualificadas tambm. Isto tem o
surpreendente potencial efeito colateral que o tipo C no sinalizado char interopervel com o tipo inteiro com
um parmetro de tipo subtipo (kind type parameter) igual a C_SIGNED_CHAR
15.2.2 Interoperabilidade com Tipos Ponteiros do C
15.2.2 Interoperability with C pointer types
C_PTR e C_FUNPTR tem que serem tipos derivados com componente particulares (derived types with
private components). C_PTR interopervel com qualquer objeto C tipo ponteiro. C_FUNPTR interopervel com
qualquer tipo ponteiro funo C.
Nota 15.10
Isto implica que um processador C requerido ter o mesmo mtodo de representao para todos os tipos ponteiro
objetos C e o mesmo mtodo de representao para todos os tipo ponteiros funo C e se o processador C ser o
alvo interopervel do processador Fortran. O padro C no impe este requerimento
Nota 15.11
A funo C_LOC pode ser usada para retornar um valor do tipo C_PTR que o endereo C de uma varivel
alocada. A funo C_FUNLOC pode ser usada para retornar um valor do tipo C_FUNPTR que o endereo de
um procedimento. Para C_LOC e C_FUNLOC o valor retornado um interopervel e ento pode ser usado em
um contexto onde o procedimento ou varivel alocvel no diretamente permitida. Por exemplo, ela pode ser
passada como um argumento real para a funo C.
Similarmente, o tipo C_FUNPTR ou C_PTR pode ser usado como um argumento mudo ou componente estrutura
e pode ter um valor que um endereo C de um procedimento ou varivel alocvel, mesmo em um contexto onde
um procedimento ou varivel alocvel no diretamente permitida
15.2.3 Interoperabilidade de Tipos derivados com Tipos Struct C
15.2.3 Interoperability of derived types and C struct types
Um tipo derivado Fortran interopervel (interoperable ) se ele tem o atributo BIND.
C1501 (R429) O tipo derivado com o atributo BIND no pode ser um tipo SEQUENCE
C1502 (R429) O tipo derivado com o atributo BIND no pode ter parmetros de tipo
C1503 (R429) O tipo derivado com o atributo BIND no pode ter o atributo EXTENDS
C1504 (R429) O tipo derivado com o atributo BIND no pode ter uma type-bound-procedure-part
C1505 (R429) Cada componente de um tipo derivado com o atributo BIND tem que ser no ponteiro,
componente de dado no alocvel com tipo interopervel e parmetros de tipo
Nota 15.12
As regras de sintaxe se suas restries requerem que o tipo derivado que interopervel tenha componentes que
so todos objetos de dados que so interopervel. Nenhum componente permitido ser um procedimento ou
alocvel, mas um componente do tipo C_FUNPTR ou C_PTR pode conter o endereo deste tipo de entidade
Um tipo derivado Fortran interopervel com um tipo struct do C se a definio do tipo derivado no
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 356
Fortran especifica BIND(C) (4.5.1), o tipo derivado Fortran tem tipo e parmetros de tipo que so interopervel
com os tipos dos componentes correspondentes no tipo struct. Um componente do tipo derivado Fortran e um
componente do tipo struct do C correspondem se eles so declarados na mesma posio em suas respectivas
definies de tipo.
Nota 15.13
Os nomes dos componentes correspondentes do tipo derivado e do tipo struct do C no necessitam serem os
mesmos
No existe um tipo no Fortran que interopervel com um tipo struct C que contm um campo bit ou que
contenha um membro de matriz flexvel. No existe um tipo no Fortran que interopervel com um tipo union do
C.
Nota 15.14
Por exemplo, o tipo myctype do C, declarado abaixo, interopervel com o tipo Fortran myftype, declarado
abaixo
typedef struct {
int m, n;
float r;
} myctype
USE, INTRINSIC :: ISO_C_BINDING
TYPE, BIND(C) :: MYFTYPE
INTEGER(C_INT) :: I, J
REAL(C_FLOAT) :: S
END TYPE MYFTYPE
Os nomes dos tipos e os nomes dos componentes no so significativos para os propsitos de determinar se um
tipo derivado do Fortran interopervel com um tipo struct do C
Nota 15.15
O padro C requer os nomes e os nomes e os nomes dos componentes estejam na mesma ordem para os tipos
serem compatveis (padro C, clusula 6.2.7). isto similar as regras do Fortran que descrevem quando os tipos
derivados sequncia so considerados serem do mesmo tipo. Esta regra no foi estendida para a determinar se um
tipo derivado Fortran interopervel com um tipo struct do C porque o caso dos identificadores significativo no
C mas no no Fortran
15.2.4 Interoperabilidade de Variveis Escalares
15.2.4 Interoperability of scalar variables
Uma varivel Fortran escalar interopervel se seu tipo e parmetros de tipo so interoperveis e ele no
tem o atributo ponteiro nem o atributo alocvel.
Uma varivel Fortran escalar interopervel com uma entidade escalar do C se seus tipos e parmetros de
tipo so interopervel.
15.2.5 Interoperabilidade de Variveis Matriciais
15.2.5 Interoperability of array variables
Uma varivel Fortran interopervel se seu tipo e parmetros de tipo so interoperveis e tem a forma
explcita ou tamanho assumido.
Uma matriz de forma explcita ou matriz de tamanho assumido de rank r (nmero de dimenses igual a r),
com a forma e
1
,, e
r
| interopervel com uma matriz do C se ela tem tamanho no zero e
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 357
1. um ou outro
(a) a matriz de tamanho assumido e a matriz do C no especifica uma tamanho
(b) a matriz uma matriz de forma assumida e a extenso da ltima dimenso (e
r
) a mesma que o
tamanho da matriz C
2. um ou outro
(a) r igual a um e um elemento da matriz interopervel com um elemento da matriz C
(b) r maior que um e uma matriz de forma explcita com a forma e
1
e
r 1
| , coma o mesmo tipo e
parmetros de tipo que a matriz original, interopervel com a matriz C de tipo igual ao tipo do elemento
da matriz C original
Nota 15.16
Um elemento de uma matriz multidimensional C um tipo matriz, ento a matriz Fortran de rank um
(unidimensional) no interopervel com uma matriz multidimensional C
Nota 15.17
Uma polimrfico, alocvel, ou matriz ponteiro nunca interopervel. Tal tipo de matriz no tem forma explcita
ou tamanho assumido
Nota 15.18
Por exemplo, uma matriz Fortran declarada como
INTEGER :: A(18, 3:7, *)
interopervel com uma matriz C do tipo
int b[][5][18]
Nota 15.19
A linguagem de programao C define strings terminados com o caractere nulo (null-terminated strings), que so
realmente matrizes do tipo char do C que tem um caractere nulo do C dentro dele para indicar o ltimo elemento
vlido. Uma matriz do Fortran do tipo caractere com um parmetro de tipo subtipo (kind type parameter) igual a
um CHAR do C interopervel com um string do C
As regras do Fortran de associao sequncia (12.4.1.5) permite que um argumento real escalar caractere seja
associado com um argumento mudo matricial. Isto torna possvel associao de um argumento com um string
caractere Fortran com um string do C
Nota 15.23 tem um exemplo de interoperao entre strings do Fortran e do C
15.2.6 Interoperabilidade de Procedimentos e Interface de Procedimentos
15.2.6 Interoperability of procedures and procedure interfaces
Um procedimento Fortran interopervel (interoperable) ise ele tem o atributo BIND, isto , se sua
interface especificada com uma proc-language-binding-spec.
Uma interface de procedimento Fortran (Fortran procedure interface) interopervel com um prottipo de
funo C (C function prototype) se
1. a interface tem o atributo BIND
2. um ou outro
(a) a interface descreve a funo cuja varivel resultado um escalar que interopervel com o resultado
do prottipo
(b) a interface descreve a sub-rotina e o prottipo tem um tipo de resultado que vazio (result type of void)
3. o nmero de argumentos mudos da interface igual ao nmero de parmetros formais do prottipo
4. qualquer argumento mudo com o atributo VALUE interopervel com o parmetro formal correspondente
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 358
do prottipo
5. qualquer argumento mudo sem o atributo VALUE corresponde a um parmetro formal do prottipo que
do tipo ponteiro e o argumento mudo interopervel com uma entidade do tipo referenciado (padro C,
6.2.5, 7.17 e 7.18.1) do parmetro formal
6. o prottipo no tem variveis argumentos como mostrada pelas elipses (...)
Nota 15.20
O tipo referenciado (referenced type) de um tipo ponteiro do C o tipo C do objeto para o qual o tipo ponteiro C
aponta. Por exemplo, o tipo referenciado de um tipo ponteiro int* int
Nota 15.21
A linguagem C permite especificao de uma funo C que pode pegar um nmero de argumentos variveis
(padro C, 7.15). Este padro no prov um mecanismo para que os procedimentos Fortran possa interoperar com
este tipo de funo do C
Um parmetro formal de um prottipo de funo C corresponde a um argumento mudo de uma interface
Fortran se eles tm as mesmas posies relativas na lista de parmetro C e na lista de argumentos mudos,
respectivamente.
Nota 15.22
Por exemplo, a interface de procedimento Fortran descrita abaixo
INTERFACE
FUNCTION FUNC(I, J, K, L, M), BIND(C)
USE, INTRINSIC :: ISO_C_BINDING
INTEGER(C_SHORT) :: FUNC
INTEGER(C_INT), VALUE :: I
REAL(C_DOUBLE) :: J
INTEGER(C_INT) :: K, L(10)
TYPE(C_PTR), VALUE :: M
END FUNCTION FUNC
END INTERFACE
interopervel com o prottipo da funo C
short func(int i, double *j, int *k, int l[10], void *m)
Um ponteiro C pode corresponder a um argumento mudo Fortran do tipo C_PTR ou a um escalar Fortran que no
tem o atributo VALUE. No exemplo acima, os ponteiros C j e k correspondem a escalares Fortran J e K,
respectivamente e o ponteiro C m corresponde ao argumento mudo Fortran M do tipo C_PTR
Nota 15.23
A interoperabilidade das interfaces de procedimento Fortran com os prottipos de funo C somente uma parte
da invocao da funo C em um Fortran. H quatro partes a serem consideradas nesta tipo de invocao: a
referncia do procedimento, a interface de procedimento Fortran, o prottipo da funo C e a funo C. Do outro
lado, a invocao de um procedimento Fortran no C envolve a referncia da funo, o prottipo da funo C, a
interface de procedimento do Fortran e o procedimento Fortran. Para determinar se a referncia permitida,
necessrio considerar todas as quatro partes
Por exemplo, considere a funo C que descrita pelo prottipo de funo C
void copy(char in[], char out[]);
Esta funo pode ser invocada em um programa Fortran como segue:
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_NULL_CHAR
INTERFACE
SUBROUTINE COPY(IN, OUT), BIND(C)
IMPORT C_CHAR
CHARACTER(KIND=C_CHAR), DIMENSION(*) :: IN, OUT
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 359
END SUBROUTINE COPY
END INTERFACE
CHARACTER(LEN=10, KIND=C_CHAR) :: DIGIT_STRING = C_CHAR_123456789 // C_NULL_CHAR
CHARACTER(KIND=C_CHAR) :: DIGIT_ARR(10)
CALL COPY(DIGIT_STRING, DIGIT_ARR)
PRINT (1X, A1), DIGIT_ARR(1:9)
END
A referncia do procedimento tem argumentos reais string caractere. Eles correspondem a argumentos mudos
matriciais caractere no corpo da interface de procedimento como permitido pela regras do Fortran de associao
sequncia (12.4.1.5). Aqueles argumentos mudos matriciais na interface de procedimento so interoperveis com
os parmetros formais do prottipo da funo C. A funo C no mostrada aqui, mas assumida ser compatvel
o prottipo C
15.3 Interoperabilidade Com Variveis Globais C
15.3 Interoperation with C global variables
Uma varivel C com ligao esterna pode interoperar com um bloco comum ou com uma varivel
declarada no escopo de um mdulo. Um bloco comum ou varivel tem que ser especificada com o atributo BIND.
Ao menso uma varivel que est associada com uma varivel particular do C com ligao externa
permitida ser declarada dentro do programa. A varivel no pode inicialmente ser definida por mais de um
processador.
Se um bloco comum especificado em uma instruo BIND, ela tem que ser especificada em uma
instruo BIND com o mesmo rtulo de ligao em cada unidade de escopo na qual ela declarada. A varivel C
com a ligao externa interopera com o bloco comum que foi especificado na declarao BIND.
1. Se a varivel C do tipo struct e as variveis que so membros do bloco comum so interoperveis com os
componente correspondentes do tipo struct
2. se o bloco comum contm uma nica varivel e a varivel interopervel com a varivel C
No pode haver uma associao de uma entidade C para uma entidade Fortran com o atributo BIND.
Nota 15.24
O que segue so exemplos de uso do atributo BIND para variveis e para um bloco comum. As variveis Fortran
C_EXTERN e C2, interopera com as variveis C, c_extern e myVariable, respectivamente. Os blocos comuns do
Fortran, COM e SINGLE, interoperam com as variveis C, com e single, respectivamente.
MODULE LINK_TO_C_VARS
USE, INTRINSIC :: ISO_C_BINDING
INTEGER(C_INT), BIND(C) :: C_EXTERN
INTEGER(C_LONG) :: C2
BIND(C, NAME=myVariable) :: C2
COMMON /COM/ R, S
REAL(C_FLOAT) :: R, S, T
BIND(C) :: /COM/, /SINGLE/
COMMON /SINGLE/ T
END MODULE LINK_TO_C_VARS
int c_extern;
long myVariable;
struct {float r, s;} com;
float single;
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 360
15.3.1 Rtulos de Ligao para Blocos e Variveis
15.3.1 Binding labels for common blocks and variables
O rtulo de ligao (binding label) de uma varivel ou bloco comum um valor do tipo caractere default
que especifica o nome pelo qual a varivel ou bloco comum conhecido no processador associado
Se a varivel ou bloco comum tem o atributo BIND especificado com o especificador NAME=, o rtulo de
ligao o valor da expresso especificada para o especificador NAME=. Letra maiscula ou letra minscula no
rtulo de ligao considerado, mas brancos antecedente ou brancos posteriores so ignorados. Se a varivel ou
bloco comum tem o atributo BIND especificado sem o especificador NAME=, o rtulo de ligao o mesmo que o
nome da entidade usando letras minsculas.
O rtulo de ligao de uma varivel C com ligao externa tem o mesmo nome que a varivel C. Uma
varivel Fortran ou bloco comum com o atributo BIND que tem o mesmo rtulo de ligao que a varivel C com
ligao externa associada com esta varivel.
15.4 Interoperabilidade Com Funes C
15.4 Interoperation with C functions
Um procedimento que interopervel pode ser definido por meio diferentes do Fortran ou por meios de um
subprograma Fortran, mas no por ambos.
Se o procedimento definido por meios diferente do Fortran, ele tem que
1. ser descrito por um prottipo C que interopervel com a interface
2. ter ligao externa como definido em 6.2.2 do padro C
3. ter o mesmo rtulo de ligao que a interface
A referncia deste procedimento causa a funo descrita pelo prottipo C ser chamada como especificado
no padro C.
A referncia em C de um procedimento que tem o atributo BIND, tem o mesmo rtulo de ligao e
definido por meio do Fortran, causa a invocao do procedimento.
Um procedimento definido por meio do Fortran no pode invocar setjmp ou longjmp (padro C, 7.13). Se
um procedimento definido por meios diferentes do Fortran invoca setjmp ou longjmp, este procedimento no pode
causar qualquer procedimento definido por meio do Fortran ser invocado. Um procedimento definido por meio do
Fortran no pode ser invocado como um manipulador de sinal (signal handler) (padro C, 7.14.1).
Se uma procedimento definido por meio do Fortran e um procedimento definido por meios diferentes do
Fortran realizam operaes de entrada/sada no mesmo arquivo externo, os resultados so dependente do
processador (9.4.3).
15.4.1 Rtulos de Ligao para Procedimentos
15.4.1 Binding labels for procedures
Um rtulo de ligao (binding label) um valor do tipo caractere default que especifica o nome pelo qual
um procedimento com o atributo BIND conhecido no processador associado.
Se o procedimento tem o atributo BIND com o especificador NAME=, o procedimento tem um rtulo de
ligao cujo valor o da expresso no especificador NAME=. Letras maisculas ou letras minsculas no rtulo de
ligao so consideradas diferentes, mas bancos precedentes e brancos posteriores so ignorados. Se um
procedimento tem o atributo BIND sem o especificador NAME= e o procedimento no um procedimento mudo,
ento o rtulo de ligao do procedimento o mesmo que o nome do procedimento usando letras minsculas.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 361
O rtulo de ligao para uma funo C com ligao externa o mesmo que o nome da funo C.
Nota 15.25
Na amostra que segue, o rtulo de ligao de C_SUB "c_sub" e o rtulo de ligao de C_FUNC "C_funC"
SUBROUTINE C_SUB, BIND(C)
...
END SUBROUTINE C_SUB
INTEGER(C_INT) FUNCTION C_FUNC(), BIND(C, NAME="C_funC")
USE, INTRINSIC :: ISO_C_BINDING
...
END FUNCTION C_FUNC
O padro C permite funes terem nomes que no so permitidos como nomes do Fortran; Ele tambm distingue
entre nomes que podem ser considerados iguais no Fortran. Por exemplo, um nome C pode iniciar com uma
sublinha (underscore) e nomes C que usam letra maiscula e minscula so diferentes. O especificador de um
rtulo de ligao permite um programa usar um nome Fortran para referir a um procedimento definido por um
processador associado
15.4.2 Excees e Procedimentos Aritmticos IEEE
15.4.2 Exceptions and IEEE arithmetic procedures
Um procedimento definido por meios diferente do Fortran no pode usar sinalizao (shall not use signal)
(padro C, 7.14.1) para mudar o manipulador de qualquer exceo que est sendo lidada por um processador
Fortran.
Um procedimento definido por meios diferente do Fortran no pode alterar o estado de ponto flutuante
(14.6 diferente de ajustar a bandeira de exceo para sinalizar).
Os valores de bandeiras de exceo de ponto flutuante na entrada de um procedimento definido por meios
diferente do Fortran so dependentes do processador.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 362
16. Escopo, Associao e Definio
Section 16: Scope, association, and definition
Entidades so identificadas por identificadores dentro do um escopo (scope) que um programa (program),
uma unidade de escopo (scoping unit), uma construo (construct), uma nica instruo (statement) ou parte de uma
instruo.
um identificador global (global identifier) tem o escopo de um programa (2.2.1)
um identificador local (local identifier) tem o escopo de uma unidade de escopo (2.2)
o identificador de uma entidade construo (construct entity) tem o escopo da construo (7.4.3, 7.4.4,
8.1)
um identificador de uma entidade instruo (statement entity) tem o escopo de uma instruo ou parte da
instruo(3.3)
Uma entidade pode ser identificada por
1. um nome (3.2.1)
2. um rtulo de instruo (3.2.4)
3. um nmero de unidade de entrada/sada externa (9.4)
4. um identificador de uma operao de transferncia de dados pendente (9.5.1.8, 9.6)
5. um identificador genrico (12.3.2.1)
6. um rtulo de ligao (15.4.1, 15.3.1)
Por meio de associao, uma entidade pode ser referenciada pelo mesmo identificador ou um identificador
diferente em uma unidade de escopo ou por um identificador diferente na mesma unidade de escopo.
16.1 Escopo de Identificadores Globais
16.1 Scope of global identifiers
Unidades de programa, blocos comuns, procedimentos externos, rtulos de ligao de procedimento e
variveis que possuem o atributo BIND so entidades globais (global entities) de um programa. O nome de uma
unidade de programa, bloco comum ou procedimento externo um identificador global e no pode ter o mesmo
nome que o nome de qualquer outra entidade global no mesmo programa, exceto que um mdulo intrnseco pode
ter o mesmo nome que outra unidade de programa, bloco comum ou procedimento esterno no mesmo programa.
Um rtulo de ligao de uma varivel global um identificador global e no pode ser o mesmo que o rtulo de
ligao de outra entidade global do programa; nem ele pode ser o mesmo de qualquer outra entidade global do
programa que no seja um mdulo intrnseco, ignorando diferena entre letras maiscula e minscula. Uma
entidade global de um programa no pode ser identificada por mais de um rtulo de ligao.
Nota 16.1
O nome de uma entidade global pode ser o mesmo que um rtulo de ligao que identifica a mesma entidade
global
Nota 16.2
Entre os vrios tipos de procedimentos, somente procedimentos externos tm nomes globais. Uma implementao
pode desejar atribuir nomes globais a outras entidades num programa Fortran tal como procedimentos internos,
procedimentos intrnsecos, procedimentos implementando operadores intrnsecos, procedimentos implementando
operaes de entrada/sada, etc.. Se isto feito, de responsabilidade do processador garantir que nenhum destes
nomes conflita com quaisquer nomes de procedimentos externos, com outras entidades nomeadas globalmente em
um programa conforme com o padro ou umas com as outras. Por exemplo, isto pode ser feito pela incluso em
cada um destes nome adicionado um caractere que no permitido em um nome conforme com o padro ou pelo
uso deste tipo de caractere combinando um designador local com o nome global da unidade de programa na qual
ele aparece
Unidade externas de entrada/sada e operaes de transferncia de dados pendentes so entidades globas.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 363
16.2 Escopo de Identificadores Local
16.2 Scope of local identifiers
Dentro de uma unidade de escopo, identificadores de entidades nas classes que seguem:
1. variveis com nome (named variables) que no so instrues ou entidades construes (16.3), constantes
com nome, construo com nome, funes instruo, procedimentos internos, procedimentos mdulo,
procedimentos mudos, procedimentos intrnsecos, interface abstrata, interfaces genricas, tipos derivados,
grupos de lista de nomes, procedimentos externos acessados via USE e rtulos de instruo
2. parmetros de tipo, componentes e ligaes de procedimento ligado ao tipo, em uma classe separada para
cada tipo
3. palavras-chaves de argumentos, em um aclasse separada para cada procedimento com uma interface
explcita
so entidades locais nesta unidade de escopo.
Dentro de uma unidade de escopo, um identificador local de uma entidade de classe (1) no pode ser o
mesmo que um identificador global usado nesta unidade de escopo a menos que o identificador global seja
1. usado somente como o use-name de uma renomeao de uma instruo USE
2. um nome de bloco comum (16.2.1)
3. um procedimento externo que tambm um nome genrico
4. o nome de uma funo externa e a unidade de escopo sua definio de subprograma(16.2.2)
Dentro de uma unidade de escopo, um identificador local de uma classe no pode ser o mesmo que outro
identificador local da mesma classe, exceto que um nome genrico pode ser o mesmo que o nome de um
procedimento como explicado em 12.3.2.1 ou o mesmo como o nome de um tipo derivado (4.5.9). Um
identificador local de uma classe pode ser o mesmo que o identificador local de outra classe.
Nota 16.3
Um procedimento intrnseco incessvel pelo seu prprio nome em uma unidade de escopo que usa o mesmo
nome como um identificador local de classe (1) para uma entidade diferente. Por exemplo, no fragmento de
programa
SUBROUTINE SUB
...
A = SIN(K)
...
CONTAINS
FUNCTION SIN(X)
...
END FUNCTION SIN
END SUBROUTINE SUB
qualquer referncia a funo SIN na sub-rotina SUB refere-se a funo interna SIN,no a funo intrnseca de
mesmo nome
Um identificador local identifica uma entidade em uma unidade de escopo e pode ser usada para identificar
uma entidade em outra unidade de escopo exceto nos seguintes casos:
1. o nome que aparece como uma subroutine-name em uma subroutine-stmt tem uso limitado dentro do
escopo estabelecido pela subroutine-stmt. Ele pode ser usado para identificar referncias recursivas da
sub-rotina ou identificar um bloco comum (o ltimo s possvel para sub-rotinas interna e sub-rotinas
mdulo)
2. o nome que aparece como um function-name em uma function-stmt tem uso limitado dentro do escopo
estabelecido por esta function-stmt. Ele pode ser usado para identificar a varivel resultado, identificar
referncias recursivas da funo ou identificar um bloco comum (o ltimo s possvel para funes
interna e funes mdulo)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 364
3. o nome que aparece como um entry-name em uma entry-stmt tem uso limitado dentro do escopo
estabelecido por esta entry-stmt aparece. Ele pode ser usado para identificar a varivel resultado se o
subprograma uma funo, identificar referncias recursivas ou identificar um bloco comum ((o ltimo s
possvel se a entry-stmt est em um subprograma mdulo)
16.2.1 Identificadores Local que so os mesmos que os Nome em Blocos
Comum
16.2.1 Local identifiers that are the same as common block names
Um nome que identifica um bloco comum em uma unidade de escopo no pode ser usada para identificar
uma constante ou um procedimento intrnseco nesta unidade de escopo. Se um identificador local tambm o nome
de um bloco comum, a apario deste nome em qualquer contexto diferente do nome de um bloco comum em uma
instruo COMMON ou SAVE uma apario do identificador local.
Nota 16.4
Um nome de procedimento local pode ser o nome de um bloco comum em uma unidade de escopo que no
referencia o procedimento intrnseco
16.2.2 Resultados de Funo
16.2.2 Function results
Para cada instruo FUNCTION ou instruo ENTRY em um subprograma funo, existe uma varivel
resultado. Se no clusula RESULT, a varivel resultado tem o mesmo nome que o nome da funo sendo definida;
caso contrrio, a varivel resultado tem o nome especificado na clusula RESULT.
16.2.3 Restries e Declaraes Genricas
16.2.3 Restrictions on generic declarations
Esta subclusula contm as regras que tem que ser satisfeitas por cada par de procedimentos especficos
que tem o mesmo identificador genrico dentro da unidade de escopo. Se um procedimento genrico acessado em
um mdulo, as regras aplicam-se a todas as verses especifica mesmo se algumas delas so inacessveis por seus
nomes especficos.
Nota 16.5
Em muitas unidade de escopo, as possveis fontes de procedimentos com um identificador genrico particular so
os blocos de interface acessveis e as ligao genricas diferentes dos nomes dos objetos acessveis nesta unidade
de escopo. Em uma definio de tipo, eles so ligaes genricas, incluindo aqueles vindo de tipo raiz (parent type)
Dois argumentos mudos so distinguveis (distinguishable ) se nenhum uma sub-rotina e nenhum deles
compatvel TKR (5.1.1.2) com o outro.
Dentro da unidade de escopo, se dois procedimentos tem o mesmo operador genrico e mesmo nmero de
argumentos ou a mesma definio de atribuio, uma tem que ter um argumento mudo que corresponde em posio
na lista de argumentos a um argumento mudo da outra que distinguvel com ele.
Dentro da unidade de escopo, se dois procedimentos tem a mesma dtio-generic-spec (12.3.2.1), seus
argumentos dtv tem que ser incompatveis em tipo ou ter diferentes parmetros de tipo subtipo.
Dentro da unidade de escopo, se dois procedimentos que tm o mesmo nome genrico tm ambos que ser
sub-rotinas ou ambos funes e
1. existe um objeto de dados mudo no passado (non-passed-object dummy data object) em um deles tal que
(a) o nmero de objetos de dados mudos em um que no opcional, no so objetos passados e e com o
qual este objeto de dado mudo compatvel TKR, possivelmente incluindo este objeto de dado mudo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 365
excede
(b) o nmero de objetos de dados objeto no passado, ambos opcionais e no posicional, na ordem que no
so distinguveis com o este objeto de dado mudo
2. ambos tem argumentos mudos objeto passado e os argumentos mudos objeto passado so distinguveis, ou
3. ao menos um deles tm ambos
(a) argumento mudo objeto no passado no opcional em um aposio efetiva tal que um ou outro
procedimento no tem argumento mudo nesta posio efetiva ou o argumento mudo nesta posio
distinguvel com ele e
(b) um argumento mudo objeto no passado no posicional cujo nome tal que um ou outro procedimento
no tem argumento mudo com este nome e ou argumento mudo com este nome indistinguvel com ele.
Alm disto, o argumento mudo que desambigua pela posio tem que ser o mesmo ou ocorre antes na lista
de argumentos que o outro que desambigua pelo nome.
A posio efetiva (effective position) de um argumento mudo sua posio na lista de argumento depois de
qualquer argumento mudo objeto passado ter sido removido.
Dentro da unidade de escopo, se o nome genrico o mesmo de um procedimento intrnseco genrico, o
procedimento intrnseco genrico no acessvel se os procedimentos na interface e o procedimento intrnseco no
so todos funes ou no todos sub-rotinas. Se uma invocao genrica aplica-se a ambos um procedimento
especfico em uma interface e um procedimento intrnseco genrico acessvel, o procedimento especfico da
interface que referenciado.
Nota 16.6
Uma explanao extensiva da aplicao destas regras est em C.11.2
16.2.4 Componentes, Parmetros de Tipos e Ligaes
16.2.4 Components, type parameters, and bindings
Um nome de componente tem o escopo da sua definio tipo derivada. Fora da definio de tipo, ele pode
aparecer somente dentro de um designador de componente de uma estrutura deste tipo ou como uma palavra-chave
de componente em um construtor de estrutura deste tipo.
Um nome de parmetro de tipo tem o escopo da sua definio tipo derivada. Fora da definio de tipo, ele
pode aparecer somente como uma palavra-chave de parmetro de tipo em uma derived-type-spec para o tipo ou
como o type-param-name de uma type-param-inquiry.
O nome de ligao (binding name) (4.5.4) de um procedimento ligado ao tipo (type-bound procedure) tem o
escopo de sua definio de tipo derivado. Fora da definio de tipo derivado, ele pode aparecer somente como o
binding-name em uma referncia de procedimento.
Uma ligao genrica (generic binding) para a qual uma generic-spec no um generic-name tem um
escopo que consiste de todas as unidades de escopo nas quais cada entidade do tipo acessvel.
Um nome de componente ou ligao pode aparecer somente em uma unidade de escopo na qual acessvel.
A acessibilidade de componentes e ligaes especificada em 4.5.3.6 e 4.5.4.
16.2.5 Palavras-chaves de Argumento
16.2.5 Argument keywords
Como em uma palavra-chave de argumento, o nome de um argumento mudo em um procedimento interno,
procedimento mdulo ou corpo de interface tem o escopo da unidade de escopo do hospedeiro do procedimento ou
corpo de interface. Ela pode aparecer somente em uma referncia de procedimento para a qual um argumento
mudo. Se o procedimento ou corpo de interface acessvel em outra unidade de escopo por associao de uso ou
hospedagem (16.4.1.2, 16.4.1.3), a palavra-chave do argumento acessvel para referncias de procedimento para
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 366
aquele procedimento nesta unidade de escopo.
O nome de um argumento mudo em um procedimento intrnseco tem o escopo de uma palavra-chave de
argumento da unidade de escopo na qual a referncia do procedimento ocorre. Como uma palavra-chave de
argumento, ele pode aparecer somente em referncia de procedimento para o procedimento no qual ele uma
argumento mudo.
16.3 Instrues e Entidades Construo
16.3 Statement and construct entities
Uma varivel que aparece como uma data-i-do-variable em uma instruo DATA ou uma ac-do-
variable em um construtor de matriz, como um argumento mudo em uma instruo funo instruo, ou como um index-
name em uma instruo FORALL uma entidade instruo (statement entity). Uma varivel que aparece em um
index-name em um construtor FORALL ou um associate-name em uma construo SELECT TYPE ou
ASSOCIATE uma entidade construo (construct entity).
O nome de uma data-i-do-variable em uma instruo DATA ou em uma ac-do-variable em um
construtor de matriz tem o escopo do seu data-implied-do. Ela uma varivel escalar que tem o tipo e
parmetros de tipo que teria se fosse o nome de uma varivel em uma unidade de escopo que inclui-se a instruo
DATA ou construtor de matriz e seu tipo tem que ser tipo inteiro; ela no tem outros atributos. A apario de um
nome em uma data-i-do-variable em um implied-DO em uma instruo DATA ou uma ac-do-variable em
um construtor de matriz no uma declarao implcita da um varivel cujo escopo a unidade de escopo que
contm a instruo.
O nome de uma varivel que aparece em um index-name em uma instruo FORALL ou construo
FORALL tem o escopo da instruo ou construo. Ela uma varivel escalar que tem o tipo e parmetros de tipo
que teria se fosse o nome de uma varivel em uma unidade de escopo que inclui-se a instruo FORALL e seu tipo
tem que ser tipo inteiro; ela no tem outros atributos. A apario de um nome como um index-name em uma
instruo FORALL ou construo FORALL no uma declarao implcita da um varivel cujo escopo a unidade
de escopo que contm a instruo ou construo.
O nome de uma varivel que aparace como um argumento mudo em uma instruo funo instruo tem o escopo da instruo na
qual aparece. Ela um escalar que tem o tipo e parmetros de tipo que teria se ela fosse o nome de uma varivel na unidade de escopo que
inclu a funo instruo; ela no tem outros atributos.
Exceto para um nome de bloco comum ou o nome de uma varivel escalar, um identificador local ou o
identificador de classe (1) (16.2) na unidade de escopo que contm a instruo no pode ser o nome de uma
entidade instruo desta instruo. Dentro do escopo da entidade instruo, outra entidade instruo no pode ter o
mesmo nome.
Se um identificador global ou local acessvel na unidade de escopo de uma construo o mesmo que o
nome de uma entidade instruo naquela instruo, o nome interpretado dentro do escopo da entidade instruo
como aquele da entidade instruo. Em outro lugar na unidade de escopo, incluindo partes da instruo fora do
escopo da entidade instruo, o nome interpretado como um identificador global ou local.
Exceto para nome de bloco comum ou nome de varivel escalar, um identificador global ou um
identificador local de classe (1) (16.2) na unidade de escopo de uma instruo FORALL ou construo FORALL
no pode ser o mesmo que quaisquer de seus index-names. Um index-name de uma instruo FORALL ou
construo FORALL no pode ser o mesmo que um index-name de quaisquer de suas construes FORALL.
Se um identificador global ou local acessvel em uma unidade de escopo de uma instruo instruo
FORALL ou construo FORALL o mesmo que index-name, o nome interpretado dentro do escopo da
instruo FORALL ou construo FORALL como o do index-name. Em outro lugar na unidade de escopo, o nome
interpretado como um identificado global ou local.
O nome associado a um construtor SELECT TYPE tem um escopo separado para cada bloco do construtor.
Dentro de cada bloco, ele tem o tipo declarado, tipo dinmico, parmetros de tipo, rank (nmero de dimenses) e
limites especificados em 8.1.5.2.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 367
Os nomes associados com uma construo ASSOCIATE tm o escopo do bloco. Eles tm o tipo declarado,
tipo dinmico, parmetros de tipo, rank (nmero de dimenses) e limites especificados em 8.1.4.2.
Se um identificado global ou local acessvel em uma unidade de escopo de uma construo SELECT TYPE
ou ASSOCIATE o mesmo que um nome associado, o nome interpretado dentro dos blocos da construo
SELECT TYPE ou ASSOCIATE como o nome associado. Em qualquer outro lugar na unidade de escopo, o nome
interpretado como um identificador global ou local.
16.4 Associao
16.4 Association
Duas entidades podem ficar associadas por associao de nome (name association), associao de ponteiro
(pointer association), associao de armazenagem (storage association) ou associao de herana (inheritance
association).
16.4.1 Associao de Nome
16.4.1 Name association
Existem cinco formas de associao de nome (name association) : associao de argumento (argument
association), associao de uso (use association), associao de hospedagem (host association), associao de ligao
(linkage association) e associao de construo (construct association). Associao de argumento, uso e hospedagem
provm mecanismo pelos quais entidades conhecidas em uma unidade de escopo pode ser acessada em outra
unidade de escopo.
16.4.1.1 Associao de Argumento
16.4.1.1 Argument association
As regras governando associao de argumentos so dadas na seo 12. Como explicado em 12.4,
execuo de uma referncia de uma referncia de procedimento estabelece uma associao entre um argumento real
e seus correspondente argumento mudo. Associao de argumento pode ser associao sequncia (12.4.1.5).
O nome de um argumento mudo pode ser diferente do nome, se existir, de seu argumento real associado. O
nome do argumento mudo o nome pelo qual o argumento real associado conhecido e pelo qual ele pode ser
acessado, na referncia do procedimento.
Nota 16.7
Um argumento real pode ser uma entidade de dado sem nome, tal como uma expresso que no simplesmente
uma varivel ou constante
As o trmino da execuo de uma referncia de procedimento, todas as associaes de argumento
estabelecidas so terminadas. Um argumento mudo de um procedimento pode ser associado com uma entidade
inteiramente diferente do argumento real em uma invocao subsequente do procedimento.
16.4.1.2 Associao de Uso
16.4.1.2 Use association
Associao de uso (use association) a associao de nomes em diferentes unidades de escopo
especificada pela instruo USE. As regras governando associao de uso so dadas em 11.2.1. Elas permitem
renomeao de entidades sendo associadas. Associao de uso permite acesso em uma unidade de escopo de
entidades identificadas em outra unidade de escopo; ela permanece em efeito durante a execuo do programa.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 368
16.4.1.3 Associao de Hospedagem
16.4.1.3 Host association
Um subprograma interno, um subprograma modulo ou uma definio tipo derivada tem acesso a entidades
no seu hospedeiro (host) via associao de hospedagem (host association). Um corpo de interface tem acesso via
associao de hospedagem aos nomes das entidades no seu hospedeiro que feito acessvel por instrues
IMPORT no corpo da interface. As entidades acessadas so conhecidas pelo mesmo nome e tem os mesmos
atributos que possuem no hospedeiro; elas so objetos de dados com nome, tipos derivados, interfaces abstratas,
procedimentos, identificadores genricos (12.3.2.1) e grupos de lista de nomes.
Se uma entidade que acessada por uma associao de uso tem o mesmo nome no genrico que uma
entidade no hospedeiro, a entidade do hospedeiro inacessvel por este nome. Dentro da unidade de escopo, um
nome que declarado como sendo um nome de procedimento externo por uma external-stmt, procedure-
declaration-stmt ou interface-body ou que aparece como um module-name em uma use-stmt um
identificador global; qualquer entidade do hospedeiro que tem este como seu nome no genrico inacessvel por
este nome. Um nome que aparece em uma unidade de escopo como
1. Uma function-name em uma stmt-function-stmt or em uma entity-decl em uma type-declaration-stmt
2. um object-name em uma entity-decl em uma type-declaration-stmt, em uma pointer-stmt, em
uma save-stmt, em uma allocatable-stmt ou em uma target-stmt
3. um type-param-name em uma derived-type-stmt
4. uma named-constant em uma named-constant-def em uma parameter-stmt
5. um array-name em uma dimension-stmt
6. um variable-name em um common-block-object em uma common-stmt
7. um proc-pointer-name em um common-block-object em uma common-stmt
8. o nome de uma varivel que est totalmente ou parcialmente inicializada em uma data-stmt
9. o nome de um objeto que est totalmente ou parcialmente equivalenciada em uma equivalence-stmt
10. um dummy-arg-name em uma function-stmt, em uma subroutine-stmt, em uma entry-stmt, ou em uma
stmt-function-stmt
11. um result-name em uma function-stmt ou em uma entry-stmt
12. O nome de uma entidade declarada no corpo em um interface
13. um intrinsic-procedure-name em uma intrinsic-stmt
14. um namelist-group-name em uma namelist-stmt
15. um generic-name em uma generic-spec em uma interface-stmt
16. o nome de uma construo com nome
um identificador local na unidade de escopo e qualquer entidade do hospedeiro que tem esta como seu nome no
genrico inacessvel por este nome por associao de hospedagem. Se uma unidade de escopo o hospedeiro de
uma definio tipo derivada ou um subprograma, o nome do tipo derivado ou de qualquer procedimento definido
pelo subprograma um identificador local na unidade de escopo; qualquer entidade do hospedeiro que tem este
como nome no genrico inacessvel por este nome. Identificadores locais a um subprograma so no acessveis
ao seu hospedeiro.
Nota 16.8
Um nome que aparace em uma instruo ASYNCHRONOUS ou VOLATILE no necessariamente o nome de
uma varivel local. Se a varivel que est acessvel via associao de hospedagem meio diferente do uso de uma
instruo IMPORT, esta varivel do hospedeiro possu o atributo ASYNCHRONOUS ou VOLATILE na unidade
de escopo do procedimento interno ou mdulo atual
Se a entidade do hospedeiro inacessvel somente porque uma varivel local com o mesmo nome est
completamente ou parcialmente inicializada em uma instruo DATA, a varivel local no pode ser referenciada ou
definida antes da instruo DATA.
Se o nome de um tipo derivado de um hospedeiro est inacessvel, entidade de dados deste tipo ou
subobjetos deste tipo de dado ainda podem estar acessveis.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 369
Nota 16.9
Um corpo de interface acessado por associao de hospedagem somente aquelas entidades feitas acessveis por
instrues IMPORT
Se um procedimento externo ou mudo com uma interface implcita acessada via associao de
hospedagem, ento ele tem que ter o atributo EXTERNAL na unidade de escopo hospedeira. O tipo e parmetros
de tipo de uma funo com o atributo EXTERNAL so estabelecidos em uma unidade de escopo se esta unidade de
escopo explicitamente as declara, invoca a funo, acessa a funo dentro de um mdulo ou acessa a funo em seu
hospedeiro onde o tipo e parmetros de tipo esto estabelecidos.
Se um procedimento intrnseco acessado via associao de hospedagem, ento ele tem que estar
estabelecido como intrnseco na unidade de escopo do hospedeiro. Um procedimento intrnseco estabelecido
como intrnseco em uma unidade de escopo se esta unidade de escopo explicitamente usa o atributo INTRINSIC,
invoca ele como um procedimento intrnseco, acessa ele em um mdulo ou acessa ele na seu hospedeiro onde ele
foi estabelecido como intrnseco.
Nota 16.10
Um subprograma e um subprograma interno pode conter as mesmas entidade ou entidades associadas por uso
diferentes, como ilustrado no exemplo que segue:
MODULE B; REAL BX, Q; INTEGER IX, JX; END MODULE B
MODULE C; REAL CX; END MODULE C
MODULE D; REAL DX, DY, DZ; END MODULE D
MODULE E; REAL EX, EY, EZ; END MODULE E
MODULE F; REAL FX; END MODULE F
MODULE G; USE F; REAL GX; END MODULE G
PROGRAM A
USE B; USE C; USE D
...
CONTAINS
SUBROUTINE INNER_PROC(Q)
USE C ! no necessrio
USE B, ONLY: BX ! as entidades acessveis so BX, IX e JX
! se nenhum outro IX ou JX
! esto acessveis para INNER_PROC
! Q local para INNER_PROC,
! porque Q um argumento mudo
USE D, X => DX
! as entidades acessveis so DX, DY e DZ
! X um nome local para DX em INNER_PROC
! X e DX denotam a mesma entidade se nenhuma outra
! entidade DX local para INNER_PROC
USE E, ONLY: EX ! EX acessvel em INNER_PROC, no no programa A
! EY e EZ no so acessveis em INNER_PROC
! ou no programa A
USE G ! FX e GX so acessveis em INNER_PROC
...
END SUBROUTINE INNER_PROC
END PROGRAM A
porque o programa A contm a instruo
USE B
todas as entidade no mdulo B, exceto para Q, so acessveis em INNER_PROC, mesmo que INNER_PROC
contenha a instruo
USE B, ONLY: BX
A instruo USE com a palavra-chave ONLY significa que esta instruo em particular s traz a entidade
nomeada, no que esta a nica varivel varivel no mdulo acessvel nesta unidade de escopo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 370
Nota 16.11
Para mais exemplos de associao de hospedagem, veja a seo C.11.1
16.4.1.4 Associao de Ligao
16.4.1.4 Linkage association
Associao de ligao (linkage association) ocorre entre uma varivel do mdulo que tem o atributo BIND e
a varivel C com a qual ela interopera ou entre o bloco comum Fortran e a varivel C com o qual ele interopera
(15.3). Este tipo de associao permanece em efeito durante todo o tempo de execuo do programa.
16.4.1.5 Associao de Construo
16.4.1.5 Construct association
Execuo de uma instruo SELECT TYPE estabelece uma associao entre o seletor e o nome associado
de uma construo. Execuo de uma instruo ASSOCIATE estabelece uma associao entre cada seletor e o
correspondente nome associado da construo.
Se o seletor alocvel, ele tem que estar alocado; o nome associado associado com o objeto de dado e
no pode ter o atributo ALLOCATABLE.
Se o seletor tem o atributo POINTER, ele tem que estar associado; o nome associado associado com o
alvo de um ponteiro e no pode ter o atributo POINTER.
Se o seletor uma varivel diferente de uma seo de matriz tendo um subscrito vetor, a associao
aquela na qual o objeto de dado especificada pelo seletor; caso contrrio, a associao com o valor da expresso
do seletor, que avaliado antes da execuo do bloco.
Cada nome associado permanece associado com o correspondente seletor durante a execuo do bloco.
Dentro do bloco, cada seletor conhecido e pode ser acessado pelo correspondente nome associado. No trmino da
construo, a associao terminada.
Nota 16.12
A associao entre o nome associado e o objeto de dado estabelecida antes da execuo do bloco e no afetada
por subsequentes mudanas de variveis que foram usadas no subscrito ou intervalo de subscrito no seletor
16.4.2 Associao de Ponteiro
16.4.2 Pointer association
Associao de ponteiro entre um ponteiro e um alvo permite que o alvo seja referenciado por uma
referncia ao ponteiro. Durante tempos diferentes durante a execuo de um programa, um ponteiro pode ser
indefinido, associado com alvos diferentes ou ser desassociado. Se um ponteiro associado com um alvo, o estado
de definio do ponteiro definido ou indefinido, dependendo da definio do estado do alvo. Se o ponteiro tem
parmetros de tipo postergados (deferred type parameters) ou forma (shape), seus valores so assumidos do alfo. Se o
ponteiro polimrfico, seu tipo dinmico o tipo dinmico do alvo.
16.4.2.1 Estado da Associao de Ponteiro
16.4.2.1 Pointer association status
Um ponteiro pode ter um estado de associao de ponteiro (pointer association status) de associado,
desassociado ou indefinido. Seu estado de associao pode mudar durante a execuo do programa. A menos que o
ponteiro esteja inicializado (explicitamente ou por default), ele tem um estado de associao inicial de indefinido.
Um ponteiro pode ser inicializado como tendo um estado de associao de desassociado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 371
Nota 16.13
Um ponteiro em um uma unidade de programa mdulo pode ser acessvel em um subprograma via associao de
uso. Este tipo de ponteiro tem um tempo de vida que maior que os alvos que so declarados no subprograma,
amenos que este tipo de alvos sejam salvos. Portanto, se este tipo de ponteiro associado com um alvo local,
existe a possibilidade que quando o procedimento definido pelo subprograma completa a execuo, o alvo deixe
de existir, deixando o ponteiro pendente (dangling). Este padro considera este tipo de ponteiro como tendo um
estado de associao indefinido. Eles no esto associados nem desassociado. Eles no podem ser usados
novamente na unidade de programa at seu estado ter sido restabelecido. No existe requerimento sobre o
processador para que tenha a capacidade de detectar quando o alvo de um ponteiro cessa sua existncia
16.4.2.1.1 Eventos que Fazem Ponteiros se Tornarem Associados
16.4.2.1.1 Events that cause pointers to become associated
Um ponteiro se torna associado quando
1. o ponteiro alocado (6.3.1) como resultado da execuo bem sucedida de uma instruo ALLOCATE
referenciando o ponteiro
2. o ponteiro pointer-assigned com um alvo (7.4.2) que est associado ou especificado com um atributo
TARGET e, se alocvel, est alocado
16.4.2.1.2 Eventos que Fazem Ponteiros se Tornarem Desassociados
16.4.2.1.2 Events that cause pointers to become disassociated
Um ponteiro se torna desassociado quando
1. o ponteiro nulificado (6.3.2)
2. o ponteiro desalocado (6.3.3)
3. o ponteiro pointer-assigned (7.4.2) com um ponteiro desassociado
4. o ponteiro um componente ltimo de um objeto de um tipo para o qual inicializao default
especificada para o componente e
(a) o procedimento invocado com este objeto como um argumento real correspondendo a um argumento
mudo no alocvel no ponteiro com INTENT (OUT)
(b) um procedimento com este objeto como um objeto local no alocvel no ponteiro no salvo que no
acessado por associao de uso ou hospedagem invocado
(c) este objeto est alocado
16.4.2.1.3 Eventos que Fazem o Estado de Associao de Ponteiros se tornar Indefinido
16.4.2.1.3 Events that cause the association status of pointers to become undefined
O estado de associao de um ponteiro se torna indefinido quando
1. o ponteiro pointer-assigned com um alvo que tem um estado de associao indefinido
2. o alvo do ponteiro desalocado por outra forma que diferente do ponteiro
3. o procedimento transferncia de alocao (allocation transfer procedure) (13.7.82) executado com o ponteiro
associado com o argumento FROM e um objeto sem o atributo alvo associado com o argumento TO
4. execuo de uma instruo RETURN ou END causa o alvo do ponteiro se tornar indefinido (item (3) de
16.5.6)
5. um procedimento terminado pela execuo de uma instruo RETURN ou END e o ponteiro declarado
ou acessado no subprograma que define o procedimento a menos que o ponteiro
(a) tenha o atributo SAVE
(b) esteja em um comum sem nome (blank common)
(c) est em um bloco comum com nome (named common block) que aparece em ao menos uma outra
unidade de escopo que est em execuo
(d) est numa unidade de escopo de um mdulo se o mdulo tambm acessado por outra unidade de
escopo que est em execuo
(e) acessado por associao de hospedagem
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 372
(f) o valor retornado de uma funo declarada com o atributo POINTER
6. o ponteiro um componente ltimo de um objeto, inicializao default no especificada para o
componente e o procedimento invocado com este objeto como um argumento real correspondendo a um
argumento mudo com inteno INTENT(OUT)
7. um procedimento invocado com um ponteiro como argumento real correspondendo a um argumento
mudo ponteiro com INTENT(OUT)
16.4.2.1.4 Outros Eventos que mudam o Estado de Associao de Ponteiros
16.4.2.1.4 Other events that change the association status of pointers
Quando um ponteiro se trona associado com outro ponteiro por associao de argumento, associao de
construo ou associao de hospedagem, os efeitos sobre o estado de associao so especificados em16.4.5.
Enquanto dois ponteiros esto associados por nome, assocados por armazenamento ou associados por
herana, se o estado de associao de um dos ponteiros muda, o estado de associao do outro muda em
concordncia com a mudana ocorrida.
16.4.2.2 Estado de Definio do Ponteiro
16.4.2.2 Pointer definition status
O estado de definio de um ponteiro o do alvo. Se um ponteiro est associado com um alvo definvel, o
estado de definio do ponteiro pode ser definido ou indefinido de acordo com as regras para uma varivel(16.5).
16.4.2.3 Relacionamento entre o Estado de Associao e Estado de Definio
16.4.2.3 Relationship between association status and definition status
Se o estado de associao de um ponteiro desassociado ou indefinido, o ponteiro no pode ser
referenciado ou desalocado. Qualquer que seja seu estado de associao, um ponteiro sempre pode ser nulificado,
alocado ou receber um valor (pointer assigned). Um ponteiro nulificado desassociado. Quando um ponteiro est
alocado, ele se torna associado mas indefinido. Quando um ponteiro recebe um valor (pointer assigned), sua
associao e estado de definio se torna igual a do data-target ou proc-target especificado.
16.4.3 Associao de Armazenamento
16.4.3 Storage association

Sequencias de armazenamento so usadas para descrever relacionamentos que existe entre variveis, blocos
comuns e variveis resultado. Associao de armazenamento (storage association) a associao de dois ou mais
objetos de dados que ocorre quando duas ou mais sequncias de armazenamento partilham ou so alinhadas com
uma ou mais unidades de armazenamento.
16.4.3.1 Sequncia de Armazenamento
16.4.3.1 Storage sequence
Uma sequncia de armazenamento uma sequncia de unidades de armazenamento. O tamanho de uma
sequncia de armazenamento (size of a storage sequence) o nmero de unidades de armazenamento na
sequncia de armazenamento. Uma unidade de armazenamento (storage unit) uma unidade de armazenamento
caractere, uma unidade de armazenamento numrica, uma unidade de armazenamento de arquivo ((9.2.4) ou uma
unidade de armazenamento no especificada. Os tamanhos da unidade de armazenamento numrica, unidade de
armazenamento caractere e da unidade de armazenamento de arquivo so os valores das constantes no mdulo
intrnseco ISO FORTRAN ENV (13.8.2).
Em um contexto de associao de armazenagem
1. um objeto escalar no ponteiro do tipo inteiro default, real default ou lgico default ocupa uma nica
unidade de armazenamento numrica (numeric storage unit)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 373
2. um objeto escalar no ponteiro do tipo real de preciso dupla ou complexo ocupa duas unidades de
armazenamento numricas contguas
3. um objeto escalar no ponteiro do tipo caractere default e caractere e do tipo caractere com comprimento
len ocupa len unidades de armazenamentos caractere (character storage units) contguas
4. um objeto escalar no ponteiro do tipo caractere com um subtipo caractere C (C character kind) (15.1.1) e
comprimento caractere len ocupa len unidade de armazenamento no especificadas contguas
(unspecified storage units)
5. um objeto escalar no ponteiro do tipo sequncia sem parmetros de tipo ocupa uma sequncia de
sequncias de armazenamento correspondendo a sequncia de seus componentes ltimos
6. um objeto escalar no ponteiro de qualquer tipo no especificado nos item (1)-(5) ocupa uma nica unidade
de armazenamento no especificada que diferente para cada caso e cada conjunto de parmetro de valores
e que diferente das unidade de armazenamento no especificadas no item (4)
7. uma matriz no ponteiro ocupa uma sequncia de sequncias de armazenamento contguas, uma paracada
elemento da matriz, na ordem dos elementos da matriz (6.2.2.2)
8. um ponteiro ocupa uma nica unidade de armazenamento no especificada que diferente daquela de
qualquer objeto no ponteiro e diferente de cada combinao de tipo, parmetros de tipo e rank (nmero
de dimenses)
Uma sequncia de sequncias de armazenamento forma uma sequncia de armazenamento. A ordem das
unidade de armazenamento nesta sequencia de armazenamento composta aquela das unidade de armazenamento
individuais em cada sequencias de armazenamento constituinte tomadas em sucesso, ignorando quaisquer
sequncias constitudas com tamanho zero.
Cada bloco comum tem uma sequncia de armazenamento (5.5.2.1).
16.4.3.2 Associao de Sequncias de Armazenamento
16.4.3.2 Association of storage sequences
Duas sequncias de armazenamento de tamanho no zero s1 e s2 so associaes de armazenamento
(storage associated) se a isima (ith) unidade de armazenamento de s1 a mesma que a jsima (jth) unidade de
armazenamento de s2. Isto causa a (i + k)sima unidade de armazenamento de s1 ser a mesma que a (j + k)sima
unidade de armazenamento de s2, para cada inteiro k tal que 1 i + k tamanho de s1 e 1 j + k tamanho de s2.
Associao de armazenamento tambm definida entre duas sequncias de armazenamento de tamanho
zero e entre uma sequncia de armazenamento de tamanho zero e uma unidade de armazenamento. Uma sequncia
de armazenamento de tamanho zero em uma sequencia de sequncias de armazenamento associao de
armazenamento com seu sucessor, se existir. Se o sucessor outra sequncia de armazenamento de tamanho zero,
as duas sequncias so associadas por armazenamento. Se o sucessor e uma sequncia de armazenamento de
tamanho zero, a sequncia de tamanho zero uma associao de armazenamento com a primeira unidade de
armazenamento do seu sucessor. Duas unidades de armazenamento que so cada uma delas associadas por
armazenamento com a mesma sequncia de tamanho zero so as mesma unidade de armazenamento.
Nota 16.14
Objetos de tamanho zero podem ocorrer em um contexto de associao de armazenamento como o resultado da
mudana de um parmetro. Por exemplo, um programa pode conter as seguintes declaraes:
INTEGER, PARAMETER :: PROBSIZE = 10
INTEGER, PARAMETER :: ARRAYSIZE = PROBSIZE * 100
REAL, DIMENSION (ARRAYSIZE) :: X
INTEGER, DIMENSION (ARRAYSIZE) :: IX
...
COMMON / EXAMPLE / A, B, C, X, Y, Z
EQUIVALENCE (X, IX)
...
se a primeira instruo na sequncia mudada para atribuir tamanho zero a PROBSIZE, o programa ainda estar
conforme com o padro
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 374
16.4.3.3 Associao de Objetos de Dados Escalar
16.4.3.3 Association of scalar data objects
Dois objetos de dados escalares esto associados por armazenamento se suas sequncias de armazenamento
so sequncias associadas. Duas entidades escalares so totalmente associadas (totally associated) se elas tem a
mesma sequncia de armazenagem. Duas entidades esto parcialmente associadas (partially associated) se elas
esto associadas sem que estejam totalmente associadas.
O estado de definio e valor de um objeto de dado afeta o estado de definio e valor de qualquer entidade
associada. Uma instruo de EQUIVALENCE, uma instruo COMMON ou uma instruo ENTRY pode causar
uma associao de armazenamento de sequncias de armazenamento.
Uma instruo EQUIVALENCE causa associao de objetos de dados somente dentro da unidade de
escopo, a menos que uma das entidades associadas seja tambm um bloco comum (5.5.1.1 e 5.5.2.1).
Instrues COMMON causam objetos de dados em uma unidade de escopo se tornarem associados por
armazenamento cause com objetos de dados em outra unidade de escopo.
Um bloco comum permitido conter uma sequncia de unidade de armazenamento de diferentes tipos.
Todas as unidades do escopo que acessam os blocos comuns com nome (named common blocks) com o mesmo nome
tem que especificar uma sequncia idntica de unidades de armazenamento. Blocos comuns sem nome (blank
common blocks) podem ser declarados com tamanhos diferentes em diferentes unidades de escopo. Para quaisquer
dois blocos comuns sem nome, a sequncia inicial de unidades de armazenamento do bloco comum sem nome de
tamanho maior tem que ser idntica sequencia de unidades de armazenamento do bloco comum de tamanho
menor. Se dois blocos comuns sem nome so de mesmo tamanho, eles tem que ter a mesma sequncia de unidades
de armazenamento.
Uma instruo ENTRY em uma subprograma funo causa associao de armazenamento das variveis
resultado.
Associao parcial pode existir somente entre
1. um objeto caractere default ou tipo sequncia caractere e um objeto do tipo caractere default ou tipo
sequncia caractere
2. um objeto do tipo complexo default, real preciso dupla ou tipo sequncia numrica e um objeto do tipo
inteiro default, real default, lgico default, real preciso dupla, complexo default ou tipo sequncia
numrica
Para entidades no caractere, associao parcial pode ocorrer somente pelo uso das instrues COMMON,
EQUIVALENCE ou ENTRY. Para entidades caractere, associao parcial pode ocorrer somente por associao de
argumentos ou pelo uso das instrues COMMON ou EQUIVALENCE.
Nota 16.15
No exemplo:
REAL A(4), B
COMPLEX C(2)
DOUBLE PRECISION D
EQUIVALENCE (C(2), A(2),B), (A, D)
a terceira unidade de armazenamento de C, segunda unidade de armazenamento de A, a unidade de
armazenamento de B e a segunda unidade de armazenamento de D so especificadas como as mesmas. As
sequencias de armazenamento podem ser ilustradas como:
unidades de armazenamento 1 2 3 4 5
----C(1)----|---C(2)----
A(1) A(2) A(3) A(4)
--B--
------D------
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 375
A(2) e B esto totalmente associadas. O que segue esto parcialmente associados: A(1) e C(1), A(2) e C(2), A(3)
e C(2), B e C(2), A(1) e D, A(2) e D, B e D, C(1) e D e C(2) e D. Apesar de C(1) e C(2) estarem cada um
associados por armazenamento com D, C(1) e C(2) no esto associados por armazenamento uma com a outra
Associao parcial de entidades caracteres ocorrem quando algumas, mas nem todas, unidades de
armazenamento das entidades forem as mesmas.
Nota 16.16
No exemplo:
CHARACTER A*4, B*4, C*3
EQUIVALENCE (A(2:3), B, C)
A, B e C esto associadas parcialmente
Uma unidade de armazenamento no pode ser explicitamente inicializada mais de uma vez em um
programa. Inicializao explcita sobrescreve inicializao default e inicializao default para um objeto derivado
sobrescreve inicializao default para um componente de objeto (4.5.1). Inicializao default pode ser especificada
por uma unidade de armazenamento que est associada por armazenamento garantido que os objetos fornecendo a
inicializao default so de mesmo tipo e parmetros de tipo e e fornece o mesmo valor para a unidade de
armazenamento.
16.4.4 Associao de Herana
16.4.4 Inheritance association
Associao por herana ocorre entre componentes de um componente raiz (parent component) e o
componente herdado por extenso de tipo em um tipo extensvel (4.5.6.1). Esta associao persistente; ela no
afetada pelos componente herdados.
16.4.5 Associaes Estabelecidas
16.4.5 Establishing associations
Quando uma associao estabelecida entre duas entidades por associao de argumento, associao de
hospedagem ou associao de construo, certas caractersticas da entidade associada (associating entity) se
tornam aquelas da entidade preexistente (preexisting entity).
Para associao de argumentos, a entidade associada o argumento mudo e a entidade preexistente a
entidade real. Para associao de hospedagem, a entidade associada a entidade na unidade de escopo hospedeira e
a entidade preexistente a entidade na unidade de escopo contida. Se a entidade de escopo hospedeira um
procedimento recursivo, a entidade preexistente que participa da associao aquela vindo da instncia do
procedimento mais interno que invoca, direta ou indiretamente, o procedimento contido. Para construo associada,
a entidade associada identificada pelo nome associado e a entidade preexistente o seletor.
Quando uma associao estabelecida por associao de argumento, associao de hospedagem ou
associao de construo. O seguinte se aplica:
1. se a entidade associada tem o atributo POINTER, seu estado de associao de ponteiro se torna o mesmo
que aquele da entidade preexistente. Se a entidade preexistente tem o estado de ponteiro associado
associado, a entidade associada se torna ponteiro associado com o mesmo alvo e se eles so matrizes, os
limites da entidade associada se torna os mesmos que o da entidade preexistente
2. se a entidade associada tem o atributo ALLOCATABLE, seu estado de associao se torna o mesmo que o
da entidade preexistente. Se a entidade preexistente est alocada, os limites (se ela uma matriz), valores
de parmetros de tipo postergados, estado de definio e valor (se ele est definido) se tornam os mesmos
que aqueles da entidade preexistente. Se a entidade preexistente polimrfica e a entidade preexistente est
alocada, o tipo dinmico da entidade associada se torna o mesmo que aquele da entidade preexistente
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 376
Se a entidade associada no um ponteiro nem ponteiro alocvel, seu estado de definio e valor (se ele
est definido) se torna os mesmo que aquele da entidade preexistente. Se as entidades so matrizes e a associao
no associao de argumento, os limites da entidade associada se tornam os mesmos que aqueles da entidade
preexistente.
16.5 Definio e Indefinio de Variveis
16.5 Definition and undefinition of variables
Uma varivel pode ser definida ou pode estar indefinida e seu estado de definio pode mudar durante a
execuo do programa. Uma ao que causa uma varivel se tornar indefinida no implica que a varivel estava
previamente definida. Uma ao que causa a varivel se tornar definida no implica que a varivel estava
previamente indefinida.
16.5.1 Definio de Objetos e Subobjetos
16.5.1 Definition of objects and subobjects
Matrizes, incluindo sees e variveis tipo derivado, tipo caractere ou tipo complexo so objetos que
consistem de zero ou mais subobjetos. Associaes podem ser estabelecidas entre variveis e subobjetos e entre
subobjetos de diferentes variveis. Estes subobjetos podem se tornar definidos ou indefinidos.
1. Uma matriz definida se e somente se todos os seus componentes esto definidos
2. um objeto escalar tipo derivado definido se e somente se todos os seus componentes no ponteiro esto
definidos
3. um objeto escalar caractere ou complexo est definido se e somente se todos os seus subobjetos esto
definidos
4. se um objeto est indefinido, ao menos um (mas no necessariamente todos) os seus subobjetos esto
indefinidos
16.5.2 Variveis que esto Sempre Definidas
16.5.2 Variables that are always defined
Matrizes e string de tamanho zero so sempre definidos.
16.5.3 Variveis que esto Inicialmente Definidos
16.5.3 Variables that are initially defined
As seguinte variveis so inicialmente definidas:
1. variveis especificada como tendo valores iniciais por instruo DATA
2. variveis especificada como tendo valores iniciais por instrues de declarao de tipo
3. variveis subcomponentes no ponteiro inicializadas por default que no tem o atributo ALLOCATABLE
ou POINTER e so salvas ou so declaradas em um programa principal, MODULE ou unidade de escopo
BLOCK DATA
4. variveis que so sempre definidas
5. variveis com o atributo BIND que so inicializadas por outros meios que no o Fortran
Nota 16.17
cdigo Fortran:
module mod
integer, bind(c,name="blivet") :: foo
end module mod
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 377
cdigo C:
int blivet = 123;
no exemplo acima, a varivel Fortran foo inicializada com o valor 123 por outro meio que no o Fortran
16.5.4 Variveis que esto Inicialmente Indefinidas
16.5.4 Variables that are initially undefined
Todas as outras variveis esto inicialmente indefinidas.
16.5.5 Eventos que Fazem Variveis se Tornarem Definidas
16.5.5 Events that cause variables to become defined
Variveis se tornam definidas como segue:
1. execuo de uma instruo de atribuio intrnseca diferente de uma atribuio de matriz mascarada
(masked array assignment) ou instruo de atribuio FORALL causa a varivel que precede o igual se
tornar definida. Execuo de uma instruo de atribuio intrnseca pode causar todas ou parte das varivel
que precede os iguais se tornarem definidas
2. execuo de uma atribuio de matriz mascarada ou instruo de atribuio FORALL pode causar alguma
ou todas os elementos de matriz na instruo de atribuio se tornarem definidos (7.4.3)
3. com o prosseguimento da execuo da instruo de entrada, a cada varivel atribuda um valor vindo do
arquivo de entrada ficando definida no tempo em que a transferncia de dado ocorre para ela.(veja (4) em
16.5.6.) Execuo de uma instruo WRITE cuja unidade especificada identifica um arquivo interno causa
cada registro que escrito se tornar definido
4. execuo de uma instruo DO causa a varivel do DO, se existir, se tornar definida
5. incio da execuo de uma ao especificada por um io-implied-do em uma instruo de entrada/sada
sncrona causa a do-variable se tornar definida
6. uma referncia a um procedimento causa o objeto de dado mudo inteiro se tornar definido se o argumento
mudo no tem INTENT(OUT) e o argumento real correspondente est definido.
Uma referncia a um procedimento causa um subobjeto de um argumento mudo se tornar definido se o
argumento mudo no tem INTENT(OUT) e o correspondente subobjeto argumento real est definido
7. execuo de uma instruo de entrada/sada contendo um especificador IOSTAT= causa a varivel inteira
especificada se tornar definida
8. execuo de uma instruo READ sncrona contendo um especificador SIZE= causa a varivel inteira
especificada se tornar definida
9. execuo de uma operao espera (wait operation) correspondendo a uma instruo de entrada assncrona
contendo o especificador SIZE= causa a varivel integral especificada se tornar definida
10. execuo de uma instruo INQUIRE causa a varivel que tem atribudo um valor durante a execuo da
instruo se tornar definida se nenhum erro existir
11. se um erro, uma condio end-of-file ou end-of-record ocorre durante a execuo da instruo de
entrada/sada que tem o especificador IOMSG=, a varivel iomsg-variable se torna definida
12. quando uma unidade de armazenamento caractere se torna definida, todas as unidade de armazenamento
associadas se tornam definidas.
Quando uma unidade de armazenamento numrica se torna definida, unidades de armazenamento
numricas do mesmo tipo se tornam definidas. Quando uma entidade do tipo real de preciso dupla se torna
definida, todas as entidades totalmente associadas do tipo real de preciso dupla se tornam definidas.
Quando um unidade de armazenamento no especificada se torna definida, todas a unidades de
armazenamento no especificadas associadas se torna definidas
13. quando uma entidade complexa default se torna definida, todas as entidade reais default associadas
parcialmente se tornam definidas
14. quando ambas as partes de uma entidade complexa default se torna definida, a entidade complexa default
se torna definida
15. quando todos os componentes de uma estrutura de um tipo sequencial numrico ou tipo sequncia caractere
se torna definido como resultado de objetos associados parcialmente se torna definidos, a estrutura se torna
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 378
definida
16. execuo de uma instruo ALLOCATE ou DEALLOCATE com o especificador STAT= causa a varivel
especificada com o especificador STAT= se tornar definido
17. se uma condio de erro ocorre durante a execuo de uma instruo ALLOCATE ou DEALLOCATE que
tem o especificador ERRMSG=, a errmsg-variable se torna definida
18. alocao de matriz de tamanho zero causa uma matriz se tornar definida
19. alocao de um objetivo que tem subcomponentes inicializados por default no ponteiro causa este
subcomponente se tornar definido
20. invocao de um procedimento causa qualquer objeto automtico de tamanho zero neste procedimento se
tornar definido
21. execuo de uma instruo de atribuio ponteiro que associa um ponteiro com um alvo que est definido
causa o ponteiro se tornar definido
22. invocao de um procedimento que contm uma varivel local no alocvel no ponteiro no salva causa
todos os subcomponentes inicializados por default no ponteiro do objeto se torna definido
23. invocao de um procedimento que tem um argumento mudo INTENT (OUT) no alocvel no ponteiro
causa todos os subcomponentes inicializados por default no ponteiro do argumento mudo se tornam
definidos
24. invocao de uma funo no ponteiro de um tipo derivado causa todos os subcomponentes inicializados
por default no ponteiro do resultado da funo se tornarem definidos.
25. Em uma construo FORALL, a index-name se torna definido quando o conjunto de valores index-name
avaliado
26. um objeto com o atributo VOLATILE que alterado por um meio listado em 5.1.2.16 se torna definido
16.5.6 Eventos que Fazem Variveis Tornarem-se Indefinidas
16.5.6 Events that cause variables to become undefined
Varivel se torna indefinida como segue:
1. quando uma varivel de um dado tipo se torna definida, todas as variveis associadas de tipos diferentes se
tornam indefinidas. Entretanto, quando uma varivel do tipo real default est associada parcialmente com
uma varivel do tipo complexa default, a varivel complexa no se torna indefinida quando a varivel real
se torna definida e a varivel real no se torna indefinida quando a varivel complexa se torna definida.
Quando uma varivel do tipo complexa default est associada parcialmente com outra varivel do tipo
complexo default, definio de uma no causa a outra se tornar indefinida
2. se a avaliao de uma funo pode causar uma varivel se tornar definida e se a referncia da funo
aparece em uma expresso na qual o valor da funo no necessria para determinar o valor da expresso,
a varivel se torna indefinida quando a expresso avaliada
3. quando execuo de uma instncia de um subprograma completa
(a) suas variveis locais no salvas se tornam indefinidas
(b) variveis no salvas em um bloco comum com nome que aparece em um subprograma se torna
indefinido se ele foi definido ou redefinido, a menos que outro unidade de escopo ativa esteja
referenciando o bloco comum
(c) variveis locais no finalizveis no salvas de um mdulo se tornam indefinidas a menos que outra
unidade de escopo ativa esteja referenciando o mdulo
Nota 16.18
Um subprograma mdulo herda referncias do mdulo que seu hospedeiro. Portanto, para processadores que
mantm registro de quando um mdulo est em uso, um mdulo est em uso se qualquer procedimento no mdulo
est ativo, mesmo que nenhuma outra unidade de escopo referencie o mdulo; esta situao pod acontecer se o
procedimento mdulo invocado via um ponteiro de procedimento, procedimento ligado ao tipo ou processador
associado
(d) variveis local finalizveis no salvas de um mdulo podem ser finalizadas se nenhum outra unidade de
escopo ativa est referenciando o mdulo depois do que ele ser torna indefinido
4. quando uma condio de erro ou condio end-of-file ocorre durante a execuo de uma instruo de
entrada, todas as variveis especificadas pela lista de entrada ou grupo de lista de nome da instruo se
tornam indefinidas
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 379
5. quando uma condio de erro, condio end-of-file ou condio end-of-record ocorre durante a
execuo de uma instruo de entrada/sada contendo quaisquer io-implied-dos, todas as do-variables
na instruo se tornam indefinidas (9.10)
6. execuo de uma instruo de entrada de acesso direta que especifica um registro que no foi escrito
previamente causa todas as variveis especificadas da lista de entrada da instruo se tornarem indefinidas
7. execuo de uma instruo INQUIRE pode causar as variveis NAME=, RECL= e NEXTREC= se
tornarem indefinidas (9.9)
8. quando uma unidade de armazenamento caractere se torna indefinida, todas as unidades de armazenamento
caractere associadas se tronam indefinidas
Quando uma unidade de armazenamento numrica se torna indefinida, todas as unidades de
armazenamentos numricas associadas se tornam indefinidas a menos que a indefinio seja o resultado da
definio de uma unidade de armazenamento numrico associado de tipo diferente (ver (1) anterior).
Quando uma entidade do tipo real preciso dupla se torna indefinida, todas as entidades associadas do tipo
real preciso dupla se tornam indefinidas.
Quando uma unidade de armazenamento no especificada se torna indefinida, todas as unidades de
armazenamento no especificadas associadas se tornam indefinidas
9. quando uma entidade alocvel desalocada, ela se torna indefinida
10. quando um procedimento de transferncia de alocao (13.5.16) causa o estado de alocao de uma
entidade alocvel se tornar no alocado, a entidade se torna indefinida
11. execuo bem sucedida de uma instruo ALLOCATE para um objeto de tamanho no zero que tem um
subcomponente para o qual inicializao default no foi especificada causa o subcomponente se tornar
indefinido
12. execuo de uma instruo INQUIRE causa todas as variveis de especificao da inquisio se tornarem
indefinidas se uma condio de erro existe, exceto para quaisquer variveis no especificador IOSTAT= ou
IOMSG=
13. quando um procedimento invocado
(a) um argumento mudo opcional que no est associado com um argumento real se torna indefinido
(b) um argumento mudo com INTENT (OUT) se torna indefinido exceto para qualquer subcomponente
inicializado por default no ponteiro do argumento
(c) um argumento real associado com um argumento mudo com INTENT (OUT) se torna indefinido exceto
para qualquer subcomponente inicializado por default no ponteiro do argumento
(d) um subobjeto de um argumento mudo que no tem INTENT (OUT) se torna indefinido se o
correspondente subobjeto do argumento real est indefinido
(e) a varivel resultado de uma funo se torna indefinida exceto para qualquer de seus subcomponentes
inicializados por default no ponteiro
14. quando o estado de associao de um ponteiro se torna indefinido ou desassociado (16.4.2.1.2, 16.4.2.1.3),
o ponteiro se torna indefinido
15. quando a execuo de uma construo FORALL termina, os index-names se tornam indefinidos
16. execuo de uma instruo READ assncrona causa todas as variveis especificadas pela lista de entrada ou
o especificador SIZE= se tronar indefinidas. Execuo de uma instruo READ lista de nome assncrona
causa qualquer varivel num grupo da lista de nomes se tornar indefinida se a varivel for
subsequentemente definida durante a execuo da instruo READ ou correspondente operao espera
(WAIT operation)
17. quando a execuo de uma instruo RETURN ou END causa a varivel se tornar indefinida, qualquer
varivel do tipo C_PTR se torna indefinida se seu valor o endereo C de qualquer parte da varivel que se
tornou indefinida
18. quando a varivel com o atributo TARGET desalocada, qualquer varivel do tipo C_PTR se torna
indefinida se seu valor o endereo C de qualquer parte da varivel que se tornou desalocada
Nota 16.19
Execuo de uma atribuio definida pode deixar toda ou parte da varivel que precede os iguais indefinida
16.5.7 Contexto de Definio de Variveis
16.5.7 Variable definition context
Algumas variveis so proibidas de aparecerem em um contexto sinttico que possa implicar definio oi
indefinio da varivel (5.1.2.7, 5.1.2.12, 12.6). O que segue so os contextos nos quais a apario de uma varivel
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 380
implica na definio ou indefinio da varivel:
1. a varivel de uma assignment-stmt
2. um pointer-object em uma pointer-assignment-stmt ou nullify-stmt
3. uma do-variable em uma do-stmt ou io-implied-do
4. um input-item em um read-stmt
5. um variable-name em uma namelist-stmt se o namelist-group-name aparece em um especificador
NML= em uma read-stmt
6. uma internal-file-variable em uma write-stmt
7. um especificador IOSTAT=, SIZE= ou IOMSG= em uma instruo de entrada/sada
8. uma variveldefinvel em uma instruo INQUIRE
9. uma stat-variable, allocate-object ou errmsg-variable em uma allocate-stmt ou uma
deallocate-stmt
10. um argumento real em uma referencia a um procedimento com uma interface explcita se o argumento
mudo associado tem o atributo INTENT(OUT) ou INTENT(INOUT)
11. a varivel que um seletor em uma construo SELECT TYPE ou ASSOCIATE se o nome associado desta
construo aparece em um contexto de definio de varivel
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 381
Anexo A (Informativo)
Annex A (Informative)
Glossrio de Termos Tcnicos
Glossary of technical terms
O que segue uma lista dos principais termos tcnicos usados neste padro e suas definies. A referncia
entre parnteses imediatamente depois do termo a seo onde o termo definido e explicado. As palavras de uma
definio aqui no so necessariamente as mesmas usadas neste padro.
Tipo Abstrato :
abstract type (4.5.6) : um tipo que tem o atributo ABSTRACT. Um objeto no polimrfico no pode ser
declarado como um tipo abstrato. Um objeto polimrfico no pode ser construdo ou alocado para ter um tipo
abstrato dinmico
Instruo de Ao :
action statement (2.1) : Instruo nica especificando ou controlando uma ao computacional (R214)
Argumento real :
actual argument (12, 12.4.1) : Uma expresso, uma varivel, um procedimento especificado em uma
referncia de procedimento
Varivel alocvel :
allocatable variable (5.1.2.2) : Uma varivel que tem o atributo ALLOCATABLE. Ela pode ser referenciada
ou definida somente quando est alocada. Se ela uma matriz, ela tem uma forma somente quando est alocada.
Ela pode ser uma varivel com nome ou um componente de estrutura
Argumento :
argument (12) : Um argumento real ou um argumento mudo
Associao de argumento :
argument association (16.4.1.1) : O relacionamento entre um argumento real e um argumento mudo
durante a execuo de uma referncia de procedimento
Matriz :
array (2.4.5) : Um conjunto de dados escalares, todos do mesmo tipo e parmetros de tipo, cujos elementos
individuais so arranjados em uma formato retangular. Ela pode ser uma matriz com nome, uma seo de matriz,
um componente de de estrutura, um valor de funo ou uma expresso. O nmero de dimenses ( rank) de pelo
menos um. Note que no FORTRAN 77, matrizes sempre tm nome e nunca so constantes
Elemento de matriz :
array element (2.4.5, 6.2.2) : Um dos dados escalares que constituem uma matriz que nomeado ou um
componente da estrutura
Ponteiro de matriz :
array pointer (5.1.2.5.3) : Um ponteiro para uma matriz
Seo de matriz :
array section (2.4.5, 6.2.2.3) : Um subobjeto que uma matriz e no uma componente de estrutura
Instruo de atribuio :
assignment statement (7.4.1.1) : Uma instruo na forma varivel = expresso
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 382
Nome associado :
associate name (8.1.4.1) : O nome pelo qual um seletor de uma construo SELECT TYPE ou ASSOCIATE
conhecido dentro da construo
Associao :
association (16.4) : Associao de nome, associao de ponteiro, associao de armazenamento ou associao
de herna
Matriz de forma assumida :
assumed-shape array (5.1.2.5.2) : Uma matriz muda no ponteiro que toma a forma do argumento real
associado
Matriz de tamanho assumido :
assumed-size array (5.1.2.5.4) : Uma matriz muda cujo tamanho assumido do argumento real associado.
Seu ltimo limite superior especificado por um asterisco
Atributo :
attribute (5) : Uma propriedade de um objeto de dado que pode ser especificado em uma instruo de declarao
de tipo (R501)
Objeto de dado automtico :
automatic data object (5.1) : Um objeto de dado que uma entidade local de um subprograma, que no
um argumento mudo e que tem um parmetro de tipo comprimento ou limite da matriz que especificado por uma
expresso que no uma expresso de inicializao
Tipo base :
base type (4.5.6) : Um tipo extensvel que no uma extenso de outro tipo
Pertence :
belong (8.1.6.4.3, 8.1.6.4.4) : Se uma instruo EXIT ou CYCLE contm um nome de construo, a
instruo pertence construo DO que est usando este nome. Caso contrrio, ela pertence construo DO mais
interna na qual ela aparace
Rtulo de ligao :
binding label (15.4.1, 15.3.1) : Um valor do tipo caractere default que identifica de forma nica como uma
varivel, um bloco comum, uma sub-rotina ou funo conhecido no processador associado
Bloco :
block (8.1) : Uma sequncia de construes executveis embutida em outra construo executvel, limitada
pelas instrues que so particulares construo e tratada como uma unidade integral
Unidade de programa dados em bloco :
block data program unit (11.3) : Uma unidade de programa que prov valores iniciais para objetos de
dados em blocos comuns com nome
Limites :
bounds (5.1.2.5.1) : Para uma matriz com nome, os limites entre os quais os valores dos subscritos dos
elementos da matriz tem que estar
Caractere :
character (3.1) : Uma letra, dgito ou outro smbolo
Classe :
class (5.1.1.2) : Uma classe chamada de N o conjunto de tipos estendidos de uma tipo chamado N
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 383
Caractersticas :
characteristics (12.2) :
1. de um procedimento, sua classificao como uma funo ou sub-rotina, se uma funo pura, se
elementar, se tem o atributo BIND, o valor de seu rtulo de ligao, as caractersticas de seus argumentos
mudos e as caractersticas de seu resultado de funo se uma funo
2. de uma argumento mudo, se um objeto de dado, uma procedimento, um ponteiro de procedimento,
um asterisco (indicador de retorno alternativo) ou tem o atributo OPTIONAL
3. de um objeto de dado mudo, seu tipo, parmetros de tipo, forma, a dependncia exata dos limites da uma
matriz ou parmetro de tipo de outras entidades, inteno, se opcional, se um ponteiro ou alvo, se
alocvel, se tem os atributos VALUE, ASYNCHRONOUS ou VOLATILE, se polimrfico e se a forma,
tamanho ou parmetro de tipo assumido
4. de um procedimento mudo ou ponteiro de procedimento, se a interface explcita, as caractersticas do
procedimento se a interface explcita e se opcional
5. de um resultado de funo, seu tipo, parmetros de tipo, quais parmetros de tipo so postergados, se
polimrfico, se um ponteiro ou alocvel, se um ponteiro de procedimento, nmero de dimenses se
um ponteiro ou alocvel, forma se no um ponteiro ou alocvel, a exata dependncia dos limites da
matriz ou parmetro de tipo de outras entidades e se o comprimento caractere assumido
Parmetro de comprimento caractere :
character length parameter (2.4.1.1) : O parmetro de tipo que especifica o nmero de caracteres para
uma entidade do tipo caractere
Cadeia de caracteres :
character string (4.4.4) : Uma sequncia de caracteres numerada da esquerda para a direita 1, 2, 3, ...
Unidade de armazenamento caractere :
character storage unit (16.4.3.1) : A unidade de armazenamento para guardar um escalar que no um
ponteiro e do tipo caractere default e um comprimento de caractere
Sequncia de arrumao :
collating sequence (4.4.4.3) : A ordem de todos os caracteres diferentes de um dado parmetro de tipo
subtipo (kind type parameter)
Bloco comum :
common block (5.5.2) : Um bloco de armazenamento fsico que pode ser acessado por qualquer unidade de
escopo de um programa
Processador associado :
companion processor (2.5.10): Um mecanismo pelo qual dados globais e procedimentos podem ser
referenciados ou definidos. Pode ser um mecanismo que referencia e define estas entidades por outros meios que
no o Fortran. Os procedimentos podem ser descritos por um prottipo de funo C
Componente :
component (4.5) : Um constituinte de um tipo derivado
Ordem dos componentes :
component order (4.5.3.5) : A ordem dos componentes de um tipo derivado que usado para entrada/sada
formatada intrnseca e para construtores de estrutura
Conforme :
conformable (2.4.5) : Duas matrizes so ditas conforme se elas tem a mesma forma. Um escalar conforma
com qualquer matriz
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 384
Conformidade :
conformance (1.5) : Um programa conforma com o padro se ele usa somente as forma e relacionamentos
descritos no padro e tem uma interpretao que concorda com o padro. Uma unidade de programa conforme
com o padro se ela pode se includa em um programa de uma maneira tal que permite que o programa seja
conforme com o padro. Um processador conforme com o padro se ele executa programas conforme com o
padro em uma maneira tal que satisfaz as interpretaes prescrita no padro e possu a pacacidade de detectar e
reportar como listado em 1.5
Conectado :
connected (9.4.3) :
1. para uma unidade externa, a propriedade de referncia a um arquivo externo
2. para um arquivo externo, a propriedade de ter uma unidade externa que refere-se a ele
Constante :
constant (2.4.3.1.2) : Um objeto de dado cujo valor no pode mudar durante a execuo do programa. Ela
pode ser uma constante com nome ou uma constante literal
Construo :
construct (7.4.3, 7.4.4, 8.1) : Uma sequncia de instrues iniciando com uma instruo ASSOCIATE, DO,
FORALL, IF, SELECT CASE, SELECT TYPE ou WHERE e finalizando com a instruo terminal correspondente
Entidade construo :
construct entity (16) : Uma entidade definida por um totem lxico cujo escopo uma construo
Mscara Controle :
control mask (7.4.3) : Em uma instruo ou construo WHERE, uma matriz do tipo lgico cujos valores
determinam quais elementos da matriz, em uma where-assignment-stmt ser definido
Dados :
data : Plural de datum
Entidade de Dados :
data entity (2.4.3) : Um objeto de dado, o resultado de um clculo da avaliao de uma expresso ou o
resultado da execuo de uma referncia de funo (chamada de resultado da funo). Uma entidade de dado tem
um tipo (intrnseco ou derivado) e tem, ou pode ter, um valor de dado (a exceo uma varivel no definvel).
Cada entidade de dado tem um nmero de dimenses e portanto um escalar ou uma matriz
Objeto de dado :
data object (2.4.3.1) : Uma entidade de dado uma constante, uma varivel ou um subobjeto de uma
constante
Tipo de Dado :
data type (4) : Ver tipo
Datum :
datum : Uma quantidade nica que pode ser qualquer um dos valores de um conjunto de valores especificado
para este tipo
Smbolo decimal :
decimal symbol (9.9.1.6, 10.5, 10.7.8) : O caractere que separa o todo da parte fracionria na
representao decimal de um nmero real em um arquivo. Por default o smbolo decimal o ponto decimal
(tambm conhecido como um ponto). O smbolo decimal em uso determinado pelo modo de edio decimal em
uso
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 385
Tipo declarado :
declared type (5.1.1.2, 7.1.4) : O tipo que a entidade de dado declarada ter. Pode ser diferente daquele tipo
durante a execuo (o tipo dinmico) para as entidades polimrficas
Inicializao default :
default initialization (4.5) : Se inicializao especificada na definio de um tipo, o objeto deste tipo ser
automaticamente inicializado. Componentes no ponteiro podem ser inicializados com valores por default;
componentes ponteiros podem estar inicialmente desassociado por default. Inicializao default no provia para
objetos do tipo intrnseco
Inicializado por default :
default-initialized (4.5.3.4) : Um subcomponente dito estar inicializado por default se ele for inicializado
por inicializao default
Ligao postergada :
deferred binding (4.5.4) : Uma ligao com o atributo DEFERRED. Uma ligao postergada s pode
aparecer em uma definio de tipo abstrato (4.5.6)
Parmetro de tipo postergado :
deferred type parameter (4.3) : Um parmetro de tipo comprimento cujo valor no especificado na
declarao de um objeto, mas em vez disto especificado quando o objeto alocado ou pointer-assigned
Definvel :
definable (2.5.5) : Uma varivel definvel se seu valor pode ser mudado pela uso de seu designador em uma
instruo de atribuio. Uma varivel alocvel que no foi alocada um exemplo de objeto de dado no definvel.
Um exemplo de um subobjeto que no definvel C(I) quando C uma matriz que uma constante e I uma
varivel inteira
Definido :
defined (2.5.5) : Para um objeto de dado, a propriedade de ter ou de ter sido dado um valor vlido ele
Instruo de atribuio definida :
defined assignment statement (7.4.1.4, 12.3.2.1.2) : Uma instruo de atribuio que no uma
instruo de atribuio intrnseca; ela definida por uma sub-rotina ou uma interface genrica que especifica
ASSIGNMENT (=)
Operao definida :
defined operation (7.1.3, 12.3.2.1.1) : Uma operao que no uma operao intrnseca e definida por
uma funo que est associada com um identificador genrico
Caracterstica removida :
deleted feature (1.8) : Uma caracterstica em um padro Fortran prvio que considerada redundante e no
muito utilizada. Veja B.1 para uma lista de caractersticas que esto no padro Fortran anterior, mas no neste
padro. Uma caracterstica designada como uma caracterstica obsoleta no padro pode se tronar uma caracterstica
removida no prximo padro
Tipo derivado :
derived type (2.4.1.2, 4.5) : Um tipo cujo dado pode ter componentes, cada um deles um tipo intrnseco ou
outro tipo derivado
Designador :
designator (2.5.1) : Um nome, seguido por zero ou mais seletores de componentes, seletores de seo de
matriz e seletores de substring
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 386
Desassociado :
disassociated (2.4.6) : Um ponteiro desassociado no est associado com um alvo. Um ponteiro est
desassociado depois da execuo de uma instruo NULLIFY, depois de uma atribuio de ponteiro com um
ponteiro desassociado, por inicializao default ou inicializao explcita. Um ponteiro de dado pode tambm ser
desassociado pela execuo de uma instruo DEALLOCATE
Argumento mudo :
dummy argument (12, 12.5.2.1, 12.5.2.2, 12.5.2.4, 12.5.4) : Uma entidade pela qual um argumento
real associado acessado durante a execuo de um procedimento
Matriz muda :
dummy array : Uma argumento mudo que uma matriz
Objeto de dado mudo :
dummy data object (12.2.1.1, 12.4.1.2) : Uma argumento mudo que um objeto de dado
Ponteiro mudo :
dummy pointer : Uma argumento mudo que um ponteiro
Procedimento mudo :
dummy procedure (12.1.2.3) : Uma argumento mudo que especificado ou referenciado como um
procedimento
Tipo dinmico :
dynamic type (5.1.1.2, 7.1.4) : O tipo de uma entidade de dado durante a execuo de um programa. O tipo
dinmico de uma entidade de dado que no polimrfica o mesmo que o seu tipo declarado
Item efetivo :
effective item (9.5.2) : Um objeto resultante da expanso de uma lista de entrada/sada de acordo com as
regras em 9.5.2
Elementar :
elemental (2.4.5, 7.4.1.4, 12.7) : Um adjetivo aplicado a uma operao, procedimento ou instruo de
atribuio que aplicada independentemente aos elementos de uma matriz ou elementos correspondentes de um
conjunto de matrizes conformes e escalares
Entidade :
entity : O termo usado para qualquer dos seguintes: uma unidade de programa, procedimento, interface abstrata,
operador, interface genrica, bloco comum, unidade externa, funo instruo, tipo, entidade de dado, rtulo de
instruo, construo ou grupo na lista de nome
Construo executvel :
executable construct (2.1) : Uma instruo ao (R214) ou uma construo ASSOCIATE, CASE, DO,
FORALL, IF, SELECT TYPE ou WHERE
Instruo executvel :
executable statement (2.3.1) : Uma instruo para realizar ou controlar uma ou mais aes computacionais
Inicializao explcita :
explicit initialization (5.1) : Inicializao explcita pode ser especificada por objetos do tipo intrnseco ou
derivado em instrues de declarao de tipo ou instrues DATA. Um objeto do tipo derivado que especifica
inicializao default no pode aparecer em uma instruo DATA
Interface explicita :
explicit interface (12.3.1) : Se o procedimento tem interface explcita no ponto em que referenciado, o
processador capaz de verificar se as caractersticas da referncia e a declarao esto relacionadas como requerido
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 387
por este padro. Um procedimento tem interface explcita se ele um procedimento interno, um procedimento
mdulo, um procedimento intrnseco, um procedimento externo que tem um corpo de interface, uma referncia de
procedimento em sua prpria unidade de escopo ou um procedimento mudo que tem um corpo de interface
Matriz de forma explicita :
explicit-shape array (5.1.2.5.1) : Uma matriz com nome que declarada com os limites explcitos
Expresso:
expression (2.4.3.2, 7.1) : Uma sequncia de operandos, operadores e parnteses (R722). Ela pode ser uma
varivel, uma constante, uma referncia de funo ou representar um clculo
Tipo estendido :
extended type (4.5.6) : Um tipo extensvel que uma extenso de outro tipo. Um tipo que declarado com o
atributo EXTENDS
Tipo extensvel :
extensible type (4.5.6) : Um tipo do qual novos tipos podem ser derivados usando o atributo EXTENDS. Um
tipo no sequncia que no pode ter o atributo BIND
Tipo extenso :
extension type (4.5.6) : Um tipo base um tipo extenso de si mesmo somente. Um tipo estendido um tipo
extenso de si mesmo e de todos os tipos para os quais seu tipo raiz uma extenso
Extenso :
extent (2.4.5) : O tamanho de uma dimenso de uma matriz
Arquivo externo :
external file (9.2) : Uma sequncia de registros que existe em um meio esterno de um programa
Ligao externa :
external linkage : A caractersticas descrevendo que a entidade C global ao programa; definida na clausula
6.2.2 do padro C
Procedimento externo :
external procedure (2.2.3.1) : Um procedimento que definido por um subprograma externo ou por meios
diferentes do Fortran
Subprograma externo :
external subprogram (2.2) : Um subprograma que no um programa principal, mdulo ou outro
subprograma. Note que um mdulo no chamado de subprograma. Note que no FRORTRAN 77, uma unidade
programa dados em bloco chamada de subprograma
Unidade externa :
external unit (9.4) : Um mecanismo que usado para referir a um arquivo externo. Ela identificada por um
inteiro no negativo
Arquivo :
file (9) : Um arquivo interno ou um arquivo externo
Unidade de armazenamento de arquivo
file storage unit (9.2.4) : A unidade de armazenamento para um arquivo no formatado ou em fluxo
Sub-rotina final :
final subroutine (4.5.5) : Uma sub-rotina que chamada automaticamente por um processador durante a
finalizao
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 388
Finalizvel :
finalizable (4.5.5) : Um tipo que uma sub-rotina final ou que tem um componente finalizvel. Um objeto do
tipo finalizvel
Finalizado :
finalization (4.5.5.1) : O processo de chamar uma sub-rotina final definida pelo usurio antes da destruio do
objeto
Funo:
function (2.2.3) : Um procedimento que invocado em uma expresso e calcula o valor que utilizado na
avaliao da expresso
Resultado de funo :
function result (12.5.2.1) : O objeto de dado que retorna o valor de uma funo
Subprograma funo :
function subprogram (12.5.2.1) : Uma sequncia de instrues iniciando com a instruo FUNCTION que
no est num bloco de interface e terminado com a correspondente instruo END
Identificador genrico :
generic identifier (12.3.2.1) : Um totem lxico que aparece em uma instruo INTERFACE e associado
com todos os procedimentos no bloco de interface
Interface genrica :
generic interface (4.5.1, 12.3.2.1) : Uma interface especificada por uma ligao de procedimento genrico
ou um bloco de interface genrico
Bloco de interface genrica :
generic interface block (12.3.2.1) : Um bloco de interface com uma especificao genrica
Entidade global :
global entity (16.1) : Uma entidade com um identificador cujo escopo um programa
Hospedeiro:
host (2.2) : Unidade de escopo hospedeira
Associao de hospedagem :
host association (16.4.1.3) : O processo pelo qual a unidade de escopo contida acessa entidades no seu
hospdedeiro
Unidade de escopo hospedeira :
host scoping unit (2.2) : Uma unidade de escopo que imediatamente envolve outra unidade de escopo
Interface implcita :
implicit interface (12.3.1) : Para um procedimento referenciado em uma unidade de escopo, a propriedade de
no ter uma interface explcita. Uma funo instruo sempre tem uma interface implcita
Herana :
inherit (4.5.6) : Adquirir de uma raiz. Parmetros de tipo, componentes ou ligaes de procedimentos de um
tipo estendido que so automaticamente adquiridos de seu tipo raiz sem que declarao explcita no tipo estendido
declare que foram herdados
Associao de herana :
inheritance association (4.5.6.1, 16.4.4) : O relacionamento entre os componentes herdados e o
componente raiz em um tipo estendido
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 389
Funo de inquisio :
inquiry function (13.1) : Uma funo que intrnseca ou definida em um mdulo intrnseco e cujo resultado
depende das propriedades de um ou mais de seus argumentos em vez de seus valores
Instncia de um subprograma
instance of a subprogram (12.5.2.3) : Uma cpia de um subprograma que criada quando um
procedimento definido por um subprograma invocado
Inteno :
intent (5.1.2.7) : Uma atributo de um objeto de dado mudo que indica se ele usado para transferir dados para
dentro do procedimento, para fora do procedimento, ou ambos
Bloco de interface :
interface block (12.3.2.1) : Uma sequncia de instrues entre a instruo INTERFACE at a correspondente
instruo END INTERFACE
Corpo de interface :
interface body (12.3.2.1) : Uma sequncia de instrues em um bloco de interface em uma instruo
FUNCTION ou SUBROUTINE at a correspondente instruo END.
Interface de um procedimento :
interface of a procedure (12.3) : Veja interface de procedimento
Arquivo interno :
internal file (9.3) : Uma varivel caractere que usada para transferir e converter dados de um armazenamento
interno para um armazenamento interno
Procedimento interno :
internal procedure (2.2.3.3) : Um procedimento que definido por um subprograma interno
Subprograma interno :
internal subprogram (2.2) : Um subprograma em um programa principal ou em outro subprograma
Interopervel :
interoperable (15.2) : A propriedade de uma entidade Fortran que garante que uma entidade equivalente pode
ser definida por meio do C
Intrnseco :
intrinsic (2.5.7) : Um adjetivo que pode ser aplicado a tipos, operadores, instrues de atribuio,
procedimentos e mdulos. Tipos intrnsecos, operadores e instrues de atribuio so definidos neste padro e
podem ser usados em qualquer unidade de escopo sem nenhuma definio ou especificao adicional.
Procedimentos intrnsecos so definidos neste padro ou providos pelo processador e podem ser usados sem uma
unidade de escopo sem nenhuma definio ou especificao adicional. Mdulos intrnsecos so definidos neste
padro ou providos pelo processador e podem ser acessados por associao de uso; procedimentos e tipos definidos
em um mdulo intrnseco no so por si prprio intrnsecos
Procedimentos intrnsecos e mdulos que no so definidos neste padro so chamados de procedimentos
intrnsecos no padro e mdulos intrnsecos no padro.
Invoca :
invoke (2.2.3) :
1. chamar uma sub-rotina por uma instruo CALL ou por uma instruo de atribuio definida
2. chamar uma funo por uma referncia ao seu nome ou operador durante a avaliao de uma expresso
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 390
Palavra-chave :
keyword (2.5.2) : Uma palavra que parte da sintaxe de uma instruo ou um nome que usado para
identificar um item numa lista
Parmetro de tipo subtipo :
kind type parameter (2.4.1.1, 4.4.1, 4.4.2, 4.4.3, 4.4.4, 4.4.5) : Um parmetro cujos valores
identificam os subtipos disponveis de um tipo intrnseco
Rtulo :
label : Veja rtulo de instruo
Comprimento de uma cadeia de caracteres :
length of a character string (4.4.4) : O nmero de caracteres em um string caractere
Totem lxico :
lexical token (3.2) : Uma sequncia de um ou mais caracteres com uma interpretao especfica
Linha :
line (3.3) : Uma sequncia de 0 at 132 caracteres, que pode conter instrues Fortran, comentrios ou uma linha
INCLUDE
Ligado :
linked (12.5.3) : Quando uma funo C com ligao externa tem o mesmo rtulo de ligao que o procedimento
Fortran, eles so ditos estar ligados. tambm possvel que duas entidades a Fortran sejam ligadas
Constante literal :
literal constant (2.4.3.1.2, 4.4) : Uma constante sem um nome. Note que no FORTRAN 77, ela
simplesmente chamada de constante
Entidade local :
local entity (16.2) : Uma entidade identificada por um totem lxico cujo escopo a unidade de escopo
Varivel local :
local variable (2.4.3.1.1) : Uma varivel local em uma unidade de escopo particular; no importada por
associao de uso ou hospedagem, no um argumento mudo e no uma varivel num comum
Programa principal :
main program (2.3.4, 11.1) : Um programa principal Fortran ou um substituto definido por outro meio que
no o Fortran
Seo de matriz muitas-para-uma :
many-one array section (6.2.2.3.2) : Uma seo de matriz com um subscrito vetor tendo dois ou mais
elementos com o mesmo valor
Mdulo :
module (2.2.4, 11.2) : Uma unidade de programa que contm ou acessa definies para ser acessadas por
outras unidades de programa
Procedimento mdulo :
module procedure (2.2.3.2) : Um procedimento que definido em um subprograma mdulo
Subprograma mdulo :
module subprogram (2.2) : Um subprograma que est num mdulo mas no um subprograma interno
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 391
Nome :
name (3.2.1) : Um totem lxico consistindo de letras seguidas por at 62 caracteres alfanumricos (letras,
dgitos e sublinha). Note que no FORTRAN 77, isto chamado de nome simblico
Associao de nome :
name association (16.4.1) : Associao de argumento, associao de uso ou associao de hospedagem
Com nome :
named : Que tem um nome. Isto , em uma frase como varivel com nome a palavra a expresso com nome
significa que o nome da varivel no qualificada por uma lista de subscrito, especificao de de subscrito e assim
por diante. Por exemplo, se X uma varivel de matriz, a referncia X uma varivel com nome enquanto a
referncia X(1) um designador de objeto
Constante com nome :
named constant (2.4.3.1.2) : Uma constante que tem um nome. Note que no FORTRAN 77, isto chamado
de constante simblica
NaN :
NaN (14.7) : O valor no-um-nmero da aritmtica IEEE. Ele representa um valor no determinado ou um valor
criado por uma operao invlida
Instruo no executvel :
nonexecutable statement (2.3.1) : Uma instruo usada para configurar o ambiente do programa na qual
aes computacionais so realizadas
Unidade de armazenamento numrica :
numeric storage unit (16.4.3.1) : A unidade de armazenamento para conter um escalar que no um
ponteiro e s tipo real default, inteiro default ou lgico default
Tipo numrico :
numeric type (4.4) : Tipo inteiro, real ou complexo
Objeto :
object (2.4.3.1) : Objeto de dado
Designador de objeto :
object designator (2.5.1) : Um designador para um objeto de dado
Caracterstica obsoleta :
obsolescent feature (1.8) : Uma caracterstica que considerada ser redundante mas que ainda permanece
sendo muito utilizada
Operando :
operand (2.5.8) : Uma expresso que precede ou sucede um operador
Operao :
operation (7.1.2) : Um clculo envolvendo um ou dois operandos
Operador :
operator (2.5.8) : Um totem lxico que especifica uma operao
Sobrescrever :
override (4.5.1, 4.5.6) : Quando uma inicializao explcita ou inicializao default sobrescreve a
inicializao default, isto como se somente a inicializao que sobrescreve tivesse sido especificada. Se um
procedimento ligado a um tipo extensvel, ele sobrescreve o que foi herdado do tipo raiz
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 392
Componente raiz :
parent component (4.5.6.1) : O componente de uma entidade do tipo extensvel que corresponde a sua parte
herdada
Tipo raiz :
parent type (4.5.6) : O tipo extensvel do qual um tipo estendido foi derivado
Argumento mudo objeto passado :
passed-object dummy argument (4.5.1) : O argumento mudo de um procedimento ligado ao tipo ou
componente ponteiro de procedimento que se torna associado com o objeto atravs do qual o procedimento
invocado
Ponteiro :
pointer (2.4.6) : Uma entidade que tem o atributo POINTER
Atribuio de ponteiro :
pointer assignment (7.4.2) : Uma associao de um ponteiro com um alvo pela execuo de uma instruo
de atribuio de ponteiro ou a execuo de uma instruo de atribuio para um objeto de dado do tipo derivado
tendo um ponteiro como subobjeto
Instruo de atribuio de ponteiro :
pointer assignment statement (7.4.2) : Uma instruo da forma pointer-object => target
Ponteiro associado :
pointer associated (6.3, 7.4.2) : O relacionamento entre um ponteiro e o alvo depois de uma atribuio de
ponteiro ou a execuo vlida de uma instruo ALLOCATE
Associao de ponteiro :
pointer association (16.4.2) : O processo pelo qual um ponteiro se torna ponteiro associado com um alvo
Polimrfico :
polymorphic (5.1.1.2) : Capaz de se tornar tipos diferentes durante a execuo do programa. Um objeto
declarado com a palavra-chave CLASS polimrfico
Pr-conectado :
preconnected (9.4.4) : Uma propriedade descrevendo uma unidade que conectada a um arquivo externo no
incio da execuo do programa. Este tipo de unidade pode ser especificada em instrues de entrada/sada sem que
uma instruo OPEN seja executada para esta unidade
Procedimento :
procedure (2.2.3, 12.1) : Um clculo que pode ser invocado durante a execuo do programa. Ele pode ser
uma funo ou uma sub-rotina. Ele pode ser um procedimento intrnseco, um procedimento externo, um
procedimenti mdulo, um procedimento interno, um procedimento mudo ou um funo instruo. Um subprograma
pode definir mais de um procedimento se ele contm uma instruo ENTRY
Designador de procedimento :
procedure designator (2.5.1) : Um designador para um procedimento
Interface de procedimento :
procedure interface (12.3) : As caractersticas de um procedimento, o nome de um procedimento, o nome de
cada argumento mudo e os identificadores genricos (se existir) pelo qual ele pode ser referenciado
Processador :
processor (1.2) : A combinao de um sistema de computao e o mecanismo pelo qual programas so
transformados para uso neste sistema de computao
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 393
Dependente do processador :
processor dependent (1.5) : A designao dada a um facilidade que no completamente especificada por
este padro. Este tipo de facilidade pode ser provido por um processador, com mtodos ou semnticas determinada
pelo processador
Programa :
program (2.2.1) : Um conjunto de unidades de programa que inclu exatamente um programa principal
Unidade de programa :
program unit (2.2) : O componente fundamental de um programa. Uma sequncia de instrues, comentrios e
linhas INCLUDE. Ela pode ser um programa principal, um mdulo, um subprograma externo ou uma unidade de
programa dados em bloco
Prottipo :
prototype : O anlogo C de um corpo de interface de uma funo; definido em 6.7.5.3 no padro C
Procedimento puro :
pure procedure (12.6) : Um procedimento que um procedimento intrnseco puro (13.1), definido por um
subprograma puro ou uma funo instruo que referencia somente funes puras
Nmero de dimenses :
rank (2.4.4, 2.4.5) : O nmero de dimenses de uma matriz. Zero para um escalar
Registro :
record (9.1) : Uma sequncia de valores ou caracteres que tratado como um todo dentro do arquivo
Referncia :
reference (2.5.6) : A utilizao de um designador de objeto em um contexto que requer o valor naquele ponto
durante a execuo, a utilizao de um nome de procedimento, seu smbolo de operador ou uma instruo de
atribuio definida em um contexto que requer a execuo do procedimento naquele ponto ou a utilizao de um
nome de mdulo em uma instruo de uso. Nem o ato de definir uma varivel nem a utilizao do nome de um
procedimento como um argumento real considerado como uma referncia
Varivel resultado :
result variable (2.2.3, 12.5.2.1) : A varivel que retorna o valor de uma funo
Modo de arredondamento :
rounding mode (14.3, 10.6.1.2.6) : O mtodo usado para escolher o resultado de uma operao que no
pode ser representada exatamente. Na aritmtica IEEE, existem quatro modos: o mais perto (nearest), para zero
(towards zero), para cima (up) (em direo ao ) e para baixo (down) (em direo a ). Adicionalmente, para
entrada/sada dois modos adicionais so providos: COMPATIBLE e PROCESSOR DEFINED
Escalar :
scalar (2.4.4) :
1. um nico valor (single datum) que no uma matriz
2. no tem a propriedade de ser uma matriz
Escopo :
scope (16) : A parte do programa dentro da qual um totem lxico tem uma nica interpretao. Ele pode ser um
programa, uma unidade de escopo, uma construo, uma nica instruo ou parte de uma instruo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 394
Unidade de escopo :
scoping unit (2.2) : Um dos seguintes:
1. uma unidade de programa ou subprograma, excluindo qualquer unidades de escopo dentro dele
2. a definio de um tipo derivado
3. um corpo de interface, excluindo qualquer unidade de escopo dentro dele
Subscrito de seo :
section subscript (6.2.2) : Um subscrito, subscrito vetor ou subscrito tripleto em um seletor de seo de
matriz
Seletor :
selector (6.1.1, 6.1.2, 6.1.3, 8.1.3, 8.1.4) : Um mecanismo sinttico para designar
1. pare de um objeto de dado. Ele pode designar um substring, um elemento de matriz, uma seo de matriz
ou um componente de estrutura
2. o conjunto de valores para o qual um bloco CASE executado
3. o objeto cujo tipo determina qual dos ramos de uma construo SELECT TYPE executado
4. o objeto que associado com o associate-name em uma construo ASSOCIATE
Forma :
shape (2.4.5) : O nmero de dimenses e extenso de uma matriz. A forma pode ser representada por uma
matriz unidimensional cujos elementos so as extenses em cada dimenso
Tamanho :
size (2.4.5) : O nmero total de elementos em uma matriz
Expresso de especificao :
specification expression (7.1.6) : Uma expresso com limitaes que fazem elas adaptveis para uso em
especificaes tais como parmetros de tipo comprimento ou limites de matriz
Funo de especificao :
specification function (7.1.6) : Uma funo no intrnseca que pode ser usada em uma expresso de
especificao
Programa conforme com o padro :
standard-conforming program (1.5) : Um programa que usa somente aquelas formas e relacionamentos
descritos neste padro e que tem uma interpretao de acordo com este padro
Instruo :
statement (3.3) : Uma sequencia de totens lxicos. Ela usualmente consiste de uma nica linha, mas uma
instruo pode ser continuada de uma linha at outra e o smbolo ponto e vrgula (semicolon) pode ser usado para
separar instrues dentro de um linha
Entidade instruo :
statement entity (16) : Uma entidade identificada por um totem lxico cujo escopo uma instruo nica ou
parte de uma instruo
Funo instruo :
statement function (12.5.4) : Um procedimento especificado por uma nica instruo que similar em forma a uma nica
instruo
Rtulo de instruo :
statement label (3.2.4) : Um totem lxico consistindo de at cinco dgitos que precede a instruo e pode ser
usado para referir a instruo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 395
Associao de armazenamento :
storage association (16.4.3) : O relacionamento entre duas sequncias de armazenamento se a unidade de
armazenamento de uma a mesma que a unidade de armazenamento da outra
Sequncia de armazenamento :
storage sequence (16.4.3.1) : Uma sequncia de unidades de armazenamento consecutivas
Unidade de armazenamento :
storage unit (16.4.3.1) : Uma unidade de armazenamento, uma unidade de armazenamento numrica, uma
unidade de armazenamento de arquivo ou uma unidade de armazenamento no especificada
Passo :
stride (6.2.2.3.1) : O incremento especificado em um subscrito tripleto
Struct :
struct : O anlogo C de uma sequncia de tipo derivado; definida em 6.2.5 no padro C
Estrutura :
structure (2.4.1.2) : Um objeto de dado escalar do tipo derivado
Componente de estrutura :
structure component (6.1.2) : Uma parte de um objeto do tipo derivado. Ele pode ser referenciado por um
designador de objeto
Construtor de estrutura :
structure constructor (4.5.9) : Um mecanismo sinttico para construir um valor do tipo derivado
Subcomponente :
subcomponent (6.1.2) : Um subcomponente de um objeto do tipo derivado um componente deste objeto ou
de um subobjeto deste objeto
Subobjeto :
subobject (2.4.3.1) : Uma poro de um objeto de dado que pode ser referenciado ou definido
independentemente de outros pores. Ele pode ser um elemento de matriz, uma seo de matriz, um componente
de estrutura, um substring ou a parte real ou complexa de um objeto complexo
Subprograma :
subprogram (2.2) : Um subprograma funo ou um subprograma sub-rotina. Note que no FORTRAN 77, uma
unidade de programa dados em bloco foi chamada de um subprograma
Sub-rotina :
subroutine (2.2.3) : Um procedimento que invocado pela instruo CALL ou por uma instruo de atribuio
definida
Subprograma sub-rotina :
subroutine subprogram (12.5.2.2) : Uma sequncia de instrues que inicia com a instruo
SUBROUTINE que no est em um bloco de interface e termina com a correspondente instruo END
Subscrito :
subscript (6.2.2) : Uma das expresses inteira escalar da lista em um seletor de elemento de matriz. Note que
no FORTRAN 77, a lista toda foi chamada de subscrito
Subscrito tripleto :
subscript triplet (6.2.2) : Um item em uma lista de um seletor de seo de matriz que contm um dois pontos
(colon) e especifica uma sequncia regular de valores inteiros
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 396
Substring :
substring (6.1.1) : Uma poro contgua de uma cadeia de caracteres escalar. Note que uma seo de matriz
pode incluir um seletor de substring; o resultado chamado de seo de matriz e no de substring
Alvo :
target (2.4.6, 5.1.2.14, 6.3.1.2) : Uma entidade de dados que tem o atributo TARGET ou uma entidade que
est associada com um ponteiro
Funo Transformacional :
transformational function (13.1) : Uma funo que intrnseca ou definida em um mdulo intrnseco e
que no uma funo elementar nem uma funo inquisitria
Tipo :
type (2.4.1) : Uma categoria de dados com nome que categorizada por um conjunto de valores, junto com uma
maneira de denotar estes valores e uma coleo de operaes que interpreta e manipula os valores. O conjunto de
valores de dados depende dos valores dos parmetros de tipos
Procedimento ligado ao tipo :
type-bound procedure (4.5.4) : Um procedimento ligado a uma definio de tipo. O procedimento pode ser
referenciado por um binding-name via qualquer objeto deste tipo dinmico, como um operador definido, por
atribuio definida ou como parte de um processo de finalizao
Compatvel em tipo :
type compatible (5.1.1.2) : Todas as entidades so compatveis em tipo com outras entidades do mesmo tipo.
Entidades polimrficas ilimitada so compatveis em tipo com todas as entidades; outras entidades polimrficas so
compatveis em tipo com entidades cujo tipo dinmico um tipo extensvel da entidade polimrfica declarada
Instruo de declarao de tipo :
type declaration statement (5) : Uma instruo INTEGER, REAL, DOUBLE PRECISION, COMPLEX,
CHARACTER, LOGICAL ou TYPE (type-name)
Parmetro de tipo :
type parameter (2.4.1.1) : Um parmetro de um tipo de dado. KIND e LEN so os parmetros de tipo dos
tipo intrnsecos. Os parmetros de tipo do tipo derivado so definidos em uma definio de tipo derivado
Ordem do parmetro de tipo :
type parameter order (4.5.2.1) : A ordem dos parmetros de tipo de um tipo derivado que usado para nos
especificadores de tipo derivado
Componente ltimo :
ultimate component (4.5) : Para uma estrutura, um componente que de um tipo intrnseco, tem o atributo
ALLOCATABLE ou o atributo POINTER ou um componente ltimo de um componente tipo derivado que no tem
o atributo POINTER ou o atributo ALLOCATABLE
Indefinido :
undefined (2.5.5) : Para um objeto, a propriedade de no ter um valor determinado
No sinalizado :
unsigned : Um qualificador de um tipo numrico C indicando que ele s pode ter valores no negativos;
definido em 6.2.5 do padro C. No h nada anlogo no Fortran
Unidade de armazenamento no especificada :
unspecified storage unit (16.4.3.1) : Uma unidade de armazenamento para conter um ponteiro ou um
escalar que no um ponteiro e de um tipo diferente de inteiro default, caractere default, real default, real com
preciso dupla, lgico default ou complexo default
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 397
Associao de uso :
use association (16.4.1.2) : A associao de nomes em diferentes unidades de escopo especificada por uma
instruo USE
Varivel :
variable (2.4.3.1.1) : Um objeto de dado cujo valor pode ser definido e redefinido durante a execuo de um
programa. Ela pode ser um objeto de dado com nome, um elemento de matriz, uma seo de matriz, um
componente de estrutura ou um substring. Note que no FORTRAN 77, uma varivel era sempre escalar e com
nome
Subscrito vetor :
vector subscript (6.2.2.3.2) : Uma seo de subscrito que uma expresso inteira unidimensional
Vazio :
void : Um tipo do C consistindo de um conjunto vazio de valores; definido em 6.2.5 do padro C. Noh nada
anlogo no Fortran
Matriz inteira :
whole array (6.2.1) : Uma matriz com nome
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 398
Anexo B (Informativo)
Annex B (Informative)
Caractersticas Decrescidas
Decremental features
B.1 Caractersticas Removidas
B.1 Deleted features
As caractersticas removidas so aquelas caractersticas do Fortran 90 que so redundantes e consideradas
como largamente no usadas. A seco 1.8.1 descreve a natureza das caractersticas removidas. As caractersticas
do Fortran 90 que no esto contidas neste padro so as seguintes:
1. variveis real e preciso dupla no DO
a capacidade presente no FORTRAN 77 e por consistncia tambm no Fortran 90, de uma varivel no DO
ser do tipo real ou preciso dupla em adio ao tipo inteiro, foi removida. Um resultado similar pode ser
obtido pelo uso de uma construo DO sem controle na quantidade de iteraes no loop e com um teste de
sada apropriado
2. desvio para uma instruo END IF vindo de fora do bloco do IF
no FORTRAN 77 e por consistncia tambm no Fortran 90, era possvel desviar para uma instruo END
IF vindo de fora da construo IF; isto foi removido. Um resultado similar pode ser obtido fazendo-se um
desvio para uma instruo CONTINUE que est colocada imediatamente depois da instruo END IF
3. instruo PAUSE
a instruo PAUSE, presente no FORTRAN 66, FORTRAN 77 e por consistncia tambm no Fortran 90,
foi removida. Um resultado similar pode ser obtido escrevendo-se uma mensagem na unidade apropriada,
seguida por uma leitura na unidade apropriada
4. instrues ASSIGN e atribuio GO TO e especificadores de formato de atribuio
a instruo ASSIGN e a instruo relacionada atribuio GO TO, presente no FORTRAN 66, FORTRAN
77 e por consistncia tambm no Fortran 90, foi removida. Alm disto, a capacidade de usar um inteiro
designado como um formato, presente no FORTRAN 77 e Fortran 90, foi removido. Um resultado similar
pode ser obtido pelo uso de outra construo de controle em vez de uma instruo de atribuio GP TO e
pelo uso de uma varivel caractere default para conter a especificao do formato em vez de do uso do
inteiro atribudo
5. H edit descriptor.
No FORTRAN 77 e por consistncia tambm no Fortran 90, existia uma forma alternativa de descritor de
edio caractere que era a nica forma existente para o descritor de edio caractere no FORTRAN 66; isto
foi removido. Um resultado similar pode ser obtido pelo uso de descritor de edio cadeia de caracteres
O que segue uma lista de edies prvias do padro Fortran internacional, junto com seus nomes
informais:
ISO/IEC 1539:1972 Fortran 66
ISO/IEC 1539:1978 Fortran 77
ISO/IEC 1539:1991 Fortran 90
ISO/IEC 1539-1:1997 Fortran 95
Veja o padro Fortran 90 para regras detalhadas destas de como estas caractersticas removidas trabalham.
B.2 Caractersticas Obsoletas
B.2 Obsolescent features
As caractersticas obsoletas so as caractersticas do Fortran 90 que so redundantes e para as quais
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 399
mtodos melhores esto disponveis no Fortran 90. A seo 1.8.2 descreve a natureza das caractersticas obsoletas.
As caractersticas obsoletas neste padro so as seguintes:
1. IF aritmtico use a instruo IF (8.1.2.4) ou a construo IF (8.1.2)
2. trmino compartilhado de DO e trmino em uma instruo diferente da instruo END DO ou CONTINUE
use a instruo END DO ou uma instruo CONTINUE para cada instruo DO
3. retorno alternativo veja B.2.1
4. instruo calculada GO TO veja B.2.2
5. funes instruo vela B.2.3
6. instrues DATA no meio de instrues executveis veja B.2.4
7. funes caractere de comprimento assumido veja B.2.5
8. cdigos fontes no formato fixo veja B.2.6
9. forma CHARACTER* da declarao CHARACTER veja B.2.7
B.2.1 Caractersticas Obsoletas
B.2.1 Obsolescent features
Um retorno alternativo introduz rtulos em uma lista de argumentos para permitir ao procedimento
chamado controlar a execuo de uma ao quando retornar. O mesmo efeito pode ser obtido com um cdigo de
retorno que usado em uma construo CASE no retorno. Isto evita uma irregularidade na sintaxe e na semntica
da associao de argumentos. Por exemplo,
CALL SUBR_NAME(X, Y, Z, *100, *200, *300)
pode ser trocado por
CALL SUBR_NAME(X, Y, Z, RETURN_CODE)
SELECT CASE (RETURN_CODE)
CASE (1)
...
CASE (2)
...
CASE (3)
...
CASE DEFAULT
...
END SELECT
B.2.2 Instruo GO TO Calculada
B.2.2 Computed GO TO statement
O GO TO calculado foi trocado pela construo CASE que mais geral, mais fcil de uso e um meio mais
eficiente de expressar o mesmo clculo.
B.2.3 Funes Instruo
B.2.3 Statement functions
Funes instruo esto sujeitas a um nmero de restries no intuitivas e so um fonte potencial de erros
porque sua sintaxe facilmente confundida com uma instruo de atribuio.
A funo interna mais geral do que a funo instruo e a substitui completamente.
B.2.4 Instrues DATA entre Executveis
B.2.4 DATA statements among executables
As regras de ordenamento de instruo do FRORTAN 66 e por esta razo do FORTRAN 77 e Fortran 90
por compatibilidade, permite que instrues DATA apaream em qualquer local em uma unidade de programa
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 400
depois das instrues de especificao. A capacidade de posicionar as instrues DATA entre instrues executveis
muito raramente necessria e uma fonte potencial de erros.
B.2.5 Funes Comprimento Caractere Assumidas
B.2.5 Assumed character length functions
Comprimento caractere assumido para funes uma irregularidade na linguagem por isto a filosofia do
Fortran tal que atributos do resultado de uma funo dependem somente dos argumentos reais da invocao e de
qualquer dados acessvel funo, onde o comprimento do resultado da funo declarado em uma expresso de
especificao. Outros usos podem ser trocados pelo uso de uma sub-rotina cujos argumentos correspondem ao
resultado da funo e argumentos da funo.
Note que argumentos mudos de uma funo podem ter comprimento caractere assumido.
B.2.6 Cdigo Fonte na Forma Fixa
B.2.6 Fixed form source
Cdigos fontes no formato fixo foi projetado quando o principal meio de entrada lido por uma mquina
para novos programas era o carto perfurado. Agora que novos e melhores programas so geralmente entrados via
teclado onde se dispe de um monitor, este formato uma sobrecarga desnecessria e potencialmente uma fonte de
erros por ter as posies 6, 7 e 72 numa linha. Cdigo fontes em formato livre foi projetado expressamente para a
tecnologia mais moderna.
uma questo simples para uma ferramenta de software converter uma formato fixo num formato livre.
B.2.7 Forma CHARACTER* para a Declarao CHARACTER
B.2.7 CHARACTER* form of CHARACTER declaration
Fortran 90 tem duas forma diferentes de especificar o seletor de comprimento em uma declarao
CHARACTER. A forma mais antiga ( CHARACTER *char-length ) redundante.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 401
Anexo C (Informativo)
Annex C (Informative)
Notas Estendidas
Extended notes
C.1 Notas da Seo 4
C.1 Section 4 notes
C.1.1 Tipos Intrnseco e Derivado (4.4, 4.5)
C.1.1 Intrinsic and derived types (4.4, 4.5)
FORTRAN 77 prov somente tipos explcitos no padro (lgico, inteiro, real, preciso dupla, complexo e
caractere). Este padro prov este tipos intrnsecos e prov tipos derivados que permite a criao de novos tipo.
Uma definio de tipo derivado especifica uma estrutura de dado consistindo de componentes do tipos intrnsecos e
de tipos derivados. Este tipo de definio no representa um objeto de dado, mas em vez disto, um modelo ( a
template) para declarao de objetos com nome deste tipo derivado. Por exemplo, a definio
TYPE POINT
INTEGER X_COORD
INTEGER Y_COORD
END TYPE POINT
especifica um novo tipo derivado chamado POINT que composto de dois componentes do tipo intrnseco inteiro
(X_COORD e Y_COORD). A instruo TYPE(POINT) FIRST, LAST declara dois objetos de dados, FIRST e LAST, que
pode conter valores do tipo POINT.
O FORTRAN 77 prov tipos intrnsecos REAL e DOUBLE PRECISION como uma aproximao dos
nmeros reais matemticos. Este padro generaliza REAL como um tipo intrnseco com um parmetro de tipo que
seleciona o mtodo de aproximao. O parmetro de tipo chamado de subtipo (kind) e tem valores que so
dependente do processador. DOUBLE PRECISION tratado como um sinnimo para REAL(k) (que
preferencialmente deve ser escrito assim: REAL(kind=k)), onde k o valor do parmetro de tipo subtipo (kind type
parameter value) definido pelo processador KIND (0.0D0).
Constantes literais reais podem ser especificadas com um parmetro de tipo subtipo (kind type parameter)
para garantir que elas possuem um valor de parmetro de tipo subtipo particular (4.4.2).
Por exemplo, com as especificaes
INTEGER Q
PARAMETER(Q = 8)
REAL(Q) B
a constante literal 10.93_Q tem a mesma preciso que a varivel B.
O FORTRAN 77 no permitia cadeias de caracteres de comprimento zero (zero-length character strings). Eles
so permitidos por este padro(4.4.4).
Objetos so de tipos derivados diferentes se eles so declarados usando definies de tipo derivado
diferentes. Por exemplo,
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 402
TYPE APPLES
INTEGER NUMBER
END TYPE APPLES
TYPE ORANGES
INTEGER NUMBER
END TYPE ORANGES
TYPE (APPLES) COUNT1
TYPE (ORANGES) COUNT2
COUNT1 = COUNT2 ! instrues erradas misturando apples e oranges
Mesmo que todos os componentes dos objetos do tipo APPLES e objetos do tipo ORANGES tenham tipos
intrnsecos idnticos, os objetos so de tipos diferentes.
C.1.2 Seleo dos Mtodos de Aproximao(4.4.2)
C.1.2 Selection of the approximation methods (4.4.2)
Pode-se selecionar o mtodo de aproximao real para um programa inteiro pelo uso de um mdulo e o tipo
real parametrizado. Isto realizado pela definio de uma constante inteira com nome que tem um valor de
parmetro de tipo subtipo (kind type parameter value) particular e usando esta constante com nome em todos as
declaraes de reais, complexos e tipos derivados. Por exemplo, instrues de especificao
INTEGER, PARAMETER :: LONG_FLOAT = 8
REAL(LONG_FLOAT) X, Y
COMPLEX(LONG_FLOAT) Z
especificam que o mtodo de aproximao correspondendo a um valor de parmetro de tipo subtipo ( kind type
parameter value) de 8 disponibilizado para os objetos de dados X, Y e Z na unidade de programa. O valor do
parmetro de tipo subtipo LONG_FLOAT pode ser feito disponvel a um programa inteiro colocando-se a
instruo de especificao INTEGER em um mdulo e acessando a constante com nome LONG_FLOAT com uma
instruo de uso (USE statement). Note que pela mudana de 8 para 4 uma nica vez no mdulo, um mtodo de
aproximao diferente selecionado.
Para evitar o uso de valores dependente do processador 4 e 8, troque 8 por KIND (0.0) ou KIND (0.0D0).
Outra maneira para evitar estes valores dependente do processador selecionar o valor do subtipo (kind value)
usando a funo de inquisio intrnseca SELECTED_REAL_KIND. Nesta funo, usando-se os argumentos
inteiros P e R especifica-se requerimento mnimos para a preciso decimal e intervalo do expoente decimal,
respectivamente, retorna o valor do parmetro de tipo subtipo do mtodo de aproximao que tem pelo menos P
dgitos decimais de preciso e pelo menos um intervalo para nmeros positivos de 10
R
at 10
R
. Na instruo
de especificao anterior, o 8 pode ser trocado, por exemplo por, SELECTED_REAL_KIND(10,50), que requer a
seleo de um mtodo de aproximao com pelo menos 10 dgitos decimais e um intervalo de 10
50
at 10
50
.
No existe magnitude ou restries de ordem colocadas nestes valores de subtipos ( kind values), de forma que
implementadores podem ter flexibilidade em atribuir tais valores e pode adicionar novos subtipos sem mudar
valores de subtipos previamente atribudos.
Como s valores de subtipo (kind values) no tem significado portveis, uma boa prtica us-los em
programas somente por meio de constantes com nome como descrito anteriormente (por exemplo, SINGLE,
IEEE_SINGLE, DOUBLE e QUAD), em vez de usar os valores de subtipo diretamente
C.1.3 Extenso de Tipo e Acessibilidade de Componente (4.5.1.1, 4.5.3)
C.1.3 Type extension and component accessibility (4.5.1.1, 4.5.3)
A acessibilidade default de uma tipo estendido pode ser especificada em uma definio de tipo. A
acessibilidade de seus componentes pode ser especificada individualmente.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 403
module types
type base_type
private !--- define acessibilidade default
integer :: i !--- um componente particular
integer, private :: j !--- outro componente particular
integer, public :: k !--- um componente pblico
end type base_type
type, extends(base_type) :: my_type
private !-- define o default para os componentes particulares em my_type
integer :: l !-- um componente particular
integer, public :: m !-- um componente pblico
end type my_type
end module types
subroutine sub
use types
type(my_type) :: x
. . .
call another_sub( &
x%base_type, & !--- ok porque o tipo base um subobjeto pblico de x
x%base_type%k, & !--- ok porque x%base_type est ok e tem k como um componente pblico
x%k, & !--- ok porque ele uma abreviao pde x%base_type%k
x%base_type%i, & !--- invlido porque i particular
x%i) !--- invlido porque uma abreviao para x%base_type%i
end subroutine sub
C.1.4 Tipos Abstratos
C.1.4 Abstract types
O que segue define um objeto que pode ser em uma janela X:
TYPE, ABSTRACT :: DRAWABLE_OBJECT
REAL, DIMENSION(3) :: RGB_COLOR=(/1.0,1.0,1.0/) ! branco
REAL, DIMENSION(2) :: POSITION=(/0.0,0.0/) ! Centroide
CONTAINS
PROCEDURE(RENDER_X), PASS(OBJECT), DEFERRED :: RENDER
END TYPE DRAWABLE_OBJECT
ABSTRACT INTERFACE
SUBROUTINE RENDER_X(OBJECT, WINDOW)
CLASS(DRAWABLE_OBJECT), INTENT(IN) :: OBJECT
CLASS(X_WINDOW), INTENT(INOUT) :: WINDOW
END SUBROUTINE RENDER_X
END INTERFACE
Nos podemos declarar um tipo no abstrato pela extenso do tipo abstrato:
TYPE, EXTENDS(DRAWABLE_OBJECT) :: DRAWABLE_TRIANGLE ! no ABSTRACT
REAL, DIMENSION(2,3) :: VERTICES ! em relao ao centroide
CONTAINS
PROCEDURE, PASS(TRIANGLE) :: RENDER=>RENDER_TRIANGLE_X
END TYPE DRAWABLE_TRIANGLE
O procedimento de desenho real (actual drawing procedure) ir desenhar um tringulo na WINDOW com
vrtices nas coordenadas x TRIANGLE%POSITION(1)+TRIANGLE%VERTICES(1,:)
e coordenadas y TRIANGLE%POSITION(2)+TRIANGLE%VERTICES(2,:)
SUBROUTINE RENDER_TRIANGLE_X(TRIANGLE, WINDOW)
CLASS(DRAWABLE_TRIANGLE), INTENT(IN) :: TRIANGLE
CLASS(X_WINDOW), INTENT(INOUT) :: WINDOW
...
END SUBROUTINE RENDER_TRIANGLE_X
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 404
C.1.5 Ponteiros (4.5.1)
C.1.5 Pointers (4.5.1)
Ponteiros so nomes que podem mudar dinamicamente sua associao com um objeto alvo. Em um
sentido, uma varivel normal um nome com uma associao fixa com um objeto particular. Um nome de varivel
normal refere-se ao mesmo espao de armazenamento durante o tempo de vida da varivel. Um nome de ponteiro
pode referir a uma espao de armazenagem diferente ou mesmo nenhum espao de armazenamento, em tempos
diferentes. Uma varivel pode ser considerada como um descritor de um espao para conter valores do tipo
apropriado, parmetros de tipo e nmero de dimenses de matriz (array rank) tal que os valores guardados no
descritor so fixos quando a varivel criada. Um ponteiro tambm pode ser considerado como um descritor, mas
um cujo valores podem ser mudados dinamicamente de forma a descrever diferente pedaos de armazenagem.
Quando um ponteiro declarado, espao para manter o descritor criado, mas o espao para o objeto alvo no
criado.
Um tipo derivado pode ter um ou mais componentes que so definidos como sendo ponteiros. Ele pode ter
um componentes que um ponteiro para um objeto do mesmo tipo derivado. Esta definio de dado recursivo
permite estrutura de dados dinmicas tal como uma lista ligada (linked lists), rvores (trees) e grficos (graphs) sejam
criadas. Por exemplo:
TYPE NODE ! define um tipo ''recursivo''
INTEGER :: VALUE = 0
TYPE(NODE), POINTER :: NEXT_NODE => NULL( )
END TYPE NODE
TYPE(NODE), TARGET :: HEAD ! inicializa automaticamente
TYPE(NODE), POINTER :: CURRENT, TEMP ! declara ponteiros
INTEGER :: IOEM, K
CURRENT => HEAD ! CURRENT aponta para o incio da lista (head of list)
DO
READ(*, *, IOSTAT = IOEM) K ! l o prximo valor, se existir
IF(IOEM /= 0) EXIT
ALLOCATE (TEMP) ! cria noca clula em cada iterao
TEMP%VALUE = K ! atribui valor clula
CURRENT%NEXT_NODE => TEMP ! conecta nova clula lista
CURRENT => TEMP ! CURRENT aponta para o novo fim da lista (new end of list)
END DO
Uma lista agora construda e a ltima clula anexada (ligada) contm um ponteiro desassociado. Um loop
pode ser usado para caminhar (walk through ) pela lista.
CURRENT => HEAD
DO
IF(.NOT. ASSOCIATED(CURRENT%NEXT_NODE)) EXIT
CURRENT => CURRENT%NEXT_NODE
WRITE(*, *) CURRENT%VALUE
END DO
C.1.6 Construtores de Estrutura e Nomes Genricos
C.1.6 Structure constructors and generic names
Um nome genrico pode ser do mesmo tipo que um nome de tipo. Isto pode ser usado para emular um
construtor de estrutura definido pelo usurio (user-defined structure constructors) para aquele tipo, mesmo se o tipo
tiver componentes particulares. Por exemplo:
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 405
MODULE mytype_module
TYPE mytype
PRIVATE
COMPLEX value
LOGICAL exact
END TYPE
INTERFACE mytype
MODULE PROCEDURE int_to_mytype
END INTERFACE
! Definies do operador etc.
...
CONTAINS
TYPE(mytype) FUNCTION int_to_mytype(i)
INTEGER,INTENT(IN) :: i
int_to_mytype%value = i
int_to_mytype%exact = .TRUE.
END FUNCTION
! Procedimentos para suportar os operadores etc.
...
END
PROGRAM example
USE mytype_module
TYPE(mytype) x
x = mytype(17)
END
O nome do tipo ainda pode ser usado como um nome genrico se o tipo tem parmetros de tipo. Por
exemplo:
MODULE m
TYPE t(kind)
INTEGER, KIND :: kind
COMPLEX(kind) value
END TYPE
INTEGER,PARAMETER :: single = KIND(0.0), double = KIND(0d0)
INTERFACE t
MODULE PROCEDURE real_to_t1, dble_to_t2, int_to_t1, int_to_t2
END INTERFACE
...
CONTAINS
TYPE(t(single)) FUNCTION real_to_t1(x)
REAL(single) x
real_to_t1%value = x
END FUNCTION
TYPE(t(double)) FUNCTION dble_to_t2(x)
REAL(double) x
dble_to_t2%value = x
END FUNCTION
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 406
TYPE(t(single)) FUNCTION int_to_t1(x,mold)
INTEGER x
TYPE(t(single)) mold
int_to_t1%value = x
END FUNCTION
TYPE(t(double)) FUNCTION int_to_t2(x,mold)
INTEGER x
TYPE(t(double)) mold
int_to_t2%value = x
END FUNCTION
...
END
PROGRAM example
USE m
TYPE(t(single)) x
TYPE(t(double)) y
x = t(1.5) ! Referencia real_to_t1
x = t(17,mold=x) ! Referencia int_to_t1
y = t(1.5d0) ! Referencia dble_to_t2
y = t(42,mold=y) ! Referencia int_to_t2
y = t(kind(0d0)) ((0,1)) ! usa o construtor de estrutura para o tipo t
END
C.1.7 Procedimentos Ligado ao tipo Genrico
C.1.7 Generic type-bound procedures
Exemplo de um tipo derivado com procedimentos ligado ao tipo genrico (generic type-bound procedures):
A nica diferena entre este exemplo e o mesmo coisa reescrita para usar blocos de interface genricas est
dentro dos procedimentos ligado ao tipo (type-bound procedures),
USE(rational_numbers),ONLY :: rational
no junta (does not block) os procedimentos ligado ao tipo (type-bound procedures); o usurio ainda pode acessar a
atribuio definida e estender operaes.
MODULE rational_numbers
IMPLICIT NONE
PRIVATE
TYPE,PUBLIC :: rational
PRIVATE
INTEGER n,d
CONTAINS
! procedimento ligado ao tipo usual
PROCEDURE :: real => rat_to_real

! especifica procedimentos liado ao tipo para suporte genrico
PROCEDURE,PRIVATE :: rat_asgn_i, rat_plus_rat, rat_plus_i
PROCEDURE,PRIVATE,PASS(b) :: i_plus_rat

! procedimento ligado ao tipo genricos
GENERIC :: ASSIGNMENT(=) => rat_asgn_i
GENERIC :: OPERATOR(+) => rat_plus_rat, rat_plus_i, i_plus_rat
END TYPE
CONTAINS
ELEMENTAL REAL FUNCTION rat_to_real(this) RESULT(r)
CLASS(rational),INTENT(IN) :: this
r = REAL(this%n)/this%d
END FUNCTION
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 407
ELEMENTAL SUBROUTINE rat_asgn_i(a,b)
CLASS(rational),INTENT(OUT) :: a
INTEGER,INTENT(IN) :: b
a%n = b
a%d = 1
END SUBROUTINE
ELEMENTAL TYPE(rational) FUNCTION rat_plus_i(a,b) RESULT(r)
CLASS(rational),INTENT(IN) :: a
INTEGER,INTENT(IN) :: b
r%n = a%n + b*a%d
r%d = a%d
END FUNCTION
ELEMENTAL TYPE(rational) FUNCTION i_plus_rat(a,b) RESULT(r)
INTEGER,INTENT(IN) :: a
CLASS(rational),INTENT(IN) :: b
r%n = b%n + a*b%d
r%d = b%d
END FUNCTION
ELEMENTAL TYPE(rational) FUNCTION rat_plus_rat(a,b) RESULT(r)
CLASS(rational),INTENT(IN) :: a,b
r%n = a%n*b%d + b%n*a%d
r%d = a%d*b%d
END FUNCTION
END
C.1.8 Sub-rotinas Finais (4.5.5, 4.5.5.1,4.5.5.2, 4.5.5.3)
C.1.8 Final subroutines (4.5.5, 4.5.5.1, 4.5.5.2, 4.5.5.3)
Exemplo de tipo derivado parametrizado com sub-rotinas finais:
MODULE m
TYPE t(k)
INTEGER, KIND :: k
REAL(k),POINTER :: vector(:) => NULL()
CONTAINS
FINAL :: finalize_t1s, finalize_t1v, finalize_t2e
END TYPE
CONTAINS
SUBROUTINE finalize_t1s(x)
TYPE(t(KIND(0.0))) x
IF(ASSOCIATED(x%vector)) DEALLOCATE(x%vector)
END SUBROUTINE
SUBROUTINE finalize_t1v(x)
TYPE(t(KIND(0.0))) x(:)
DO i=LBOUND(x,1),UBOUND(x,1)
IF(ASSOCIATED(x(i)%vector)) DEALLOCATE(x(i)%vector)
END DO
END SUBROUTINE
ELEMENTAL SUBROUTINE finalize_t2e(x)
TYPE(t(KIND(0.0d0))),INTENT(INOUT) :: x
IF(ASSOCIATED(x%vector)) DEALLOCATE(x%vector)
END SUBROUTINE
END MODULE
SUBROUTINE example(n)
USE m
TYPE(t(KIND(0.0))) a,b(10),c(n,2)
TYPE(t(KIND(0.0d0))) d(n,n)
...
! retorno desta sub-rotina ir efetivamente fazer
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 408
!
CALL finalize_t1s(a)
!
CALL finalize_t1v(b)
!
CALL finalize_t2e(d)
! nenhuma sub-rotina final ser chamada para a varivel c porque o usurio
! omitiu uma definio de procedimento especfico para ela
END SUBROUTINE
Exemplo de tipos estendidos com sub-rotinas finais:
MODULE m
TYPE t1
REAL a,b
END TYPE
TYPE,EXTENDS(t1) :: t2
REAL,POINTER :: c(:),d(:)
CONTAINS
FINAL :: t2f
END TYPE
TYPE,EXTENDS(t2) :: t3
REAL,POINTER :: e
CONTAINS
FINAL :: t3f
END TYPE
...
CONTAINS
SUBROUTINE t2f(x) ! finalizador para os componentes estras de TYPE(t2)
TYPE(t2) :: x
IF (ASSOCIATED(x%c)) DEALLOCATE(x%c)
IF (ASSOCIATED(x%d)) DEALLOCATE(x%d)
END SUBROUTINE
SUBROUTINE t3f(y) ! finalizador para os componentes extras de TYPE(t3)
TYPE(t3) :: y
IF (ASSOCIATED(y%e)) DEALLOCATE(y%e)
END SUBROUTINE
END MODULE
SUBROUTINE example
USE m
TYPE(t1) x1
TYPE(t2) x2
TYPE(t3) x3
...
! Retorno desta sub-rotina no ir fazer efetivamente
! ! nada com x1; ele no finalizvel
! CALL t2f(x2)
! CALL t3f(x3)
! CALL t2f(x3%t2)
END SUBROUTINE
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 409
C.2 Notas da Seo 5
C.2 Section 5 notes
C.2.1 O Atributo Ponteiro (5.1.2.11)
C.2.1 The POINTER attribute (5.1.2.11)
O atributo POINTER tem que ser especificado para declarar um ponteiro. O tipo, parmetros de tipo e
nmero de dimenses (rank) podem ser especificados na mesma instruo ou em uma ou mais instrues de
especificao de atributo, determina as caractersticas dos objetos alvos que podem ser associados com os ponteiros
declarados na instruo. Um modelo bvio para interpretar declaraes de ponteiros que estas declaraes cria
para cada nome um descritor. Este tipo de descritor inclu todos os dados necessrios para descrever completamente
e localiza na memria um objeto e todos os subobjetos do tipo, parmetros de tipo e nmero de dimenses ( rank)
especificados. Os valores do descritor ser preenchido quando o ponteiro for associado com o espao do alvo real.
O exemplo que segue ilustra o suo de ponteiro em um algoritmo iterativo:
PROGRAM DYNAM_ITER
REAL, DIMENSION(:, :), POINTER :: A, B, SWAP ! Declara os ponteiros
...
READ(*, *) N, M
ALLOCATE(A (N, M), B (N, M)) ! aloca matrizes alvo
! l valores para entrar em A
...
ITER: DO
...
! aplica transformaes nos valores de A para produzir valores para B
...
IF(CONVERGED) EXIT ITER
! trova A com B
SWAP => A; A => B; B => SWAP
END DO ITER
...
END PROGRAM DYNAM_ITER
C.2.2 O Atributo TARGET (5.1.2.14)
C.2.2 The TARGET attribute (5.1.2.14)
O atributo TARGET tem que ser especificado para qualquer objeto no ponteiro que pode, durante a
execuo de um programa, se tornar associado com um ponteiro. Este atributo definido primariamente com
propsitos de otimizao. Ele permite que o processador assuma que qualquer objeto no ponteiro no
explicitamente declarado como um alvo possa ser referenciado somente por meio de seu nome declarado
originalmente. Ele tambm significa que objetos declarados implicitamente no podem ser usados como alvo de
ponteiros. Isto ir permitir a um processador realizar otimizaes que de outra forma no seriam possveis na
presena de certos ponteiros.
O exemplo que segue ilustra o uso do atributo TRAGET em um algortimo iterativo:
PROGRAM ITER
REAL, DIMENSION(1000, 1000), TARGET :: A, B
REAL, DIMENSION(:, :), POINTER :: IN, OUT, SWAP
...
! L valores para A
...
IN => A ! associa IN com o alvo A
OUT => B ! associa OUT com o alvo B
...
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 410
ITER:DO
...
! aplica transformaes nos valores de IN para produzir OUT
...
IF(CONVERGED) EXIT ITER
! troca IN com OUT
SWAP => IN; IN => OUT; OUT => SWAP
END DO ITER
...
END PROGRAM ITER
C.2.3 O atributo Voltil (5.1.2.16)
C.2.3 The VOLATILE attribute (5.1.2.16)
O exemplo que segue mostra o uso de uma varivel com o atributo VOLATILE para comunicar com um
processo assncrono, neste caso o sistema operacional. O programa detecta o pressionamento de uma tecla pelo
usurio no terminal e reage a isto em um ponto conveniente no seu processamento.
O atributo VOLATILE necessrio para prevenir que um compilador otimizado guarde a varivel de
comunicao em um registrador ou fazer anlise de fluxo e decidir que a instruo EXIT nunca pode ser executada.
SUBROUTINE TERMINATE_ITERATIONS
LOGICAL, VOLATILE :: USER_HIT_ANY_KEY
! Tendo o OS iniciado a olhar pelo pressionamento de uma tecla pelo usurio e ajustado a
! varivel "USER_HIT_ANY_KEY" para TRUE to logo ele detecte a utilizao de uma tecla.
! Esta pseudo chamar (pseudo call) dependente do sistema operacional
CALL OS_BEGIN_DETECT_USER_KEYSTROKE( USER_HIT_ANY_KEY )
USER_HIT_ANY_KEY = .FALSE. ! isto ir ignorar qualquer pressionamento de tecla recente
PRINT *, " Hit any key to terminate iterations!"
DO I = 1,100
... ! calcula um valor para R
PRINT *, I, R
IF(USER_HIT_ANY_KEY) EXIT
ENDDO
! Faz o OS parar de olhar por pressionamento de tecla pelo usurio
CALL OS_STOP_DETECT_USER_KEYSTROKE
END SUBROUTINE TERMINATE_ITERATIONS
C.3 Notas da Seo 6
C.3 Section 6 notes
C.3.1 Componentes de Estrutura (6.1.2)
C.3.1 Structure components (6.1.2)
Componentes de uma estrutura so referenciados escrevendo-se os componentes de sucessveis nveis da
hierarquia da estrutura at que o componente desejado encontrado. Por exemplo
TYPE ID_NUMBERS
INTEGER SSN
INTEGER EMPLOYEE_NUMBER
END TYPE ID_NUMBERS
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 411
TYPE PERSON_ID
CHARACTER(LEN=30) LAST_NAME
CHARACTER(LEN=1) MIDDLE_INITIAL
CHARACTER(LEN=30) FIRST_NAME
TYPE(ID_NUMBERS) NUMBER
END TYPE PERSON_ID
TYPE PERSON
INTEGER AGE
TYPE(PERSON_ID) ID
END TYPE PERSON
TYPE(PERSON) GEORGE, MARY
PRINT *, GEORGE%AGE ! mostra o componente AGE
PRINT *, MARY%ID%LAST_NAME ! mostra LAST_NAME de MARY
PRINT *, MARY%ID%NUMBER%SSN ! mostra SSN de MAR
PRINT *, GEORGE%ID%NUMBER ! mostra SSN e EMPLOYEE_NUMBER de GEORGE
Um componente de estrutura pode ser um objeto de dados do tipo intrnseco como o caso de
GEORGE%AGE ou pode ser de tipo derivado como o caso de GEORGE%ID%NUMBER. O componente
resultante pode ser um escalar ou uma matriz de tipo intrnseca ou tipo derivado.
TYPE LARGE
INTEGER ELT(10)
INTEGER VAL
END TYPE LARGE
TYPE(LARGE) A(5) ! elemento 5 da matriz, cada um destes elementos
! inclu 10 elementos da matriz ELT e
! um escalar VAL
PRINT *, A(1) ! Mostra 10 elementos da matriz ELT e o escalar VAL
PRINT *, A(1)%ELT(3) ! Mostra o elemento escalar 3
! do elemento 1 da matriz A
PRINT *, A(2:4)%VAL ! Mostra o escalar VAL dos elementos 2 at 4 da matriz A
Componentes de um objeto do tipo extensvel que so herdados de um tipo raiz (parent type) pode ser
acessado como um todo usando o nome do componente raiz (parent component name) ou individualmente, com ou
sem qualific-los com o nome do componente raiz.
Por exemplo:
TYPE POINT
! o tipo base
REAL :: X, Y
END TYPE POINT
TYPE, EXTENDS(POINT) :: COLOR_POINT ! uma extenso de TYPE(POINT)
! componentes X e Y e o nome componente POINT, herdado do raiz
INTEGER :: COLOR
END TYPE COLOR_POINT
TYPE(POINT) :: PV = POINT(1.0, 2.0)
TYPE(COLOR_POINT) :: CPV = COLOR_POINT(PV, 3) ! forma aninhada do construtor
PRINT *, CPV%POINT ! mostra 1.0 e 2.0
PRINT *, CPV%POINT%X, CPV%POINT%Y ! e este tambm
PRINT *, CPV%X, CPV%Y ! e este tambm
C.3.2 Tipo Dinmico com Alocao (6.3.1)
C.3.2 Allocation with dynamic type (6.3.1)
O exemplo que segue ilustra o uso de alocao com um valor e tipo dinmico do objeto alocado por outro
objeto. O exemplo copia uma lista de objetos de qualquer tipo. Ele copia uma lista iniciando em IN_LIST. Depois
de ter copiado, cada elemento da lista iniciando em LIST_COPY tem um componente polimrfico, ITEM, para o
qual tanto o valor e o tipo so tomados dos componentes ITEM dos elementos correspondentes da lista iniciando
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 412
em IN LIST.
TYPE :: LIST ! uma lista de qualquer coisa
TYPE(LIST), POINTER :: NEXT => NULL()
CLASS(*), ALLOCATABLE :: ITEM
END TYPE LIST
...
TYPE(LIST), POINTER :: IN_LIST, LIST_COPY => NULL()
TYPE(LIST), POINTER :: IN_WALK, NEW_TAIL
! copia IN_LIST para LIST_COPY
IF(ASSOCIATED(IN_LIST)) THEN
IN_WALK => IN_LIST
ALLOCATE(LIST_COPY)
NEW_TAIL => LIST_COPY
DO
ALLOCATE(NEW_TAIL%ITEM, SOURCE=IN_WALK%ITEM)
IN_WALK => IN_WALK%NEXT
IF(.NOT. ASSOCIATED(IN_WALK)) EXIT
ALLOCATE(NEW_TAIL%NEXT)
NEW_TAIL => NEW_TAIL%NEXT
END DO
END IF
C.3.3 Alocao de Ponteiro e Associao
C.3.3 Pointer allocation and association
O efeito de ALLOCATE, DEALLOCATE, NULLIFY e atribuio de ponteiro (pointer assignment) que
eles so interpretados como mudanas nos valores no descritor que um ponteiro. Um ALLOCATE assumido
criar espao para um objeto apropriado e atribuir (to assign) ao ponteiro os valores necessrios para descrever o
espao. Uma NULLIFY quebra a associao do ponteiro com o espao. Uma DEALLOCATE quebra a associao
e libera o espao. Dependendo da implementao, o efeito pode ser visto como uma bandeira ( flag) em um ponteiro
que indica se o valor no descritor vlido ou pode ser limpar os valores do descritor para algum valor (por exemplo
zero) indicando que o ponteiro no aponta para qualquer coisa. Uma atribuio de ponteiro copia os valores
necessrios para descrever o espao ocupado pelo alvo no descritor que o ponteiro. Descritores so copiados,
valores de objetos no.
Se PA e PB so ambos ponteiros e PB est associado com um alvo, ento
PA => PB
resulta em PA estar sendo associado com o mesmo alvo que PB. Se PB foi desassociado, ento PA se rorna
desassociado.
O padro especificado de forma que este tipo de associao direta e independente. Uma instruo
subsequente
PB => D
ou
ALLOCATE (PB)
no tem efeito na associao de PA com este alvo. A instruo
DEALLOCATE (PB)
desaloca o espao que est associado com ambos PA e PB. PB se torna desassociado, mas no h requerimento que o
processador faa isto explicitamente reconhecendo que PA no mais tem um alvo. Isto deixa PA como ponteiro
pendurado (dangling pointer) num espao que foi liberado. O programa no pode usar PA novamente at que ele se
torna associado via uma atribuio de ponteiro ou uma instruo ALLOCATE.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 413
DEALLOCATE s pode ser usada para liberar espao que foi criado por uma ALLOCATE prvia. Ento o
que segue no vlido:
REAL, TARGET :: T
REAL, POINTER :: P
...
P = > T
DEALLOCATE (P) ! no vlido. O alvo de P no foi alocado
O princpio bsico que ALLOCATE, NULLIFY e atribuio de ponteiro afeta o ponteiro em vez do alvo.
ALLOCATE cria um alvo novo mas, diferentemente de quebrar sua conexo com o ponteiro especificado, ele no
tem efeito no alvo antigo. Nem NULIFFY nem atribuio de ponteiro tem qualquer efeito nos alvos. Um pedao de
memria que foi alocado e associado com um ponteiro se tornar inacessvel a um programa se o ponteiro
nulificado (nullified) ou associado com um alvo diferente e nenhum outro ponteiro foi associado com este pedao de
memria. Estes pedaos de memria podem ser reutilizados pelo processador se isto for necessrio. Entretanto, se
esta memria inacessvel de fato utilizada dependente do processador.
C.4 Notas da Seo 7
C.4 Section 7 notes
C.4.1 Atribuio Caractere
C.4.1 Character assignment
A restrio do FORTRAN 77 que nenhuma das posies caractere que est sendo definida na instruo de
atribuio caractere pode ser referenciada na expresso foi removida (7.4.1.3).
C.4.2 Avaliao de Referencias de Funo
C.4.2 Evaluation of function references
Se mais de uma referencia de funo aparace em uma instruo, elas podem ser executadas em qualquer
ordem (sujeita a um resultado de funo ter sido avaliada depois de seus argumentos) e seus valores no dependem
da ordem de execuo. Esta ausncia de dependncia na ordem de avaliao permite execuo em paralelo das
referncias das funes (7.1.8.1).
C.4.3 Ponteiros em Expresses
C.4.3 Pointers in expressions
Um ponteiro basicamente considerado como sendo qualquer outra varivel quando ele usado como uma
primria em uma expresso. Se um ponteiro usado como um operando em um operador que espera um valor, o
ponteiro ir automaticamente entregar o valor guardado no espao descrito pelo ponteiro, isto , o valor de seu
objeto alvo associado com o ponteiro.
C.4.4 Ponteiros no lado esquerdo de uma Atribuio
C.4.4 Pointers on the left side of an assignment
Um ponteiro que aparece no lado esquerdo de uma instruo de atribuio intrnseca tambm pode ser
desreferenciado (dereferenced) e considerado como referenciando o espao que seu alvo atual. Portanto, a
instruo de atribuio especifica a cpia normal de valor da expresso colocada a direita da expresso para o
espao do alvo. Todas as regras normais de atribuio so mantidas; o tipo e parmetros de tipo da expresso e dos
alvo do ponteiro tm que concordar e as formas tm que ser conforme.
Acessar o valor referenciado pela referncia chama-se "desrefernciar".
Desrefernciar um ponteiro o processo de acessar o valor de uma posio de memria
especfica (acessar o valor guardado no alvo).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 414
Para atribuio intrnseca dos tipos derivados, componentes no ponteiros so atribudos e componentes
ponteiros so atribudos como ponteiros (pointer assignment). Desreferenciado (dereferenced) aplicado somente aos
objetos escalares inteiros, no seletivamente a subobjetos ponteiros.
Por exemplo, suponha um tipo tal como
TYPE CELL
INTEGER :: VAL
TYPE(CELL), POINTER :: NEXT_CELL
END TYPE CELL
seja definido e objetos tais como HEAD e CURRENT so declarados usando
TYPE(CELL), TARGET :: HEAD
TYPE(CELL), POINTER :: CURRENT
Se uma lista ligada (linked list) foi criado e ligada (attached) com HEAD e o ponteiro CURRENT teve
espao alocado, instrues como
CURRENT = HEAD
CURRENT = CURRENT%NEXT_CELL
causam o contedo das clulas referenciadas a direita ser copiada para a clula referenciada por CURRENT. Em
particular, o lado direito da segunda instruo causa o componente do ponteiro na clula, CURRENT, ser
selecionado. Este ponteiro desreferenciado (dereferenced) porque ele est em um contexto de expresso que
produz o valor inteiro do alvo e aponta para uma clula que o componente NEXT_CELL do alvo. O lado
esquerdo causa o ponteiro CURRENT ser desreferenciado (dereferenced) para produzir seu alvo atual, nomeando
espao para manter a clula (um inteiro e uma clula ponteiro). O valor inteiro a direita copiado para o espao
inteiro na esquerda e o componente ponteiro atribudo (o descritor a direta copiado para o espao do descritor a
esquerda). Quando uma instruo tal como
CURRENT => CURRENT%NEXT_CELL
executada, o valor do descritor em CURRENT%NEXT_CELL copiado para o o descritor denominado CURRENT. Neste
caso, CURRENT feito apontar para um alvo diferente.
Na instruo de atribuio intrnseca, o espao associado com o ponteiro atual no pode mudar mas os
valores guardados neste espao podem. Na atribuio de ponteiro (pointer assignment), o ponteio atual associado
com um espao diferente. Usando a atribuio intrnseca causa a lista ligada (linked list) das clulas serem movidas
para cima atravs da janela (window) atual; a atribuio de ponteiro causa o ponteiro atual ser movido para baixo
atravs da lista de clulas.
C.4.5 Um exemplo de Construo FORALL contendo uma Construo
WHERE
C.4.5 An example of a FORALL construct containing a WHERE construct
INTEGER :: A(5,5)
...
FORALL(I = 1:5)
WHERE(A(I,:) == 0)
A(:,I) = I
ELSEWHERE(A(I,:) > 2)
A(I,:) = 6
END WHERE
END FORALL
Se antes de execuo do FORALL, A tem o valor
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 415
A = 1 0 0 0 0
2 1 1 1 0
1 2 2 0 2
2 1 0 2 3
1 0 0 0 0
Depois das instrues de atribuio que seguem a instruo WHERE, A tem o valor A. A mscara (mask)
criada pela linha um usada para mascarar (to mask) as atribuies para a coluna um. A mscara da coluna dois
usada para mascarar a coluna dois; etc..
A' = 1 0 0 0 0
1 1 1 1 0
1 2 2 4 5
1 1 3 2 5
1 2 0 0 5
A mscara criada pelas atribuies seguindo a instruo ELSEWHERE so
.NOT.( A(I,:) == 0 ) .AND. ( A(I,:) > 2 )
Ento os nicos elementos afetados pelas atribuies que seguem a instruo ELSEWHERE so A(3, 5) e
A(4, 5). Depois da execuo da construo FORALL, A tem o valor
A = 1 0 0 0 0
1 1 1 1 5
1 2 2 4 6
1 1 3 2 6
1 2 0 0 5
C.4.6 Exemplos de Instrues FORALL
C.4.6 Examples of FORALL statements
Exemplo1:
FORALL(J=1:M, K=1:N) X(K, J) = Y(J, K)
FORALL(K=1:N) X(K, 1:M) = Y(1:M, K)
Estas duas instrues abas copiam coluna 1 at N da matriz Y para as linhas 1 at N da matriz X. Elas so
equivalentes a
X(1:N, 1:M) = TRANSPOSE (Y(1:M, 1:N) )
Exemplo 2:
A instruo FORALL que segue calcula cinco somas parciais de submatrizes de J.
J = (/ 1, 2, 3, 4, 5 /)
FORALL(K = 1:5) J(K) = SUM( J(1:K) )
SUM permitido em uma FORALL porque funes intrnsecas so funes puras (12.6). Depois da
execuo de uma instruo FORALL, tem-se J = (/ 1, 3, 6, 10, 15 /).
Exemplo 3:
FORALL(I = 2:N-1) X(I) = ( X(I-1) + 2*X(I) + X(I+1) ) / 4
em o mesmo efeito que
X(2:N-1) = ( X(1:N-2) + 2*X(2:N-1) + X(3:N) ) / 4
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 416
C.5 Notas da Seo 8
C.5 Section 8 notes
C.5.1 Controle de Loop
C.5.1 Loop control
O Fortran prov vrias formas de controle de loop:
1. com um contador de iterao e uma varivel DO. Este o DO loop clssico
2. teste de uma condio lgica antes de cada execuo do loop (DO WHILE)
3. DO infinito (DO forever)
C.5.2 A Construo CASO
C.5.2 The CASE construct
No mximo um bloco do caso (case block) selecionado para execuo em uma construo CASE e no h
possibilidade de passar de um bloco para outro bloco em uma construo CASE. No h requerimento para o
usurio explicitamente saia do bloco.
C.5.3 Exemplos de Construes DO
C.5.3 Examples of DO constructs
O que segue so todos exemplos vlidos de blocos de construes DO.
Exemplo 1:
SUM = 0.0
READ (IUN) N
OUTER: DO L = 1, N ! Um DO com um nome para a construo
READ(IUN) IQUAL, M, ARRAY(1:M)
IF(IQUAL < IQUAL_MIN) CYCLE OUTER ! pula o loop interno
INNER: DO 40 I = 1, M ! um DO com um rtulo e um nome
CALL CALCULATE(ARRAY(I), RESULT)
IF(RESULT < 0.0) CYCLE
SUM = SUM + RESULT
IF(SUM > SUM_MAX) EXIT OUTER
40 END DO INNER
END DO OUTER
O loop chamado outer tem uma contagem de iteraes de MAX (N, 0) e ser executado este nmero de
vezes ou at que SUM exceda SUM_MAX, e neste caso a instruo EXIT OUTER termina os dois loops. O loop
chamado inner pulado (skipped) pela primeira instruo CYCLE se a bandeira qualificadora, IQUAL, muito
pequena (low). Se CALCULATE retorna um RESULT negativo, a segunda instruo CYCLE impede que ele seja
somado. Os dois loops possuem nomes nas construes e o loop interno ( aquela chamado inner) tambm tem um
rtulo. Um nome de construo requerido na instruo EXIT para garantir que os dois loops sejam terminados,
mas opcional nas instrues CYCLE porque cada um deles pertence ao loop mais interno.
Exemplo 2:
N = 0
DO 50, I = 1, 10
J = I
DO K = 1, 5
L = K
N = N + 1 ! esta instruo executada 50 vezes
END DO ! um DO sem rtulo dentro de um DO com rtulo
50 CONTINUE
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 417
Depois da execuo do fragmento de programa acima, I = 11, J = 10, K = 6, L = 5 e N = 50.
Exemplo 3:
N = 0
DO I = 1, 10
J = I
DO 60, K = 5, 1 ! Este loop interno nunca executado
L = K
N = N + 1
60 CONTINUE ! DO com rtulo dentro de um DO sem rtulo
END DO
Depois da execuo do fragmento de programa acima , I = 11, J = 10, K = 5, N = 0 e L no definido por
estas instrues.
O que segue so todos exemplos vlidos de construo DO no bloco (nonblock DO constructs):
Exemplo 4:
DO 70
READ(IUN, (1X, G14.7), IOSTAT = IOS) X
IF(IOS /= 0) EXIT
IF(X < 0.) GOTO 70
CALL SUBA(X)
CALL SUBB(X)
...
CALL SUBY(X)
CYCLE
70 CALL SUBNEG(X) ! SUBNEG chamada somente quando X < 0
Isto no uma construo DO no bloco porque termina com uma instruo diferente de END DO ou CONTINUE. O loop ser
continuado at que uma condio fim-de-arquivo (end-of-file) ou erro de entrada/sada ocorra.
Exemplo 5:
SUM = 0.0
READ (IUN) N
DO 80, L = 1, N
READ(IUN) IQUAL, M, ARRAY(1:M)
IF(IQUAL < IQUAL_MIN) M = 0 ! pula o loop interno
DO 80 I = 1, M
CALL CALCULATE (ARRAY(I), RESULT)
IF(RESULT < 0.) CYCLE
SUM = SUM + RESULT
IF(SUM > SUM_MAX) GOTO 81
80 CONTINUE ! Este CONTINUE compartilhado pelso dois loops
81 CONTINUE
Este exemplo similar ao exemplo 1 acima, exceto que os dois loops no so construes DO bloco (block DO constructs) porque
elas compartilham a instruo CONTINUE com o rtulo 80. O trmino da construo DO externa a construo DO internas inteira. O loop
interno pulado fazendo-se que M seja zero. Se SUM cresce e fica muito grande, os dois loops terminam por desvio para a instruo
CONTINUE rotulada 81. A instruo CYCLE no loop interno usada para pular valores negativos em RESULT.
Exemplo 6:
N = 0
DO 100 I = 1, 10
J = I
DO 100 K = 1, 5
L = K
100 N = N + 1 ! Esta instruo executa 50 vezes
Neste exemplo, os dois loops compartilham a uma instruo de atribuio. Depois da execuo deste fragmento de programa,
I = 11, J = 10, K = 6, L = 5 e N = 50.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 418
Exemplo 7:
N = 0
DO 200 I = 1, 10
J = I
DO 200 K = 5, 1
L = K
200 N = N + 1
Este exemplo muito similar ao anterior, exceto que o loop interno nunca executado. Depois da execuo deste fragmento de
programa, I = 11, J = 10, K = 5, N = 0 e L no definido por estas instrues.
C.5.4 Exemplos de Construes DO invlidas
C.5.4 Examples of invalid DO constructs
O que segue so todos exemplos de esqueletos de construes DO invlidas.
Exemplo 1:
DO I = 1, 10
...
END DO LOOP ! No h concordncia (no matching) do nome da construo
Exemplo 2:
LOOP: DO 1000 I = 1, 10 ! No h concordncia (no matching) do nome da construo
...
1000 CONTINUE
Exemplo 3:
LOOP1: DO
...
END DO LOOP2 ! nome da construo no concordam entre si
Exemplo 4:
DO I = 1, 10 ! rtulo requerido ou ...
...
1010 CONTINUE ! ... END DO requerido
Exemplo 5:
DO 1020 I = 1, 10
...
1021 END DO ! rtulos no concordam (Labels dont match)
Exemplo 6:
FIRST: DO I = 1, 10
SECOND: DO J = 1, 5
...
END DO FIRST ! DO aninhado de forma errada
END DO SECOND
C.6 Notas da Seo 9
C.6 Section 9 notes
C.6.1 Arquivos Externos (9.2)
C.6.1 External files (9.2)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 419
Este padro acomoda, mas no requer, catalogao de arquivos (file cataloging). Para fazer isto, vrios
conceitos so introduzidos.
C.6.1.1 Conexo de Arquivos (9.4)
C.6.1.1 File connection (9.4)
Antes de qualquer entrada/sada possa ser realizada em um arquivo, ele tem que ser conectado a uma
unidade. A unidade ento serve como um designador para o arquivo enquanto ele estiver conectado. Estar
conectado no implica que memrias temporria para guardar dados (buffers) foram ou no foram alocados, que
tabelas de controle de arquivos (file-control tables) foram ou no foram preenchidas ou que qualquer outro
mtodo de implementao foi usado. Conexo significa que (exceto alguma outra falha) uma instruo READ ou
WRITE pode ser executada na unidade, por isto sobre o arquivo. Sem uma conexo, uma instruo READ ou
WRITE no pode ser executada.
C.6.1.2 Existncia de Arquivos (9.2.1)
C.6.1.2 File existence (9.2.1)
Totalmente independente do estado de conexo a propriedade de existncia, isto uma propriedade do
arquivo. O processador conhece (knows) um conjunto de arquivos que existem em um dado tempo para um dado
programa. Este conjunto deve incluir fitas (tapes) prontas para serem lidas, arquivos em um catlogo, um teclado,
uma impressora, etc.. O conjunto pode excluir arquivos inacessveis ao programa por causa de segurana, porque
eles j esto em uso por outro programa, etc.. Este padro no especifica quais arquivos existem, porque muitas
possibilidade esto disponveis para um processador implementar segurana, travas, tcnicas de privilgios, etc..
Existncia um conceito conveniente para designar todos os arquivos que um programa potencialmente pode
processar.
Todos as quatro combinaes de conexo e existncia podem ocorre:
Conectado Exite Exemplos
SIM SIM Um leitor de carto carregado e pronto para ser lido
SIM NO Uma impressora antes de primeira linha ter sido escrita
NO SIM Um arquivo chamado JOAN em um catlogo
NO NO Um arquivo em um rolo de fita, no conhecido pelo processador
Meios so disponibilizados para criar, apagar, conectar e desconectar arquivos.
C.6.1.3 Nomes de Arquivos (9.4.5.8)
C.6.1.3 File names (9.4.5.8)
Um arquivo pode ter um nome. A forma do nome do arquivo no especificada. Se o sistema no tem uma
forma de catalogar ou rotular as fitas de pelo menos alguns de seus arquivos, todos os nomes de arquivo iro
desaparecer quando terminar a execuo. Isto uma implementao vlida. Em nenhum lugar este padro requereu
nomes para manter por qualquer perodo de tempo maior que o tempo de execuo de um programa. Portanto, este
padro no impe catalogao como um pr-requisito. A caracterstica de nomear intenciona permitir o uso de um
catlogo quando um existe.
C.6.1.4 Acesso de Arquivos (9.2.2)
C.6.1.4 File access (9.2.2)
Este padro no trata problemas de segurana, proteo, trava e qualquer outro conceito que pode ser parte
de um conceito de direito de acesso (right of access). Tal conceitos so considerados estar sob responsabilidade
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 420
do sistema operacional.
As instrues OPEN e INQUIRE podem ser estendidas naturalmente para considerar estas coisas.
Mtodos de acesso possveis para um arquivo so: sequencial e direto. O processador pode implementar
dois tipos diferentes de arquivos, cada qual com seu prprio mtodo de acesso. Ele tambm pode ser implementar
um tipo de arquivo com dois mtodos de acesso diferentes.
Acesso direto para arquivos um tipo disponvel comum e simples, isto , registros de comprimento fixos.
A chave um inteiro positivo.
C.6.2 Entrada/sada sem Avano (9.2.3.1)
C.6.2 Nonadvancing input/output (9.2.3.1)
Instrues de transferncia de dados afeta o posicionamento em um arquivo externo. No FORTRAN 77, se
um erro ou condio de fim-de-arquivo (end-of-file) existe, o arquivo posicionado depois do registro que terminou
de ser lido ou escrito e o registro se torna o registro precedente. Este padro contm o especificador de
posicionamento de registro ADVANCE= em uma instruo de transferncia da dados que prov a capacidade de
manter a posio dentro do registro corrente em uma instruo de transferncia de dados formatada para a prxima
transferncia de dados. O valor NO prov esta capacidade. O valor YES posiciona o arquivo depois do registro que
foi lido ou escrito. O default YES.
O descritor de edio tab (tabulador) e a barra (slash) so ainda apropriados para uso com este tipo de acesso
de registro mas o tab no reposiciona antes do limite do tab esquerdo.
O BACKSPACE de um arquivo que est posicionado dentro de um registro causa a unidade especificada
ser posicionada antes do registro atual.
Se a ltima instruo de transferncia de dados foi WRITE e o arquivo est posicionado dentro de um
registro, o arquivo estar posicionado implicitamente depois do registro atual antes do registo ENDFILE ter sido
escrito no arquivo, isto , uma instruo REWIND, BACKSPACE ou ENDFILE seguindo uma instruo sem
avano WRITE causa o arquivo ser posicionado no fim do registro de sada atual antes do registro fim-de-arquivo
(endfile) ter sido escrito no arquivo.
Este padro prov o especificador SIZE= para ser usado com instrues de transferncia de dados sem
avano. A varivel no especificador SIZE= conter o nmero de caracteres que constitu a sequncia de valores
lidos pelo descritor de edio da dados nesta instruo de entrada.
A contagem especialmente til se h somente um item na lista de entrada porque ela conter o nmero de
caracteres que estar presente para o item.
O especificador EOR= provido para indicar quando uma condio fim-de-registro (end-of-record) foi
encontrada durante uma instruo de transferncia de dados sem avano. A condio fim-de-registro (end-of-record)
no uma condio de erro. Se este especificador est presente, um item na lista de entrada atual que requeira mais
caracteres do que aqueles que o registro contm ser preenchido com brancos se PAD= YES est em uso. Isto
significa que o item da lista de entrada foi completado com sucesso. O especificador IOSTAT=, se presente, ser
definido com o valor da constante com nome IOSTAT EOR do mdulo ISO FORTRAN ENV e a instruo de
transferncia de dados ser terminada. A execuo do programa continuar com a instruo especificada no
especificador EOR=. O especificador EOR= d a capacidade de ter controle de execuo quando um fim-de-
registro (end-of-record) foi encontrado. As variveis de um DO nos io-implied-dos mantm seus ltimos valores
definidos e quaisquer itens restantes na input-item-list mantm seus estados de definies quando uma conciso
de fim-de-registro (end-of-record) ocorre. O especificador SIZE=, se presente, ir conter o nmero de caracteres
lidos com os descritores de edio de dados durante esta instruo READ.
Para entrada sem avano, o processador no requerido ler registros parciais. O processador pode ler o
registro inteiro em um buffer interno (memria temporria interna) e pegar sucessivas pores do registro disponvel
em sucessivas instrues de entrada.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 421
Em uma implementao de entrada/sada sem avano na qual escrita sem avano para um dispositivo
terminal causa a imediata apresentao (immediate display) da sada, esta escrita pode ser usada como um
mecanismo de sada de aviso de comando (espera de comando prontido prompt). Neste caso, a instruo
WRITE(*, FMT=(A), ADVANCE=NO) CONTINUE?(Y/N):
ir resultar no aviso de comando
CONTINUE?(Y/N):
sendo mostrado sem a apresentao de uma subsequente nova linha (line feed).
A resposta, que pode ser lida por uma instruo da forma
READ(*, FMT=(A)) ANSWER
pode ento ser entrada na mesma linha que o aviso de comando (prompt) como em
CONTINUE?(Y/N): Y
O padro no requer que uma implementao de uma entrada/sada sem avano opere desta forma. Por
exemplo, uma implementao de uma sada sem avano a qual a apresentao postergada at que o registro atual
esteja completo tambm conforme com o padro. Esta implementao no permitir, entretanto, um mecanismo
de aviso de comando (prompting mechanism) deste tipo operar.
C.6.3 Entrada/sada Assncrona
C.6.3 Asynchronous input/output
Em vez de limitar o suporte para entrada/sada assncrona ao que foi tradicionalmente disponibilizado por
facilidades como BUFFERIN/BUFFEROUT, este padro construiu sobre a sintaxe Fortran. Isto permite uma
abordagem alternava para a implementao de entrada/sada assncrona e simplifica a tarefa de adaptar programas
conforme com o padro para o uso de entrada/sada assncrona.
Nem todos os processadores iro realizar entrada/sada assncrona nem todo processador ter a capacidade
de manejar instrues de transferncia de dados com lista de itens de entrada/sada complicadas de uma maneira
assncrona. Este tipo de processador ainda pode estar conforme com o padro. Espera-se que a documentao de
cada processador Fortran descreva quando, sempre que ocorrerem, entrada/sada assncrona sero realizadas.
Este padro permite por pelo menos dois modelos conceituais diferentes entrada/sada assncrona.
Modelo 1: o processador ir realizar entrada/sada assncrona quando um item da lista simples (talvez
uma matriz com nome contgua) e a entrada/sada no formatada. O custo da implementao reduzido e isto o
cenrio mais provvel de ser beneficiado nas mquinas tradicionais caras (traditional big-iron machines).
Modelo 2: o processador livre para fazer um do seguinte:
1. na sada, criar um buffer (memria temporria) dentro de uma biblioteca de entrada/sada, completamente
formatada e ento iniciar uma escrita assncrona do buffer e imediatamente retornar para a prxima
instruo do programa. O processador livre para esperar instrues prvias WRITE ou no
2. passar o endereo da lista de entrada/sada para outro processador/processo, o qual ir processar os itens da
lista independentemente do processador que executa os cdigos do usurio. O endereo dos itens da lista
tem que ser calculados (must be computed) antes da instruo READ/WRITE assncrona esteja completa.
Existe ainda um requerimento de ordem no processamento dos itens da lista para lidar com aes como
READ (...) N,(a(i),i=1,N).
O padro permite que um usurio requeira uma grande nmero de entrada/sada assncrona, sem esperar
que qualquer uma delas esteja completada e portanto esperar por qualquer uma delas ou por todas elas. Pode ser
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 422
impossvel e indesejvel manter registro de cada um deste requerimentos de entrada/sada individualmente.
No necessrio que todas as requisies sejam tratadas pela biblioteca de tempo de execuo ( runtime
library).
Em computao, runtime library (biblioteca de tempo de execuo) uma programa da biblioteca usado pelo
compilador para implementar funes que sero usadas durante a execuo (runtime) do programa.
Frequentemente ela inclu funes de entrada e sada ou para manejar memria
Se um especificador ID= no aparece em uma instruo READ ou WRITE, a execuo ( runtime) livre para
esquecer sobre esta requisio particular uma vez que ela foi completada com sucesso. Se ela recebe uma condio
ERR ou END, o processador livre para reportar isto durante qualquer operao de entrada/sada nesta unidade.
Quando um especificador ID= est presente, a biblioteca de entrada/sada de tempo de execuo do processador
requerida manter registro (keep track) de quaisquer condies END ou ERR para esta requisio particular de
entrada/sada. Entretanto, se a requisio de entrada/sada bem sucedida sem qualquer ocorrncia de condio de
exceo, ento a execuo pode esquecer este valor do ID= se desejar. Tipicamente, a execuo deve somente
manter registro da ltima requisio feita ou, talvez, de umas poucas. Ento, quando um usurio espera ( WAITs) por
uma requisio em particular, a biblioteca tem conhecimento sobre isto (e faz a coisa certa com respeito a
manipulao de um erro, etc.) ou ir assumir que uma das requisies que completaram com sucesso e ir
esquecer sobre (e ir retornar sem sinalizar qualquer condio de erro ou finalizao). incumbncia do usurio
passar valores vlidos de ID=. No h requisio para que o processador detecte valores no vlidos de ID=. H,
claro, um limite dependente do processador de quantas requisies pendentes de entrada/sada ( outstanding
input/output requests) que geram uma condio de erro ou finalizao podem ser tratadas antes do processador atinja
um limite de pouca memria (runs out of memory) para manter registro desta condio. As restries nas variveis
SIZE= so projetadas para permitir ao processador atualizar estas variveis a qualquer tempo (depois da requisio
ter sido processada, mas antes da operao WAIT) e ento esquecer sobre elas. Isto o porque no existe
especificador SIZE= permitido nas vrias operaes WAIT. Somente condies de exceo (erros e fins de arquivo)
so esperados serem registrados por requisies individuais na execuo e somente se uma especificador ID=
estiver presente. Os especificadores END= e EOR= no foram adicionados em todos as instrues que podem
realizar operaes WAIT. Em vez disto, a varivel IOSTAT ter que ser guarda numa fila (queried) depois da
operao WAIT ter manejado esta situao. Esta escolha foi feita porque espera-se que a instruo WAIT seja o
mtodo usual de esperar que uma entrada/sada complete (e WAIT no suporta especificadores END= e EOR=).
Esta escolha particular filosfica e no foi baseada em dificuldades tcnicas significativas.
Note que a requisio de ajustar a varivel IOSTAT corretamente requer que a implementao lembre qual
requisio de entrada/sada gerou uma condio EOR (End Of Record fim-de-registro), ento a operao espera (wait
operation) subsequente ir retornar o valor IOSTAT correto. Isto significa que h um limite definido pelo
processador no nmero de requisies pendentes de entrada/sada (outstanding input/output requests) que uma
condio EOR recebe (restrita pela quantidade de memria requerida para manter registro desta informao, similar
as condies END/ERR ).
C.6.4 Instruo OPEN (9.4.5)
C.6.4 OPEN statement (9.4.5)
Um arquivo pode ser conectado a uma unidade por pr-conexo ou pela execuo de uma instruo OPEN.
Pr-conexo realizada antes do incio da execuo de um programa por meios externos ao Fortran. Por exemplo,
ela pode ser feita pela ao de controle de tarefas (job control action) ou pelos defaults preestabelecidos no
processador. Execuo de uma instruo OPEN no requerida para acessar os arquivos pr-conectados(9.4.4).
A instruo OPEN prov meios para acessar arquivos existente que no esto pr-conectados. Uma
instruo OPEN pode ser usada de duas maneiras: com um nome de arquivo (aberto por nome open-by-name) e sem
nome de arquivo. Uma unidade usada em ambos os casos. Aberto por nome (open-by-name) conecta um arquivo
especfico a uma unidade especificada. Aberto por unidade (open-by-unit) conecta um arquivo default dependente do
processador a uma unidade especificada (o arquivo default pode ou pode no ter um nome).
Portanto, existem trs formas de um arquivo se tornar conectado ento processado: pr-conexo
(preconnection), aberto por nome (open-by-name) e aberto por unidade (open-by-unit). Uma vez que o arquivo est
conectado, no h meios do Fortran padro determinar como ele foi conectado.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 423
Uma instruo OPEN tambm pode ser usada para criar um arquivo novo. De fato, qualquer um dos trs
mtodos que seguem podem ser sobre um arquivo que no existe. Quando uma unidade est pr-conectada,
escrever o primeiro registro cria o arquivo. Com os outros dois mtodos, a execuo de uma instruo OPEN cria o
arquivo.
Quando uma instruo OPEN executada, a unidade especificada pode ou no pode estar conectada a um
arquivo. Se ela j est conectada a um arquivo(pela pr-conexo ou por uma instruo OPEN prvia) a omisso do
especificador FILE= na instruo OPEN implica que o arquivo para permanecer conectado unidade. Este tipo
de instruo OPEN pode ser usada para muda os valores do modo interpretao branco (blank interpretation mode),
modo de edio decimal (decimal edit mode), modo preenchimento (pad mode), modo E/S arredondado (I/O rounding
mode), modo delimitado (delimiter mode) e modo sinalizado (sign mode).
Se o valor do especificador ACTION= WRITE, ento instrues READ no podem ser usadas nesta
conexo. ACTION = WRITE no restringe posicionamento por uma instruo BACKSPACE ou posicionamento
especificado pelo especificador POSITION= com o valor APPEND. Entretanto, a instruo BACKSPACE ou uma
instruo OPEN contendo POSITION = APPEND pode falhar se o processador requer leitura do arquivo para
implementar o posicionamento.
O exemplo que segue ilustra estas regras. No primeiro exemplo, a unidade 10 (unit 10) pr-conectada a um
arquivo SCRATCH (rascunho); a instruo OPEN muda o valor de PAD= para YES.
CHARACTER(LEN = 20) CH1
WRITE(10, (A)) THIS IS RECORD 1
OPEN (UNIT = 10, STATUS = OLD, PAD = YES)
REWIND 10
READ(10, (A20)) CH1 ! CH1 agora tem o valor
! THIS IS RECORD 1
No prximo exemplo, a unidade 12 (unit 12) primeiro conectada a um arquivo chamado FRED, com um
estado OLD (with a status of OLD). A segunda instruo OPEN ento abre a unidade 12 novamente, retendo a
conexo com o arquivo FRED, mas muda o valor do especificador DELIM= para QUOTE.
CHARACTER(LEN = 25) CH2, CH3
OPEN(12, FILE = FRED, STATUS = OLD, DELIM = NONE)
CH2 = THIS STRING HAS QUOTES.
! Quotes in string CH2
WRITE(12, *) CH2 ! escreve sem delimitadores
OPEN(12, DELIM = QUOTE) ! agora aspa o delimitador
REWIND 12
READ(12, *) CH3 ! CH3 agora tem o valor
! THIS STRING HAS QUOTES.
O prximo exemplo invlido porque tenta mudar o valor do especificador STATUS=.
OPEN(10, FILE = FRED, STATUS = OLD)
WRITE(10, *) A, B, C
OPEN(10, STATUS = SCRATCH) ! tenta fazer FRED
! um arquivo rascunho (SCRATCH file)
O exemplo prvio pode se tornar vlido pelo fechamento da unidade antes do uso da instruo OPEN,
como no exemplo que segue.
OPEN(10, FILE = FRED, STATUS = OLD)
WRITE(10, *) A, B, C
CLOSE(10)
OPEN(10, STATUS = SCRATCH) ! abre um arquivo
! SCRATCH diferente
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 424
C.6.5 Propriedades da Conexo (9.4.3)
C.6.5 Connection properties (9.4.3)
Quando uma unidade se torna conectada a um arquivo, pela execuo de uma instruo OPEN ou por pr-
conexo, as propriedades de conexo que seguem, entre outras, podem ser estabelecidas:
1. um mtodo de acesso, sequencial, direto ou em fluxo (stream) estabelecido para a conexo (9.4.5.1)
2. uma forma, formatada ou no formatada estabelecida para a conexo com o arquivo que j existe ou
criado pela conexo. Para uma conexo que resulta na execuo da uma instruo OPEN, uma forma
default (que depende do mtodo de acesso, como descrito em 9.2.2) estabelecida se o especificador form
no especificado. Para um arquivo pr-conectado que existe, a forma estabelecida pela pr-conexo.
Para um arquivo pr-conectado que no existe, a forma pode ser estabelecida ou o estabelecimento da
forma pode ser atrasado at que o arquivo seja criado(por exemplo, pela execuo de uma instruo
WRITE formatada ou no formatada) (9.4.5.9).
3. o comprimento do registro pode ser estabelecido. Se o mtodo de acesso direto, a conexo estabelece o
comprimento do registro que especifica o comprimento de cada registro no arquivo. Um arquivo existente
com registros que no so todos de comprimentos iguais no pode ser conectado para aceso direto. Se o
mtodo de acesso sequencial, registros com comprimentos diferentes so permitidos. Neste caso, o
comprimento do registro estabelece o comprimento mximo do registro no arquivo (9.4.5.12)
Um processador tem grande liberdade para adaptar estes conceitos e aes suas regras prprias de
catalogao e controle de tarefas (cataloging and job control). Alguns processadores podem requere aes de controle
de tarefas para especificar o conjunto de arquivos que existe ou que iro ser criados pelo programa. Alguns
processadores podem no requerer controle de tarefas antes da execuo. Este padro permite que os processadores
realizem abertura dinmica, fechamento ou operaes de criao, mas no requer que estas capacidades do
processador.
O significado de abrir (open) me contextos diferentes do Fortran pode incluir coisas como montar uma
fita, mensagens de console, guarda temporria em memria (spooling), verificao de rtulos, verificaes de
segurana, etc.. Estas aes podem ocorrer sob aes de controle externas ao Fortran, sob execuo de uma
instruo OPEN ou sob execuo da primeira leitura ou escrita no arquivo. A instruo OPEN descreve as
propriedades da conexo do arquivo e pode ou no pode causar a ocorrncia de atividades fsicas. Ela o lugar
para uma implementao definir propriedades de um arquivo alm daquelas requeridas no padro Fortran.
C.6.6 Instruo CLOSE (9.4.6)
C.6.6 CLOSE statement (9.4.6)
Similarmente, as aes de desmontar uma fita, proteo, etc. De um fechar (close) pode ser implcita no
fim da execuo (end of a run). A instruo CLOSE pode ou no pode causar a ocorrncia destas aes. Aqui outro
local para estender as propriedades do arquivo alm daquelas do padro Fortran. Note, entretanto, que a execuo
de uma instruo CLOSE em uma unidade seguida por uma instruo OPEN na mesma unidade com o mesmo
arquivo ou com um arquivo diferente uma sequncia de eventos permitida. O processador no pode impedir esta
sequncia somente porque a implementao escolheu implementar aes fsicas para fechar o arquivo no trmino
da execuo do programa.
C.7 Notas da Seo 10
C.7 Section 10 notes
C.7.1 Nmero de Registros (10.3, 10.4, 10.7.2)
C.7.1 Number of records (10.3, 10.4, 10.7.2)
O nmero de registros lidos por uma instruo de entrada formatada explcita pode ser determinadas pelas
seguintes regras: um registro lido no incio de um escaneamento formatado (mesmo que a lista de entrada esteja
vazia), em cada descritor de editor barra (slash edit descriptor) encontrado no formato e quando um reescaneamento
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 425
formatado ocorre no fim do formato.
O nmero de registros escritos por uma instruo de sada formatada explcita pode ser determinada pelas
seguinte regra: um registro escrito quando um descritor de edio barra (slash edit descriptor) encontrado no
formato, quando um reescaneamento formatado ocorre no fim do formato e na finalizao da execuo da instruo
de sada (mesmo se a lista de sada estiver vazia). Ento, a ocorrncia de sucessivas barras ( successive slashes) entre
dois descritores de edio causa a impresso de n 1 linhas brancas. A ocorrncia de n barras (slashes) no incio ou
fim de uma especificao de formato completa causa a impresso de n linhas em branco. Entretanto. Uma
especificao de formato completa contendo n barras (n > 0) e nenhum outro descritor de edio causa n + 1 linhas
em branco se o registro impresso. Por exemplo, as instrues
PRINT 3
3 FORMAT (/)
iro escrever dois registros que causa duas linhas em branco se o registros so impressos
C.7.2 Entrada Lista dirigida (10.9.1)
C.7.2 List-directed input (10.9.1)
Os exemplos que seguem ilustram dirigida entrada (list-directed input). Um caractere branco representado
por um b.
Exemplo 1:
Programa:
J = 3
READ*, I
READ*, J
Arquivo sequencial de entrada:
record 1: b1b,4bbbbb
record 2: ,2bbbbbbbb
Resultado: I = 1, J = 3.
Explicao: A segunda instruo READ l o segundo registro. A vrgula inicial no registro designa um valor nulo;
portanto, J no redefinido.
Exemplo 2:
Programa:
CHARACTER A*8, B*1
READ*, A, B
Arquivo sequencial de entrada:
record 1: bbbbbbbb
record 2: QXYbZ
Resultado: A = bbbbbbbb, B = Q
Explicao: no primeiro registro, o apstrofo mais a direita interpretado como o delimitador da constante (ele no
pode ser o primeiro de um par apstrofos embutidos representando um valor nico de apstrofo porque isto
envolveria a separao proibida de um par pelo fim de um registro); portanto, A recebe o caractere constante
bbbbbbbb. O fim do registro atua como um branco, que neste caso um valor separador porque ele ocorre entre
duas constantes
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 426
C.8 Notas da Seo 11
C.8 Section 11 notes
C.8.1 Programa Principal e Unidade de Programa Dados em Bloco (11.1,
11.3)
C.8.1 Main program and block data program unit (11.1, 11.3)
O nome de um programa principal ou de uma unidade de programa dados em bloco no tem uso explcito
dentro da linguagem Fortran. Ele disponvel para documentao e possvel uso pelo processador.
Um processador pode implementar um programa principal sem nome ou uma unidade de programa dados
em bloco sem nome atribuindo a ele um nome default. Entretanto, este nome no pode conflitar com qualquer
nome global em um programa conforme com o padro. Isto pode ser conseguido fazendo-se o nome default um que
no permitido em um programa conforme com o padro (por exemplo, pela incluso de um caractere no
permitido em nomes) ou provendo algum mecanismo externo tal como para um dado programa o nome default
pode ser mudado para um que no usado.
C.8.2 Compilao Dependente (11.2)
C.8.2 Dependent compilation (11.2)
Este padro, como seus predecessores, permite a implementao de processadores conformes nos quais um
programa pode ser quebrado em mltiplas unidades, cada uma delas podendo ser transladada separadamente na
preparao para a execuo. Estes processadores so comumente descritos como suportando compilao separada.
H uma diferena importante entre a maneira que uma compilar separada pode ser implementada sob este padro e
a maneira que ela pode ser implementada no padro FORTRAN 77. Sob o FORTRAN 77, qualquer informao
requerida para transladar uma unidade de programa foi especificada na unidade de programa. Cada translao era
ento totalmente independente das outras. Sob este padro, uma unidade de programa pode usar informao que foi
especificada em um mdulo separado e ento pode ser dependente deste mdulo. A implementao desta
dependncia em um processador pode ser que a translao da unidade de programa pode depender dos resultados
da translao de um ou mais mdulos. Processadores implementando a dependncia desta forma so comumente
descritos como suportando compilao dependente.
As dependncias envolvidas aqui so somente novas no sentido que o processador Fortran agora ciente
delas. A mesma dependncia de informaes existe sob o padro FORTRAN 77, mas era responsabilidade dos
programadores em transportar as informaes necessrias para resolv-las fazendo especificaes redundantes da
informao em mltiplas unidades de programas. A disponibilidade de separar mas compilar dependentemente
oferece a vantagem potencial sobre as especificaes textuais redundantes de informao:
1. especificando informao em um nico local em um programa garante que diferentes unidades de
programas usando esta informao ser transladado consistentemente. Especificao redundante deixa a
possibilidade de informaes diferentes sejam especificadas erroneamente. Mesmo que uma linha
INCLUDE seja usada para garantir que o texto das especificaes sejam idnticos em todas as unidades de
programa envolvidas, a presena de outras especificaes (por exemplo, uma instruo IMPLICIT) pode
mudar a interpretao deste texto
2. durante a reviso de um programa, possvel para um processador auxiliar na determinao se unidades de
programas diferentes foram transladadas usando diferentes (incompatveis) verses de um mdulo, apesar
de no existir requerimentos que o processador disponha deste tipo de assistncia. Inconsistncias na
especificao de texto redundante de informao, por outro lado, tende a ser muito mais difcil de ser
detectado
3. colocar informao em um mdulo prov um meio de empacot-la (packaging it). Sem os mdulos,
especificao redundante frequentemente so intercaladas (interleaved) com outras informaes em uma
unidade de programa, tornando o empacotamento (packaging) conveniente desta informao difcil
4. porque um processador pode ser implementado tal que as especificaes em um mdulo so transladadas
uma vez e ento referenciada repetidamente, h a potencialidade de grande eficincia do que quando o
processador tem que transladar redundantemente especificaes de informao em mltiplas unidades de
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 427
programa
O exato significado do requerimento de que a poro pblica de um mdulo esteja disponvel no tempo da
referncia dependente do processador. Por exemplo, um processador pode considerar um mdulo como
disponvel somente depois que ele foi compilado e requerer que se o mdulo foi compilado separadamente, o
resultado desta compilao seja identificado para as unidade de programa que esto sendo compiladas e usam o
mdulo.
C.8.2.1 Instruo USE e Compilao Dependente (11.2.1)
C.8.2.1 USE statement and dependent compilation (11.2.1)
Outro beneficio da instruo USE so suas facilidades ampliadas para manipular nomes. Se for necessrio
usar somente entidades selecionadas em um mdulo, pode-se fazer isto sem que se tenha que se preocupar sobre os
nomes de todas as outras entidades no mdulo. Se for necessrio usar dois mdulos diferentes que contenham
entidades com o mesmo nome, existe vrias maneira de lidar com este conflito. Se nenhuma das entidades como o
mesmo nome so usadas, ento las simplesmente podem ser ignoradas. Se o nome vai referenciar a mesma entidade
em ambos os mdulos (por exemplo, se os dois mdulos obtm a entidade de um terceiro mdulo), ento no h
confuso sobre o que o nome denota e o nome pode ser usado livremente. Se as entidades so diferentes e uma ou
ambas so usadas, a facilidade de renomeao local na instruo USE torna possvel das a esta entidade nomes
diferentes na unidade de programa contendo a instruo USE.
O benefcio de usar o especificador ONLY consistentemente, quando comparado com o USE sem ele, que
o mdulo no qual cada entidade acessada explicitamente especificado em cada unidade de programa. Isto
significa que no necessrio procurar outras unidades de programa para encontrar onde cada uma definida. Isto
reduz o custo de manuteno.
Uma implementao tpica de dependente, mas compilao separada pode envolver guardar o resultado da
translao de um mdulo em um arquivo (ou um elemento de arquivo) cujo nome derivado do nome do mdulo.
Note, entretanto, que o nome de um mdulo limitado somente pelas regras do Fortran e no pelos nomes
permitidos no sistema de arquivos. Ento o processador pode ter que prover um mapa entre os nomes Fortran e os
nomes do sistema de arquivos.
O resultado da translao de um mdulo pode razoavelmente conter somente informao textual
especificada no mdulo (com ponteiros (pointers) para informao originalmente textualmente especificada em
outros mdulos) ou conter todas as informaes no mdulo (incluindo cpias de informao originalmente
especificada em outro mdulo). Ainda que a primeira abordagem ir aparecer salva no espao de armazenamento, a
ltima abordagem pode simplificar grandemente a lgica necessria para processar a instruo USE e pode evitar a
necessidade de impor limites na lgica de aninhamento (nesting) de mdulos via a instruo USE.
Variveis declaradas em um mdulo retm seus estado de definio da mesma forma que variveis em um
bloco comum. Isto , variveis salvas retm sues estados de definio ao longo da execuo do programa, enquanto
variveis que no so salvas retm seus estados de definio somente durante a execuo do unidade de escopo que
referencia o mdulo. Em alguns casos, pode ser apropriado colocar a instruo USE como
USE MY_MODULE, ONLY:
em uma unidade de escopo para garantir que outros procedimentos que ela referencia pode se comunicar atravs do
mdulo. Neste caso, a unidade de escopo no acessa quaisquer entidades vindo do mdulo, mas as variveis no
salvas no mdulo retero seus estados de definio durante a execuo da unidade de escopo.
H um potencial enorme para no detectar erros em uma unidade de escopo que usa tipo implcito e
instruo USE. Por exemplo, no fragmento de programa
SUBROUTINE SUB
USE MY_MODULE
IMPLICIT INTEGER(I-N), REAL(A-H, O-Z)
X = F(B)
A = G(X) + H(X + 1)
END SUBROUTINE SUB
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 428
X pode ser uma varivel do tipo real implcito ou uma varivel obtida vindo do mdulo MY_MODULE e
pode mudar de um para outro por causa de mudanas em MY_MODULE no relacionadas com aes realizadas
por SUB. Erros lgicos resultando deste tipo de situao pode ser extremamente difcil de localizar. Ento, o uso
desta caractersticas juntas desencorajada.
C.8.2.2 Atributos de Acessibilidade
C.8.2.2 Accessibility attributes
Atributos PUBLIC e PRIVATE, que pode ser declarado somente dentro de mdulos,divide as entidades em
um mdulo em aquelas que so realmente relevantes a uma unidade de escopo referenciando o mdulo e aquelas
que no so. Esta informao pode ser usada para melhora a performance de um processador Fortran. Por exemplo,
pode ser possvel desconsiderar muita das informaes sobre as entidades particulares ( private) uma vez que o
mdulo foi transladado, ento salvando tempo e armazenamento procurando por elas. Analogamente, pode ser
possvel reconhecer que duas verses de um mdulo diferem somente nas entidades particulares que eles contm e
evitar retransladar unidades de programas que usa este mdulo quando mudando de uma verso de mdulo para a
outra.
C.8.3 Exemplos de uso de Mdulos
C.8.3 Examples of the use of modules
C.8.3.1 Blocos Comuns idnticos
C.8.3.1 Identical common blocks
Um bloco comum (common block) e todas as suas instrues de especificao associadas pode ser colocado
em um mdulo denominado, por exemplo, MY_COMMON e acessado por uma instruo de uso (USE statement)
da forma
USE MY_COMMON
que acessa o mdulo todo sem qualquer renomeao (renaming). Isto garante que todas as instncias do bloco
comum (common block) so idnticas. O mdulo MY_COMMON pode conter mais do que um bloco comum.
C.8.3.2 Dados Global
C.8.3.2 Global data
Um mdulo pode conter somente objetos de dados, por exemplo:
MODULE DATA_MODULE
SAVE
REAL A(10), B, C(20,20)
INTEGER :: I=0
INTEGER, PARAMETER :: J=10
COMPLEX D(J,J)
END MODULE DATA_MODULE
Objetos de dados feitos globais desta maneira podem ter qualquer combinao de tipos de dados.
Acesso a algumas destas pode ser feito por uma instruo de uso (USE statement) com a opo ONLY, tal
como:
USE DATA_MODULE, ONLY: A, B, D
Acesso a todos elas com algumas renomeaes para evitar conflito de nomes por ser feito por:
USE DATA_MODULE, AMODULE => A, DMODULE => D
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 429
C.8.3.3 Tipos Derivado
C.8.3.3 Derived types
Um tipo derivado pode ser definido em um mdulo e acessado em um inmeras unidades de programa. Por
exemplo:
MODULE SPARSE
TYPE NONZERO
REAL A
INTEGER I, J
END TYPE NONZERO
END MODULE SPARSE
define um tipo consistindo de uma componente real e dois componentes inteiros para conter valores numricos de
um elemento matriz no zero e seus ndices de linha e coluna
C.8.3.4 Matrizes Alocveis Global
C.8.3.4 Global allocatable arrays
Vrios programas necessitam de matrizes alocveis globais muito grandes cujos tamanhos no so
conhecidos antes da execuo do programa. Uma forma simples para este tipo de programa :
PROGRAM GLOBAL_WORK
CALL CONFIGURE_ARRAYS ! realiza as alocaes apropriadas
CALL COMPUTE ! usa as matrizes em clculos
END PROGRAM GLOBAL_WORK
MODULE WORK_ARRAYS ! Um exemplo de conjunto de matrizes de trabalho
INTEGER N
REAL, ALLOCATABLE, SAVE :: A(:), B(:, :), C(:, :, :)
END MODULE WORK_ARRAYS
SUBROUTINE CONFIGURE_ARRAYS ! processo para criar matrizes de trabalho
USE WORK_ARRAYS
READ(*, *) N
ALLOCATE (A(N), B(N, N), C(N, N, 2 * N))
END SUBROUTINE CONFIGURE_ARRAYS
SUBROUTINE COMPUTE
USE WORK_ARRAYS
... ! clculos envolvendo as matrizes A, B e C
END SUBROUTINE COMPUTE
Tipicamente, vrios subprogramas necessitam acesso as matrizes de trabalho e todos este subprogramas
contero a instruo
USE WORK_ARRAYS
C.8.3.5 Bibliotecas de Procedimentos
C.8.3.5 Procedure libraries
Corpos de interface para procedimentos externos em uma biblioteca (library) pode ser coletados em um
mdulo. Isto permite o uso de palavras-chaves de argumentos (argument keywords) e argumentos opcionais e
permite verificao esttica da referncia. Diferentes verses podem ser construdas para diferentes, aplicaes
usando palavras-chaves de argumentos de uso comum em cada aplicao.
Um exemplo o mdulo de biblioteca que segue:
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 430
MODULE LIBRARY_LLS
INTERFACE
SUBROUTINE LLS(X, A, F, FLAG)
REAL X(:, :)
! SIZE na prxima instruo uma funo intrnseca
REAL, DIMENSION(SIZE(X, 2)) :: A, F
INTEGER FLAG
END SUBROUTINE LLS
...
END INTERFACE
...
END MODULE LIBRARY_LLS
Este mdulo permite que a sub-rotina LLS seja invocada:
USE LIBRARY_LLS
...
CALL LLS(X = ABC, A = D, F = XX, FLAG = IFLAG)
...
C.8.3.6 Extenses de Operadores
C.8.3.6 Operator extensions
Para estender um smbolo de operador intrnseco para ter um significado adicional, uma bloco de interface
(interface block) especificando que o smbolo do operador na opo OPERATOR da instruo INTERFACE pode ser
colocado em um mdulo.
Por exemplo, // pode ser estendido para realizar concatenao de dois objetos tipo derivado utilizados como
cadeias de caracteres de comprimento varivel (varying length character strings) e + pode ser estendido para
especificar adio de matriz para o tipo MATRIX ou adio aritmtica intervalo (interval arithmetic addition) para o
tipo INTERVAL.
Um mdulo pode conter vrias destes blocos de interface. Um operador pode ser definido por uma funo
externa (em Fortran ou alguma outra linguagem) e sua interface procedimento colocada no mdulo.
C.8.3.7 Abstrao de Dados
C.8.3.7 Data abstraction
Em adio ao provimento de meios portteis de evitar especificao redundantes de informaes em
mltiplas unidades de programa, um mdulo prov um meio conveniente de empacotar (packaging) entidade
relacionadas, tal como as definies da representao e operaes de um tipo abstrato de dado ( abstract data type). O
exemplo que segue de um mdulo define uma abstrao de dado (data abstraction) para um tipo SET onde os
elementos de cada conjunto so do tipo inteiro. O conjunto padro de operaes de UNION, INTERSECTION e
DIFFERENCE so providas. A funo CARDINALITY retorna a cardinalidade (nmero de elementos no) seu
conjunto de argumentos. Duas funes retornando valores lgicos so includas, ELEMENT e SUBSET.
ELEMENT define o operador .IN. E SUBSET estende o operador <=. ELEMENT determina se uma dado valor
escalar um elemento de um dado conjunto e SUBSET determina se um dados conjunto um subconjunto de outra
conjunto dado. (Dois conjuntos podem ser verificados quanto a igualdade por comparao cardinal e verificao
que um um subconjunto do outro ou verificando para ver se cada um um subconjunto do outro.)
A funo de transferncia SETF converte um vetor de valores inteiros do conjunto correspondente, com
valores duplicados removidos. Ento, um vetor de valores constantes pode ser usado como um conjunto de
constantes. A funo de transferncia inversa VECTOR retorna os elementos de um conjunto como um vetor de
valores em ordem crescente. Na implementao deste SET, um conjunto de objetos de dados tem uma
cardinalidade mxima de 200.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 431
MODULE INTEGER_SETS
! Este mdulo intenciona ilustrar o uso das facilidades dos mdulos
! para definir um tipo novo, e operadores ajustados a um certo uso
INTEGER, PARAMETER :: MAX_SET_CARD = 200
TYPE SET ! define o tipo SET
PRIVATE
INTEGER CARD
INTEGER ELEMENT(MAX_SET_CARD)
END TYPE SET
INTERFACE OPERATOR(.IN.)
MODULE PROCEDURE ELEMENT
END INTERFACE OPERATOR(.IN.)
INTERFACE OPERATOR(<=)
MODULE PROCEDURE SUBSET
END INTERFACE OPERATOR(<=)
INTERFACE OPERATOR(+)
MODULE PROCEDURE UNION
END INTERFACE OPERATOR(+)
INTERFACE OPERATOR(-)
MODULE PROCEDURE DIFFERENCE
END INTERFACE OPERATOR(-)
INTERFACE OPERATOR(*)
MODULE PROCEDURE INTERSECTION
END INTERFACE OPERATOR(*)
CONTAINS
INTEGER FUNCTION CARDINALITY(A) ! retorna a cardinalidade do conjunto A
TYPE(SET), INTENT(IN) :: A
CARDINALITY = A % CARD
END FUNCTION CARDINALITY
LOGICAL FUNCTION ELEMENT(X, A) ! determina se
INTEGER, INTENT(IN) :: X ! o elemento X est no conjunto A
TYPE(SET), INTENT(IN) :: A
ELEMENT = ANY(A%ELEMENT(1 : A%CARD) == X)
END FUNCTION ELEMENT
FUNCTION UNION(A, B) ! Unio dos conjuntos A e B
TYPE(SET) UNION
TYPE(SET), INTENT(IN) :: A, B
INTEGER J
UNION = A
DO J = 1, B%CARD
IF(.NOT.(B%ELEMENT(J) .IN. A)) THEN
IF(UNION%CARD < MAX_SET_CARD) THEN
UNION%CARD = UNION%CARD + 1
UNION%ELEMENT(UNION%CARD) = B%ELEMENT(J)
ELSE
! tamanho mximo do conjunto excedido . . .
END IF
END IF
END DO
END FUNCTION UNION
FUNCTION DIFFERENCE(A, B) ! diferena entre os conjuntos A e B
TYPE(SET) DIFFERENCE
TYPE(SET), INTENT(IN) :: A, B
INTEGER J, X
DIFFERENCE%CARD = 0 ! o conjunto vazio
DO J = 1, A%CARD
X = A%ELEMENT (J)
IF(.NOT.(X .IN. B)) DIFFERENCE = DIFFERENCE + SET(1, X)
END DO
END FUNCTION DIFFERENCE
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 432
FUNCTION INTERSECTION (A, B) ! intercesso doso conjuntos A e B
TYPE(SET) INTERSECTION
TYPE(SET), INTENT(IN) :: A, B
INTERSECTION = A - (A - B)
END FUNCTION INTERSECTION
LOGICAL FUNCTION SUBSET(A, B) ! determine se o conjunto A
TYPE (SET), INTENT(IN) :: A, B ! um subconjunto do conjunto B
INTEGER I
SUBSET = A%CARD <= B%CARD
IF(.NOT. SUBSET) RETURN ! Para eficincia
DO I = 1, A%CARD
SUBSET = SUBSET .AND. (A%ELEMENT(I) .IN. B)
END DO
END FUNCTION SUBSET
TYPE(SET) FUNCTION SETF(V) ! funo de transferncia entre um vetor
INTEGER V(:) ! de elementos e um conjunto de elementos
INTEGER J ! removendo elementos duplicados
SETF%CARD = 0
DO J = 1, SIZE(V)
IF (.NOT. (V(J) .IN. SETF)) THEN
IF (SETF%CARD < MAX_SET_CARD) THEN
SETF%CARD = SETF%CARD + 1
SETF%ELEMENT (SETF%CARD) = V (J)
ELSE
! tamanho mximo do conjunto excede . . .
END IF
END IF
END DO
END FUNCTION SETF
FUNCTION VECTOR(A) ! transfere valores do conjunto A
TYPE(SET), INTENT(IN) :: A ! para o vetor em ordem ascendente
INTEGER, POINTER :: VECTOR(:)
INTEGER I, J, K
ALLOCATE(VECTOR (A%CARD))
VECTOR = A%ELEMENT(1 : A%CARD)
DO I = 1, A%CARD - 1 ! usa uma ordenao melhor se
DO J = I + 1, A%CARD ! A%CARD grande
IF (VECTOR(I) > VECTOR(J)) THEN
K = VECTOR(J); VECTOR(J) = VECTOR(I); VECTOR(I) = K
END IF
END DO
END DO
END FUNCTION VECTOR
END MODULE INTEGER_SETS
Exemplos usando INTEGER_SETS (A, B e C so variveis do tipo SET; X um avarivel inteira):
! verifica psara ver se A tem mais de 10 elementos
IF(X .IN. (A - B)) ...
! C a unio de A e o resultado de B interceptado
! com os inteiros de 1 at 100
C = A + B * SETF ((/ (I, I = 1, 100) /))
! A tem qualquer nmeros par no intervalo 1:100?
IF(CARDINALITY(A * SETF( (/ (I, I = 2, 100, 2) /) )) > 0) ...
PRINT *, VECTOR(B) ! mostra os elementos do conjunto B, em ordem ascendente
C.8.3.8 Renomeao de Entidades Pblicas
C.8.3.8 Public entities renamed
Quando necessrio pode-se renomear entidades que so acessadas com as instrues USE. Cuidados devem
ser tomados se os mdulos referenciados tambm contm instrues USE.
O exemplo que segue ilustra caractersticas da renomeao da instruo USE.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 433
MODULE J; REAL JX, JY, JZ; END MODULE J
MODULE K
USE J, ONLY : KX => JX, KY => JY
! KX e KY so nome locais no mdulo K
REAL KZ ! KZ um nome local para o mdulo K
REAL JZ ! JZ um nome local para o mdulo K
END MODULE K
PROGRAM RENAME
USE J; USE K
! entidade JX no mdulo J acessvel sob o nome JX e KX
! entidade JY no mdulo J acessvel sob o nome JY e KY
! entidade KZ no mdulo K acessvel sob o nome KZ
! entidade JZ no mdulo J e entidade JZ no mdulo K so entidades diferentes
! e no podem ser referenciadas
...
END PROGRAM RENAME
C.9 Notas da Seo 12
C.9 Section 12 notes
C.9.1 Problemas de Portabilidade com Procedimentos Externos (12.3.2.2)
C.9.1 Portability problems with external procedures (12.3.2.2)
Existe um problema potencial de portabilidade na unidade de escopo que referencia um procedimento
externo sem explicitamente declarar os procedimentos externos com o atributo EXTERNAL (5.1.2.6). Em um
processador diferente, o nome deste procedimento pode ser o nome de um procedimento intrnseco no padro e ao
processador permitido interpretar estas referncias de procedimentos como referncias de seus procedimentos
intrnsecos (neste processador, o programa pode tambm ser visto como no conforme com o padro por causa das
referncias ao procedimento intrnseco no padro). Declarao do atributo EXTERNAL causa as referncias dos
procedimentos externos independente de procedimento intrnseco disponvel com o mesmo nome. Note que a
declarao de tipo de um procedimento no suficiente para faz-la externa, mesmo que o tipo seja inconsistente
com o tipo do resultado de uma intrnseca com o mesmo nome.
C.9.2 Procedimentos definidos por meios diferentes do Fortran (12.5.3)
C.9.2 Procedures defined by means other than Fortran (12.5.3)
O processador no requerido prover quaisquer meios diferentes do Fortran para definir procedimentos
externos. Entre os meios que podem ser suportados esto a linguagem de mquina montadora (linguagem de mquina
machine assembly language), outras linguagens de alto nvel, a linguagem Fortran estendida com caractersticas no
padro e a linguagem Fortran como suportado por outros processadores Fortran (por exemplo, um processador
FORTRAN 77 previamente existente).
Procedimentos definidos por outros meios que no o Fortran so considerados procedimentos externos
porque suas definies no esto dentro de unidades de programa Fortran e porque elas so referenciadas usando-se
nomes globais. O uso do termo externo no pode ser entendido como contendo qualquer tipo de restrio nas
maneiras pelas quais estes procedimentos podem ser definidos. Por exemplo, se meios diferentes do Fortran tem
suas prprias facilidades para procedimentos internos e externos, permitido us-los. Se meios diferentes do
Fortran podem criar um procedimento interno com um nome global, permitido para este procedimento
internoser considerado um procedimento externo pelo Fortran. Outros meios diferentes do Fortran pra definir
procedimentos externos, incluindo quaisquer restries na estrutura da organizao destes procedimentos, so
inteiramente dependentes do processador.
Um processador Fortran pode limitar seu suporte aos procedimentos definidos por meios diferentes do
Fortran quando estes procedimentos podem afetar entidades no ambiente do Fortran somente nas mesmas bases que
os procedimentos escritos em Fortran. Por exemplo, ele pode proibir que o valor de uma varivel local seja
modificada por uma referncia de procedimento a menos que a varivel seja um dos argumentos do procedimento.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 434
C.9.3 Interfaces de Procedimentos (12.3)
C.9.3 Procedure interfaces (12.3)
No FORTRAN 77, a interface de um procedimento externo foi sempre deduzido da forma da referncia do
procedimento e de quaisquer declaraes do nome do procedimento na unidade de programa referenciada. Neste
padro, caractersticas como palavras-chaves de argumentos e argumentos opcionais tornam impossvel deduzir
suficiente informao sobre os argumentos mudos vindos da natureza dos argumentos reais que so associados com
eles e caractersticas tais como resultados de funo matricial e resultado de funo ponteiro tornam necessrio
extenses da declarao de um procedimento que no podem ser feitas por um meio que seja anlogo com a
manipulao das declaraes de procedimentos no FORTRAN 77. Ento, mecanismos so providos atravs dos
quais todas as informaes sobre a interface do procedimento podem se tornar disponveis em uma unidade de
escopo que referencia o procedimento. Um procedimento cuja interface tem que ser deduzida como no FORTRAN
77 descrita como tendo uma interface explcita. Um procedimento cuja interface completamente descrita como
tendo uma interface explcita.
Uma unidade de escopo permitida conter um corpo de interface para um procedimento que no existe em
um programa, garantido que o procedimento descrito nunca referencia ou o usa de qualquer outra maneira. O
propsito desta regra permitir implementaes na qual o uso de um mdulo provendo corpos de interface
descrevendo a interface de cada rotina em uma biblioteca no cause automaticamente cada uma destas rotina da
biblioteca se uma parte do programa que est referenciando o mdulo. Em vez disto, somente aqueles
procedimentos da biblioteca realmente referenciados sero parte do programa (em termos da implementao, a
simples presena de um corpo de interface no gera uma referncia externa em uma implementao).
C.9.4 Interfaces Abstratas (12.3) e Componentes Ponteiro de Procedimento
(4.5)
C.9.4 Abstract interfaces (12.3) and procedure pointer components (4.5)
Neste exemplo de um mdulo de biblioteca disponibilizando uma lista de retrochamadas (callbacks) que o
usurio pode registrar e invocar
Na computao callback (retrochamar)
(retrochamar chamar de volta estranho mas a traduo seria esta. Por este motivo o termo
ingls callback muito usado)
uma referncia de um cdigo executvel ou um pedao de cdigo executvel que passado como
argumento de outro cdigo. Isto permite que uma camada de software de nvel mais baixo chamar
uma funo (ou sub-rotina) definida em uma camada de nvel mais alto
http://en.wikipedia.org/wiki/Callback_(computer_programming) (acessado em: 03/02/2011)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 435
MODULE callback_list_module
!
! Tipo para o usurio estender com seus prprios dados, se desejar
!
TYPE callback_data
END TYPE
!
! Interface abstrata para os procedimentos callback
!
ABSTRACT INTERFACE
SUBROUTINE callback_procedure(data)
IMPORT callback_data
CLASS(callback_data),OPTIONAL :: data
END SUBROUTINE
END INTERFACE
!
! o tipo callback list
!
TYPE callback_list
PRIVATE
CLASS(callback_record),POINTER :: first => NULL()
END TYPE
!
! Interno: cada registro de callback cria um destes
!
TYPE,PRIVATE :: callback_record
PROCEDURE(callback_procedure),POINTER,NOPASS :: proc
CLASS(callback_record),POINTER :: next
CLASS(callback_data),POINTER :: data => NULL();
END TYPE

PRIVATE invoke,forward_invoke
CONTAINS
!
! registra um procedimento callback com dados opcionais
!
SUBROUTINE register_callback(list, entry, data)
TYPE(callback_list),INTENT(INOUT) :: list
PROCEDURE(callback_procedure) :: entry
CLASS(callback_data),OPTIONAL :: data
TYPE(callback_record),POINTER :: new,last
ALLOCATE(new)
new%proc => entry
IF(PRESENT(data)) ALLOCATE(new%data,SOURCE=data)
new%next => list%first
list%first => new
END SUBROUTINE
!
! interno: invoca um nica callback e destri seu registro
!
SUBROUTINE invoke(callback)
TYPE(callback_record),POINTER :: callback
IF(ASSOCIATED(callback%data) THEN
CALL callback%proc(list%first%data)
DEALLOCATE(callback%data)
ELSE
CALL callback%proc
END IF
DEALLOCATE(callback)
END SUBROUTINE
!
! chama os procedimentos na ordem reversa do registro
!
SUBROUTINE invoke_callback_reverse(list)
TYPE(callback_list),INTENT(INOUT) :: list
TYPE(callback_record),POINTER :: next,current
current => list%first
NULLIFY(list%first)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 436
DO WHILE (ASSOCIATED(current))
next => current%next
CALL invoke(current)
current => next
END DO
END SUBROUTINE
!
! interno: invoca no modo progressivo
!
RECURSIVE SUBROUTINE forward_invoke(callback)
IF(ASSOCIATED(callback%next)) CALL forward_invoke(callback%next)
CALL invoke(callback)
END SUBROUTINE
!
! chama o procedimento na ordem progressiva de registro
!
SUBROUTINE invoke_callback_forward(list)
TYPE(callback_list),INTENT(INOUT) :: list
IF(ASSOCIATED(list%first)) CALL forward_invoke(list%first)
END SUBROUTINE
END
C.9.5 Argumentos Associados e Avaliao (12.4.1.2)
C.9.5 Argument association and evaluation (12.4.1.2)
Existe uma diferena significante entre a associao de argumento permitida neste padro e aquela
suportada pelo FORTRAN 77 e FORTRAN 66. No FORTRAN 77 e 66, argumentos reais eram limitados a
unidades de armazenamentos consecutivas. Com a exceo dos argumentos mudos caractere de comprimento
assumido, a estrutura imposta nesta sequncia de unidades de armazenamento foi sempre determinada no
procedimento invocado e no pego do argumento real. Ento era possvel implementar associao de argumentos
no FORTRAN 66 e 77 fornecer somente a localizao da primeira unidade de armazenamento (exceto para
argumentos caractere, onde o comprimento tambm tinha que ser fornecido). Entretanto, este padro permite
argumentos que no reside em locaes de armazenamento consecutivas (por exemplo, uma seo de matriz) e
argumentos mudos que assume informaes estruturais adicionais vindo do argumento real (por exemplo,
argumentos mudos de forma assumida). Ento, o mecanismo para implementar associao de argumentos permitido
neste padro necessita ser mais geral.
Porque no h vantagens prticas para um processador que pode suportar referncias para e de
procedimentos definidos por um processador FORTRAN 77, requerimentos para interfaces explcitas torna possvel
determinar se um (FORTRAN 66/FORTRAN77) mecanismo de implementao de associao de argumento
simples suficiente ou se um mecanismo mais geral necessrio (12.3.1.1). Ento um processador pode ser
implementado para os procedimentos que requerem um mecanismo simples sempre que a interface do
procedimento tal que usa somente caractersticas do FORTRAN 77 e que utiliza um mecanismo mais geral em
caso contrrio (por exemplo, se existem formas assumidas ou argumentos opcionais). No ponto em que a referncia
aparece, o mecanismo apropriado pode ser determinado da interface se ela explicita e pode ser assumido ser um
mecanismo simples se a interface no existe. Note que o mecanismo simples determinado como sendo aquele que
o procedimento espera, pode ser necessrio para o processador alocar temporariamente espao de armazenamento
consecutivo para o argumento real, copiar o argumento real para este armazenamento temporrio, referenciar o
procedimento usando este armazenamento temporrio em vez do argumento real, copiar o contedo do
armazenamento temporrio de volta para o argumento real e desalocar o armazenamento temporrio.
Se este for o mtodo de implementao particular estas regras so projetadas para dar suportar, este no o
nico mtodo possvel. Por exemplo, em alguns processadores, possvel implementar uma associao de
argumento geral de forma que a informao envolvida na associao de argumento do FORTRAN 77 pode ser
encontrada no mesmo local e as informaes extras so colocadas de forma que elas no perturbem uma
procedimento esperando somente associao de argumentos FORTRAN 77. Com este tipo de implementao,
associao de argumento pode ser transladada sem considerao se a interface explcita ou implcita.
A previso para avaliao de expresso d ao processador considervel flexibilidade para obter valores de
expresso da forma mais eficiente possvel. Isto inclu no avaliao ou somente avaliao parcial de um operando,
por exemplo, se o valor da expresso pode ser determinado de outra forma (7.1.8.1). Esta flexibilidade aplica-se a
avaliao de argumento de funo, incluindo a ordem de avaliao dos argumentos, atrasando avaliao de
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 437
argumento e omitindo avaliao da argumento. U,m processador pode atrasar a avaliao de um argumento em uma
referncia do procedimento at que a execuo do procedimento faa uma referncia ao valor do argumento,
garantido que o atraso na referncia do procedimento no produza outros efeitos no resultado do programa. O
processador pode, com restries similares, omitir inteiramente a avaliao de um argumento no referenciado na
execuo do procedimento. Isto d ao processador uma grande flexibilidade para otimizao (por exemplo, para
processamento em paralelo).
C.9.6 Ponteiros e Alvos como Argumentos (12.4.1.2)
C.9.6 Pointers and targets as arguments (12.4.1.2)
Se um argumento mudo declarado como sendo um ponteiro, ele somente pode ser associado ( ligado
conectado matched) com um argumento real que tambm um ponteiro e as caractersticas dos dois argumentos
tem que concordarem. Um modelo para este tipo de associao que os valores do descritor de um ponteiro real
so copiados para o ponteiro mudo. Se o ponteiro atual tem um alvo associado, este alvo se torna acessvel via o
ponteiro mudo. Se o ponteiro mudo se torna associado com um alvo diferentes durante a execuo do
procedimento, este alvo estar acessvel via o ponteiro real depois do procedimento ter terminado a execuo. Se o
ponteiro mudo se torna associado com um alvo local que cessa de existir quando o procedimento termina, o
ponteiro atual ser deixado pendurado (dangling) em um estado no definido. Estes ponteiros pendurados no
podem ser usados.
Quando a execuo de um procedimento termina, qualquer ponteiro que permanece definido e que est
associado com um argumento mudo que tem o atributo TARGET e um escalar ou uma matriz de forma assumida,
permanece associado com o correspondente argumento real se o argumento real tem o atributo TARGET e no
uma seo de matriz com um subscrito vetor.
REAL, POINTER :: PBEST
REAL, TARGET :: B(10000)
CALL BEST(PBEST, B) ! at o retorno de PBEST est associado
... ! com o best elemento de B
CONTAINS
SUBROUTINE BEST (P, A)
REAL, POINTER, INTENT (OUT) :: P
REAL, TARGET, INTENT (IN) :: A(:)
...
! encontre o best elemento de A(I)
P => A (I)
RETURN
END SUBROUTINE BEST
END
Quando o procedimento BEST termina, o ponteiro PBEST est associado com um elemento B.
Um argumento real sem o atributo TARGET pode se tornar associado com um argumento mudo com o
atributo TARGET. Isto permite que ponteiro se tornem associados com argumentos mudos durante a execuo do
procedimento que contm o argumento mudo. Por exemplo:
INTEGER LARGE(100,100)
CALL SUB (LARGE)
...
CALL SUB()
CONTAINS
SUBROUTINE SUB(ARG)
INTEGER, TARGET, OPTIONAL :: ARG(100,100)
INTEGER, POINTER, DIMENSION(:,:) :: PARG
IF(PRESENT(ARG)) THEN
PARG => ARG
ELSE
ALLOCATE(PARG(100,100))
PARG = 0
ENDIF
... ! cdigo com muitas referncias a PARG
IF(.NOT. PRESENT(ARG)) DEALLOCATE(PARG)
END SUBROUTINE SUB
END
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 438
Dentro da sub-rotina SUB o ponteiro PARG est associado com o argumento mudo ARG ou ele est
associado com um alvo alocado. O corpo (bulk) do cdigo pode referenciar PARG sem mais chamadas funo
intrnseca PRESENT.
C.9.7 Associao de Argumentos Polimrficos (12.4.1.3)
C.9.7 Polymorphic Argument Association (12.4.1.3)
O exemplo que segue ilustra as regras de associao de argumento polimrfica usando as definio de tipos
derivados da nota 4.54.
TYPE(POINT) :: T2
TYPE(COLOR_POINT) :: T3
CLASS(POINT) :: P2
CLASS(COLOR_POINT) :: P3
! o argumento mudo polimrfico e o argumento real do tipo fixo
SUBROUTINE SUB2( X2 ); CLASS(POINT) :: X2; ...
SUBROUTINE SUB3( X3 ); CLASS(COLOR_POINT) :: X3; ...
CALL SUB2( T2 ) ! vlido o tipo declarado de T2 o mesmo que o
! tipo declarado de X2
CALL SUB2( T3 ) ! vlido o tipo declarado de T3 estende o
! tipo declarado de X2
CALL SUB3( T2 ) ! invlido o tipo declarado de T2 no de mesmo tipo
! nem estende o tipo declarado de X3
CALL SUB3( T3 ) ! vlido o tipo declarado de T3 o mesmo
! tipo declarado de X3
! Argumento real polimrfico e argumento mudo do tipo fixo
SUBROUTINE TUB2( D2 ); TYPE(POINT) :: D2; ...
SUBROUTINE TUB3( D3 ); TYPE(COLOR_POINT) :: D3; ...
CALL TUB2( P2 ) ! vlido o tipo declarado de P2 o mesmo
! tipo declarado de D2
CALL TUB2( P3 ) ! invlido o tipo declarado de P3 difere do
! tipo declarado de D2
CALL TUB2( P3%POINT ) ! alternativa vlida do mostrado acima
CALL TUB3( P2 ) ! invlido o tipo declarado de P2 difere do
! tipo declarado de D3
SELECT TYPE( P2 ) ! alternativa condicional vlida para o anterior
CLASS IS( COLOR_POINT ) ! funciona se o tipo dinmico de P2 do mesmo tipo
CALL TUB3 ( P2 ) ! declarado no tipo de D3 ou o tipo
! estendido dele
CLASS DEFAULT
! no funciona se no
END SELECT
CALL TUB3( P3 ) ! vlido o tipo declarado de P3 o mesmo
! tipo declarado de D3
! os dois argumento real e mudo so polimrficos
CALL SUB2( P2 ) ! vlido o tipo declarado de P2 o mesmo
! tipo declarado em X2
CALL SUB2( P3 ) ! vlido o tipo declarado de P3 estendido do
! tipo declarado em X2
CALL SUB3( P2 ) ! invlido o tipo declarado de P2 no o mesmo
! nem estende o tipo X3
SELECT TYPE( P2 ) ! alternativa condicional vlida para o anterior
CLASS IS( COLOR_POINT ) ! funciona se o tipo dinmico de P2 o mesmo
CALL SUB3( P2 ) ! que o tipo declarado de X3 ou estende o tipo X3
CLASS DEFAULT
! no funciona se no
END SELECT
CALL SUB3( P3 ) ! vlido o tipo declarado de P3 o mesmo
! tipo declarado de X3
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 439
C.10 Notas da Seo 15
C.10 Section 15 notes
C.10.1 Ambiente de Execuo
C.10.1 Runtime environments
Este padro permite que programas contenham procedimentos definidas por outros meios que no o
Fortran. Isto cria a necessidade de inicializao e interao entre os ambientes de execuo envolvidos.
Implementaes so livres para resolver estas necessidades da melhor forma, garantido que:
1. alocao/desalocao de uma rea de memria livre (heap) (exemplo, (DE)ALLOCATE em um
subprograma Fortran e malloc/free em uma funo C ) pode ser realizada sem interferncia
2. Entrada/sada (I/O E/S) para e de um arquivo externo pode ser realizado sem interferncia, enquanto os
procedimentos definidos por diferentes meios no faam E/S de/para (I/O to/from) para o mesmo arquivo
esterno
3. pr-conexo de E/S (I/O preconnections) existe como requerido pelos respectivos padres
4. dados inicializados so inicializados de acordo com seus respectivos padres
A memria alocada de um grande aglomerado de memria no usada chamada de heap
heap conjunto de coisas colocadas umas sobre as outras aglomerado, amontoado, pilha
tambm chamado de armazenamento livre ou memria livre
http://en.wikipedia.org/wiki/Dynamic_memory_allocation
C.10.2 Exemplos de Interoperao entre Fortran e Funes C
C.10.2 Examples of Interoperation between Fortran and C Functions
Os exemplos que seguem ilustram a interoperao do Fortran com funes C. Dois exemplos so
mostrados: um do Fortran chamando o C e outro do C chamando o Fortran. Em cada um dos exemplos, a
correspondncia dos argumentos reais Fortran, argumentos mudos Fortran e parmetros formais C so descritos.
C.10.2.1 Exemplos de Fortran chamando C
C.10.2.1 Example of Fortran calling C
Prottipo de funo C:
int C_Library_Function(void* sendbuf, int sendcount, int *recvcounts);
Mdulos Fortran:
MODULE FTN_C_1
USE, INTRINSIC :: ISO_C_BINDING
END MODULE FTN_C_1
MODULE FTN_C_2
INTERFACE
INTEGER(C_INT) FUNCTION C_LIBRARY_FUNCTION(SENDBUF, SENDCOUNT, RECVCOUNTS), &
BIND(C, NAME=C_Library_Function)
USE FTN_C_1
IMPLICIT NONE
TYPE (C_PTR), VALUE :: SENDBUF
INTEGER (C_INT), VALUE :: SENDCOUNT
TYPE (C_PTR), VALUE :: RECVCOUNTS
END FUNCTION C_LIBRARY_FUNCTION
END INTERFACE
END MODULE FTN_C_2
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 440
O mdulo FTN_C_2 contm a declarao dos argumentos mudos Fortran,que correspondem aos
argumentos formais do C. O mdulo intrnseco ISO_C_BINDING referenciado no mdulo FTN_C_1. O
especificador NAME usado no atributo BIND para manejar a caracterstica de nome sensvel ao tamanho (isto ,
diferencia letras maisculas e minsculas case-sensitive) entre o Fortran e o C que acontece entre
C_LIBRARY_FUNCTION para C_Library_Function. Veja tambm a nota 12.39.
O primeiro parmetro formal C o ponteiro para void sendbuf, que corresponde ao argumento mudo
Fortran SENDBUF, que tem o tipo C_PTR e o atributo VALUE .
O segundo parmetro formal C o int sendcount, que corresponde ao argumento mudo Fortran
SENDCOUNT, que tem o tipo INTEGER(C_INT) e o atributo VALUE.
O terceiro parmetro formal C o ponteiro int recvcounts, que corresponde ao argumento mudo Fortran
RECVCOUNTS, que tem o tipo C_PTR e o atributo VALUE.
Sequncia de chamada Fortran:
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_LOC
USE FTN_C_2
...
REAL(C_FLOAT), TARGET :: SEND(100)
INTEGER(C_INT) :: SENDCOUNT
INTEGER(C_INT), ALLOCATABLE, TARGET :: RECVCOUNTS(100)
...
ALLOCATE( RECVCOUNTS(100) )
...
CALL C_LIBRARY_FUNCTION(C_LOC(SEND), SENDCOUNT, C_LOC(RECVCOUNTS))
...
Os cdigos precedentes contm a declarao dos argumentos reais Fortran associados com a lista acima de
argumentos mudos Fortran.
O primeiro argumento real Fortran o endereo do primeiro elemento da matriz SEND, que tem o tipo
REAL(C_FLOAT) e o atributo TARGET. Este endereo retornado pela funo intrnseca C_LOC. Este
argumento real associado com o argumento mudo Fortran SENDBUF, que tem o tipo C_PTR e o atributo
VALUE.
O segundo argumento real Fortran SENDCOUNT do tipo INTEGER(C_INT), que associado com o
argumento mudo Fortran SENDCOUNT, que tem o tipo INTEGER(C_INT) e o atributo VALUE.
O terceiro argumento real Fortran o endereo do primeiro elemento da matriz alocvel RECV_COUNTS,
que tem o tipo REAL(C_FLOAT) e o atributo TARGET. Este endereo retornado pela funo intrnseca C_LOC.
Este argumento real associado com o argumento mudo Fortran RECVCOUNTS, que tem o tipo C_PTR e o
atributo VALUE.
C.10.2.2 Exemplos de C chamando Fortran
C.10.2.2 Example of C calling Fortran
Cdigo Fortran:
SUBROUTINE SIMULATION( ALPHA, BETA, GAMMA, DELTA, ARRAYS ), BIND(C)
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
INTEGER(C_LONG), VALUE :: ALPHA
REAL(C_DOUBLE), INTENT(INOUT) :: BETA
INTEGER(C_LONG), INTENT(OUT) :: GAMMA
REAL(C_DOUBLE),DIMENSION(*),INTENT(IN) :: DELTA
TYPE, BIND(C) :: PASS
INTEGER(C_INT) :: LENC, LENF
TYPE(C_PTR) :: C, F
END TYPE PASS
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 441
TYPE(PASS), INTENT(INOUT) :: ARRAYS
REAL(C_FLOAT), ALLOCATABLE, TARGET, SAVE :: ETA(:)
REAL(C_FLOAT), POINTER :: C_ARRAY(:)
...
! Associa C_ARRAY com uma matriz alocvel no C
CALL C_F_POINTER( ARRAYS%C, C_ARRAY, (/ARRAYS%LENC/) )
...
! aloca uma matriz e a torna disponvel no C
ARRAYS%LENF = 100
ALLOCATE( ETA(ARRAYS%LENF) )
ARRAYS%F = C_LOC( ETA )
...
END SUBROUTINE SIMULATION
Declarao struct do C
struct pass {int lenc, lenf; float* f, c};
Prottipo de funo C:
void simulation(long alpha, double *beta, long *gamma, double delta[], pass *arrays);
Sequncia de chamada C :
simulation( alpha, &beta, &gamma, delta, &arrays );
O cdigo Fortran listado acima especifica a sub-rotina SIMULATION. Esta sub-rotina corresponde a
funo void simulation do C.
A sub-rotina Fortran referencia o mdulo intrnseco ISO_C_BINDING.
O primeiro argumento mudo Fortran da sub-rotina ALPHA, que tem o tipo INTEGER(C_LONG) e o
atributo VALUE. Este argumento mudo corresponde ao parmetro formal C alpha, que um long. O parmetro
real C tambm um long.
O segundo argumento mudo Fortran da sub-rotina BETA, que tem o tipo REAL(C_DOUBLE) e o
atributo INTENT(INOUT). Este argumento mudo corresponde ao parmetro formal C beta, que um ponteiro
para double. Um endereo passado como o parmetro real em uma sequncia de chamada no C.
O terceiro argumento mudo Fortran da sub-rotina a sub-rotina GAMMA, que tem o tipo
INTEGER(C_LONG) e o atributo INTENT(OUT). Este argumento mudo corresponde ao parmetro formal C
gamma, que um ponteiro para long. Um endereo passado como o parmetro real em uma sequncia de chamada
no C.
O quarto argumento mudo Fortran a matriz de tamanho assumido DELTA, que tem o tipo
REAL(C_DOUBLE) e o atributo INTENT(IN). Este argumento mudo corresponde ao parmetro formal C delta,
que uma matriz double. O parmetro real C tambm uma matriz double.
O quinto argumento mudo Fortran ARRAYS, que uma estrutura para acessar uma matriz alocada no C e
uma matriz alocada no Fortran. Os comprimentos destas matrizes so mantidos nos componentes LENC e LENF;
seus endereos C so mantidos nos componentes C e F.
C.10.2.3 Exemplos de chamada de Funes C com dados no
Interoperveis
C.10.2.3 Example of calling C functions with non-interoperable data
Muitos processadores suportam nmeros reais de 16-byte, que pode no ser suportado por um processador
C. Assuma que um programador necessite usar um procedimento C da biblioteca passando uma mensagem para
uma matriz com este tipo de nmero real. O prottipo C para este procedimento
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 442
void ProcessBuffer(void *buffer, int n_bytes);
com a correspondente interface Fortran
USE, INTRINSIC :: ISO_C_BINDING
INTERFACE
SUBROUTINE PROCESS_BUFFER(BUFFER,N_BYTES), BIND(C,NAME="ProcessBuffer")
IMPORT :: C_PTR, C_INT
TYPE(C_PTR), VALUE :: BUFFER ! o endereo C do buffer da matriz
INTEGER(C_INT), VALUE :: N_BYTES ! nmero de octetos (bytes) no buffer
END SUBROUTINE PROCESS_BUFFER
END INTERFACE
Isto pode ser deito usando C_LOC se o processador particular especifica que C_LOC retorna um endereo
apropriado:
REAL(R_QUAD), DIMENSION(:), ALLOCATABLE, TARGET :: QUAD_ARRAY
...
CALL PROCESS_BUFFER(C_LOC(QUAD_ARRAY), INT(16*SIZE(QUAD_ARRAY),C_INT))
! um real quad utiliza 16 octetos (bytes) neste processador
C.10.2.4 Exemplos de Comunicao Opaca entre C e Fortran
C.10.2.4 Example of opaque communication between C and Fortran
O exemplo que segue demonstra como um processador pode construir um moderno gerador de nmero
aleatrio OO (OO orientao a objetos) escrito em Fortran disponvel para um programa C:
USE, INTRINSIC :: ISO_C_BINDING
! assuma que este cdigo est dentro de um mdulo
TYPE RANDOM_STREAM
! um gerador de nmero aleatrio (uniforme) (URNG - Uniform Random Number Generator )
CONTAINS
PROCEDURE(RANDOM_UNIFORM), DEFERRED, PASS(STREAM) :: NEXT
! gera o prximo nmero deste fluxo (stream)
END TYPE RANDOM_STREAM
ABSTRACT INTERFACE
! interface abstrata da URNG Fortran
SUBROUTINE RANDOM_UNIFORM(STREAM, NUMBER)
IMPORT :: RANDOM_STREAM, C_DOUBLE
CLASS(RANDOM_STREAM), INTENT(INOUT) :: STREAM
REAL(C_DOUBLE), INTENT(OUT) :: NUMBER
END SUBROUTINE RANDOM_UNIFORM
END INTERFACE
Um objeto polimrfico do tipo base RANDOM_STREAM no interopervel com o C. Entretanto, ns
podemos fazer este tipo de gerador de nmero aleatrio disponvel para o C empacotando-o dentro de outro tipo
derivado no parametrizvel no polimrfico:
TYPE :: URNG_STATE ! no BIND(C), porque este tipo no interopervel
CLASS(RANDOM_STREAM), ALLOCATABLE :: STREAM
END TYPE URNG_STATE
Os dois procedimentos que seguem iro permitir que o programa C use nosso gerador de nmero aleatrio
uniforma Fortran:
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 443
! inicializa o gerador de nmero aleatrio uniforme:
SUBROUTINE INITIALIZE_URNG(STATE_HANDLE, METHOD),BIND(C, NAME="InitializeURNG")
TYPE(C_PTR), INTENT(OUT) :: STATE_HANDLE
! um manipulador opaco para o URNG
CHARACTER(C_CHAR), DIMENSION(*), INTENT(IN) :: METHOD
! o algoritmo a ser usado
TYPE(URNG_STATE), POINTER :: STATE
! um objeto URNG real
ALLOCATE(STATE)
! aqui necessrio um procedimento de finalizao correspondente
! para evitar vazamento de memria, no mostrado neste exemplo
! aloca STATE%STREAM com um tipo dinmico dependente de METHOD
...
STATE_HANDLE=C_LOC(STATE)
! obtm um manipulador opaco para retornar para o C
END SUBROUTINE INITIALIZE_URNG
! gera um nmero aleatrio:
SUBROUTINE GENERATE_UNIFORM(STATE_HANDLE, NUMBER), BIND(C, NAME="GenerateUniform")
TYPE(C_PTR), INTENT(IN), VALUE :: STATE_HANDLE
! um manipulador opaco: obtido cia uma chamada de INITIALIZE_URNG
REAL(C_DOUBLE), INTENT(OUT) :: NUMBER

TYPE(URNG_STATE), POINTER :: STATE
! um ponteiro para o real URNG

CALL C_F_POINTER(CPTR=STATE_HANDLE, FPTR=STATE)
! converte o manipulador opaco em um ponteiro usvel
CALL STATE%STREAM%NEXT(NUMBER)
! usa o procedimento ligado ao tipo NEXT para gerar NUMBER
END SUBROUTINE GENERATE_UNIFORM
C.11 Notas da Seo 16
C.11 Section 16 notes
C.11.1 Exemplos de Associao de Hospedagem (16.4.1.3)
C.11.1 Examples of host association (16.4.1.3)
Os dois primeiros exemplos so exemplos de associao de hospedagem vlidas. O terceiro exemplo um
exemplo invlido de associao de hospedagem.
Exemplo 1:
PROGRAM A
INTEGER I, J
...
CONTAINS
SUBROUTINE B
INTEGER I ! declarao de I esconde as declaraes de I no programa A
...
I = J ! usa a varivel J do programa A atravs de associao de hospedagem
END SUBROUTINE B
END PROGRAM A
Exemplo 2:
PROGRAM A
TYPE T
...
END TYPE T
...
CONTAINS
SUBROUTINE B
IMPLICIT TYPE(T) (C) ! referncia do tipo T declarado a seguir na sub-rotina B,
! no tipo T declarado antes no programa A

Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 444
...
TYPE T
...
END TYPE T
...
END SUBROUTINE B
END PROGRAM A
Exemplo 3:
PROGRAM Q
REAL(KIND = 1) :: C
...
CONTAINS
SUBROUTINE R
REAL(KIND = KIND(C)) :: D ! declarao invlida, ver a seguir
REAL(KIND = 2) :: C
...
END SUBROUTINE R
END PROGRAM Q
Na declarao de D na sub-rotina R, o uso de C refere-se a uma declarao do C na sub-rotina R, no o
programa Q. Entretanto, ele invlido porque a declarao de C requerida ocorrer antes de seu uso na declarao
de D (7.1.7).
C.11.2 Regras assegurando no Ambiguidades Genricas (16.2.3)
C.11.2 Rules ensuring unambiguous generics (16.2.3)
As regras em 16.2.3 intencionam garantir
que possvel referenciar cada procedimento especfico na coleo genrica
que para qualquer referncia vlida para um procedimento genrico, a determinao do procedimento
especfico referenciado no ambguo
que a determinao do procedimento especfico referenciado pode ser feito antes da execuo do programa
iniciar (durante a compilao)
Procedimentos especficos so distinguveis por propriedades fixas de seus argumentos, especificamente
tipo, parmetros de tipo subtipo (kind type parameters) e nmero de dimenses (rank). Uma referncia vlida a um
procedimento em uma coleo genrica ir diferir de outra porque ela tem um argumento que a outra no aceita,
porque ela no tem um argumento que a outra requer ou porque uma destas propriedades fixas diferente.
Apesar da declarao de tipo de uma entidade de dado ser uma propriedade fixa, variveis polimrficas
permitem um grau limitado de erro de concordncia de tipo (type mismatch) entre argumentos mudos e argumentos
reais, ento o requerimento para distinguir dois argumentos mudos incompatibilidade de tipo, no meramente
diferena de tipo (isto ilustrado no exemplo BAD6 depois nesta nota).
Esta mesma no concordncia de tipo (type mismatch) significa que dois argumentos mudos que no so
incompatveis em tipo podem ser distinguveis tomando como base os valores dos parmetros de tipo subtipo (kind
type parameters) que eles possuem em comum; se um deles tem um parmetro de tipo subtipo ( kind type parameter)
que o outro no tem, isto irrelevante para distingui-los.
Nmero de dimenses (rank) uma propriedade fixa, mas algumas formas de argumentos mudos matriciais
permite no concordncia (mismatches) quando o procedimento referenciado pelo seu nome especfico. Para
permitir que o nmero de dimenses (rank) seja usado para distinguir genricos, esta no concordncia de nmero
de dimenses (rank mismatches) desabilitada para aqueles argumentos quando o procedimento referenciado
como parte da um genrico. Adicionalmente, o fato que procedimentos elementares podem aceitar argumentos
matriciais no levado em conta quando da aplicao destas regras, ento aparente ambiguidade entre
procedimentos elementares e no elementares possvel; nestes casos, a referncia interpretada como sendo um
procedimento no elementar.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 445
Para procedimentos referenciados como operadores ou atribuio definida, argumentos sintaticamente
distinguveis so mapeados em posies especficas na lista de argumentos, ento a regra para distinguir estes
procedimentos que possvel distinguir os argumentos pelas posies deles.
Para procedimentos de entrada/sada tipos derivados definidos pelos usurios, somente o argumento dtv
correspondente a algum explicitamente escrito no programa, ento ele o dtv que requerido para ser distinguvel.
Porque os argumentos dtv so requeridos serem escalares, eles no podem diferir em nmero de dimenses ( rank).
Ento esta regra efetivamente envolve somente tipo e parmetros de tipo subtipo.
Para procedimentos genricos identificados por nomes, as regras so mais complicadas porque argumentos
opcionais podem ser omitidos e porque argumentos podem ser especificados por posio ou por nome.
No caso especial de procedimentos ligado ao tipo (type-bound procedures) com argumentos mudos objeto
passado (passed-object dummy arguments), o argumento objeto passado distinguvel sintaticamente na referncia,
ento a regra (2) pode ser aplicada. O tipo dos argumentos objeto passado restrito de maneira que impea que
argumentos objeto passado na mesma unidade de escopo de ser tornarem incompatvel em tipo. Ento esta regra
efetivamente envolve somente parmetros de tipo subtipo (kind type parameters) e nmero de dimenses (rank).
A primeiro mecanismo para distinguir genricos com nome (named generics) a regra (3). A aplicao mais
comum desta regra um argumento simples satisfazendo as regras (3a) e (3b):
INTERFACE GOOD1
FUNCTION F1A(X)
REAL :: F1A,X
END FUNCTION F1A

FUNCTION F1B(X)
INTEGER :: F1B,X
END FUNCTION F1B
END INTERFACE GOOD1
Se se escreve GOOD1(1.0) ou GOOD1(X=1.0), a referncia para F1A porque F1B ir requerer um
argumento inteiro enquanto que esta referncia prov uma constante real 1.0.
Este exemplo e o que segue espesso usando corpos de interface,com o tipo como a propriedade
distinguvel. Esto foi feito para tornar fcil escrever e descrever o exemplo. Os princpios que esto sendo
ilustrados so igualmente aplicveis quando os procedimentos obtm suas interfaces de outra maneira ou quando
parmetros de tipo subtipo (kind type parameters) ou nmero de dimenses (rank) so propriedades distinguveis.
Outra variante comum o argumento que satisfaz as regras (3a) e (3b) sendo requisitado em uma ordem
especfica ou esquecendo completamente a ordem.
INTERFACE GOOD2
FUNCTION F2A(X)
REAL :: F2A,X
END FUNCTION F2A

FUNCTION F2B(X,Y)
COMPLEX :: F2B
REAL :: X,Y
END FUNCTION F2B
END INTERFACE GOOD2
Se se escreve GOOD2(0.0,1.0), GOOD2(0.0,Y=1.0) ou GOOD2(Y=1.0,X=0.0), a referncia para F2B,
porque F2A no tem argumento na segunda posio ou com o nome Y. Este forma usada como uma alternativa
para os argumentos opcionais quando se deseja que uma funo tenha tipo, parmetros de tipo subtipo ( kind type
parameters) ou nmero de dimenses (rank) diferentes, dependendo se o argumento est presente. Em muitas das
das funes intrnsecas, o argumento DIM trabalha desta forma.
possvel construir casos onde argumentos diferentes so usados para distinguir posicionalmente ou por
nome:
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 446
INTERFACE GOOD3
SUBROUTINE S3A(W,X,Y,Z)
REAL :: W,Y
INTEGER :: X,Z
END SUBROUTINE S3A
SUBROUTINE S3B(X,W,Z,Y)
REAL :: W,Z
INTEGER :: X,Y
END SUBROUTINE S3B
END INTERFACE GOOD3
Se se escreve GOOD3(1.0,2,3.0,4) para referenciar S3A, ento os terceiro e quarto argumentos so
consistente com a referncia para S3B, mas os primeiro e segundo no so. Se se troca a escrita para que os
primeiros dois argumentos tenham palavras-chaves de argumentos de forma que eles se tornem consistente com a
referncia para S3B, os dois ltimos argumentos tem que obrigatoriamente (must) tambm ser escritos com
palavras-chaves de argumentos, GOOD3(X=2,W= 1.0,Z=4,Y=3.0) e os argumentos com nome Y e Z so
distinguveis.
O requerimento de ordenao na regra (3) crtico:
INTERFACE BAD4 ! esta interface no vlida
SUBROUTINE S4A(W,X,Y,Z)
REAL :: W,Y
INTEGER :: X,Z
END SUBROUTINE S4A
SUBROUTINE S4B(X,W,Z,Y)
REAL :: X,Y
INTEGER :: W,Z
END SUBROUTINE S4B
END INTERFACE BAD4
Neste exemplo, os argumentos distinguveis pela posio so Y e Z enquanto W e X so distinguveis pelo
nome. Nesta ordem possvel escrever BAD4(1.0,2, Y=3.0, Z=4), que uma referncia vlida tanto para S4A
quanto para S4B.
A regra (1) pode ser usada para distinguir alguns casos que no so cobertos pela regra (3):
INTERFACE GOOD5
SUBROUTINE S5A(X)
REAL :: X
END SUBROUTINE S5A
SUBROUTINE S5B(Y,X)
REAL :: Y,X
END SUBROUTINE S5B
END INTERFACE GOOD5
Ao tentar aplicar a regra (3), a posio 2 e o nome Y so distinguveis, mas eles esto na ordem errada,
como no exemplo BAD4. Entretanto, quando ns tentamos construir uma referncia similar ambgua, ns obtemos
GOOD5(1.0,X=2.0), que no pode ser uma referncia para S5A porque ela est tentando associas dois argumentos
reais diferentes com o argumento mudo X. A regra (3) pega esse caso reconhecendo que S5B requer dois
argumentos reais e requires S5A no pode aceitar mais de um.
A aplicao da regra (1) se torna mais complicada quando tipo extensveis so invocados. Se FRUIT um
tipo extensvel, PEAR e APPLE so extenses de FRUIT e BOSC uma extenso de PEAR, ento
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 447
INTERFACE BAD6 ! esta interface no vlida
SUBROUTINE S6A(X,Y)
CLASS(PEAR) :: X,Y
END SUBROUTINE S6A
SUBROUTINE S6B(X,Y)
CLASS(FRUIT) :: X
CLASS(BOSC) :: Y
END SUBROUTINE S6B
END INTERFACE BAD6
pode, em princpio, ser distinguvel desta forma, mas por causa da limitao da no concordncia de tipo ( type
mismatching), BAD6(A PEAR,A BOSC) uma referncia vlida tanto para S6A quanto para S6B.
importante tentar a regra (1) para cada tipo presente:
INTERFACE GOOD7
SUBROUTINE S7A(X,Y,Z)
CLASS(PEAR) :: X,Y,Z
END SUBROUTINE S7A
SUBROUTINE S7B(X,Z,W)
CLASS(FRUIT) :: X
CLASS(BOSC) :: Z
CLASS(APPLE),OPTIONAL :: W
END SUBROUTINE S7B
END INTERFACE GOOD7
Olhando para o tipo mais geral, S7A tem um mnimo e mximo de 3 argumentos FRUIT, enquanto S7B
tem um mnimo de 2 e um mximo de trs. Olhando para o mais especfico, S7A tem um mnimo de 0 e um
mximo de 3 argumentos BOSC, enquanto S7B tem um mnimo de 1 e um mximo de 2. Entretanto, quando se
olha de forma intermediria, S7A tem um mnimo de 3 argumentos PEAR, enquanto S7B tem um mnimo de 1 e
um mximo de 2. Porque o mnimo de S7A excede o mximo de S7B, eles podem ser distinguveis.
Na identificao do nmero mnimo de argumentos com um conjunto particular de propriedades, ns
exclumos argumentos opcionais e o teste de compatibilidade TKR, ento os argumentos reais correspondente so
requeridos terem estas propriedades. Na identificao do nmero mximo de argumentos com estas propriedades,
nos inclumos os argumentos opcionais e no testamos distinguibilidade, ento nos inclumos argumentos reais que
podem ter estas propriedades mas no so requeridas t-las.
Estas regras so suficiente para garantir que referncias aos procedimentos que obedecem elas so no
ambguas, mas ainda existem exemplos que falham em obedecer as regras mas que podem ser mostrados serem no
ambguos:
INTERFACE BAD8 ! esta interface no vlida
! apesar do fato dela ser no ambgua
SUBROUTINE S8A(X,Y,Z)
REAL,OPTIONAL :: X
INTEGER :: Y
REAL :: Z
END SUBROUTINE S8A
SUBROUTINE S8B(X,Z,Y)
INTEGER,OPTIONAL :: X
INTEGER :: Z
REAL :: Y
END SUBROUTINE S8B
END INTERFACE BAD8
Esta interface falha na regra (3) no porque no h argumentos que possam ser distinguveis pela posio
correspondente do argumento, mas por causa da no concordncia dos argumento opcionais no ser relevante, o
ltimo argumento tem que ser especificado com a palavra-chave de argumento, ento distinguibilidade pelo nome
no faz o desejado. Esta interface entretanto no vlida ento um processador Fortran conforme com o padro no
requerido fazer esta ao. As regras para cobrir todos os casos muito so muito complicadas para serem teis.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 448
Adicionalmente no reconhecer configuraes distinguveis (distinguishable patterns arranjos distnguiveis)
como aquele em BAD8, as regras no distinguem usando quaisquer propriedades diferente do tipo, parmetros de
tipo subtipo (kind type parameters) e nmero de dimenses (rank):
INTERFACE BAD9 ! esta interface no vlida
! apesar do fato dela ser no ambgua
SUBROUTINE S9A(X)
REAL :: X
END SUBROUTINE S9A
SUBROUTINE S9B(X)
INTERFACE
FUNCTION X(A)
REAL :: X,A
END FUNCTION X
END INTERFACE
END SUBROUTINE S9B
SUBROUTINE S9C(X)
INTERFACE
FUNCTION X(A)
REAL :: X
INTEGER :: A
END FUNCTION X
END INTERFACE
END SUBROUTINE S9C
END INTERFACE BAD9
Os objetos de dado reais que podem ser argumento vlidos para S9A so inteiramente disjuntos dos
procedimentos que so argumentos vlidos para S9B e S9C e os procedimentos que so argumentos vlidos para
S9B so disjuntos dos procedimentos que so argumentos vlidos parar S9C porque o primeiro requerido aceitar
argumentos reais e o ltimo argumentos inteiros. Novamente, esta interface no vlida, ento um processador
Fortran conforme com o padro no necessita examinar estas propriedades quando decidir se uma coleo genrica
vlida. Novamente, as regras para cobrir todos os casos so muito complicadas para serem teis.
C.12 Notas Caractersticas de Matrizes
C.12 Array feature notes
C.12.1 Sumrios de Caractersticas
C.12.1 Summary of features
Esta seo um sumrio das principais caractersticas de matrizes.
C.12.1.1 Expresses de Matriz Inteira e Atribuies (7.4.1.2, 7.4.1.3)
C.12.1.1 Whole array expressions and assignments (7.4.1.2, 7.4.1.3)
Uma caracterstica importante que expresses matriz inteira (whole array expressions) e atribuies so
permitidas. Por exemplo, a instruo
A = B + C * SIN(D)
onde A, B, C e D so matrizes de mesma forma, permitido. Esta operao interpretado elemento a elemento
(element-by-element); isto , a funo seno realizada sobre cada elemento de D, cada resultado multiplicado pelo
seu elemento correspondente de C, adicionada ao elemento correspondente de B e atribudo aos correspondente
elemento de A. Funes, incluindo funes escrita pelo usurio, pode ser matrizes e pode ser genrica com verses
escalares. Todas as matrizes em uma expresso ou usadas em atribuies tem que serem conformes; esto , terem
exatamente a mesma forma (nmero de dimenses e extenso em cada dimenso), mas escalares podem ser
includos livremente e eles so interpretados como sendo enviados como uma matriz conforma. Expresses so
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 449
avaliadas antes de qualquer atribuio serem feitas.
C.12.1.2 Sees de Matriz (2.4.5, 6.2.2.3)
C.12.1.2 Array sections (2.4.5, 6.2.2.3)
Aonde matriz inteira pode ser usada, tambm possvel usar submatrizes chamadas de sees (subarrays
called sections). Por exemplo:
A(:, 1:N, 2, 3:1:-1)
consiste de uma submatriz contendo a primeira dimenso inteira, posies 1 at N da segunda dimenso, posio 2
da terceira dimenso e posies 1 at 3 na ordem reversa da quarta dimenso. Isto um exemplo artificial escolhido
para ilustrar as formas diferentes. Claro, um uso comum pode ser selecionar uma linha ou coluna de uma matriz,
por exemplo:
A(:, J)
C.12.1.3 Instruo WHERE (7.4.3)
C.12.1.3 WHERE statement (7.4.3)
A instruo WHERE implica no uso de uma matriz lgica conforme nas operaes individuais da
expresso e na atribuio. Por exemplo:
WHERE(A > 0) B = LOG (A)
pega o logaritmo somente dos componentes positivos de A e faz atribuies somente nesta posies.
A instruo WHERE tambm tem uma forma bloco (construo WHERE ).
C.12.1.4 Matrizes Automticas e Variveis Alocveis (5.1, 5.1.2.5.3)
C.12.1.4 Automatic arrays and allocatable variables (5.1, 5.1.2.5.3)
Duas caractersticas teis para escrever software modular so matrizes automticas, criada na entrada dos
subprogramas e destrudas no retorno e variveis alocveis, incluindo matrizes cujo nmero de dimenses ( rank)
fixo mas cujo tamanho e tempo de vida completamente determinado pelo programador pelo uso das instrues
explcitas ALLOCATE e DEALLOCATE. As declaraes
SUBROUTINE X(N, A, B)
REAL WORK(N, N); REAL, ALLOCATABLE :: HEAP(:, :)
especificam uma matriz automtica WORK e uma matriz alocvel HEAP. Note que uma pilha (stack) um
mecanismo adequado de armazenamento para a implementao de matrizes automticas, mas uma rea de memria
livre (heap) ser necessria para algumas variveis alocveis.
Stack pilha
tipo de dado abstrato e estrutura de dados baseada no princpio de ltimo a entrar, primeiro a
sair (Last In First Out LIFO)
atenta ao fato que:
heap um conjunto de coisas colocadas umas sobre as outras aglomerado, amontoado, pilha,
mas para ns uma rea de armazenamento livre ou memria livre
stack e heap so dois locais (reas) da memria que o computador usa para guardar os dados
(objetos) usados no programa. Na stack os objetos em uso (uma dada rea contendo vrios
dados de trabalho) seguem a lgica LIFO, isto , a ltima rea de memria criada a primeira a
ser removida,quando no mais for necessria
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 450
C.12.1.5 Construes de Matriz (4.7)
C.12.1.5 Array constructors (4.7)
Matrizes e em particular matrizes constantes, podem ser construdas com construtores de matriz
exemplificado pro:
(/ 1.0, 3.0, 7.2 /)
que uma matriz unidimensional (rank-one array) de tamanho 3,
(/ (1.3, 2.7, L = 1, 10), 7.1 /)
uma matriz unidimensional com tamanho 21 e contm um par de constante real 1.3 e 2.7 repetida 10 vezes
seguida pelo nmero 7.1 e
(/ (I, I = 1, N) /)
contm os inteiros 1, 2, ..., N. Somente matrizes unidimensionais podem ser construdas desta forma, mas matrizes
de dimenses maiores podem ser obtidas delas pelo uso da funo intrnseca RESHAPE.
C.12.2 Exemplos
C.12.2 Examples
As caractersticas das matrizes tem o potencial de simplificar a maneira de se projetar e escrever de quase
todos os programas que usam matrizes. Muitos algortimos envolvendo matrizes podem agora ser escritos
convenientemente como uma srie de clculos com matrizes inteiras.
C.12.2.1 Clculos de Matriz Incondicional
C.12.2.1 Unconditional array computations
No nvel mais simples, instrues tais como
A = B + C
ou
S = SUM (A)
podem ser usadas no lugar de loops com DO. Os loops so requeridos para implementar adio de matrizes ou a
soma de todos os elementos de uma matriz.
Mais exemplos de operaes incondicionais sobre matrizes que so simples de escrever:
multiplicao de matriz P = MATMUL(Q, R)
maior elemento da matriz L = MAXVAL(P)
fatorial de N F = PRODUCT( (/ (K, K = 2, N) /) )
A soma de uma expresso envolvendo somente os cosseno da srie de Fourier F=

i=1
N
a
i
cos x
i

tambm pode ser calculada sem o uso do DO (DO loop) se for usado a definio de elemento a elemento das
expresses matriciais como descrito na seo 7. Ento, pode-se escrever
F = SUM A * COS(X))
Os estgios sucessivos dos clculos de F iro envolver as matrizes:
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 451
A = (/ A(1), ..., A(N) /)
X = (/ X(1), ..., X(N) /)
COS(X) = (/ COS(X(1)), ..., COS(X(N)) /)
A * COS(X) = (/ A(1) * COS(X(1)), ..., A(N) * COS(X(N)) /)
O resultado escalar final obtido simplesmente pela soma dos elementos da ltima matriz destas matrizes.
Ento, o processador est lidando com matrizes em cada passo dos clculos.
C.12.2.2 Clculos de Matriz Condicional
C.12.2.2 Conditional array computations
Suponha que queiramos calcular a soma Fourier do exemplo anterior, mas incluir somente os termos
a(i )cos x(i ) que satisfazem a condio de que o coeficiente a(i ) seja menor que 0.01 em valor absoluto.
Mais precisamente, adora estamos interessados em avaliar a soma Fourier condicional
CF=

a
i
0.01
a
i
cos x
i
onde o ndice varia de 1 at N como antes.
Isto pode ser feito pelo uso de um parmetro MASK da funo SUM, que restringe o somatrio dos
elementos da matriz Acos( X ) queles elementos que correspondem aos elementos verdadeiros (true elements)
de MASK. Claramente, a mscara requerida a expresso matricial lgica ( A)0.01 . Note que os estgios da
avaliao desta expresso so:
A = (/ A(1), ..., A(N) /)
ABS(A) = (/ ABS(A (1)), ..., ABS(A (N)) /)
ABS(A) < 0.01 = (/ ABS(A (1)) < 0.01, ..., ABS(A (N)) < 0.01 /)
A soma condicional Fourier que ns chegamos :
CF = SUM(A * COS(X), MASK = ABS(A) < 0.01)
Se a mascara toda falsa, o valor de CF zero.
O uso de uma mscara para definir um subconjunto de uma matriz crucial para a ao de uma instruo
WHERE. Ento por exemplo, para zerar uma matriz inteira, ns podemos simplesmente escrever A = 0; mas para
fazer somente os elementos negativos iguais a zero, ns necessitamos escrever uma atribuio condicional.
WHERE(A .LT. 0) A = 0
A instruo WHERE completa atribuio matricial usual provida pela atribuio de matriz para qualquer
subconjunto de uma matriz que pode ser restrita por uma expresso lgica.
No modelo de Ising descrito adiante, a instruo WHERE predomina sobre o uso da instruo de atribuio
matricial usual.
C.12.2.3 Um programa Simples: O modelo Ising
C.12.2.3 A simple program: the Ising model
O modelo de Ising uma simulao de Monte Carlo em 3 dimenses no espao Euclidiano bem conhecida
que til em certos estudos da fsica. Nos vamos considerar com algum detalhe como ela pode ser programada. O
modelo pode ser descrito em termos de uma matriz lgica de forma N por N por N. Cada ponto da frade (gridpoint)
uma varivel lgica nica que ser interpretada como um up-spin (true) ou um down-spin (false).
O modelo de Ising opera passando por muitos estgios sucessivos. A transio para o prximo estgio
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 452
governada por um processo probabilstico local. Em cada transio, todos os pontos da grade mudam de estado
simultaneamente. Cada spin muda para o seu estado contrrio ou no muda de acordo com uma regra que depende
unicamente dos estados de sues 6 vizinhos mais prximos na grade em volta. Os vizinhos dos pontos das grades
que fazem fronteira num cubo so definidos assumindo periodicidade cbica. De fato, isto estende a grade
periodicamente pela repetio em todas as direes atravs do espao.
A regra estabelece que um spin virado (flipped) para sua paridade oposta para certos pontos da grade onde
meramente 3 ou menos de 6 vizinhos prximos possuem a mesma paridade que ele possu. Tambm, a rotao (flip
troca de sentido) executada somente com probabilidade P (4), P (5) ou P(6) se 4, 5 ou 6 dos spins tm a mesma
paridade que o spin que ser virado. (A regra parece promover alinhamento que pode ser presumidamente aceito
como levando ao equilbrio em um tempo longo).
C.12.2.3.1 Problemas para serem Resolvidos
C.12.2.3.1 Problems to be solved
Alguns dos problemas de programao que iremos necessitar resolver para transformar o modelo de Ising
em instrues Fortran usando inteiramente matrizes so
1. contagem dos vizinhos mais prximos que possuem os mesmos spins
2. prover uma funo matricial para retornar uma matriz de nmeros aleatrios
3. determinar quais pontos da grade devem ser alterados (flipped)
C.12.2.3.2 Solues em Fortran
C.12.2.3.2 Solutions in Fortran
As matrizes necessrias so:
LOGICAL ISING(N, N, N), FLIPS(N, N, N)
INTEGER ONES(N, N, N), COUNT(N, N, N)
REAL THRESHOLD(N, N, N)
A funo matricial necessria :
FUNCTION RAND(N)
REAL RAND(N, N, N)
As probabilidades de transio so especificadas na matriz
REAL P(6)
A primeira tarefa contar o nmero de vizinhos mais prximos de cada ponto da grade g que tem o mesmo
spin que g.
Assumindo que ISING fornecido, as instrues
ONES = 0
WHERE(ISING) ONES = 1
torna a matriz ONES em uma analogia exata de ISING na qual 1 indica um up-spin e 0 um down-spin.
A prxima matriz que construmos, COUNT, ir registrar para cada ponto da grade de ISING o nmero de
spins encontrado entre os 6 vizinhos mais prximos para este ponto da grade. COUNT ser calculado pela adio
de 6 matrizes, uma para cada uma das 6 posies relativas na qual o vizinho mais prximo encontrado. Cada uma
das 6 matrizes obtida da matriz ONES pelo deslocamento (shifting) a matriz ONES um alugar de forma circular ao
longo de sua dimenso. Este uso do deslocamento circular (circular shifting) representa (imparts transmite) a
periodicidade cbica
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 453
COUNT = CSHIFT(ONES, SHIFT = -1, DIM = 1) &
+ CSHIFT(ONES, SHIFT = 1, DIM = 1) &
+ CSHIFT(ONES, SHIFT = -1, DIM = 2) &
+ CSHIFT(ONES, SHIFT = 1, DIM = 2) &
+ CSHIFT(ONES, SHIFT = -1, DIM = 3) &
+ CSHIFT(ONES, SHIFT = 1, DIM = 3)
Neste ponto, COUNT contm a contagem de vizinhos mais prximos com up-spins (nearest neighbor up-
spins even) nos pontos da grade onde o modelo Ising tem um down-spin. Mas ns precisamos a contagem dos
down-spins naqueles pontos da grade, ento nos corrigimos COUNT nos pontos down (false) de ISING escrevendo:
WHERE(.NOT. ISING) COUNT = 6 - COUNT
Nosso objetivo agora usar esta contagem que pode ser chamada o vizinhos mais prximos com mesmo
modo (like-minded nearest neighbors) para decidir quais pontos da grade sero virados (flipped). Esta deciso ser
registrada como um elemento true de uma matriz FLIPS. A deciso de virar (flip) ser baseada no uso de nmeros
aleatrios distribudos uniformemente no intervalo 0 p < 1. Isto ser provido em cada ponto da grade pela funo
matricial RAND. A troca (flip a alterao do sentido) ir ocorrer em um dado ponto se se somente se o nmero
aleatrio naquele ponto for menor que um certo valor limite (threshold value). Em particular, fazendo-se o valor do
limite (threshold value) igual a 1 nos pontos onde existem 3 ou menos de 3 vizinhos mais prximos com mesmo
modo, ns garantimos que a troca (flip) ocorre naqueles pontos (porque p sempre menor que 1). Analogamente, os
valores limites (threshold values) correspondendo as contagens 4, 5 e 6 so atribudos P (4), P (5) e P (6) de forma a
obter as propriedades desejadas de virar (flip) nestes pontos ( P (4), P (5) e P (6) so os parmetros de entrada no
intervalo 0 a 1).
O limites (thresholds) so estabelecidos pelas instrues:
THRESHOLD = 1.0
WHERE(COUNT == 4) THRESHOLD = P(4)
WHERE(COUNT == 5) THRESHOLD = P(5)
WHERE(COUNT == 6) THRESHOLD = P(6)
e os spins que so para serem virados (to be flipped) so localizados pela instruo:
FLIPS = RAND(N) <= THRESHOLD
Tudo restante para completar uma transio para o prximo estado do modelo ISING reverter os spins em
ISING onde FLIPS true:
WHERE(FLIPS) ISING = .NOT. ISING
C.12.2.3.3 Uma Sub-rotina Fortran Completa
C.12.2.3.3 The complete Fortran subroutine
O cdigo completo, colocado numa sub-rotina que realiza uma sequncia de transies, como segue:
SUBROUTINE TRANSITION(N, ISING, ITERATIONS, P)

LOGICAL ISING(N, N, N), FLIPS(N, N, N)
INTEGER ONES(N, N, N), COUNT(N, N, N)
REAL THRESHOLD(N, N, N), P(6)

DO I = 1, ITERATIONS
ONES = 0
WHERE(ISING) ONES = 1
COUNT = CSHIFT(ONES, -1, 1) + CSHIFT(ONES, 1, 1) &
+ CSHIFT(ONES, -1, 2) + CSHIFT(ONES, 1, 2) &
+ CSHIFT(ONES, -1, 3) + CSHIFT(ONES, 1, 3)
WHERE (.NOT. ISING) COUNT = 6 - COUNT
THRESHOLD = 1.0
WHERE(COUNT == 4) THRESHOLD = P(4)
WHERE(COUNT == 5) THRESHOLD = P(5)
WHERE(COUNT == 6) THRESHOLD = P(6)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 454
FLIPS = RAND(N) <= THRESHOLD
WHERE(FLIPS) ISING = .NOT. ISING
END DO
CONTAINS
FUNCTION RAND(N)
REAL RAND(N, N, N)
CALL RANDOM_NUMBER(HARVEST = RAND)
RETURN
END FUNCTION RAND
END
C.12.2.3.4 Reduo de Armazenamento
C.12.2.3.4 Reduction of storage
A matriz ISING pode ser removida (com alguma perda de clareza) pela representao do modelo em ONES
todo o tempo. A matriz FLIPS pode ser evitada pela combinao de duas instrues que so usadas assim:
WHERE(RAND(N) <= THRESHOLD) ISING = .NOT. ISING
Mas uma matriz temporria extra provavelmente ser necessria. Ento, o escopo para economizar
armazenamento enquanto se realiza as operaes matriz inteira limitado. Se N pequeno, isto no importa e o uso
da operao matriz inteira levar a uma boa velocidade de execuo. Se N grande, armazenagem pode ser muito
importante e eficincia adequada provavelmente ser disponvel para realizar as operaes plano por plano. O
cdigo resultante no elegante, mas todas as matrizes exceto ISING tero tamanhos da ordem N
2
em vez de
N
3
.
C.12.3 FORmula TRANslation e Processando Matriz
C.12.3 FORmula TRANslation and array processing
Muitas frmulas matemticas podem ser transladadas diretamente no Fortran pelo uso de caractersticas de
processamento de matrizes.
Assumindo a declarao matricial que segue:
REAL X(N), A(M, N)
Alguns exemplos de frmulas matemticas e expresses Fortran correspondentes so apresentadas a seguir.
C.12.3.1 A Soma dos Produtos
C.12.3.1 A sum of products
A expresso

j=1
N

i=1
M
a
ij
pode ser formada usando a expresso Fortran
SUM( PRODUCT(A, DIM=1) )
O argumento DIM=1 significa que o produto para ser calculado para baixo em cada coluna de Se A tem
os valor

BC D
E F G
|
o resultado desta expresso BE + CF + DG.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 455
C.12.3.2 O produto das Somas
C.12.3.2 A product of sums
A expresso

i =1
M

j =1
N
a
ij
pode ser formada usando a expresso Fortran
PRODUCT( SUM(A, DIM = 2) )
O argumento DIM = 2 significa que a soma para ser calculada ao longo de cada linha de A. Se A tem o
valor

BC D
E F G
|
o resultado desta expresso (B+C+D)(E+F+G).
C.12.3.3 Adio de Elementos Selecionados
C.12.3.3 Addition of selected elements
A expresso

x
i
>0.0
x
i
pode ser formada usando a expresso Fortran
SUM( X, MASK = X > 0.0 )
A mscara localiza os elementos positivos da matriz unidimensional (array of rank one). Se X tem os valores
(0.0, 0.1, 0.2, 0.3, 0.2, 0.1, 0.0), o resultado desta expresso vale 0.7.
C.12.4 Soma dos Resduos ao Quadrados
C.12.4 Sum of squared residuals
A expresso

i =1
N
(
x
i
x
mean
)
2
pode ser formada usando as expresses Fortran
XMEAN = SUM(X) / SIZE(X)
SS = SUM( (X - XMEAN)** 2 )
Ento, SS a soma dos resduos ao quadrado.
C.12.5 Norma de Vetores: Norma infinita e Norma um
C.12.5 Vector norms: infinity-norm and one-norm
A norma infinita (infinity-norm) de um vetor X = (X (1), ..., X(N)) definida como o maior dos nmeros
ABS (X(1)), ..., ABS(X(N)) e portanto tem o valor MAXVAL (ABS(X)).
A norma um (one-norm) do vetor X definida como a soma dos nmeros ABS (X (1)), ..., ABS (X (N)) e
portanto tem o valor SUM ( ABS (X)).
C.12.6 Normas de Matrizes: Norma infinita e Norma um
C.12.6 Matrix norms: infinity-norm and one-norm
A norma infinita de uma matriz A = (A (I, J)) a maior soma da linha (largest row-sum) da matriz
ABS (A (I, J)) e portanto tem o valor MAXVAL (SUM (ABS (A), DIM = 2)).
A norma um da matriz A = (A (I, J)) a maior soma das colunas (largest column-sum) da matriz
ABS (A (I, J)) e portanto tem o valor MAXVAL (SUM (ABS (A), DIM = 1)).
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 456
C.12.7 Filas Lgicas
C.12.7 Logical queries
As funes intrnsecas permitem a respostas de questes complicadas sobre dados tabular sem o uso de
loops ou construes condicionais. Considere, por exemplo, a questo perguntada abaixo sobre o resultado de um
teste feito por alunos e colocado em uma forma tabular simples.
Suponha q tabela retangular T(M, N) contendo o resultado do teste de M estudantes que realizaram N testes
diferentes. T uma matriz inteira com entradas no intervalo 0 a 100.
Exemplo: Os resultados de 4 testes feito por 3 alunos so mantidos na tabela como

T=

85 76 90 60
71 45 50 80
66 45 21 55
|
Questo: Qual a maior nota de cada estudante ?
Resposta: MAXVAL(T, DIM = 2) ! neste exemplo: [90, 80, 66]
Questo: Qual a mdia de todas as notas ?
Resposta: SUM(T) / SIZE(T) ! neste exemplo: 62
Questo: Quantas notas na tabela esto acima da mdia ?
Resposta: ABOVE = T > SUM(T) / SIZE(T); N = COUNT(ABOVE)
neste exemplo: ABOVE a matriz lgica (t = true, . = false):

t t t .
t . . t
t . . .
|
e COUNT(ABOVE) vale 6
Questo: Qual foi a menor nota no grupo de mdias das notas ?
Resposta: MINVAL(T, MASK = ABOVE), onde ABOVE foi definido previamente; no exemplo : 66
Questo: Existe um estudante cujas nota foram todas acima da mdia ?
Resposta: Com ABOVE definido previamente, a resposta sim ou no de acordo com o valor da expresso
ANY (ALL(ABOVE, DIM = 2)) seja true ou false; neste exemplo, a resposta no.
C.12.8 Clculos em Paralelo
C.12.8 Parallel computations
A mais direta forma de processamento em paralelo fazer a mesma coisa ao mesmo tempo com os mesmos
operandos. Adio de matriz um bom exemplo desta forma muito simples de processamento em paralelo. Ento, a
atribuio matricial A = B + C especifica que os elementos correspondentes das matrizes B e C de forma idnticas
so adicionadas em paralelo e que a soma resultante atribuda em paralelo matriz A.
O processo que est sendo feito em paralelo no exemplo de adio de matrizes claro o processo de
adio; a caracterstica de matrizes que implementa adio de matriz como um processo paralelo a avaliao
elemento a elemento das expresses de matrizes.
Estes observaes nos levam a olhar clculos elemento e elemento como um meio de implementar outros
algoritmos de processamento em paralelo simples.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 457
C.12.9 Exemplos de Clculos elemento a elemento
C.12.9 Example of element-by-element computation
Vrios polinmios de mesmo rau podem ser avaliados no mesmo ponto arranjando seus coeficientes como
linhas em uma matriz e aplicando o mtodo de Horner para a avaliao polinomial das colunas das matrizes
formadas.
O procedimento ilustrado pelo cdigo que calcula os trs polinmios cbicos

P(t )=1+2t3t
2
+4t
3
Q(t )=23t +4t
2
5t
3
R(t )=3+4t 5t
2
+6t
3
em paralelo no ponto t = X e coloca o vetor resultado de nmeros [P (X), Q (X), R (X)] em uma matriz real
RESULT (3).
O cdigo para calcular RESULT somente uma instruo
RESULT = M(:, 1) + X * ( M(:, 2) + X * ( M(:, 3) + X * M(:, 4) ))
onde M representa a matriz M(3, 4) com valores

1 2 3 4
2 3 4 5
3 4 5 6
|
C.12.10 Manipulao de Bit e Procedimentos Inquisitrios
C.12.10 Bit manipulation and inquiry procedures
Os procedimentos IOR, IAND, NOT, IEOR, ISHFT, ISHFTC, IBITS, MVBITS, BTEST, IBSET e IBCLR
so definidos por MIL-STD 1753 para argumentos escalares e so estendidos neste padro para aceitar argumentos
matriciais e retornar resultados matriciais.
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 458
Anexo D (Informativo)
Annex D (Informative)
Regras de Sintaxe
Syntax rules
D.1 Extrato de Todas as Regras de Sintaxe
D.1 Extract of all syntax rules
Seo 1:
Section 1:
R101 xyz-list is xyz [,xyz] ...
R102 xyz-names is name
R103 scalar-xyz is xyz
C101 (R103) scalar-xyz tem que se escalar
Seo 2:
Section 2:
R201 program is program-unit
[program-unit]...
Um programa tem que conter exatamente uma unidade de programa programa principal ou um programa principal
definido por outros meios que no o Fortran, mas no ambos
R202 program-unit is main-program
or external-subprogram
or module
or block-data
R1101 main-program is [program-stmt]
[specification-part]
[execution-part]
[internal-subprogram-part]
end-program-stmt
R203 external-subprogram is function-subprogram
or subroutine-subprogram
R1223 function-subprogram is function-stmt
[specification-part]
[execution-part]
[internal-subprogram-part]
end-function-stmt
R1231 subroutine-subprogram is subroutine-stmt
[specification-part]
[execution-part]
[internal-subprogram-part]
end-subroutine-stmt
R1104 module is module-stmt
[specification-part]
[module-subprogram-part]
end-module-stmt
R1116 block-data is block-data-stmt
[specification-part]
end-block-data-stmt
R204 specification-part is [use-stmt]...
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 459
[import-stmt]...
[implicit-part]
[declaration-constructor]...
R205 implicit-part is [implicit-part-stmt]...
implicit-stmt
R206 implicit-part-stmt is implicit-stmt]
or parameter-stmt
or format-stmt
or entry-stmt
R207 declaration-constructor is derived-type-def
or entry-stmt
or enum-def
or format-stmt
or interface-block
or parameter-stmt
or procedure-declaration-stmt
or specification-stmt
or type-declaration-stmt
or stmt-function-stmt
R208 execution-part is executable-constructor
[executable-part-constructor]...
R209 execution-part-constructor is executable-constructor
or format-stmt
or entry-stmt
or data-stmt
R210 internal-subprogram-part is contains-stmt
internal-subprogram
[internal-subprogram]...
R211 internal-subprogram-part is function-subprogram
or subroutine-subprogram
R1107 module-subprogram-part is contains-stmt
module-subprogram
[module-subprogram]...
R1108 module-subprogram is function-subprogram
or subroutine-subprogram
R212 specification-stmt is access-stmt
or allocatable-stmt
or asynchronous-stmt
or bind-stmt
or common-stmt
or data-stmt
or dimension-stmt
or equivalence-stmt
or external-stmt
or intent-stmt
or intrinsic-stmt
or namelist-stmt
or optional-stmt
or pointer-stmt
or protected-stmt
or save-stmt
or target-stmt
or volatile-stmt
or value-stmt
R213 executable-construct is action-stmt
or associate-construct
or case-construct
or do-construct
or forall-construct
or if-construct
or select-type-construct
or where-construct
R214 action-stmt is allocate-stmt
or assignment-stmt
or backspace-stmt
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 460
or call-stmt
or close-stmt
or continue-stmt
or cycle-stmt
or deallocate-stmt
or endfile-stmt
or end-function-stmt
or end-program-stmt
or end-subroutine-stmt
or exit-stmt
or flush-stmt
or forall-stmt
or goto-stmt
or if-stmt
or inquire-stmt
or nullify-stmt
or open-stmt
or pointer-assignment-stmt
or print-stmt
or read-stmt
or return-stmt
or rewind-stmt
or stop-stmt
or wait-stmt
or where-stmt
or write-stmt
or arithmetic-if-stmt
or computed-goto-stmt
C201 (R208) Uma execution-part no pode conter uma end-function-stmt, end-program-stmt ou
end-subroutine-stmt
R215 keyword is name
Seo 3:
Section 3:
R301 character is alphanumeric-character
or sepecial-character
R302 alphanumeric-character is letter
or digit
or underscore
R303 underscore is _
R304 name is letter [alphanumeric-character]...
C301(R304) O comprimento mximo de um nome de 63 caracteres
R305 constant is literal-constant
or named-constant
R306 literal-constant is int-literal-constant
or real-literal-constant
or complex-literal-constant
or logical-literal-constant
or char-literal-constant
or boz-literal-constant
R307 named-constant is name
R308 int-constant is constant
C302(R308)int-constant tem que ser do tipo inteiro
R309 char-constant is constant
C303 (R309) char-constant tem que ser do tipo caractere
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 461
R310 intrinsic-operator is power-op
or mult-op
or add-op
or concat-op
or rel-op
or not-op
or and-op
or or-op
or equiv-op
R707 power-op is **
R708 mult-op is *
or /
R709 add-op is +
or -
R711 concat-op is //
R713 rel-op is .EQ.
or .NE.
or .LT.
or .LE.
or .GT.
or .GE.
or ==
or /=
or <
or <=
or >
or >=
R718 not-op is .NOT.
R719 and-op is .AND.
R720 or-op is .OR.
R721 equiv-op is .EQV.
or .NEQV.
R311 defined-operator is defined-unary-op
or defined-binary-op
or extend-intrinsic-op
R703 defined-unary-op is letter [letter]...
R723 defined-binary-op is letter [letter]...
R312 extended-intrinsic-op is intrinsic-oprator
R313 label is digit[digit[digit[digit[digit]]]]]
C304 (R313) Ao menos um dgito no rtulo no pode ser zero
Seo 4:
Section 4:
R401 type-sepc is intrinsic-type-spec
or derived-type-spec
C401 (R401) O derived-type-spec no pode especificar um tipo abstrato
R402 type-param-value is scalar-int-expr
or *
or :
C402 (R402) O type-param-value para um parmetro de tipo subtipo (kind type parameter) tem que ser uma
expresso inteira escalar constante
C403 (R402) O caractere dois pontos pode ser usado como um type-param-value somente em uma
declarao de uma entidade ou componente que possua o atributo POINTER ou ALLOCATABLE
R403 intrinsic-type-spec is INTEGER[kind-selector]
or REAL[kind-selector]
or DOUBLE PRECISION
or COMPLEX[kind-selector]
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 462
or CHARACTER[char-selector]
or LOGICAL[kind-selector]
R404 kind-selector is ([KIND=]scalar-int-initialization-expr)
C404 (R404) O valor da scalar-int-initialization-expr no pode ser negativo e tem que especificar
uma mtodo de representao que existe no processador
R405 signed-int-literal-constant is [sign] int-literal-constant
R406 int-literal-constant is digit-string[_kind-param]
R407 kind-param is digit-string
or scalar-int-constant-name
R408 signed-digit-string is [sign]digit-string
R409 digit-string is digit [digit]...
R410 sign is +
or -
C405 (R407) O scalar-int-constant-name tem que ser uma constante com nome do tipo inteiro
C406 (R407) O valor de kind-param no pode ser negativo
C407 (R406) O valor de kind-param tem que especificar um mtodo de representao que existe no
processsador
R411 boz-literal-constant is binary-conatant
or octal-constant
or hex-constant
R412 binary-conatant is B ' digit[digit]...'
or B " digit[digit]..."
C408 (R412) digit tem que ser um dos valores 0 ou 1
R413 octal-conatant is O ' digit[digit]...'
or O " digit[digit]..."
C409 (R413) digit tem que ser um dos valores 0 at 7
R414 hex-conatant is Z ' digit[digit]...'
or Z " digit[digit]..."
R415 hex-digit is digit
or A
or B
or C
or D
or E
or F
C410 (R411) Uma boz-literal-constant s pode aparecer como uma instruo de dado constante (data-
stmt-constant), como valor de um argumento real associado com um argumento mudo A de uma das funo
numrica intrnseca DBLE, REAL ou INT ou como o argumento real associado com o argumento mudo X ou Y da
funo intrnseca CMPLX
R416 signed-real-literal-constant is [sign] real-literal-constant
R417 real-literal-constant is significant[exponent-letter exponent][_kind-param]
or digit-string exponent-letter exponent[_kind-param]
R418 significant is digit-string.[ digit-string]
or .digit-string
R419 exponent-letter is E
or D
R420 exponent is signed-digit-string
C411 (R417) Se o kind-param e a exponent-letter esto presentes, a exponent-letter tem que ser E
C412 (R417) O valor do kind-param tem que especificar um mtodo de aproximao que existe no
processador
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 463
R421 complex-literal-constant is (real-part, imag-part)
R422 real-part is signed-int-literal-constant
or signed-real-literal-constant
or named-constant
R423 imag-part is signed-int-literal-constant
or signed-real-literal-constant
or named-constant
C413 (R421) Cada constante com nome em uma constante literal complexa tem que ser do tipo inteiro ou real
R424 char-selector is length-selector
or (LEN=type-param-value,
KIND=scalar-int-initialization-expr)
or (type-param-value,
KIND=scalar-int-initialization-expr)
or (KIND=scalar-int-initialization-expr
[,LEN=type-param-value])
R425 length-selector is (LEN=type-param-value)
or * char-length[,]
R426 char-length is (type-parm-value)
or scalar-int-literal-constant
C414 (R424) O valor da scalar-int-initialization-expr tem que ser no negativa e tem que
especificar um mtodo de representao que exista no processador
C415 (R426) A scalar-int-literal-constant no pode incluir um kind-param
C416 (R422) O type-parm-value de * pode ser usado somente nos seguintes casos:
1. para declarar um argumento mudo
2. para declarar uma constante com nome
3. em uma type-spec de uma instruo ALLOCATE onde cada objeto alocvel um argumento mudo do
tipo caractere com um comprimento assumido
4. em uma funo externa, para declarar o parmetro de comprimento caractere de uma funo muda
C417 Uma nome de funo no pode ser declarada com um asterisco type-param-value a menos que seja do tipo
CHARACTER e seja o nome do resultado de uma funo externa ou o nome de uma funo muda
C418 O nome de uma funo declarada com um asterisco type-param-value no pode ser uma matriz, um ponteiro, recursiva ou pura
C419 (R425) A vrgula opcional em um length-selector permitida em uma declaration-type-spec em uma type-
declaration-stmt
C420 (R425) A vrgula em um length-selector permitido somente se o separador : : (double-colon) aparece na type-declaration-
stmt
C421 (R424) O especificador de comprimento para um funo instruo caractere (character statement function) ou para um argumento
mudo funo instruo (statement function dummy argument) do tipo caractere tem que ter uma expresso de inicializao
R427 char-literal-constant is [kind-param_]'[rep-char]...'
or [kind-param_]"[rep-char]..."
C422 (R427) O valor de kind-param tem que especificar um mtodo de representao que existe no processo
R428 logical-literal-constant is .TRUE.[_kind-param]
or .FALSE.[_kind-param]
C423 (R428) O valor do parmetro de tipo subtipo (kind-param) tem que especificar um mtodo de
representao que existe no processo
R429 derived-type-def is derived-type-stmt
[type-param-def-stmt]...
[private-or-sequenca]...
[component-part]
[type-bound-procedure-part]
end-type-stmt
R430 derived-type-stmt is TYPE[[,type-attr-spec-list]::]type-name
[(type-param-name-list)]
R431 type-attr-spec is access-spec
or EXTENDS(parent-type-name)
or ABSTRACT
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 464
or BIND(C)
C424 (R430) Um tipo derivado type-name no pode ser DOUBLE PRECISION ou ter o mesmo nome de
qualquer tipo intrnseco
C425 (R430) O mesmo type-attr-spec no pode aparecer mais de uma vez em uma instruo de tipo
derivado (derived-type-stmt)
C426 (R431) Um parent-type-name tem que ser o nome de um tipo extensvel previamente definido (4.5.6)
C427 (R429) Se a definio de tipo contm ou herda (4.5.6.1) um procedimento postergado ligado (deferred
type-bound procedure), ABSTRACT tem que ser usado
C428 (R429) Se ABSTRACT aparece, o tipo tem que ser extensvel
C429 (R429) Se EXTENDS aparece, SEQUENCE no pode aparecer
R432 private-or-sequence is private-component-stmt
or sequence-stmt
C430 (R429) A mesma private-or-sequence no pode aparecer mais de uma vez em uma definio de tipo
derivada (derived-type-def)
R433 end-type-stmt is END TYPE[type-name]
C431 (R433) Se END TYPE seguido pelo type-name, o type-name tem que ser o mesmo usado na
instruo de tipo derivado correspondente
R434 sequence-stmt is SEQUENCE
C432 (R438) Se SEQUENCE aparece, todos os tipos derivados especificados nas definies dos componentes
so do tipo sequncia
C433 (R429) Se SEQUENCE aparece, um type-bound-procedure-part no pode aparecer
R435 type-param-def-stmt is INTEGER[kind-selector], type-param-attrr-spec::
type-param-decl-list
R436 type-param-decl is type-param-name[=scalar-int-constant-expr]
C434 (R435) Um type-param-name em uma type-param-def-stmt em uma derived-type-def tem
que ser um type-param-name numa derived-type-stmt deste derived-type-def
C435 (R435) Cada type-param-name em uma type-param-def-stmt em uma derived-type-def tem
que aparecer em um type-param-name numa derived-type-stmt deste derived-type-def
R437 type-param-attr-spec is KIND
or LEN
R438 component-part is [component-def-stmt] ...
R439 component-def-stmt is data-component-def-stmt
or proc-component-def-stmt
R440 data-component-def-stmt is declaration-type-spec[[,component-attr-spec-list]::]
component-decl -list
R441 component-attr-spec is POINTER
or DIMENSION ( component-array-spec )
or ALLOCATABLE
or access-spec
R442 component-decl is component-name[(component-array-spec)]
[*char-length][component-initialization]
R443 component-array-spec is explicit-shape-spec-list
or deferred-shape-spec-list
R444 component-initialization is = initialization-expr
or => null-init
C436(R440) Nenhuma component-attr-spec pode aparecer mais de uma vez em uma component-def-
stmt
C437(R440) Um componente declarado com a palavra-chave CLASS (5.1.1.2) tem que ter o atributo
ALLOCATABLE ou POINTER
C438(R440)Se o atributo POINTER no especificado para o componente, a declaration-type-spec na
component-def-stmt tem que especificar um tipo intrnseco ou um tipo derivado previamente definido
C439(R440) Se o atributo POINTER especificado para um componente, a declaration-type-spec em
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 465
component-def-stmt tem que especificar um tipo intrnseco ou qualquer tipo derivado acessvel incluindo o tipo
que est sendo definido
C440(R440)Se o atributo POINTER ou ALLOCATABLE especificado, cada component-array-spec tem que
ser uma deferred-shape-spec-list
C441(R440) Se nem o atributo POINTER nem o atributo ALLOCATABLE especificado, cada component-
array-spec tem que ser uma explicit-shape-spec-list
C442(R443) Cada limite em uma explicit-shape-spec tem que ser uma expresso de iniciao ou uma
expresso de especificao que no contenha referncias a funes de especificao ou qualquer designador de
objeto diferente de uma constante com nome ou subobjeto desta
C443(R440) Um componente no pode ter, ao mesmo tempo, o atributo ALLOCATABLE e POINTER
C444(R442) A opo *char-length permitida somente se a especificao do tipo for de um caractere
C445(R439) Cada type-param-value dentro de uma component-def-stmt tem que ter um :, ser uma
expresso de inicializao ou ser uma expresso de especificao que no contenha referncias nem a funes
de especificao nem a designadores de objetos diferentes de de uma constante com nome ou subobjeto desta
C446(R440) Se component-initialization aparece, um separador : : (double-colon separator) tem que aparecer antes
da component-decl-list
C447(R440) Se => aparece em component-initialization, POINTER tem que aparecer na component-
attr-spec-list. Se = aparece na component-initialization, POINTER ou ALLOCATABLE no pode
aparecer na component-attr-spec-list
R445 proc-component-def-stmt is PROCEDURE([proc-interface]),
R446 proc-component-attr-spec is POINTER
or PASS[(arg-name)]
or NOPASS
or access-spec
C448(R445) O mesmo proc-component-attr-spec no pode aparecer mais de uma vez em uma dada
proc- component-def-stmt
C449(R445) POINTER tem que aparecer em cada proc-component-attr-spec-list
C450(R445) Se o componente ponteiro de procedimento tem uma interface implcita ou no tem argumentos,
NOPASS tem que ser especificada
C451(R445) Se PASS(arg-name) aparece, a interface tem que ter um argumento mudo chamado arg-name
C452(R445) PASS e NOPASS no podem aparecer na mesma proc-component-attr-spec-list
C453 O argumento mudo objeto passado tem que ser um escalar, no ponteiro, no objeto de dado no alocvel
com o mesmo tipo declarado que o tipo que est sendo definido; todo os seus parmetros de tipo comprimentos
tem que ser assumidos; ele pode ser polimrfico (5.1.1.2) se e somente se o tipo que est sendo definido
extensvel (4.5.6)
R447 private-components-stmt is PRIVATE
C454 (R447) Uma private-components-stmt permitida somente se a definio de tipo est na parte de
especificao do mdulo
R448 type-bound-procedure-part is contains-stmt
[binding-private-stmt]
proc-binding-stmt
[proc-binding-stmt] ...
R449 binding-private-stmt is PRIVATE
C455 (R448) Uma binding-private-stmt permitido somente se a definio de tipo est na parte de
especificao do mdulo
R450 proc-binding-stmt is specific-binding
or generic-binding
or final-binding
R451 specific-binding is PROCEDURE[(interface-name)]
[[, binding-attr-list]::]
binding-name[=>procedure-name]
C456 (R451) Se => procedure-name aparece, o separador : : (double-colon) tem que aparecer
C457 (R451) Se => procedure-name aparece, interface-name no pode aparecer
C458 (R451) O procedure-name tem que ser o nome de um procedimento mdulo acessvel ou um
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 466
procedimento externo que possu uma interface explicita
R452 generic-binding is GENERIC
[, access-spec] :: generic-spec => binding-name-list
C459 (R452) Dentro da specification-part de um mdulo, cada ligao genrica (generic-binding) tem que
especificar, implicitamente ou explicitamente, a mesma acessibilidade que cada ligao genrica (generic-binding)
com a generic-spec no mesmo tipo derivado
C460 (R452) Cada binding-name na binding-name-list tem que ser o nome de uma ligao especfica
para o tipo
C461 (R452) Se a generic-spec no um generic-name, cada uma das ligaes especficas tem que ter
um argumento mudo objeto passado (4.5.3.3)
C462 (R452) Se a generic-spec OPERATOR (operador definido), a interface de cada ligao tem que ser
especificada como em 12.3.2.1.1
C463 (R452) Se a generic-spec ASSIGNMENT( = ), a interface de cada ligao tem que se especificada
como em 12.3.2.1.2
C464 (R452) Se a generic-spec uma dtio-generic-spec, a interface de cada ligao tem que ser
especificada como especificado em 9.5.3.7. O tipo do argumento dtv tem que ser um type-name
R453 binding-attr is PASS[(arg-name)]
or NOPASS
or NON OVERRIDABLE
or DEFERRED
or access-spec
C465 (R453) A mesma binding-attr no pode aparecer mais de uma vez em uma dada binding-attr-
list
C466 (R451) Se a interface de uma ligao no tem argumento mudo do tipo que est sendo definido, NOPASS
tem que aparecer
C467 (R451) Se PASS(arg-name) aparece, a interface da ligao tem que ter um argumento mudo chamado
arg-name
C468 (R453) PASS e NOPASS no podem aparecer juntos na mesma binding-attr-list
C469 (R453) NON OVERRIDABLE e DEFERRED no podem aparecer juntos na mesma binding-attr-list
C470 (R453) DEFERRED tem que aparecer se e somente se um interface-name aparece
C471 (R451) Uma ligao sobrecarregada (overriding binding) (4.5.6.2) tem que ter o mesmo atributo DEFERRED
somente se a ligao sobrecarregada (overrides) postergada
C472 (R451) Uma ligao no pode sobrecarregar uma ligao herdada (4.5.6.1) que tem o atributo NON
OVERRIDABLE
R454 final-binding is FINAL[::]final-subroutine-name-list
C473 (R454) Um final-subroutine-name tem que ser o nome de um procedimento mdulo com
exatamente um argumento mudo. Este argumento no pode ser opcional e tem que ser um no ponteiro, no
alocvel, varivel no polimrfica do tipo derivado que est sendo definida. Todos os parmetros de tipo
comprimento de um argumento mudo tem que ser assumidos. O argumento mudo no pode ter INTENT(OUT)
C474 (R454) O final-subroutine-name no pode ser um previamente especificado como uma sub-rotina
final para aquele tipo
C475 (R454) Uma sub-rotina final no pode ter um argumento mudo com os mesmos parmetros de subtipo
(kind type parameters) e rank (nmero de dimenses) que o argumento mudo de outra sub-rotina final deste tipo
R455 derived-type-spec is type-name[(type-param-spec-list)]
R456 type-param-spec is [keyword=]type-param-value
C476 (R455) Um type-name tem que ser o nome de um tipo derivado acessvel
C477 (R455) Uma type-param-spec-list s pode aparecer se o tipo parametrizado
C478 (R455) Tem que existir ao menos uma type-param-spec correspondendo a cada parmetro do tipo. Se
o parmetro de tipo no possu um valor default, tem que existir uma type-param-spec correspondendo a este
parmetro de tipo
C479 (R456) A keyword= pode ser omitida em uma type-param-spec somente se a keyword= foi omitida
em cada type-param-spec precedente na type-param-spec-list
C480 (R456) Cada palavra-chave tem que ser o nome de um parmetro de tipo
C481 (R456) Um asterisco pode ser usado como um type-param-value em uma type-param-spec
somente na declarao de um argumento mudo ou nome associado na alocao de um argumento mudo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 467
R457 structure-constructor is derived-type-spec([component-spec-list])
R458 component-spec is [keyword=]component-data-source
R459 component-data-source is expr
or data-target
or proc-target
C482 (R457) Uma derived-type-spec no pode especificar um tipo abstrato (4.5.6)
C483 (R457) No mximo uma component-spec tem que ser provido para um componente
C484 (R457) Se uma component-spec provida para um componente, nenhuma component-spec pode ser
usada para qualquer componente para o qual ela associao por herana
C485 (R457) Uma component-spec tem que ser provido para um componente a menos que ele possua
inicializao default ou associao herdada de outro componente com uma component-spec ou que tenha
inicializao default
C486 (R458) A keyword= pode ser omitida da component-spec somente se a keyword= foi omitida em cada
component-spec precedente no construtor
C487 (R458) Cada palavra-chave tem que ser o nome de um componente do tipo
C488 (R457) O nome do tipo e todos os componentes do tipo para o qual uma component-spec aparece tem
que ser acessvel em uma unidade de escopo contendo o construtor de estrutura
C489 (R457) Se a derived-type-spec um nome de tipo que o mesmo que um nome genrico, a
component- spec-list no pode ser uma actual-arg-spec-list vlida para a referncia da funo que
resolvida como uma referncia genrica (12.4.4.1)
C490 (R459) Um data-target tem que corresponder a um componente ponteiro no procedimento; um
proc-target corresponde a um componente ponteiro de procedimento
C491 (R459) Um data-target tem que ter o mesmo nmero de dimenses (rank) que seu componente
correspondente
R460 enum-def is enum-def-stmt
enumerator-def-stmt
[enumerator-def-stmt] ...
end-enum-stmt
R461 enum-def-stmt is ENUM, BIND(C)
R462 enumerator-def-stmt is ENUMERATOR[::]enumerator-list
R463 enumerator is named-constant[=scalar-int-initialization-expr]
R464 end-enum-stmt is END ENUM
C492 (R462) Se = aparece em um enumerador, um separador : : (double-colon) tem que aparecer antes da
enumerator-list
R465 array-constructor is (/ ac-spec /)
or left-square-bracket ac-spec right-square-bracket
R466 ac-spec is type-spec ::
or [type-spec ::] ac-value-list
R467 left-square-bracket is [
R468 right-square-bracket is ]
R469 ac-value is expr
or ac-implied-do
R470 ac-implied-do is ( ac-value-list , ac-implied-do-control )
R471 ac-implied-do-control is ac-do-variable = scalar-int-expr , scalar-int-expr
[, scalar-int-expr]
R472 ac-do-variable is scalar-int-variable
C493 (R472) ac-do-variable tem que ser uma varivel com nome
C494 (R466) Se type-spec omitido, cada expresso ac-value no array-constructor tem que ter
mesmo tipo e parmetros de tipo subtipo (kind type parameters)
C495 (R466) Se type-spec especifica um tipo intrnseco, cada expresso ac-value no array-
constructor tem que ser um tipo intrnseco que conforme em tipo com a varivel do tipo type-spec como
especificado na tabela 7.8
C496 (R466) Se type-spec especifica um tipo derivado, todas as expresses ac-value no construtor de
matriz tem que ser deste tipo derivado e tem que ter o mesmo parmetro de tipo subtipo (kind type parameters) que
foi especificado por type-spec
C497 (R470) A ac-do-variable de um ac-implied-do que outro ac-implied-do no pode aparecer
como um ac-do-variable de um ac-implied-do
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 468
Seo 5:
Section 5:
R501type-declaration-stmt is declaration-type-spec[[,attr-spec]...:]entity-decl-list
R502 declaration-type-spec is intrinsic-type-spec
or TYPE( derived-type-spec )
or CLASS( derived-type-spec )
or CLASS( * )
C501 (R502) Em uma declaration-type-spec cada type-param-value que no um dois pontos (colon)
ou um asterisco tem que ser uma specification-expr
C502 (R502) Em uma declaration-type-spec que usa a palavra-chave CLASS, derived-type-spec
especifica um tipo extensvel
C503 (R502) O TYPE(derived-type-spec) no pode especificar um tipo abstrato (4.5.6)
R503 attr-spec is access-spec
or ALLOCATABLE
or ASYNCHRONOUS
or DIMENSION ( array-spec )
or EXTERNAL
or INTENT ( intent-spec )
or INTENT ( intent-spec )
or INTRINSIC
or language-binding-spec
or OPTIONAL
or PARAMETER
or POINTER
or PROTECTED
or SAVE
or TARGET
or VALUE
or VOLATILE
R504 entity-decl is object-name[(array-spec)][*char-length][initialization]
or function-name[*char-length]
C504 (R504) Se um type-param-value em um char-length em um entity-decl no um dois pontos
(colon) ou um asterisco, ele tem que se uma specification-expr
R505 object-name is name
C505 (R505) O object-name tem que ser o nome de um objeto de dado
R506 initialization is = initialization-expr
or => null-init
R507 null-init is function-reference
C506 (R507) A function-reference tem que ser uma referncia da funo intrnseca NULL sem argumentos
C507 (R501) O mesmo attr-spec no pode aparecer mais de uma vez em uma dada type-declaration-
stmt
C508 Uma entidade no pode explicitamente usar qualquer atributo mais de uma vez em uma unidade de escopo
C509 (R501) Uma entidade declarada com a palavra-chave CLASS tem que ser um argumento mudo ou ter o
atributo ALLOCATABLE ou POINTER
C510 (R501) Uma matriz que tem o atributo POINTER ou ALLOCATABLE tem que ser especificada com um
array-spec que uma deferred-shape-spec-list (5.1.2.5.3)
C511 (R501) Uma array-spec para um object-name que um resultado de funo que no tem o atributo
ALLOCATABLE ou POINTER tem que ter uma explicit-shape-spec-list
C512 (R501) Se um atributo POINTER especificado, o atributo ALLOCATABLE, TARGET, EXTERNAL ou
INTRINSIC no pode ser especificado
C513 (R501) Se o atributo TARGET especificado, o atributo POINTER, EXTERNAL, INTRINSIC ou PARAMETER
no pode ser especificado
C514 (R501) O atributo PARAMETER no pode ser especificado em um argumento mudo, um ponteiro, uma
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 469
entidade alocvel, uma funo ou um objeto em um bloco comum
C515 (R501) Os atributos INTENT, VALUE e OPTIONAL s podem ser especificado argumentos mudos
C516 (R501) O atributo INTENT no pode especificar um procedimento mudo sem um atributo ponteiro
C517 (R501) O atributo SAVE no pode ser especificado para um objeto que est em um bloco comum, um
argumento mudo, um procedimento, um resultado de funo um objeto de dado automtico ou um objeto com o
atributo PARAMETER
C518 Uma entidade no pode ter o atributo EXTERNAL e INTRINSIC ao mesmo tempo
C519 (R501) Uma entidade em um entity-decl-list no pode ter um atributo EXTERNAL ou INTRINSIC
especificado amenos que seja uma funo
C520 (R504) A opo *char-length permitida somente se o tipo especificado do tipo caractere
C521 (R504) A function-name tem que ser o nome de uma funo externa, uma funo intrnseca, uma
funo procedimento mudo ou uma funo instruo
C522 (R501) A inicializao pode aparecer se a instruo contm um atributo PARAMETER (5.1.2.10)
C523 (R501) Se inicializao aparece, um separador : : tem que ser usado antes da entity-decl-list
C524 (R504) Inicializao no pode aparece se object-name um argumento mudo, um resultado de funo,
um objeto em uma bloco comum com nome (named common block) amenos que a declarao de tipo esteja em
uma unidade de programa dados em bloco, um objeto em um comum sem nome, uma varivel alocvel, um nome
esterno, um nome intrnseco ou um objeto automtico
C525 (R504) Se => aparece em uma inicializao, o objeto tem que ter o atributo POINTER. Se = aparece em
uma inicializao, o objeto no pode ter o atributo POINTER
C526 (R501) Se o atributo VOLATILE especificado, o atributo PARAMETER, INTRINSIC, EXTERNAL ou
INTENT(IN) no pode se especificado
C527 (R501) Se o atributo VALUE especificado o atributo PARAMETER, EXTERNAL, POINTER,
ALLOCATABLE, DIMENSION, VOLATILE, INTENT(INOUT) ou INTENT(OUT) no pode se especificado
C528 (R501) Se o atributo VALUE especificado para um argumento mudo do tipo caractere, o parmetro de
comprimento pode ser omitido ou pode ser especificado por uma expresso de inicializao com o valor um
C529 (R501) O atributo VALUE no pode ser especificado para um procedimento mudo
C530 (R501) O atributo ALLOCATABLE, POINTER ou OPTIONAL no pode ser especificado para um
procedimento mudo de um procedimento que tem uma proc-language-binding-spec
C531 (R503) Uma language-binding-spec s pode aparecer em uma parte de especificao de um mdulo
C532 (R501) Se uma language-binding-spec especificada, a entidade declarada pode ser uma varivel
interopervel (15.2)
C533 (R501) Se uma language-binding-spec com um especificador NAME= aparece, a entity-decl-
list tem que consistir de um nica entity-decl
C534 (R503) O atributo PROTECTED permitido somente na parte de especificao de um mdulo
C535 (R501) O atributo PROTECTED permitido somente para um procedimento ponteiro ou varivel com
nome que no esteja em um bloco comum
C536 (R501) Se o atributo PROTECTED especificado, o atributo EXTERNAL, INTRINSIC ou PARAMETER no
pode ser especificado
C537 Um objeto no ponteiro que tem o atributo PROTECTED e acessado por uma associao de uso no pode
aparecer em um contexto de definio de varivel (16.5.7) ou como um data-target ou proc-target em uma
pointer-assignment-stmt
C538 Um objeto ponteiro que tem o atributo PROTECTED e acessada por uma associao de uso no pode
aparecer como
(1) um pointer-object em uma pointer-assignment-stmt ou nullify-stmt
(2) um allocate-object em uma allocate-stmt ou deallocate-stmt
(3) um argumento real em uma referncia a um procedimento se o argumento mudo associado um
ponteiro com o atributo INTENT(OUT) ou INTENT(INOUT)
R508 access-spec is PUBLIC
or PRIVATE
C539 (R508) Um access-spec s pode aparecer na specification-part de um mdulo
R509 language-binding-spec is BIND(C[,NAME=scalar-char-initialization-expr])
C540 (R509) A scalar-char-initialization-expr tem que ser caractere subtipo default (default character
kind)
R510 array-spec is explicit-shape-spec-list
or assumed-shape-spec-list
or deferred-shape-spec-list
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 470
or assumed-size-spec
C541 (R510) O nmero de dimenses (rank) mximo sete
R511 explicit-shape-spec is [lower-bound:]upper-bound
R512 lower-bound is specification-expr
R513 upper-bound is specification-expr
C542 (R511) Uma matriz de forma explcita cujos limites no so expresses de inicializao tem que ser um
argumento mudo, um resultado de funo ou uma matriz automtica de um procedimento
R514 assumed-shape-spec is [lower-bound]:
R515 deferred-shape-spec is :
R516 assumed-size-spec is [explicit-shape-spec-list,][lower-bound:]*
C543 Uma assumed-size-spec no pode aparecer como uma declarao dos limites de uma matriz de um
argumento mudo
C544 Um matriz de tamanho assumido com INTENT (OUT) no pode pode ser um tipo para o qual inicializao
especificada
R517 intent-spec is IN
or OUT
or INOUT
C545 (R517) Um objeto no ponteiro com o atributo INTENT(IN) no pode aparecer em um contexto de
definio de varivel(16.5.7)
C546 (R517) Um objeto ponteiro com o atributo INTENT(IN)no pode aparecer como
(1) um objeto ponteiro em uma pointer-assignment-stmt ou uma nullify-stmt
(2) um allocate-object em uma allocate-stmt ou uma deallocate-stmt
(3) um argumento real em uma referncia a um procedimento se o argumento mudo um ponteiro com o
atributo INTENT(OUT) ou INTENT(INOUT)
C547 (R503) (R1216) Se o nome de um procedimento intrnseco genrico explicitamente declarado como
tendo o atributo INTRINSIC e ele tambm um nome genrico em uma ou mais interfaces genricas(12.3.2.1)
acessvel na mesma unidade de escopo, os procedimentos nas interfaces e os procedimentos intrnsecos
especficos tem todos que serem funes ou todos sub-rotinas e as caractersticas dos procedimentos intrnsecos
especficos e dos procedimentos nas interfaces tm que diferir como especificado em 16.2.3
R518 access-stmt is access-spec[[::]access-id-list]
R519 access-id is use-name
or generic-spec
C548 (R518) Uma access-stmt s pode aparecer na specification-part de um mdulo. Somente uma
instruo de acessibilidade com uma access-id-list omitida permitida na specification-part de um
mdulo
C549 (R519) Cada use-name tem que ser o nome de uma varivel com nome, procedimento, tipo derivado,
constante com nome ou grupo de lista de nome (namelist group)
R520 allocatable-stmt is ALLOCATABLE[::]
object-name[(deferred-shape-spec-list)]
[,object-name[(deferred-shape-spec-list)]] ...
R521 asynchronous-stmt is ASYNCHRONOUS[::]object-name-list
R522 bind-stmt is language-binding-spec[::]bind-entity-list
R523 bind-entity is entity-name
or / common-block-name /
C550 (R522) Se qualquer bind-entity em uma bind-stmt um entity-name, a bind-stmt tem que
aparecer na parte de especificao de um mdulo e a entidade ser uma varivel interoperacional (interoperable
variable) (15.2.4, 15.2.5)
C551 (R522) Se a language-binding-spec tem um especificador NAME=, a bind-entity-list tem que
consistir de uma nica bind-entity
C552 (R522) Se a bind-entity um bloco comum, cada varivel do bloco comum tem que se interopervel
(15.2.4, 15.2.5)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 471
R524 data-stmt is DATA data-stmt-set[[,]data-stmt-set]...
R525 data-stmt-set is data-stmt-object-list / data-stmt-value-list /
R526 data-stmt-object is variable
or data-implied-do
R527 data-implied-do is (data-i-do-object-list,data-i-do-variable=
scalar-int-expr,scalar-int-expr[,scalar-int-expr])
R528 data-i-do-object is array-element
or scalar-structure-component
or data-implied-do
R529 data-i-do-variable is scalar-int-variable
C553 (R526) Em uma varivel que um data-stmt-object, qualquer subscrito, seo de subscrito, ponto
inicial de substring e ponto final de subscrito tem que ser uma expresso de inicializao
C554 (R526) Uma varivel cujo designador includo em uma data-stmt-object-list ou uma data-i-
do-object-list no pode ser: um argumento mudo, feito acessvel por associao de uso ou associao de
hospedagem, em um bloco comum com nome a menos que a instruo DATA esteja em uma unidade de
programa boco de dados, em um bloco de dados sem nome, um nome de funo, um nome de resultado de
funo, um objeto automtico ou uma varivel alocvel
C555 (R526) Um data-i-do-object ou uma varivel que aparece como um data-stmt-object no pode
ser um designador de objeto na qual um ponteiro aparece e no a parte inteira mais a direita de part-ref
C556 (R529) A data-i-do-variable no pode ser uma varivel com nome
C557 (R527) Uma scalar-int-expr de um data-implied-do tem que envolver primariamente s
constantes, subobjetos constantes ou variveis do DO dos data-implied-dos e cada operao tem que ser
intrnseca
C558 (R528) O array-element tem que ser uma varivel
C559 (R528) O scalar-structure-component tem que ser uma varivel
C560 (R528) O scalar-structure-component tem que conter ao menos uma part-ref que contenha uma
subscript-list
C561 (R528) Em um array-element ou um scalar-structure-component que um data-i-do-
object, qualquer subscrito tem que ser uma expresso cujas primrias so constantes, subobjetos de
constantes ou variveis DO deste data-implied-do ou os data-implied-dos contidos e cada operao tem
que ser intrnseca
R530 data-stmt-value is [data-stmt-repeat*]data-stmt-constant
R531 data-stmt-repeat is scalar-int-constant
or scalar-int-constant-subobject
C562 (R531) O data-stmt-repeat tem que ser positivo ou zero. Se uma data-stmt-repeat uma
constante com nome, ela tem que ter sido declarada previamente em uma unidade de escopo ou feita acessvel
por associao de uso ou associao de hospedagem
R532 data-stmt-constant is scalar-constant
or scalar-constant-subobject
or signed-int-literal-constant
or signed-real-literal-constant
or null-init
or structure-constructor
C563 (R532) Se um valor constante em uma instruo DATA uma constante com nome ou um construtor de
matriz, a constante com nome ou o tipo derivado tem que ter sido declarado previamente na unidade de escopo ou
tornada acessvel por associao de uso ou associao de hospedagem
C564 (R532) Se uma data-stmt-constant um structure-constructor, ela tem que ser uma
expresso de inicializao
R533 int-constant-subobject is constant-subobject
C565 (R533) int-constant-subobject shall be of type integer
R534 constant-subobject is designator
C566 (R534) constant-subobject tem que ser um subobjeto de uma constante
C567 (R534) Qualquer subscrito, ponto inicial de subscrito ou ponto final de subscrito tem que ser uma
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 472
expresso de inicializao
R535 dimension-stmt is DIMENSION[::]array-name(array-spec)
[,array-name(array-spec)]...
R536 intent-stmt is INTENT (intent-spec)[::]dummy-arg-name-list
R537 optional-stmt is OPTIONAL[::]dummy-arg-name-list
R538 parameter-stmt is PARAMETER(named-constant-def-list)
R539 named-constant-def is named-constant = initialization-expr
R540 pointer-stmt is POINTER[::]pointer-decl -list
R541 pointer-decl is object-name[(deferred-shape-spec-list)]
or proc-entity-name
C568 (R541) Um proc-entity-name tambm tem que ser declarado em uma procedure-declaration-
stmt
R542 protected-stmt is PROTECTED[::]entity-name-list
R543 save-stmt is SAVE[[::]saved-entity-list]
R544 saved-entity is object-name
or proc-pointer-name
or / common-block-name /
R545 proc-pointer-name is name
C569 (R545) Um proc-pointer-name tem que ser o nome de um procedimento ponteiro
C570 (R543) Se a instruo SAVE com uma lista de entidades salvas entidade omitida ocorre em uma unidade
de escopo, nenhuma ocorrncia explcita da atributo SAVE ou instruo SAVE permitido na mesma unidade de
escopo
R546 target-stmt is TARGET[::]object-name[(array-spec)]
[,object-name[(array-spec)]]...
R547 value-stmt is VALUE[::]dummy-arg-name-list
R548 volatile-stmt is VOLATILE[::]object-name-list
R549 implicit-stmt is IMPLICIT implicit-spec-list
or IMPLICIT NONE
R550 implicit-spec is declaration-type-spec(letter-spec-list)
R551 letter-spec is letter[letter]
C571 (R549) Se IMPLICIT NONE especificado em uma unidade de escopo, ela tem que preceder qualquer
instruo PARAMETER que aparece na unidade de escopo e no pode haver outra instruo IMPLICIT na
unidade de escopo
C572 (R551) Se o menos e a segunda letra aparece, a segunda letra tem que seguir a primeira letra
alfabeticamente
R552 namelist-stmt is NAMELIST
/ namelist-group-name / namelist-group-object-list
[[,]/ namelist-group-name /
namelist-group-object-list]...
C573 (R552) O namelist-group-name no pode ser o nome tornado acessvel por associao de uso
R553 namelist-group-object is variable-name
C574 (R553) Um namelist-group-object no pode ser uma matriz de tamanho assumido
C575 (R552) Um namelist-group-object no pode ter o atributo PRIVATE se o namelist-group-name
tem o atributo PUBLIC
R554 equivalence-stmt is EQUIVALENCE equivalence-set-list
R555 equivalence-set is (equivalence-object,equivalence-object-list)
R556 quivalence-object is variable-name
or array-element
or substring
C576 (R556) Um equivalence-object no pode ser um designador com um objeto base que um
argumento mudo, um ponteiro, uma varivel alocvel, um objeto tipo derivado que tem um componente ltimo
alocvel, um objeto de um tipo derivado no sequencial, um objeto do tipo derivado que um ponteiro em
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 473
qualquer nvel de seleo de componente, um objeto automtico, um nome de funo, um nome entry, um nome
resultado, uma varivel com o atributo a BIND, uma varivel em um bloco comum que tem o atributo BIND ou uma
constante com nome
C577 (R556) Um equivalence-object no pode ser um designador que tem mais de uma part-ref
C578 (R556) Um equivalence-object no pode ter o atributo TARGET
C579 (R556) Cada subscrito ou expresso de intervalo de subscrito em uma equivalence-object tem que
ser uma expresso de inicializao(7.1.7)
C580 (R555) Se um equivalence-object um inteiro do tipo default, real default, real de preciso dupla,
complexo default, lgico default ou tipo numrico sequncia, todos os objetos no conjunto equivalente tem que ser
destas tipos
C581 (R555) Se um equivalence-object do tipo caractere default ou tipo sequncia caractere, todos os
objetos no conjunto equivalente tem que ser destas tipos
C582 (R555) Se um equivalence-object tipo derivado sequncia que no uma sequncia numrica ou
tipo sequncia caractere, todos os objetos no conjunto equivalente tem que ser do mesmo tipo com os mesmos
valores de parmetros de tipo
C583 (R555) Se um equivalence-object do tipo intrnseco diferente de inteiro default, real default, real
preciso dupla, complexo default, lgico default ou caractere default, todos os objetos no conjunto equivalente tem
que ser do mesmo tipo com os mesmos valores de parmetros de tipo
C584 (R556) Se um equivalence-object tem o atributo PROTECTED, todos os objetos no conjunto
equivalente tem que ter o atributo PROTECTED
C585 (R556) O nome de um equivalence-object no pode ser um nome feito acessvel por associao de
uso
C586 (R556) Um substring no pode ter comprimento zero
R557 common-stmt is COMMON
[/[common-block-name]/]common-block-object-list
[[,]/[common-block-name]/
common-block-object-list]...
R558 common-block-object is variable-name[(explicit-shape-spec-list)]
or proc-pointer-name
C587 (R558) Somente uma apario de um dado variable-name ou proc-pointer-name permitido em
todos as common-block-object-lists dentro de uma unidade de escopo
C588 (R558) Um common-block-object no pode ser um argumento mudo, uma varivel alocvel, um objeto
tipo derivado com um componente ltimo que seja alocvel, um objeto automtico, o nome de uma funo, um
nome entry, uma varivel com o atributo BIND ou um nome relutado
C589 (R558) Se um common-block-object do tipo derivado, tem que ser um tipo sequncia (4.5.1) ou um
tipo com o atributo BIND e no pode ter inicializao default
C590 (R558) Um variable-name ou um proc-pointer-name no pode ser um nome feito acessvel por
associao de uso
Seo 6:
Section 6:
R601 variable is designator
C601 (R601) designador no pode ser uma constante ou subobjeto de uma constante
R602 variable-name is name
C602 (R602) Um variable-name tem que ser o nome de uma varivel
R603 designator is object-name
or array-element
or array-section
or structure-component
or substring
R604 logical-variable is variable
C603 (R604) logical-variable tem que ser do tipo lgico
R605 default-logical-variable is variable
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 474
C604 (R605) default-logical-variable tem que ser do tipo lgico default
R606 char-variable is variable
C605 (R606) char-variable tem que ser do tipo caractere
R607 default-char-variable is variable
C606 (R607) default-char-variable tem que ser do tipo caractere default
R608 int-variable is variable
C607 (R608) int-variable tem que ser do tipo inteiro
R609 substring is parent-string(substring-range)
R610 parent-string is scalar-variable-name
or array-element
or scalar-structure-component
or scalar-constant
R611 substring-range is [scalar-int-expr]:[scalar-int-expr]
C608 (R610) parent-string tem que ser do tipo caractere
R612 data-ref is part-ref[%part-ref]...
R613 part-ref is part-name[(section-subscript-list)]
C609 (R612) Cada part-name exceto a mais a direita tem que ser do tipo derivado
C610 (R612) Cada part-name exceto a mais a esquerda tem que ser o nome de um componente do tipo
declarado na parte part-name precedente
C611 (R612) Se o part-name mais a direita um tipo abstrato, data-ref tem que ser polimrfico
C612 (R612) O part-name mais a esquerda tem que ser o nome de um objeto de dado
C613 (R613) Se a section-subscript-list aparece, o nmero de section-subscripts tem que ser
igual ao nmero de dimenses de part-name
C614 (R612) No pode haver mais de uma part-ref com nmero de dimenses no zero. O part-name a
direita da part-ref com nmero de dimenses no zero no pode ter o atributo ALLOCATABLE ou POINTER
R614 structure-component is data-ref
C615 (R614) Existe mais de uma part-ref e a part-ref shall mais a direita tem que ter a forma part-
name
R615 type-param-inquiry is designator%type-param-name
C616 (R615) O type-param-name tem que ser o nome de um parmetro de tipo do tipo declarado do objeto
designado pelo designador
R616 array-element is data-ref
C617 (R616) Cada part-ref tem que ter nmero de dimenses (rank) zero e a ltima part-ref tem que
conter uma subscript-list
R617 array-section is data-ref[(substring-range)]
C618 (R617) Exatamente uma part-ref tem que ter nmero de dimenses no zero e ou a parte final de
part-ref tem que ter uma section-subscript-list com nmero de dimenses no zero ou outra part-
ref tem que ter nmero de dimenses no zero
C619 (R617) Se um substring-range aparece, o part-name mais a direita tem que ser do tipo caractere
R618 subscript is scalar-int-expr
R619 section-subscript is subscript
or subscript-triplet
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 475
or vector-subscript
R620 subscript-triplet is [subscript]:[subscript][:stride]
R621 stride is scalar-int-expr
R622 vector-subscript is int-expr
C620 (R622) Um vector-subscript tem que ser uma expresso matricial inteira de nmero de dimenses
(rank) um
C621 (R620) O segundo subscrito no pode ser omitido em um subscript-triplet na ltima dimenso de
uma matriz de tamanho assumido
R623 allocate-stmt is ALLOCATE([type-spec::]allocation-list
[,alloc-opt-list])
R624 alloc-opt is STAT = stat-variable
or ERRMSG = errmsg-variable
or SOURCE = source-expr
R625 stat-variable is scalar-int-variable
R626 errmsg-variable is scalar-default-char-variable
R627 source-expr is expr
R628 allocation is allocate-object[(allocate-shape-spec-list)]
R629 allocate-object is variable-name
or structure-component
R630 allocate-shape-spec is [lower-bound-expr:]upper-bound-expr
R631 lower-bound-expr is scalar-int-expr
R632 upper-bound-expr is scalar-int-expr
C622 (R629) Cada allocate-object tem que ser um ponteiro no procedimento ou uma varivel alocvel
C623 (R623) Se algum allocate-object na instruo tem parmetro de tipo postergado, ou type-spec ou
SOURCE= tem que aparecer
C624 (R623) Se uma type-spec aparece, ela especifica um tipo no qual cada allocate-object
compatvel com o tipo
C625 (R623) Se qualquer allocate-object polimrfico ilimitado, ou type-spec ou SOURCE= tem que
aparecer
C626 (R623) Um type-param-value em uma type-spec tem que ser um asterisco se e somente se cada
allocate-object um argumento mudo para o qual o parmetro de tipo correspondente assumido
C627 (R623) Se uma type-spec aparece, os valores dos parmetros de subtipo de cada allocate-object
tem que ser os mesmos valores do parmetro de tipo correspondente da type-spec
C628 (R628) Uma allocate-shape-spec-list tem que aparecer se e somente se o allocate-object
uma matriz
C629 (R628) O nmero de allocate-shape-specs em uma allocate-shape-spec-list tem que ser o
mesmo que o nmero de dimenses (rank) do allocate-object
C630 (R624) Nenhuma alloc-opt pode aparecer mais de um vez em uma dada alloc-opt-list
C631 (R623) Se SOURCE= aparece, type-spec no pode aparecer e allocation-list s contm um
allocate-object, que tem que ser compatvel em tipo (5.1.1.2) com a source-expr
C632 (R623) A source-expr tem que ser um escalar ou ter o mesmo nmero de dimenses (rank) que
allocate-object
C633 (R623) Parmetros de subtipo de allocate-object e source-expr tem que ter os mesmos valores
R633 nullify-stmt is NULLIFY(pointer-object-list)
R634 pointer-object is variable-name
or structure-component
or proc-pointer-name
C634 (R634) Cada pointer-object temque ter o atributo POINTER
R635 deallocate-stmt is DEALLOCATE(allocate-object-list[,dealloc-opt-list])
C635 (R635) cada allocate-object tem que ser um ponteiro no procedimento ou uma varivel alocvel
R636 dealloc-opt is STAT = stat-variable
or ERRMSG = errmsg-variable
C636 (R636) Nenhuma dealloc-opt pode aparecer mais de uma vez em uma dada dealloc-opt-list
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 476
Seo 7:
Section 7:
R701 primary is constant
or designator
or array-constructor
or structure-constructor
or function-reference
or type-param-inquiry
or type-param-name
or ( expr )
C701 (R701) O type-param-name tem que ser o nome de um parmetro de tipo
C702 (R701) O designador no pode se uma matriz inteira de tamanho assumido
R702 level-1-expr is [defined-unary-op]primary
R703 defined-unary-op is . letter[letter]... .
C703 (R703) Um defined-unary-op no pode conter mais de 63 letras e no pode ser o mesmo que
qualquer intrinsic-operator ou logical-literal-constant
R704 mult-operand is level-1-expr[power-op mult-operand]
R705 add-operand is [add-operand mult-op]mult-operand
R706 level-2-expr is [[level-2-expr]add-op]add-operand
R707 power-op is **
R708 mult-op is *
or /
R709 add-op is +
or -
R710 level-3-expr is [level-3-expr concat-op]level-2-expr
R711 concat-op is //
R712 level-4-expr is [level-3-expr rel-op]level-3-expr
R713 rel-op is .EQ.
or .NE.
or .LT.
or .LE.
or .GT.
or .GE.
or ==
or /=
or <
or <=
or >
or >=
R714 and-operand is [not-op]level-4-expr
R715 or-operand is [or-operand and-op]and-operand
R716 equiv-operand is [equiv-operand or-op]or-operand
R717 level-5-expr is [level-5-expr equiv-op]equiv-operand
R718 not-op is .NOT.
R719 and-op is .AND.
R720 or-op is .OR.
R721 equiv-op is .EQV.
or .NEQV.
R722 expr is [expr defined-binary-op]level-5-expr
R723 defined-binary-op is . letter[letter]... .
C704 (R723) Um defined-binary-op no pode conter mais de 63 letras e no pode ser o meso que qualquer
intrinsic-operator ou logical-literal-constant
R724 logical-expr is expr
C705 (R724) logical-expr tem que ser lgico
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 477
R725 char-expr is expr
C706 (R725) char-expr tem que ser caractere
R726 default-char-expr is expr
C707 (R726) default-char-expr tem que ser tipo default caractere
R727 int-expr is expr
C708 (R727) int-expr shall tem que ser tipo inteiro
R728 numeric-expr is expr
C709 (R728) numeric-expr tem que ser tipo inteiro, real ou complexo
R729 specification-expr is scalar-int-expr
C710 (R729) A scalar-int-expr tem que ser uma expresso restrita
R730 initialization-expr is expr
C711 (R730) initialization-expr tem que ser uma expresso de inicializao
R731 char-initialization-expr is char-expr
C712 (R731) char-initialization-expr tem que ser uma expresso de inicializao
R732 int-initialization-expr is int-expr
C713 (R732) int-initialization-expr tem que ser uma expresso de inicializao
R733 logical-initialization-expr is logical-expr
C714 (R733) logical-initialization-expr tem que ser uma expresso de inicializao
R734 assignment-stmt is variable = expr
C715 (R734) A varivel em uma assignment-stmt no pode ser uma matriz de tamanho assumido
R735 pointer-assignment-stmt is data-pointer-object[(bounds-spec-list)]=>data-target
or data-pointer-object(bounds-remapping-list)=>data-target
or proc-pointer-object=>proc-target
R736 data-pointer-object is variable-name
or variable%data-pointer-component-name
C716 (R735) Se data-target no polimrfico ilimitado, data-pointer-object tem que compatvel em
tipo (5.1.1.2) com ele e os correspondentes parmetros de tipo tem que ser iguais
C717 (R735) Se data-target polimrfico ilimitado, data-pointer-object tem que ser polimrfico
ilimitado, de um tipo derivado sequencial ou de tipo com o atributo BIND
C718 (R735) Se bounds-spec-list especificado, o nmero de bounds-specs tem que ser igual ao rank
de data-pointer-object
C719 (R735) Se bounds-remapping-list especificado, o nmero de bounds-remappings tem que ser
igual ao nmero de dimenses de data-pointer-object
C720 (R735) Se bounds-remapping-list especificado, data-target tem que ter nmero de dimenses
(rank) um; caso contrrio, os nmeros de dimenses de data-pointer-object e data-target tem que ser
iguais
C721 (R736) Um variable-name tem que ter o atributo POINTER
C722 (R736) Um data-pointer-component-name tem que ter o nome de um componente da varivel que
um ponteiro dado
R737 bounds-spec is lower-bound-expr:
R738 bounds-remapping is lower-bound-expr:upper-bound-expr
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 478
R739 data-target is variable
or expr
C723 (R739) Uma varivel tem que ter o atributo TARGET ou POINTER e no pode ser uma seo de matriz
com um subscrito vetor
C724 (R739) Uma expr tem que ser uma referncia a um funo cujo resultado um ponteiro dado
R740 proc-pointer-object is proc-pointer-name
or proc-component-ref
R741 proc-component-ref is variable % procedure-component-name
C725 (R741) O procedure-component-name tem que ser o nome de um componente ponteiro de
procedimento (procedure pointer) de uma varivel de tipo declarada
R742 proc-target is expr
or procedure-name
or proc-component-ref
C726 (R742) Uma expr tem que ser uma referncia a uma funo cujo resultado um ponteiro de
procedimento
C727 (R742) Um procedure-name tem que ser o nome de uma externa, mdulo ou procedimento mudo, uma
funo intrnseca especificada na em 13.6 e no marcada por um ponto lista () ou um ponteiro de procedimento
C728 (R742) O proc-target no pode ser um procedimento elementar no intrnseco
R743 where-stmt is WHERE(mask-expr)where-assignment-stmt
R744 where-construct is where-construct-stmt
[where-body-construct] ...
[masked-elsewhere-stmt
[where-body-construct] ... ] ...
[elsewhere-stmt
[where-body-construct] ... ]
end-where-stmt
R745 where-construct-stmt is [where-construct-name:]WHERE(mask-expr)
R746 where-body-construct is where-assignment-stmt
or where-stmt
or where-construct
R747 where-assignment-stmt is assignment-stmt
R748 mask-expr is logical-expr
R749 masked-elsewhere-stmt is ELSEWHERE(mask-expr)[where-construct-name]
R750 elsewhere-stmt is ELSEWHERE[where-construct-name]
R751 end-where-stmt is END WHERE[where-construct-name]
C729 (R747) Uma where-assignment-stmt que uma atribuio definida tem que ser elementar
C730 (R744) Se a where-construct-stmt identificada por um where-construct-name, o
correspondente end-where-stmt tem que especificar o mesmo where-construct-name. Se a where-
construct-stmt no identificada por um where-construct-name, o correspondente end-where-stmt
no pode especificar um where-construct-name. Se uma elsewhere-stmt ou uma masked-elsewhere-
stmt identificada por um where-construct-name, a correspondente where-construct-stmt tem que
especificar o mesmo where-construct-name
C731 (R746) Uma instruo que parte de uma where-body-construct no pode ser uma instruo alvo de
desvio (branch target statement)
R752 forall-construct is forall-construct-stmt
[forall-body-construct ] ...
end-forall-stmt
R753 forall-construct-stmt is [forall-construct-name:]FORALL forall-header
R754 forall-header is (forall-triplet-spec-list[,scalar-mask-expr])
R755 forall-triplet-spec is index-name=subscript:subscript[:stride]
R618 subscript is scalar-int-expr
R621 stride is scalar-int-expr
R756 forall-body-construct is forall-assignment-stmt
or where-stmt
or where-construct
or forall-construct
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 479
or forall-stmt
R757 forall-assignment-stmt is assignment-stmt
or pointer-assignment-stmt
R758 end-forall-stmt is END FORALL[forall-construct-name]
C732 (R758) Se a forall-construct-stmt tem um forall-construct-name, a end-forall-stmt tem
que ter o mesmos forall-construct-name. Se a end-forall-stmt tem um forall-construct-name, a
forall-construct-stmt tem que ter o mesmo forall-construct-name
C733 (R754) A scalar-mask-expr tem que ser escalar e do tipo lgico
C734 (R754) Qualquer procedimento referenciado em uma scalar-mask-expr, incluindo uma referncia a um
operao definida, tem que ser um procedimento puro(12.6)
C735 (R755) Um index-name tem que ser um varivel escalar com nome do tipo inteiro
C736 (R755) Um subscrito ou passo em uma forall-triplet-spec no pode conter um referncia a
qualquer index-name em uma forall-triplet-spec-list na qual ele aparece
C737 (R756) Uma instruo em uma forall-body-construct no pode definir um index-name de uma
forall-construct
C738 (R756) Qualquer procedimento referenciado em um forall-body-construct, incluindo aquele
referenciado por uma operao definida, atribuio ou finalizao, tem que ser um procedimento puro
C739 (R756) Uma forall-body-construct no pode ser o alvo de um desvio
R759 forall-stmt is FORALL forall-header forall-assignment-stmt
Seo 8:
Section 8:
R801 block is [execution-part-construct]...
R802 if-construct is if-then-stmt
block
[else-if-stmt
block ] ...
[else-stmt
block ]
end-if-stmt
R803 if-then-stmt is [if-construct-name:]IF(scalar-logical-expr)THEN
R804 else-if-stmt is ELSE IF(scalar-logical-expr)THEN[if-construct-name]
R805 else-stmt is ELSE[if-construct-name]
R806 end-if-stmt is END IF[if-construct-name]
C801 (R802) Se a if-then-stmt de uma if-construct especifica um if-construct-name, a
correspondente end-if-stmt tem que especificar o mesmo if-construct-name. Se a if-then-stmt de
uma if-construct no especifica um if-construct-name, a correspondente end-if-stmt no pode
especificar um if-construct-name. Se a else-if-stmt ou a else-stmt especifica uma if-construct-
name, a correspondente if-then-stmt tem que especificar o mesmo if-construct-name
R807 if-stmt is IF(scalar-logical-expr)action-stmt
C802 (R807) Uma action-stmt em uma if-stmt no pode ser uma if-stmt, end-program-stmt, end-
function-stmt, ou end-subroutine-stmt
R808 case-construct is select-case-stmt
[case-stmt
block] ...
end-select-stmt
R809 select-case-stmt is [case-construct-name:]SELECT CASE(case-expr)
R810 case-stmt is CASE case-selector[case-construct-name]
R811 end-select-stmt is END SELECT[case-construct-name]
C803 (R808) Se uma select-case-stmt de um case-construct especifica um case-construct-name,
a correspondente end-select-stmt tem que especificar o mesmo case-construct-name. E a select-
case-stmt de uma case-construct no especifica um case-construct-name, a correspondente end-
select-stmt shall no especifica um case-construct-name. Se uma case-stmt especifica um case-
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 480
construct-name, a correspondente select-case-stmt tem que especificar o mesmo case-construct-
name
R812 case-expr is scalar-int-expr
or scalar-char-expr
or scalar-logical-expr
R813 case-selector is ( case-value-range-list )
or DEFAULT
C804 (R808) No mais de um seletor de uma instruo CASE pode ser DEFAULT
R814 case-value-range is case-value
or case-value:
or case-value
or case-value:case-value
R815 case-value is scalar-int-initialization-expr
or scalar-char-initialization-expr
or scalar-logical-initialization-expr
C805 (R808) Para um dado case-construct, cada case-value tem que ter o mesmo tipo de case-expr.
Para o tipo caractere, os parmetros de tipo subtipo tm que ser os mesmos; caracteres de comprimentos
diferentes so permitidos
C806 (R808) Um case-value-range usando dois pontos no pode ser usado se case-expr do tipo lgico
C807 (R808) Para um dado case-construct, o case-value-ranges no pode sobrepor-se, isto , no h
possveis valores de case-expr que sejam igual a mais de um case-value-range
R816 associate-construct is associate-stmt
block
end-associate-stmt
R817 associate-stmt is [associate-construct-name:]ASSOCIATE
(association-list)
R818 association is associate-name => selector
R819 selector is expr
or variable
C808 (R818) Se o seletor no uma varivel ou uma varivel que tem um subscrito vetor, associate-name
no pode aparecer em um contexto de definio de varivel (16.5.7)
C809 (R818) Um associate-name no pode ter o mesmo nome que outro associate-name no mesmo
associate-stmt
R820 end-associate-stmt is END ASSOCIATE[associate-construct-name]
C810 (R820) Se a associate-stmt de um associate-construct especifica um associate-construct-
name, o correspondente end-associate-stmt tem que especificar o mesmo associate-construct-name.
Se a associate-stmt de um associate-construct no especifica um associate-construct-name, a
correspondente end-associate-stmt no pode especificar um associate-construct-name
R821 select-type-construct is select-type-stmt
[type-guard-stmt
block] ...
end-select-type-stmt
R822 select-type-stmt is [select-construct-name:]SELECT TYPE
([associate-name=>]selector)
C811 (R822) Se selector no uma varivel com nome, associate-name => tem que aparecer
C812 (R822) Se selector no uma varivel ou uma varivel que te, um subscrito vetor, associate-name no
pode aparecer num contexto de definio de varivel (16.5.7)
C813 (R822) O seletor em uma select-type-stmt tem que ser polimrfico
R823 type-guard-stmt is TYPE IS(type-spec)[select-construct-name]
or CLASS IS(type-spec)[select-construct-name]
or CLASS DEFAULT[select-construct-name]
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 481
C814 (R823) A type-spec tem que especificar cada parmetro de tipo comprimento assumido
C815 (R823) A type-spec no pode especificar um tipo derivado sequncia ou um tipo com o atributo BIND
C816 (R823) Se selector no polimrfico ilimitado, a type-spec tem que especificar uma extenso do tipo
declarado do seletor
C817 (R823) Para um dado select-type-construct, o mesmo tipo e valor de parmetro de tipo subtipo no
pode ser especificado em mais de um TYPE IS type-guard-stmt e no pode especificar mais de uma CLASS
IS type-guard-stmt
C818 (R823) Para um dado select-type-construct, tem que no mximo um CLASS DEFAULT type-
guard-stmt
R824 end-select-type-stmt is END SELECT[select-construct-name]
C819 (R821) Se uma select-type-stmt de um select-type-construct especifica um select-
construct-name, o correspondente end-select-type-stmt tem que especificar o mesmo select-
construct-name. Se a select- type-stmt de um select-type-construct no especifica um select-
construct-name, o correspondente end-select-type-stmt no pode especificar um select-construct-
name. Se uma type-guard-stmt especifica um select-construct-name, a correspondente select-type-
stmt tem que especificar o mesmo select-construct-name
R825 do-construct is block-do-construct
or nonblock-do-construct
R826 block-do-construct is do-stmt
do-block
end-do
R827 do-stmt is label-do-stmt
or nonlabel-do-stmt
R828 label-do-stmt is [do-construct-name:]DO label[loop-control]
R829 nonlabel-do-stmt is [do-construct-name:]DO [loop-control]
R830 loop-control is [,]do-variable=scalar-int-expr,scalar-int-expr
[,scalar-int-expr]
or [,]WHILE(scalar-logical-expr)
R831 do-variable is scalar-int-variable
C820 (R831) A do-variable tem que ser uma varivel escalar com nome do tipo inteiro
R832 do-block is block
R833 end-do is end-do-stmt
or continue-stmt
R834 end-do-stmt is END DO[do-construct-name]
C821 (R826) Se o do-stmt de uma block-do-construct especifica um do-construct-name, o
correspondente end-do tem que ser uma end-do-stmt especificando o mesmo do-construct-name. Se o
do-stmt de uma block-do-construct no especifica um do-construct-name, o correspondente end-do
no pode especificar um do-construct-name
C822 (R826) Se uma do-stmt uma nonlabel-do-stmt, o correspondente end-do tem que ser uma end-
do-stmt
C823 (R826) Se a do-stmt uma label-do-stmt, a correspondente end-do tem que ser identificada pelo
mesmo rtulo
R835 nonblock-do-construct is action-term-do-construct
or outer-shared-do-construct
R836 action-term-do-construct is label-do-stmt
do-body
do-term-action-stmt
R837 do-body is [execution-part-construct]...
R838 do-term-action-stmt is action-stmt
C824 (R838) Uma do-term-action-stmt no pode ser uma continue-stmt, uma goto-stmt, uma return-stmt,
uma stop-stmt, uma exit-stmt, uma cycle-stmt, uma end-function-stmt, uma end-subroutine-stmt, uma
end-program-stmt ou uma arithmetic-if-stmt
C825 (R835) A do-term-action-stmt tem que ser identificada com um rtulo e a correspondente label-do-stmt tem
que referir o mesmo rtulo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 482
R839 outer-shared-do-construct is label-do-stmt
do-body
shared-term-do-construct
R840 shared-term-do-construct is outer-shared-do-construct
R841 inner-shared-do-construct is inner-shared-do-construct
R842 do-term-shared-stmt is label-do-stmt
C826 (R842) Uma do-term-shared-stmt no pode ser uma goto-stmt, uma return-stmt, uma stop-stmt, uma
exit-stmt, uma cycle-stmt, uma end-function-stmt, uma end-subroutine-stmt, uma end-program-stmt ou
uma arithmetic-if-stmt
C827 (R840) A do-term-shared-stmt tem que ser identificada com um rtulo e todas as label-do-stmts do inner-
shared-do-construct e outer-shared-do-construct tem que referir ao mesmo rtulo
R843 cycle-stmt is CYCLE [ do-construct-name ]
C828 (R843) Se a cycle-stmt refere-se a um do-construct-name, ela tem que estar dentro do intervalo do
do-construct; caso contrrio, ela tem que estar dentro do intervalo de pelo menos um dos do-construct
R844 exit-stmt is EXIT[do-construct-name]
C829 (R844) Se uma exit-stmt refere-se a um do-construct-name, ela tem que estar dentro do intervalo
deste do-construct; caso contrrio, ela tem que estar dentro do intervalo de pelo menos um dos do-
construct
R845 goto-stmt is GO TO label
C830 (R845) O rtulo tem que ser uma instruo rtulo de uma instruo alvo de desvio que aparece na mesma
unidade de escopo que a goto-stmt
R846 computed-goto-stmt is GO TO (label-list)[,]scalar-int-expr
C831 (R846) Cada rtulo em uma label-list tem que ser um instruo rtulo de uma instruo alvo de desvio que
aparece na mesma unidade de escopo que a computed-goto-stmt
R847 arithmetic-if-stmt is IF(scalar-numeric-expr)label,label,label
C832 (R847) Cada rtulo tem que ser um rtulo de uma instruo alvo de desvio que aparace na mesma unidade de
escopo da arithmetic-if-stmt
C833 (R847) A scalar-numeric-expr no pode ser do tipo complexo
R848 continue-stmt is CONTINUE
R849 stop-stmt is STOP[stop-code]
R850 stop-code is scalar-char-constant
or digit[digit[digit[digit[digit]]]]
C834 (R850) scalar-char-constant tem que ser do tipo caractere default
Seo 9:
Section 9:
R901 io-unit is file-unit-number
or *
or internal-file-variable
R902 file-unit-number is scalar-int-expr
R903 internal-file-variable is char-variable
C901 (R903) A char-variable no pode ser uma seo de matriz com um subscrito vetor
C902 (R903) A char-variable tem que ser um tipo caractere default, caractere ASCII ou caractere ISO
10646
R904 open-stmt is OPEN(connect-spec-list)
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 483
R905 connect-spec is [UNIT=]file-unit-number
or ACCESS=scalar-default-char-expr
or ACTION=scalar-default-char-expr
or ASYNCHRONOUS=scalar-default-char-expr
or BLANK=scalar-default-char-expr
or DECIMAL=scalar-default-char-expr
or DELIM=scalar-default-char-expr
or ENCODING=scalar-default-char-expr
or ERR=label
or FILE=file-name-expr
or FORM=scalar-default-char-expr
or IOMSG=iomsg-variable
or IOSTAT=scalar-int-variable
or PAD=scalar-default-char-expr
or POSITION=scalar-default-char-expr
or RECL=scalar-int-expr
or ROUND=scalar-default-char-expr
or SIGN=scalar-default-char-expr
or STATUS=scalar-default-char-expr
R906 file-name-expr is scalar-default-char-expr
R907 iomsg-variable is scalar-default-char-variable
C903 (R905) Nenhum especificador pode aparecer mais de uma vez em uma dada connect-spec-list
C904 (R905) Um file-unit-number tem que ser especificado; se os caracteres opcionais UNIT= so
omitidos, o file-unit-number tem que ser o primeiro item da connect-spec-list
C905 (R905) O rtulo no especificador ERR= tem que se um rtulo de instruo de um uma instruo alvo de
desvio que aparece na mesma unidade de escopo que a instruo OPEN
R908 close-stmt is CLOSE(close-spec-list)
R909 close-spec is [UNIT=]file-unit-number
or IOSTAT=scalar-int-variable
or IOMSG=iomsg-variable
or ERR=label
or STATUS=scalar-default-char-expr
C906 (R909) Nenhum especificador pode aparecer mais de uma vez em uma dada close-spec-list
C907 (R909) Um file-unit-number tem que ser especificado; se os caracteres opcionais UNIT= so
omitidos, o file-unit-number tem que ser o primeiro item na close-spec-list
C908 (R909) o rtulo usado no especificador ERR= tem que ser uma instruo rtulo de uma instruo alvo de
desvio que aparece na mesma unidade de escopo que a instruo CLOSE
R910 read-stmt is READ(io-control-spec-list)[input-item-list]
or READ format[,input-item-list]
R911 write-stmt is WRITE(io-control-spec-list)[output-item-list]
R912 print-stmt is PRINT format[,output-item-list]
R913 io-control-spec is [UNIT=]io-unit
or [FMT=]format
or [NML=]namelist-group-name
or ADVANCE=scalar-default-char-expr
or ASYNCHRONOUS=scalar-char-initialization-expr
or BLANK=scalar-default-char-expr
or DECIMAL=scalar-default-char-expr
or DELIM=scalar-default-char-expr
or END=label
or EOR=label
or ERR=label
or ID=scalar-int-variable
or IOMSG=iomsg-variable
or IOSTAT=scalar-int-variable
or PAD=scalar-default-char-expr
or POS=scalar-int-expr
or REC=scalar-int-expr
or ROUND=scalar-default-char-expr
or SIGN=scalar-default-char-expr
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 484
or SIZE=scalar-int-variable
C909 (R913) Nenhum especificador pode aparecer mais de uma vezem uma dada io-control-spec-list
C910 (R913) Uma io-unit tem que ser especificada; se os caracteres opcionais UNIT= so omitidos, a io-
unit tem que ser o primeiro item na io-control-spec-list
C911 (R913) O especificador DELIM= ou SIGN= no pode aparecer em uma read-stmt
C912 (R913) O especificador BLANK=, PAD=, END=, EOR= ou SIZE= no pode aparecer em uma write-stmt
C913 (R913) Um rtulo no especificador ERR=, EOR= ou END= tem que ser uma instruo rtulo de uma
instruo alvo de desvio que aparece na mesma unidade de escopo que a instruo de transferncia de dado
C914 (R913) Um namelist-group-name tem que ser o nome de um namelist group
C915 (R913) Um namelist-group-name no pode aparecer em uma input-item-list ou uma output-
item-list aparecer em uma instruo de transferncia de dado
C916 (R913) Uma io-control-spec-list conter um formato e um namelist-group-name
C917 (R913) Se formato aparece sem um precedente FMT=, ele tem que ser o segundo item na io-control-
spec-list e o primeiro item tem que ser a io-unit
C918 (R913) Se namelist-group-name aparece sem um precedente NML=, ele tem que ser o segundo item
na io-control-spec-list e o primeiro item tem que ser a io-unit
C919 (R913) Se io-unit no um file-unit-number, a io-control-spec-list no pode conter o
especificador REC= ou o especificador POS=
C920 (R913) Se o especificador REC= aparece, um especificador END= no pode aparecer, um namelist-
group- name no pode aparecer e o formato, se existir, no pode ser um asterisco
C921 (R913) Um especificador ADVANCE= s pode aparecer em uma instruo sequencial formatada ou
instruo entrada/sada em fluxo (stream input/output statement) com especificao explcita de formato (10.1) cuja
lista de informao de controle no contm uma internal-file-variable como a io-unit
C922 (R913) Se um especificador EOR= aparece, um especificador ADVANCE= tambm tem que aparecer
C923 (R913) Se um especificador SIZE= aparece, um especificador ADVANCE= tambm tem que aparecer
C924 (R913) A scalar-char-initialization-expr em um especificador ASYNCHRONOUS= tem que ser
tipo caractere default e tem que ter o valor YES ou NO
C925 (R913) Um especificador ASYNCHRONOUS= com o valor YES no pode aparecer a menos que io-unit
seja um file-unit-number
C926 (R913) Se um especificador ID= aparece, um especificador ASYNCHRONOUS= com o valor YES tambm
tem que aparecer
C927 (R913) Se um especificador POS= aparece, a io-control-spec-list no pode conter o especificador
REC=
C928 (R913) Se o especificador DECIMAL=, BLANK=, PAD=, SIGN= ou ROUND= aparece, um formato ou
namelist-group-name tambm tem que aparecer
C929 (R913) Se o especificador DELIM= aparece, o formato tem que ser um asterisco ou namelist-group-
name tem que aparecer
R914 format is default-char-expr
or label
or *
C930 (R914) O rtulo tem que ser um rtulo de uma instruo FORMAT que aparece na mesma unidade de
escopo que a instruo contendo o especificador FMT=
R915 input-item is variable
or io-implied-do
R916 output-item is expr
or io-implied-do
R917 io-implied-do is (io-implied-do-object-list,io-implied-do-control)
R918 io-implied-do-object is input-item
or output-item
R919 io-implied-do-control is do-variable=scalar-int-expr,
scalar-int-expr[,scalar-int-expr]
C931 (R915) Uma varivel que um input-item no pode ser uma matriz inteira de tamanho assumido
C932 (R915) Uma varivel que um input-item no pode ser um ponteiro de procedimento
C933 (R919) Uma do-variable tem que ser uma varivel escalar com nome do tipo inteiro
C934 (R918) Em uma input-item-list, um io-implied-do-object tem que ser um input-tem. Em
uma output-item-list, um io-implied-do-object tem que ser um output-item
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 485
C935 (R916) Uma expresso que um output-item no pode ter um valor que um ponteiro procedimento
R920 dtv-type-spec is TYPE(derived-type-spec)
or CLASS(derived-type-spec)
C936 (R920) Se derived-type-spec especifica um tipo extensvel, a palavra-chave CLASS tem que ser
usada, caso contrrio, a palavra-chave TYPE tem que ser usada
C937 (R920) Todos os parmetros de tipo comprimento da derived-type-spec tm que ser assumidos
R921 wait-stmt is WAIT(wait-spec-list)
R922 wait-spec is [UNIT=]file-unit-number
or END = label
or EOR = label
or ERR = label
or ID = scalar-int-variable
or IOMSG = iomsg-variable
or IOSTAT = scalar-int-variable
C938 (R922) Nenhum especificador pode aparecer mais de uma vez em uma dada wait-spec-list
C939 (R922) Um file-unit-number tem que ser especificado; se os caracteres opcionais UNIT= so
omitidos, o file-unit-number tem que ser o primeiro item na wait-spec-list
C940 (R922) O rtulo no especificador ERR=, EOR= ou END= tem que ser um rtulo de instruo de uma
instruo alvo de desvio que aparece na mesma unidade de escopo que a instruo WAIT
R923 backspace-stmt is BACKSPACE file-unit-number
or BACKSPACE(position-spec-list)
R924 endfile-stmt is ENDFILE file-unit-number
or ENDFILE(position-spec-list)
R925 rewind-stmt is REWIND file-unit-number
or REWIND(position-spec-list)
R926 position-spec is [UNIT=]file-unit-number
or IOMSG=iomsg-variable
or IOSTAT=scalar-int-variable
or ERR=label
C941 (R926) Nenhum especificador pode aparecer mais de uma vezem uma dada position-spec-list
C942 (R926) Um file-unit-number tem que ser especificado; se os caracteres opcionais UNIT= so
omitidos, o file-unit-number tem que ser o primeiro item na position-spec-list
C943 (R926) O rtulo no especificador ERR= tem que ser uma instruo rtulo de uma instruo alvo de desvio
que aparece na mesma unidade de escopo que a instruo de posicionamento do arquivo
R927 flush-stmt is FLUSH file-unit-number
or FLUSH(flush-spec-list)
R928 flush-spec is [UNIT=]file-unit-number
or IOSTAT=scalar-int-variable
or IOMSG=iomsg-variable
or ERR=label
C944 (R928) Nenhum especificador pode aparecer mais de uma vez em uma dada flush-spec-list
C945 (R928) O file-unit-number tem que ser especificado; se os caracteres opcionais UNIT= so omitidos
do unidade especificada, o file-unit-number tem que ser o primeiro item na flush-spec-list
C946 (R928) O rtulo no especificador ERR= tem que ser a instruo rtulo de uma instruo alvo de desvio que
aparece na mesma unidade de escopo que a instruo flush
R929 inquire-stmt is INQUIRE(inquire-spec-list)
or INQUIRE(IOLENGTH=scalar-int-variable)
output-item-list
R930 inquire-spec is [ UNIT = ] file-unit-number
or FILE = file-name-expr
or ACCESS = scalar-default-char-variable
or ACTION = scalar-default-char-variable
or ASYNCHRONOUS = scalar-default-char-variable
or BLANK = scalar-default-char-variable
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 486
or DECIMAL = scalar-default-char-variable
or DELIM = scalar-default-char-variable
or DIRECT = scalar-default-char-variable
or ENCODING = scalar-default-char-variable
or ERR = label
or EXIST = scalar-default-logical-variable
or FORM = scalar-default-char-variable
or FORMATTED = scalar-default-char-variable
or ID = scalar-int-variable
or IOMSG = iomsg-variable
or IOSTAT = scalar-int-variable
or NAME = scalar-default-char-variable
or NAMED = scalar-default-logical-variable
or NEXTREC = scalar-int-variable
or NUMBER = scalar-int-variable
or OPENED = scalar-default-logical-variable
or PAD = scalar-default-char-variable
or PENDING = scalar-default-logical-variable
or POS = scalar-int-variable
or POSITION = scalar-default-char-variable
or READ = scalar-default-char-variable
or READWRITE = scalar-default-char-variable
or RECL = scalar-int-variable
or ROUND = scalar-default-char-variable
or SEQUENTIAL = scalar-default-char-variable
or SIGN = scalar-default-char-variable
or SIZE = scalar-int-variable
or STREAM = scalar-default-char-variable
or UNFORMATTED = scalar-default-char-variable
or WRITE = scalar-default-char-variable
C947 (R930) Nenhum especificador pode aparecer mais de uma vez em uma dada inquire-spec-list
C948 (R930) Uma inquire-spec-list tem que conter um especificador FILE= ou um especificador UNIT=,
mas no ambos
C949 (R930) Na forma de inquisio por unidade da instruo INQUIRE, se os caracteres opcionais UNIT= so
omitidos, o file-unit-number tem que ser o primeiro item na inquire-spec-list
C950 (R930) Se um especificador ID= aparece, um especificador PENDING= tambm tem que aparecer
Seo 10:
Section 10:
R1001 format-stmt is FORMAT format-specification
R1002 format-specification is ([format-item-list])
C1001 (R1001) Uma format-stmt tem que ter um rtulo
C1002 (R1002) O dois pontos usado para separar format-items em um format-item-list pode se
omitido
(1) entre o descritor de edio P e um descritor de edio F, E, EN, ES, D ou G que (10.7.5) escrito
imediatamente depois, possivelmente precedido por um especificador de repetio
(2) Antes de uma descritor de edio barra quando a especificao de repetio opcional no est
presente(10.7.2)
(3) depois de um descritor de edio barra ou
(4) antes ou depois do descritor de edio dois pontos(10.7.3)
R1003 format-item is [r]data-edit-desc
or control-edit-desc
or char-string-edit-desc
or [r](format-item-list)
R1004 r is int-literal-constant
C1003 (R1003) r tem que ser positivo
C1004 (R1003) r no pode ter parmetro de subtipo (kind parameter) especificado para ele
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 487
R1005 data-edit-desc is Iw [. m ]
or Bw [. m ]
or Ow [. m ]
or Zw [. m ]
or Fw . d
or Ew . d [Ee ]
or EN w . d [ E e ]
or ES w . d [ E e ]
or Gw . d [Ee ]
or Lw
or A[w ]
or Dw . d
or DT [ char-literal-constant ] [ ( v -list ) ]
R1006 w is int-literal-constant
R1007 m is int-literal-constant
R1008 d is int-literal-constant
R1009 e is int-literal-constant
R10010 v is signed-int-literal-constant
C1005 (R1009) e tem que ser positivo
C1006 (R1006) w tem que ser zero ou positivo para os descritores de edio I, B, O, Z e F.w tem que ser
positivo para todos os outros descritores de edio
C1007 (R1005) w, m, d , e e v no podem ter parmetros de subtipo (kind parameters) especificados para ele
C1008 (R1005) Uma char-literal-constant no descritor de edio DT no pode ter parmetro de subtipo
(kind parameter) especificado para ele
R10011 control-edit-desc is position-edit-desc
or [r ]/
or :
or sign-edit-desc
or k P
or blank-interp-edit-desc
or round-edit-desc
or decimal-edit-desc
R10012 k is signed-int-literal-constant
C1009 (R1012) k no pode ter parmetro de subtipo (kind parameter) especificado para ele
R10013 position-edit-desc is Tn
or TL n
or TR n
or n X
R10014 n is int-literal-constant
C1010 (R1014) n tem que ser positivo
C1011 (R1014) n no pode ter parmetro de subtipo (kind parameter) especificado para ele
R10015 sign-edit-desc is SS
or SP
or S
R10016 blank-interp-edit-desc r is BN
or BZ
R10017 ound-edit-desc is RU
or RD
or RZ
or RN
or RC
or RP
R10018 decimal-edit-desc is DC
or DP
R10019 char-string-edit-desc is char-literal-constant
C1012 (R1019) A char-literal-constant no pode ter parmetro de subtipo (kind parameter) especificado
para ela
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 488
Seo 11:
Section 11:
R1101 main-program is [program-stmt]
[specification-part]
[execution-part]
[internal-subprogram-part]
end-program-stmt
R1102 program-stmt is PROGRAM program-name
R1103 end-program-stmt is END[PROGRAM[program-name]]
C1101 (R1101) Em um main-program, a execution-part no pode conter uma instruo RETURN ou uma
instruo ENTRY
C1102 (R1101) O program-name pode ser includo na end-program-stmt somente se a program-stmt
opcional foi usada, se includa, tem que ser idntica ao program-name especificado na program-stmt
C1103 (R1101) Um objeto automtico no pode aparecer na specification-part (R204) de um programa
principal
R1104 module is module-stmt
[specification-part]
[module-subprogram-part]
end-module-stmt
R1105 module-stmt is MODULE module-name
R1106 end-module-stmt is END[MODULE[module-name]]
R1107 module-subprogram-part is contains-stmt
module-subprogram
[module-subprogram]...
R1108 module-subprogram is function-subprogram
or subroutine-subprogram
C1104 (R1104) Se o module-name especificado em uma end-module-stmt, ele tem que ser idntico ao
module-name especificado na module-stmt
C1105 (R1104) Uma specification-part de um mdulo no pode conter uma format-stmt
C1106 (R1104) Um objeto automtico no pode aparecer em uma specification-part de um mdulo
C1107 (R1104) Se um objeto do tipo para o qual component-initialization especificada (R444)
aparece em uma specification-part de um mdulo e no tem o atributo ALLOCATABLE ou POINTER, o
objeto tem que ter o atributo SAVE
R1109 use-stmt is USE[[,module-nature]::]module-name[,rename-list]
or USE[[,module-nature]::]module-name,
ONLY:[only-list]
R1110 module-nature is INTRINSIC
or NON INTRINSIC
R1111 rename is local-name => use-name
or OPERATOR(local-defined-operator) =>
OPERATOR(use-defined-operator)
R1112 only is generic-spec
or only-use-name
or rename
R1113 only-use-name is use-name
C1108 (R1109) Se module-nature INTRINSIC, module-name tem que ser o nome de um mdulo
intrnseco
C1109 (R1109) Se module-nature NON INTRINSIC, module-name tem que ser o nome de um mdulo no
intrnseco
C1110 (R1109) A unidade de escopo no pode acessar um mdulo intrnseco e mdulo no intrnseco de
mesmo nome
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 489
C1111 (R1111) OPERATOR(use-defined-operator) no pode identificar uma generic-binding
C1112 (R1112) A generic-spec no pode identificar uma generic-binding
C1113 (R1112) Cada generic-spec tem que ser uma entidade pblica no mdulo
C1114 (R1113) Cada use-name tem que ser o nome de uma entidade pblica no mdulo
R1114 local-defined-operator is defined-unary-op
or defined-binary-op
R1115 use-defined-operator is defined-unary-op
or defined-binary-op
C1115 (R1115) Cada use-defined-operator tem que ser uma entidade pblica no mdulo
R1116 block-data is block-data-stmt
[specification-part]
end-block-data-stmt
R1117 block-data-stmt is BLOCK DATA[block-data-name]
R1118 end-block-data-stmt is END[BLOCK DATA[block-data-name]]
C1116 (R1116) Um block-data-name tem que ser includo na end-block-data-stmt somente se foi ele
provido em uma block-data-stmt e, se includo, tem que ser idntico ao block-data-name na block-
data-stmt
C1117 (R1116) A block-data specification-part tem que conter somente definies de derived-type
e instrues de declaraes de tipo ASYNCHRONOUS, BIND, COMMON, DATA, DIMENSION, EQUIVALENCE,
IMPLICIT, INTRINSIC, PARAMETER, POINTER, SAVE, TARGET, USE e VOLATILE
C1118 (R1116) Uma instruo de declarao de tipo em uma block-data specification-part no pode
conter especificador de atributo ALLOCATABLE, EXTERNAL ou BIND
Seo 12:
Section 12:
R1201 interface-block is interface-stmt
[interface-specification]...
end-interface-stmt
R1202 interface-specification is interface-body
or procedure-stmt
R1203 nterface-stmt is INTERFACE[generic-spec]
or ABSTRACT INTERFACE
R1204 end-interface-stmt is END INTERFACE[generic-spec]
R1205 interface-body is function-stmt
[specification-part]
end-function-stmt
or subroutine-stmt
[specification-part]
end-subroutine-stmt
R1206 procedure-stmt is [MODULE]PROCEDURE procedure-name-list
R1207 generic-spec is generic-name
or OPERATOR(defined-operator)
or ASSIGNMENT(=)
or dtio-generic-spec
R1208 dtio-generic-spec is READ(FORMATTED)
or READ(UNFORMATTED)
or WRITE(FORMATTED)
or WRITE(UNFORMATTED
R1209 import-stmt is IMPORT[[::]import-name-list]
C1201 (R1201) Um interface-block em um subprograma no pode conter uma interface-body para um
procedimento definido por este subprograma
C1202 (R1201) A generic-spec tem que ser includa na end-interface-stmt somente se ela provida na
interface-stmt. Se a end-interface-stmt inclu generic-name, a interface-stmt tem que especificar
o mesmo generic-name. Se a end-interface-stmt inclu ASSIGNMENT(=), a interface-stmt especifica
ASSIGNMENT(=). Se a end-interface-stmt inclu dtio-generic-spec, a interface-stmt tem que
especificar o mesmo dtio-generic-spec. Se a end-interface-stmt inclu OPERATOR(defined-operator), a
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 490
interface-stmt especicifc o mesmo defined-operator. Se um defined-operator .LT., .LE.,
.GT., .GE., .EQ. Ou .NE., o outro permitido ser o operador correspondente <, <=, >, >=, == ou /=
C1203 (R1203) Se a interface-stmt ABSTRACT INTERFACE, ento o function-name na function-
stmt ou o subroutine-name na subroutine-stmt no pode ser o mesmo que a palavra-chave que
especifica um tipo intrnseco
C1204 (R1202) Uma procedure-stmt permitida somente em um bloco de interface que tem uma generic-
spec
C1205 (R1205) Um interface-body de um procedimento puro tem que especificar as intenes de todos os
argumentos mudos exceto ponteiro, retorno alternativo e argumentos procedimento
C1206 (R1205) Um interface-body no pode conter uma entry-stmt, data-stmt, format-stmt, ou
stmt-function-stmt
C1207 (R1206) O procedure-name tem que ter uma interface explcita e tem que referi-se a um ponteiro de
procedimento acessvel, procedimento externo, procedimento mudo ou procedimento mdulo
C1208 (R1206) Se MODULE aparece em uma procedure-stmt, cada procedure-name nesta instruo tem
que ser acessvel no escopo atual como um procedimento mdulo
C1209 (R1206) Um procedure-name no pode especificar um procedimento que foi especificado previamente
em qualquer procedure-stmt em qualquer interface acessvel com o mesmo identificador genrico
C1210 (R1209) A instruo IMPORT permitida em um interface-body
C1211 (R1209) Cada import-name tem que ser o mesmo de uma entidade em uma unidade de escopo
hospedeira
R1210 external-stmt is EXTERNAL[::]external-name-list
R1211 procedure-declaration-stmt is PROCEDURE([proc-interface])
or [[,proc-attr-spec]...::]proc-decl-list
R1212 proc-interface is interface-name
or declaration-type-spec
R1213 proc-attr-spec is access-spec
or proc-language-binding-spec
or INTENT(intent-spec)
or OPTIONAL
or POINTER
or SAVE
R1214 proc-decl is procedure-entity-name[ => null-init]
R1215 interface-name is name
C1212 (R1215) O nome tem que ser o nome de uma interface abstrata ou de um procedimento que tem uma
interface explcita. Se o nome declarado por uma procedure-declaration-stmt ele tem que ser
previamente declarado. Se o nome representa um procedimento intrnseco ele tem que ser um dos listados em
13.6 e no marcado com um ponto lista ()
C1213 (R1215) O nome no pode ser o nome de uma palavra-chave que especifica um tipo intrnseco
C1214 Se a entidade procedimento tem o atributo INTENT ou atributo SAVE, ela tambm tem o atributo
POINTER
C1215 (R1211) Se uma proc-interface descreve um procedimento elementar, cada procedure-entity-
name tem que especificar um procedimento externo
C1216 (R1214) Se => aparece em proc-decl, a entidade procedimento tem que ter o atributo POINTER
C1217 (R1211) Se proc-language-binding-spec com um NAME= especificado, a proc-decl-list
tem que conter exatamente uma proc-decl, que nunca tem o atributo POINTER nem um procedimento mudo
C1218 (R1211) Se proc-language-binding-spec especificado, a proc-interface tem que aparecer,
ela tem um interface-name e um interface-name tem que ser declarado com uma proc-language-
binding-spec
R1216 intrinsic-stmt is INTRINSIC[::]intrinsic-procedure-name-list
C1219 (R1216) Cada intrinsic-procedure-name tem que ser o nome de um procedimento intrnseco
R1217 function-reference is procedure-designator([actual-arg-spec-list])
C1220 (R1217) O procedure-designator tem que designar uma funo
C1221 (R1217) O actual-arg-spec-list no pode conter uma alt-return-spec
R1218 call-stmt is CALL procedure-designator[([actual-arg-spec-list])]
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 491
C1222 (R1217) O procedure-designator tem que designar uma sub-rotina
R1219 procedure-designator is procedure-name
or proc-component-ref
or data-ref % binding-name
C1223 (R1219) Um procedure-name tem que ser o nome de um procedimento ou ponteiro de procedimento
C1224 (R1219) O binding-name tem que ser um nome ligado (4.5.4) de um tipo declarado na data-ref
R1220 actual-arg-spec is [keyword=]actual-arg
R1221 actual-arg is expr
or variable
or procedure-name
or proc-component-ref
or alt-return-spec
R1222 alt-return-spec is * label
C1225 (R1220) O keyword = no pode aparecer se a interface do procedimento implcita na unidade de
escopo
C1226 (R1220) O keyword = no pode ser omitido em uma actual-arg-spec a menos que ele seja omitido
em cada actual-arg-spec precedente na lista de argumentos
C1227 (R1220) cada palavra-chave tem que ser o nome de um argumento mudo na interface explcita do
procedimento
C1228 (R1221) Um procedimento elementar no intrnseco no pode ser usada como um argumento real
C1229 (R1221) O procedure-name tem que ser o nome de um procedimento externo, um procedimento
mudo, um procedimento mdulo, um ponteiro de procedimento ou uma funo intrnseca especfica que est
listada em 13.6 e no marcada com um ponto lista ()
C1230 (R1221) Em uma referncia a um procedimento puro, o procedure-name actual-arg tem que ser o
nome de um procedimento puro (12.6)
C1231 (R1222) O rtulo em uma alt-return-spec tem que ser o rtulo de instruo de uma instruo alvo de desvio
que aparece na mesma unidade de escopo que a call-stmt
C1232 (R1221) Se um argumento real uma seo de matriz ou uma matriz de forma assumida e o argumento
mudo correspondente tem o atributo VOLATILE ou ASYNCHRONOUS, o argumento mudo tem que ser uma matriz
de forma assumida
C1233 (R1221) Se um argumento real uma matriz ponteiro e o argumento mudo correspondente tem o
atributo VOLATILE ou ASYNCHRONOUS, o argumento mudo tem que ser uma matriz de forma assumida ou uma
matriz ponteiro
R1223 function-subprogram is function-stmt
[specification-part]
[execution-part]
[internal-subprogram-part]
end-function-stmt
R1224 function-stmt is [prefix]FUNCTION function-name
([dummy-arg-name-list])[suffix]
C1234 (R1224) Se RESULT especificado, result-name no pode ser o mesmo que function-name e no
pode ser o mesmo que entry-name em qualquer instruo ENTRY no subprograma
C1235 (R1224) Se RESULT especificado, o function-name no pode aparecer em qualquer instruo de
especificao na unidade de escopo do subprograma funo
R1225 proc-language-binding-spec is language-binding-spec
C1236 (R1225) A proc-language-binding-spec com um especificador NAME= no pode ser especificada
na function-stmt ou subroutine-stmt de um corpo de interface de uma interface abstrata ou um
procedimento mudo
C1237 (R1225) A proc-language-binding-spec no pode ser especificada para um procedimento interno
C1238 (R1225) Se proc-language-binding-spec especificada para um procedimento, cada um dos
argumentos mudos s procedimento tem que ser uma varivel interopervel no opcional (15.2.4, 15.2.5) ou um
procedimento interopervel (15.2.6). Se proc-language-binding-spec especificada para uma funo , o
resultado de funo tem que ser uma varivel interopervel
R1226 dummy-arg-name is name
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 492
C1239 (R1226) O dummy-arg-name tem que ser o nome de um argumento mudo
R1227 prefix is prefix-spec [prefix-spec]...
R1228 prefix-spec is declaration-type-spec
or RECURSIVE
or PURE
or ELEMENTAL
C1240 (R1227) Um prefixo tem que conter no mximo um do prefix-spec
C1241 (R1227) Um prefixo no pode especificar ELEMENTAL e RECURSIVE ao mesmo tempo
C1242 (R1227) Um prefixo no pode especificar ELEMENTAL se proc-language-binding-spec aparece
em uma function-stmt ou subroutine-stmt
R1229 suffix is proc-language-binding-spec [RESULT(result-name)]
or RESULT(result-name) [proc-language-binding-spec]
R1230 end-function-stmt is END [FUNCTION[function-name]]
C1243 (R1230) FUNCTION tem que aparecer em uma end-function-stmt de uma funo interna ou mdulo
C1244 (R1223) Um subprograma funo interno no pode conter uma instruo ENTRY
C1245 (R1223) Um subprograma funo interno no pode conter uma internal-subprogram-part
C1246 (R1230) Se um function-name aparece em uma end-function-stmt, Ele tem que ser idntico ao
function-name especificado na function-stmt
R1231 subroutine-subprogram is subroutine-stmt
[specification-part]
[execution-part]
[internal-subprogram-part]
end-subroutine-stmt
R1232 subroutine-stmt is [prefix]SUBROUTINE subroutine-name
[([dummy-arg-list])[proc-language-binding-spec]]
C1247 (R1232) O prefixo de uma subroutine-stmt no pode conter uma declaration-type-spec
R1233 dummy-arg is dummy-arg-name
or *
R1234 end-subroutine-stmt is END [SUBROUTINE[subroutine-name]]
C1248 (R1234) SUBROUTINE tem que aparecer em uma end-subroutine-stmt de uma sub-rotina interna
ou mdulo
C1249 (R1231) Um subprograma sub-rotina interno no pode conter uma instruo ENTRY
C1250 (R1231) Um subprograma sub-rotina interno no pode conter uma internal-subprogram-part
C1251 (R1234) Se o subroutine-name aparece em uma end-subroutine-stmt, ele tem que ser idntico
ao subroutine-name especificado na subroutine-stmt
R1235 entry-stmt is ENTRY entry-name[([dummy-arg-list])[suffix]]
C1252 (R1235) Se RESULT especificado, o entry-name no pode aparecer em qualquer especificao ou
instruo type-declaration no escopo da unidade de um programa funo
C1253 (R1235) Uma entry-stmt s pode aparecer em um external-subprogram ou module-
subprogram. Uma entry-stmt no pode aparecer dentro de uma executable-construct
C1254 (R1235) RESULT s pode aparecer se a entry-stmt um subprograma funo
C1255 (R1235) Dentro de um subprograma contendo a entry-stmt, o entry-name no pode aparecer como
um argumento mudo em uma instruo FUNCTION ou SUBROUTINE ou outra instruo ENTRY nem aparecer
em uma instruo EXTERNAL, INTRINSIC ou PROCEDURE
C1256 (R1235) Um dummy-arg no pode ser um indicador de retorno alternativo se a instruo ENTRY est em um
subprograma funo
C1257 (R1235) Se RESULT especificado, result-name no pode ser o mesmo que o function-name na
instruo FUNCTION e no pode ser o mesmo que o entry-name em qualquer instruo ENTRY no
subprograma
R1236 return-stmt is RETURN[scalar-int-expr ]
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 493
C1258 (R1236) A return-stmt tem que ser uma unidade de escopo de um subprograma funo ou sub-rotina
C1259 (R1236) A scalar-int-expr permitida somente no escopo da unidade de um subprograma sub-rotina
R1237 contains-stmt is CONTAINS
R1238 stmt-function-stmt is function-name([dummy-arg-name-list])=scalar-expr
C1260 (R1238) As primarias de uma scalar-expr tem que ser constantes (literal e com nome), referencias para variveis,
referncias para funes e procedimentos mudos funo e operaes intrnsecas. Se scalar-expr contm uma referncia a
uma funo ou procedimento mudo funo, a referncia no pode requerer uma interface explcita, a funo no pode
requerer uma interface explcita a menos que ela seja intrnseca, a funo no pode ser uma transformacional intrnseca e o
resultado tem que ser escalar. Se um argumento para a funo ou procedimento mudo funo uma matriz, ele tem que ser o
nome de uma matriz. Se a referncia para uma funo instruo aparece em scalar-expr, sua definio no pode ter sido
fornecida antes na unidade de escopo e no pode ser o nome de uma funo instruo que esteja sendo definida
C1261 (R1238) Constantes com nome em uma scalar-expr tem que ter sido declaradas antes na unidade de escopo ou
feita acessvel por associao de uso ou hospedagem. Se elementos de matriz aparece na scalar-expr, a matriz tem que ter
sido declarada como uma matriz antes na unidade de escopo ou feita acessvel por associao de uso ou hospedagem
C1262 (R1238) Se um dummy-arg-name, varivel, funo, referncia ou referncia de funo muda tem seu tipo definido
pela regra de tipo implcita, sua apario em qualquer instruo de declarao de tipo subsequente tem que confirmar este tipo
implcito e os valores de quaisquer parmetros de tipo implcitos
C1263 (R1238) O function-name e cada dummy-arg-name tem que ser especificado, explicitamente ou implicitamente,
como escalar
C1264 (R1238) Um dado dummy-arg-name no pode aparecer mais de uma vez em qualquer dummy-arg-name-list
C1265 (R1238) Cada referncia de varivel em uma scalar-expr pode ser uma referncia para um argumento mudo da
funo instruo ou uma referncia para a varivel acessvel na mesma unidade de escopo que a instruo funo instruo
C1266 A specification-part de um subprograma puro tem que especificar que todos os objetos de dados
mudos no ponteiros tem INTENT(IN)
C1267 A specification-part de um subprograma sub-rotina puro tem que especificar que as intenes de
todos os seus objetos de dados mudos no ponteiros
C1268 Uma varivel local declarada na specification-part ou internal-subprogram-part de um
subprograma puro no pode ter o atributo SAVE
C1269 A specification-part de um subprograma puro tem que especificar que todos os seus procedimentos
mudos so puros
C1270 Se um procedimento que no um procedimento intrnseco nem uma funo instruo usada em um
contexto que requer que ele seja puro, ento sua interface tem que ser explcita no escopo que ele usa. A interface
tem que especificar que o procedimento puro
C1271 Todos os subprogramas internos em um subprograma puro tm que ser puros
C1272 Em um subprograma puro qualquer designador com um objeto base que est em um comum ou acessado
por associao de uso ou hospedagem, um argumento mudo de uma funo pura, um argumento mudo com
INTENT (IN) de uma sub-rotina pura ou um objeto que est associado por armazenamento com qualquer destas
variveis, no pode ser usado nos seguintes contextos:
1. em um contexto de definio de varivel (16.5.7)
2. como um data-target em uma pointer-assignment-stmt
3. como a expr correspondendo a um componente com o atributo POINTER em um structure-
constructor
4. como a expr de uma instruo de atribuio intrnseca na qual a varivel do tipo derivado se o tipo
derivado tem um componente ponteiro em qualquer nvel de seleo de componente
5. como um argumento real associado com um argumento mudo com INTENT(OUT) ou INTENT(INOUT) ou
com o atributo POINTER
C1273 Qualquer procedimento referenciado em um subprograma puro, incluindo aquele referenciado via uma
operao definida, atribuio ou finalizao, tem que ser puro
C1274 Um procedimento puro no pode conter uma print-stmt, open-stmt, close-stmt, backspace-
stmt, endfile-stmt, rewind-stmt, flush-stmt, wait-stmt ou inquire-stmt
C1275 Um subprograma puro no pode conter uma read-stmt ou write-stmt cuja io-unit um file-
unit-number ou *
C1276 Um subprograma puro no pode conter uma stop-stmt
C1277 Todos os argumentos de um procedimento elementar tem que ser objetos de dados mudo escalar e no ter
o atributo POINTER ou ALLOCATABLE
C1278 A varivel resultado de uma funo elementar tem que ser escalar e no pode ter o o atributo POINTER ou
ALLOCATABLE
C1279 No escopo da unidade de um subprograma elementar, um designador de objeto com um argumento mudo
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 494
como objeto base no pode aparecer em uma specification-expr exceto como o argumento de uma das
funes intrnsecas BIT_SIZE, KIND, LEN ou funes inquisitrias numricas (13.5.6)
Seo 13:
Section 13:
Seo 14:
Section 14:
Seo 15:
Section 15:
C1501 (R429) O tipo derivado com o atributo BIND no pode ser um tipo SEQUENCE
C1502 (R429) O tipo derivado com o atributo BIND no pode ter parmetros de tipo
C1503 (R429) O tipo derivado com o atributo BIND no pode ter o atributo EXTENDS
C1504 (R429) O tipo derivado com o atributo BIND no pode ter uma type-bound-procedure-part
C1505 (R429) Cada componente de um tipo derivado com o atributo BIND tem que ser no ponteiro,
componente de dado no alocvel com tipo interopervel e parmetros de tipo
Seo 16:
Section 16:
R472 ac-do-variable R471, C493, C497
R470 ac-implied-do R469, C497
R471 ac-implied-do-control R470
R466 ac-spec R465
R469 ac-value R466, R470, C494, C495, C496
R519 access-id R518, C548
R508 access-spec R431, R441, R446, R452, R453, R503, C539, R518, R1213
R518 access-stmt R212, C548
R214 action-stmt R213, R807, C802
R836 action-term-do-construct R835
R1221 actual-arg R1220, C1230
R1220 ctual-arg-spec C489, R1217, C1221, R1218, C1226
R709 add-op R310, R706
R705 add-operand R705, R706
R624 alloc-opt R623, C630
R520 allocatable-stmt R212
R629 allocate-object R628, C622, C623, C624, C625, C626, C627, C628, C629, C631,
C632, C633, R635, C635
R630 allocate-shape-spec R628, C628, C629
R623 allocate-stmt R214
R628 allocation R623, C631
R302 alphanumeric-character R301, R304
R122 2 alt-return-spec C1221, R1221, C1231
R719 and-op R310, R715
R714 and-operand R715
------- arg-name R446, C451, R453, C467
R847 arithmetic-if-stmt R214, C824, C826, C832
R465 array-constructor C494, C495, C496, R701
R616 array-element R528, C558, C561, R556, R603, R610
------ array-name R535
R617 array-section R603
R510 array-spec R503, R504, C510, C511, R535, R546
R734 assignment-stmt R214, C715, R747, R757
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 495
R816 associate-construct R213, C810
------ associate-construct-name R213, C810
------ associate-name R817, R820, C810
R817 associate-stmt R818, C808, C809, R822, C811, C812
R818 association R816, C809, C810
R514 assumed-shape-spec R817
R516 assumed-size-spec R510
R521 asynchronous-stmt R510
R503 attr-spec R212
R923 backspace-stmt R501, C507
R412 binary-constant R214, C1274
R523 bind-entity R522, C550, C551, C552
R522 bind-stmt R212, C550
R453 binding-attr R451, C465, C468, C469
------ binding-name R451, R452, C460, R1219, C1224
R449 binding-private-stmt R448, C455
R1016 blank-interp-edit-desc R1011
R801 block R802, R808, R816, R821, R832
R1116 block-data R202, C1117, C1118
------ block-data-name R1117, R1118, C1116
R1117 block-data-stmt R1116, C1116
R826 block-do-construct R825, C821
R738 bounds-remapping R735, C719, C720
R737 bounds-spec R735, C718
R411 boz-literal-constant R306, C410
R1218 call-stmt R214, C1231
R808 case-construct R213, C803, C805, C807
------ case-construct-name R809, R810, R811, C803
R812 case-expr R809, C805, C806, C807
R813 case-selector R810
R810 case-stmt R808, C803
R815 case-value R814, C805
R814 case-value-range R813, C806, C807
R309 char-constant C303C706, R731, R812 , R850, C834
R725 char-expr C706, R731, R812
R731 char-initialization-expr R509, C540, C712, R815, R913, C924
R426 char-length R425, R442, C444, R504, C504, C520
R427 char-literal-constant R306, R1005, C1008, R1019, C1012
R424 char-selector R403
R1019 char-string-edit-desc R1003
R606 char-variable C605, R903, C901, C902
R909 close-spec R908, C906, C907
R908 close-stmt R214, C1274
------- common-block-name R523, R544, R557
R558 common-block-object R557, C587, C588, C589
R557 common-stmt R212
R421 complex-literal-constant R306
R443 component-array-spec R441, R442, C440, C441
R441 component-attr-spec R440, C436, C447
R459 component-data-source R458
R442 component-decl R440, C446
R439 component-def-stmt R438, C436, C438, C439, C445
R444 component-initialization R442, C446, C447, C1107
------- component-name R442
R438 component-part R429
R458 component-spec R457, C483, C484, C485, C486, C488, C489
R846 computed-goto-stmt R214, C831
R711 concat-op R310, R710
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 496
R905 connect-spec R904, C903, C904
R305 constant R308, R309, R532, R610, R701
R534 constant-subobject R532, R533, C566
R1237 contains-stmt R210, R448, R1107
R848 continue-stmt R214, R833, C824
R1011 control-edit-desc R1003
R843 cycle-stmt R214, C824, C826, C828
R1008 d R1005, C1007
R440 data-component-def-stmt R439
R1005 data-edit-desc R1003
R528 data-i-do-object R527, C554, C555, C561
R529 data-i-do-variable R527, C556
R527 data-implied-do R526, R528, C557, C561
------ data-pointer-component-name R736, C722
R736 data-pointer-object R735, C716, C717, C718, C719, C720
R612 data-ref C611, R614, R616, R617, R1219, C1224
R524 data-stmt R209, R212, C1206
R532 data-stmt-constant C410, R530, C564
R526 data-stmt-object R525, C553, C554, C555
R531 data-stmt-repeat R530, C562
R525 data-stmt-set R524
R530 data-stmt-value R525
R739 data-target R459, C490, C491, C537, R735, C716, C717, C720
R636 dealloc-opt R635, C636
R635 deallocate-stmt R214
R1018 decimal-edit-desc R1011
R207 declaration-construct R204
R502 declaration-type-spec C419, R440, C438, C439, R501, C501, C502, R550, R1212,
R1228, C1247
R726 default-char-expr C707, R905, R906, R909, R913, R914
R607 default-char-variable C606, R626, R907, R930
R605 default-logical-variable C604,R443, C440, C510, R510, R520, R541 R930
R515 deferred-shape-spec R311, R722, C704, R1114, R1115
R723 defined-binary-op C462, R1207, C1202
R311 defined-operator R311, R702, C703, R1114, R1115
R703 defined-unary-op R207, C430, C434, C435
R429 derived-type-def R401, C401, R457, C482, C489, R502, C502, C503, R920,
R455 derived-type-spec C936, C937
R430 derived-type-stmt R429, C425, C431, C434, C435
R603 designator R534, R601, C601, R615, C616, R701, C702
------- digit R302, R313, R409, R412, C408, R413, C409, R415, R850
R409 digit-string R406, R407, R408, R417, R418
R535 dimension-stmt R212
R832 do-block R826
R837 do-body R836, R839, R841
R825 do-construct R213, C828, C829
------- do-construct-name R828, R829, R834, C821, R843, C828, R844, C829
R827 do-stmt R826, C821, C822, C823
R838 do-term-action-stmt R836, C824, C825
R842 do-term-shared-stmt R841, C826, C827
R831 do-variable R830, C820, R919, C933
R1208 dtio-generic-spec C464, R1207, C1202
R1233 dummy-arg R1232, R1235, C1256
R1226 dummy-arg-name R536, R537, R547, R1224, C1239, R1233, R1238, C1262,
C1263, C1264
R1009 e R1005, C1005, C1007
R804 else-if-stmt R802, C801
R805 else-stmt R802, C801
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 497
R750 elsewhere-stmt R744, C730
R820 end-associate-stmt R816, C810
R1118 end-block-data-stmt R1116, C1116
R833 end-do R826, C821, C822, C823
R834 end-do-stmt R833, C821, C822
R464 end-enum-stmt R460
R758 end-forall-stmt R752, C732
R1230 end-function-stmt R214, C201, C802, C824, C826, R1205, R1223, C1243,
C1246
R806 end-if-stmt R802, C801
R1204 end-interface-stmt R1201, C1202
R1106 end-module-stmt R1104, C1104
R1103 end-program-stmt R214, C201, C802, C824, C826, R1101, C1102
R811 end-select-stmt R808, C803
R824 end-select-type-stmt R821, C819
R1234 end-subroutine-stmt R214, C201, C802, C824, C826, R1205, R1231, C1248,
C1251
R433 end-type-stmt R429
R751 end-where-stmt R744, C730
R924 endfile-stmt R214, C1274
R504 entity-decl R501, C504, C519, C523, C533
----- entity-name R523, C550, R542
------ entry-name C1234, R1235, C1252, C1255, C1257
R1235 entry-stmt R206, R207, R209, C1105, C1206, C1253, C1254, C1255
R460 enum-def R207
R461 enum-def-stmt R460
R463 enumerator R462, C492
R462 enumerator-def-stmt R460
R721 equiv-op R310, R717
R716 equiv-operand R716, R717
R556 equivalence-object R555, C576, C577, C578, C579, C580, C581, C582, C583,
C584, C585
R555 equivalence-set R554
R554 equivalence-stmt R212
R626 errmsg-variable R624, R636
R213 executable-construct R208, R209, C1253
R208 execution-part C201, R1101, C1101, R1223, R1231
R209 execution-part-construct R208, R801, R837
R844 exit-stmt R214, C824, C826, C829
R511 explicit-shape-spec R443, C441, C442, C511, R510, R516, R558
R420 exponent R417
R419 exponent-letter R417, C411
R722 expr R459, R469, R627, R701, R722, R724, R725, R726, R727,
R728, R730, R734, R739, C724, R742, C726, R819, R916,
R1221, R1238, C1260, C1261, C1265
R312 extended-intrinsic-op R311
------- external-name R1210
R1210 external-stmt R212
R203 external-subprogram R202, C1253
R906 file-name-expr R905, R930
R902 file-unit-number R901, R905, C904, R909, C907, C919, C925, R922, C939,
R923, R924, R925, R926, C942, R927, R928, C945, R930,
C949, C1275
R454 final-binding R450
------ final-subroutine-name R454, C473, C474
R928 flush-spec R927, C944, C945
R927 flush-stmt R214, C1274
R757 forall-assignment-stmt R756, R759
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 498
R756 forall-body-construct R752, C737, C738, C739
R752 forall-construct R213, R756, C737
------ forall-construct-name R753, R758, C732
R753 forall-construct-stmt R752, C732
R754 forall-header R753, R759
R759 forall-stmt R214, R756
R755 forall-triplet-spec R754, C736
R914 format R910, R912, R913, C916, C917, C920, C928, C929
R1003 format-item R1002, C1002, R1003
R1002 format-specification R1001
R1001 format-stmt R206, R207, R209, C1001, C1105, C1206
------- function-name R504, C521, C1203, R1224, C1234, C1235, R1230, C1246,
C1257, R1238, C1263
R1217 function-reference R507, C506, R701
R1224 function-stmt R1205, C1203, R1223, C1236, C1242, C1246
R1223function-subprogram R203, R211, R1108
$452 generic-binding R450, C459, C1111, C1112
----- generic-name C461, R1207, C1202
R1207 generic-spe c R452, C459, C461, C462, C463, C464, R519, R1112,
C1112, C1113, R1203, R1204, C1202, C1204
R845 goto-stmt R214, C824, C826, C830
R414 hex-constant R411
R415 hex-digit R414
R802 if-construct R213, C801
------ if-construct-name R803, R804, R805, R806, C801
R807 if-stmt R214, C802
R803 if-then-stmt R802, C801
R423 imag-part R421
R205 implicit-part R204
R206 implicit-part-stmt R205
R550 implicit-spec R549
R549 implicit-stmt R205, R206
------- import-name R1209, C1211
R1209 import-stmt R204
------ index-name R755, C735, C736, C737
R1209 import-stmt R204
-------- index-name R755, C735, C736, C737
R506 initialization R504, C522, C523, C524, C525
R730 initialization-expr R444, R506, R539, C711
R841 inner-shared-do-construct R840, C827
R915 input-item R910, C915, R918, C931, C932, C934
R930 inquire-spec R929, C947, C948, C949
R929 inquire-stmt R214, C1274
R308 int-constant C302, R531
------- int-constant-name R407, C405
R533 int-constant-subobject R531, C565
R727 int-expr R402, R471, R527, C557, R611, R618, R621, R622, R631,
R632, C708, R729, C710, R732, R812, R830, R846, R902,
R905, R913, R919, R1236, C1259
R732 int-initialization-expr R404, C404, R424, C414, R436, R463, C713, R815
R406 int-literal-constant R306, R405, R426, C415, R1004, R1006, R1007, R1008,
R1009, R1014
R608 int-variable R472, R529, C607, R625, R831, R905, R909, R913, R922,
R926, R928, R929, R930
R517 intent-spec R503, R536, R1213
R536 intent-stmt R212
R1201 interface-block R207, C1201
R1205 interface-body R1202, C1201, C1205, C1206, C1210
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 499
R1215 interface-name R451, C457, C470, R1212, C1218
R1202 interface-specification R1201
R1203 interface-stmt R1201, C1202, C1203
R903 internal-file-variable R901, C921
R211 internal-subprogram R210
R210 internal-subprogram-part R1101, R1223, C1245, R1231, C1250, C1268
R310 intrinsic-operator R312, C703, C704
------- intrinsic-procedure-name R1216, C1219
R1216 intrinsic-stmt R212
R403 intrinsic-type-spec R401, R502
R913 io-control-spec R910, R911, C909, C910, C916, C917, C918, C919, C927
R917 io-implied-do R915, R916
R919 io-implied-do-control R917
R918 io-implied-do-object R917, C934
R901 io-unit R913, C910, C917, C918, C919, C921, C925, C1275
R907 iomsg-variable R905, R909, R913, R922, R926, R928, R930
R1012 k R1011, C1009
R215 keyword R456, C479, C480, R458, C486, C487, R1220, C1225,
C1226, C1227
R1216 intrinsic-stmt R212
R403 intrinsic-type-spec R401, R502
R913 io-control-spec R910, R911, C909, C910, C916, C917, C918, C919, C927
R917 io-implied-do R915, R916
R919 io-implied-do-control R917
R918 io-implied-do-object R917, C934
R901 io-unit R913, C910, C917, C918, C919, C921, C925, C1275
R907 iomsg-variable R905, R909, R913, R922, R926, R928, R930
R1012 k R1011, C1009
R215 keyword R456, C479, C480, R458, C486, C487, R1220, C1225,
C1226, C1227
R407 kind-param R406, C406, C407, R417, C411, C412, C415, R427, C422,
R428, C423
R404 kind-selector R403, R435
R313 label C304, R828, C823, R845, C830, R846, C831, R847, C832,
R905, C905, R909, C908, R913, C913, R914, C930, R922,
C940, R926, C943, R928, C946, R930, R1222, C1231
R828 label-do-stmt R827, C823, R836, C825, R839, R841, C827
R509 language-binding-spec R503, C531, C532, C533, R522, C551, R1225
R467 left-square-bracket R465
R425 length-selector R424, C419, C420
------- letter R302, R304, R551, R703, R723
R551 letter-spec R550
R702 level-1-expr R704
R706 level-2-expr R706, R710
R710 level-3-expr R710, R712
R712 level-4-expr R714
R717 level-5-expr R717, R722
R306 literal-constant R305
R1114 local-defined-operator R1111
------- local-name R1111
R724 logical-expr C705, R733, R748, R803, R804, R807, R812, R830
R733 logical-initialization-expr C714, R815
R428 logical-literal-constant R306, C703, C704
R604 logical-variable C603
R830 loop-control R828, R829
R512 lower-bound R511, R514, R516
R631 lower-bound-expr R630, R737, R738
R1007 m R1005, C1007
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 500
R1101 main-program R202, C1101
R748 mask-expr R743, R745, R749, R754, C733, C734
R749 masked-elsewhere-stmt R744, C730
R1104 module R202
------ module-name R1105, R1106, C1104, R1109, C1108, C1109
R1110 module-nature R1109, C1108, C1109
R1105 module-stmt R1104, C1104
R1108 module-subprogram R1107, C1253
R1107 module-subprogram-part R1104
R708 mult-op R310, R705
R704 mult-operand R704, R705
R1014 n R1013, C1010, C1011
R304 name R102, R215, C301, R307, R505, R545, R602, R1215,
C1212, C1213, R1226
R307 named-constant R305, R422, R423, R463, R539
R539 named-constant-def R538
------- namelist-group-name R552, C573, C575, R913, C914, C915, C916, C918, C920,
C928, C929
R553 namelist-group-object R552, C574, C575
R552 namelist-stmt R212
R835 nonblock-do-construct R825
R829 nonlabel-do-stmt R827, C822
R718 not-op R310, R714
R507 null-init R444, R506, R532, R1214
R633 nullify-stmt R214
R728 numeric-expr C709, R847, C833
R505 object-name R504, C505, C511, C524, R520, R521, R541, R544, R546,
R548, R603
R413 octal-constant R411
R1112 only R1109
R1113 only-use-name R1112
R904 open-stmt R214, C1274
R537 optional-stmt R212
R720 or-op R310, R716
R715 or-operand R715, R716
R839 outer-shared-do-construct R835, R840, C827
R916 output-item R911, R912, C915, R918, C934, C935, R929
R538 parameter-stmt R206, R207
R610 parent-string R609, C608
-------- parent-type-name R431, C426
------- part-name R613, C609, C610, C611, C612, C613, C614, C615, C619
R613 part-ref C555, C560, C577, R612, C614, C615, C617, C618
R735 pointer-assignment-stmt R214, C537, R757
R541 pointer-decl R540
R634 pointer-object R633, C634
R540 pointer-stmt R212
R1013 position-edit-desc R1011
R926 position-spec R923, R924, R925, C941, C942
R707 power-op R310, R704
R1227 prefix R1224, C1240, C1241, C1242, R1232, C1247
R1228 prefix-spec R1227, C1240
-------- primaries C1260
R701 primary R702
R912 print-stmt R214, C1274
R447 private-components-stmt R432, C454
R432 private-or-sequence R429, C430
R1213 proc-attr-spec R1211
R450 proc-binding-stmt R448
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 501
R446 proc-component-attr-spec R445, C448, C449, C452
R445 proc-component-def-stmt R439, C448
R741 proc-component-ref R740, R742, R1219, R1221
R1214 proc-decl R445, R1211, C1216, C1217
-------- proc-entity-name R541, C568
R1212 proc-interface R445, R1211, C1215, C1218
R1225 proc-language-binding-spec C530, R1213, C1217, C1218, C1236, C1237, C1238, C1242,
R1229, R1232
R545 proc-pointer-name R544, C569, R558, C587, C590, R634, R740
R740 proc-pointer-object R735
R742 proc-target R459, C490, C537, R735, C728
------- procedure-component-name R741, C725
R1211 procedure-declaration-stmt R207, C568, C1212
R1219 procedure-designator R1217, C1220, R1218, C1222
-------- procedure-entity-name R1214, C1215
-------- procedure-name R451, C456, C457, C458, R742, C727, R1206, C1207,
C1208, C1209, R1219, C1223, R1221, C1229, C1230
R1206 procedure-stmt R1202, C1204, C1208, C1209
-------- program-name R1102, R1103, C1102
R1102 program-stmt R1101, C1102
R202 program-unit R201
R542 protected-stmt R212
R1004 r R1003, C1003, C1004, R1011
R910 read-stmt R214, C911, C1275
R417 real-literal-constant R306, R416
R422 real-part R421
R713 rel-op R310, R712
R1111 rename R1109, R1112
------ rep-char R427
------ result-name C1234, R1229, C1257
R1236 return-stmt R214, C824, C826, C1258
R925 rewind-stmt R214, C1274
R468 right-square-bracket R465
R1017 round-edit-desc R1011
R543 save-stmt R212
R544 saved-entity R543
R103 scalar-xyz C101
R619 section-subscript R613, C613, C618
R809 select-case-stmt R808, C803
------- select-construct-name R822, R823, R824, C819
R821 select-type-construct R213, C817, C818, C819
R822 select-type-stmt R821, C813, C819
R819 selector R818, C808, R822, C811, C812, C813, C816
R434 sequence-stmt R432
R840 shared-term-do-construct R839
R410 sign R405, R408, R416
R1015 sign-edit-desc R1011
R408 signed-digit-string R420
R405 signed-int-literal-constant R422, R423, R532, R1010, R1012
R416 signed-real-literal-constant R422, R423, R532
R418 significand R417
R627 source-expr R624, C631, C632, C633
------- special-character R301
R451 specific-binding R450
R729 specification-expr C501, C504, R512, R513, C1279
R204 specification-part C459, C539, C548, R1101, C1103, R1104, C1105, C1106,
C1107, R1116, C1117, C1118, R1205, R1223, R1231,
C1266, C1267, C1268, C1269
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 502
R212 specification-stmt R207
R625 stat-variable R624, R636
R1238 stmt-function-stmt R207, C1105, C1206
R850 stop-code R849
R849 stop-stmt R214, C824, C826, C1276
R621 stride R620, R755, C736
R614 structure-component R528, C559, C560, C561, R603, R610, R629, R634
R457 structure-constructor R532, C564, R701
------- subroutine-name C1203, R1232, R1234, C1251
R1232 subroutine-stmt R1205, C1203, C1236, C1242, R1231, C1247, C1251
R1231 subroutine-subprogram R203, R211, R1108
R618 subscript C560, C617, R619, R620, R755, C736
R620 subscript-triplet R619, C621
R609 substring R556, C586, R603
R611 substring-range R609, R617, C619
R1229 suffix R1224, R1235
R546 target-stmt R212
R431 type-attr-spec R430, C425
R448 type-bound-procedure-part R429, C433, C1504
R501 type-declaration-stmt R207, C419, C420, C507
R823 type-guard-stmt R821, C817, C818, C819
------- type-name R430, C424, R433, C431, C464, R455, C476
R437 type-param-attr-spec R435
R436 type-param-decl R435
R435 type-param-def-stmt R429, C434, C435
R615 type-param-inquiry R701
------ type-param-name R430, R436, C434, C435, R615, C616, R701, C701
R456 type-param-spec R455, C477, C478, C479, C481
R402 type-param-value C402, C403, R424, R425, R426, C416, C417, C418, C445,
R456, C481, C501, C504, C626
R401 type-spec R466, C494, C495, C496, R623, C623, C624, C625, C626,
C627, C631, R823, C814, C815, C816
R3030 underscore R302
R513 upper-bound R511
R632 upper-bound-expr R630, R738
R1115 use-defined-operator R1111, C1111, C1115
------- use-name R519, C549, R1111, R1113, C1114
R1109 use-stmt R204
R1010 v R1005, C1007
R547 value-stmt R212
R601 variable R526, C553, C555, R604, R605, R606, R607, R608, R734,
C715, R736, C722, R739, C723, R741, C725, R819, C808,
C811, C812, R915, R1221
R602 variable-name R553, R556, R558, C587, C590, C602, R610, R629, R634,
R736, C721
R622 vector-subscript R619, C620
R548 volatile-stmt R212
R1006 w R1005, C1006, C1007
R922 wait-spec R921, C938, C939
R921 wait-stmt R214, C1274
R747 where-assignment-stmt R743, R746, C729
R746 where-body-construct R744, C731
R744 where-construct R213, R746, R756
------- where-construct-name R745, R749, R750, R751, C730
R745 where-construct-stmt R744, C730
R743 where-stmt R214, R746, R756
R911 write-stmt R214, C912, C1275
Traduo Livre do Rascunho Final do Fortran 2003 (com acrscimos e comentrios) Verso 0.9 503
Anexo E (Informativo)
Annex E (Informative)
ndice
Index
Neste ndice, entradas em itlico indica termos BFN, entradas em negrito indica palavras-chaves da
linguagem e nmeros de pginas em negrito indica primrio ou definio de texto.
Smbolos
Symbols
<, 134
<=, 134
>, 134
>=, 134
*, 29,34,35,40,75,80,88,133,195,196,227,238,
242,267,282
**, 133
+, 33
-, 133
.AND., 135
.EQ., 134
$$$$$$$$$$$$$$
FAZER: Completar

Вам также может понравиться