Академический Документы
Профессиональный Документы
Культура Документы
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