Академический Документы
Профессиональный Документы
Культура Документы
3.1
Como j a foi colocado anteriormente, e uma boa praxe de programa c ao iniciar o setor de declara c oes de vari aveis com a declara c ao IMPLICIT NONE a qual impede a possibilidade de haver nomes de vari aveis n ao denidos, os quais possuem o seu tipo impl cito, uma pr atica corriqueira em Fortran 77. A forma geral de uma declara c ao de tipo de vari aveis e: <tipo>[([KIND=]<par^ ametro de esp ecie>)][,<lista de atributos>] :: <lista de entidades>
onde <tipo> especica o tipo de vari avel, <par^ ametro de esp ecie> especica a esp ecie da vari avel, <lista de atributos> e um dos seguintes: PARAMETER PUBLIC PRIVATE POINTER TARGET ALLOCATABLE e cada entidade e <nome do objeto> [(lista de extens~ oes)] [*char-len] [= express~ ao de inicializa c~ ao] ou <nome da fun c~ ao> [*char-len] onde <nome do objeto> e o nome da vari avel, seguindo a regra de nomes v alidos denida no cap tulo 2. Os objetos restantes, em particular <par^ ametro de esp ecie> e <lista de atributos>, ser ao estudados ao longo do desenvolvimento desta apostila. 13 DIMENSION(<lista de extens~ oes>) INTENT(<inout>) OPTIONAL SAVE EXTERNAL INTRINSIC
14
3.2
Este tipo de vari avel armazena apenas a parte inteira de um n umero, exemplos de n umeros inteiros v alidos, tamb em denominados literais s ao: 123, 89312, 5. As declara c oes b asicas de nomes de vari aveis de tipo inteiro s ao: Fortran 77: INTEGER <lista de nomes de vari aveis> Fortran 90/95: INTEGER :: <lista de nomes de vari aveis>
O tipo de dados inteiro possui valores que pertencem ao conjunto dos n umeros inteiros. Programa exemplo: program i n t e i r o i m p l i c i t none integer : : x ! O v a l o r d i g i t a d o n a o pode c o n t e r ponto ( . ) Caso i s t o ! aco nte c a , v a i g e r a r um e r r o de e x e c u c a o no programa , ! a b o r t a n d o o mesmo . read * , x print * , Valor l i d o : , x end program i n t e i r o
3.3
O tipo de vari avel real e composto de quatro partes, assim dispostas: 1. uma parte inteira, com ou sem sinal, 2. um ponto decimal, 3. uma parte fracion aria e 4. um expoente, tamb em com ou sem sinal. Um ou ambos os itens 1 e 3 devem estar presentes. O item 4 ou est a ausente ou consiste na letra E seguida por um inteiro com ou sem sinal. Um ou ambos os itens 2 e 4 devem estar presentes. Exemplos de literais reais s ao: -10.6E-11 (representando 10, 6 1011 ) 1. -0.1 1E-1 (representando 101 ou 0,1) 3.141592653 Os literais reais s ao representa c oes do conjunto dos n umeros reais e o padr ao da linguagem n ao especica o intervalo de valores aceitos para o tipo real e nem o n umero de d gitos signicativos na parte fracion aria (item 3) que o processador suporta, uma vez que estes valores dependem do tipo de processador em uso. Valores comuns s ao: intervalo de n umeros entre 1038 a 10+38 , com uma precis ao de cerca de 7 (sete) d gitos decimais. As declara c oes b asicas do tipo real s ao: Fortran 77: REAL <lista de nomes de vari aveis> Fortran 90/95: REAL :: <lista de nomes de vari aveis>
Impresso: 12 de abril de 2010
Cap tulo 3. Tipos de Vari aveis Programa exemplo: program v a r r e a l i m p l i c i t none r e a l : : a , b= 1 0 . 5 e 2 ! V a r i avel b e i n i c i a l i z a d a a 1 0 . 5 e 2. print * , Valor de a : read * , a print * , Valor de a : , a print * , Valor de b : , b end program v a r r e a l
15
3.4
O Fortran, como uma linguagem destinada para c alculos cient cos ou em engenharia, tem a vantagem de possuir um terceiro tipo intr nseco: n umeros complexos. Este tipo e concebido como um par de literais, os quais s ao ou inteiros ou reais, separados por v rgula , e contidos entre par enteses ( e ). Os literais complexos representam n u meros contidos no conjunto dos n u meros complexos, isto e, n umeros do tipo e a parte real e y e a parte imagin aria do n umero complexo z . Assim, um z = x + iy, onde i = 1, x literal complexo deve ser escrito: (<parte real>,<parte imagin aria>) Exemplos de literais complexos s ao: (1.,3.2) (representando 1 + 3, 2i) (1.,.99E-2) (representando 1 + 0, 99 102 i) (1.0,-3.7) Uma outra grande vantagem do Fortran e que toda a algebra de n umeros complexos j a est a implementada a n vel de compilador. Assim, se for realizado o produto de dois n umeros complexos (x1,y1) e (x2,y2), o resultado ser a o literal complexo dado por (x1*x2 - y1*y2,x1*y2 + x2*y1). O mesmo acontecendo com as outras opera c oes alg ebricas. As declara c oes b asicas do tipo complexo s ao: Fortran 77: COMPLEX <lista de nomes de vari aveis> Fortran 90/95: COMPLEX :: Programa exemplo: program va r c o m pl ex a i m p l i c i t none complex : : a= (5 , 5) , b , c ! V a r i avel a e i n i c i a l i z a d a a (5 , 5). print * , Valor de b : ! O v a l o r de b d e v e s e r e n t r a d o como um l i t e r a l complexo . ! Exemplo : ( 1 . 5 , 2 . 5 ) read * , b c= a * b print * , O v a l o r de c : , c ! V e r i f i q u e o r e s u l t a d o no p a p e l . end program va r c o m pl ex a <lista de nomes de vari aveis>
3.5
O tipo padr ao consiste em um conjunto de caracteres contidos em um par de ap ostrofes ou aspas. Os caracteres n ao est ao restritos ao conjunto de caracteres padr ao denidos na se c ao 2.4. Qualquer caractere que possa ser representado pelo processador e aceito, exceto os caracteres de controle tais como o return. Os ap ostrofes ou aspas servem como delimitadores dos literais de caractere e n ao s ao considerados parte integrante do conjunto. Ao contr ario das normas usuais, um espa co em branco e diferente de dois ou mais. Exemplos de literais de caractere:
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de abril de 2010
16
3.6. Vari aveis do tipo LOGICAL bom Dia bomDia BRASIL Fortran 90 As declara c oes mais utilizadas para o tipo caractere s ao:
Fortran 77: character*<comprimento> <lista de nomes de vari aveis> ou character <nome 1>*<comp. 1>, [<nome 2>*<comp. 2>, ...] Fortran 90/95: character(len=<comprimento>) :: <lista de nomes de vari aveis>
onde <comprimento> indica a quantidade de caracteres contidos nas vari aveis. Todas as vari aveis denidas por esta declara c ao t em o mesmo n umero de caracteres. Se for informado um literal maior que <comprimento>, este ser a truncado; se for informado um literal menor que o declarado, o processador ir a preencher o espa co restante ` a direita com espa cos em branco. Programa exemplo: program l e c a r a c t e r e i m p l i c i t none character ( len =10) : : s t r r e a d print * , Entre com t e x t o : read ( a ) , s t r r e a d print * , Texto l i d o : , s t r r e a d end program l e c a r a c t e r e importante mencionar aqui a regra particular para o formato de fonte dos literais de caractere que s E ao escritos em mais de uma linha: 1. Cada linha deve ser encerrada com o caractere & e n ao pode ser seguida por coment ario. 2. Cada linha de continua c ao deve ser precedida tamb em pelo caractere &. 3. Este par && n ao faz parte do literal. 4. Quaisquer brancos seguindo um & em nal de linha ou precedendo o mesmo caractere em in cio de linha n ao s ao partes do literal. 5. Todo o restante, incluindo brancos, fazem parte do literal. Como exemplo temos: car_longo = O tempo que eu hei sonhado & Quantos anos foi de vida! & Ah, quanto do meu passado & Foi s o a vida mentida & De um futuro imaginado! & & Aqui ` a beira do rio & Sossego sem ter raz~ ao. & Este seu correr vazio & Figura, an^ onimo e frio, & A vida, vivida em v~ ao. & & & & & & & & & & &
3.6
O tipo l ogico dene vari aveis l ogicas. Uma vari avel l ogica s o pode assumir dois valores, verdadeiro e falso. A representa c ao dos dois estado poss veis de uma vari avel l ogica s ao:
.TRUE. Verdadeiro
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de abril de 2010
17
As declara c oes do tipo l ogico s ao: Fortran 77: logical <lista de nomes de vari aveis> Fortran 90/95: logical :: Programa exemplo: program l o g i c o i m p l i c i t none l o g i c a l : : a= . t r u e . i f ( a ) then print * , A v a r i avel e verdadeira . end i f end program l o g i c o <lista de nomes de vari aveis>
3.7
Em Fortran, al em dos 5 tipos de vari aveis denidos nas se c oes 3.2 a 3.6, e poss vel denir extens oes a um determinado tipo, cujas declara c oes dependem da vers ao do Fortran utilizada e do processador no qual o programa ser a executado.
3.7.1
Fortran 77
As diferen cas entre estas extens oes e os correspondentes tipos originais ser ao ilustradas a seguir.
3.7.2
Fortran 90/95
Em Fortran 90/95, cada um dos cinco tipos intr nsecos, INTEGER, REAL, COMPLEX, CHARACTER e LOGICAL possui associado um valor inteiro n ao negativo denominado par ametro de esp ecie do tipo (kind type parameter) . Por exig encia do padr ao, um processador deve suportar, no m nimo, duas esp ecies para os tipos REAL e COMPLEX e uma esp ecie para os tipos INTEGER, CHARACTER e LOGICAL. Os valores da esp ecie s ao dependentes do processador e/ou do compilador empregado. Contudo, h a fun c oes intr nsecas fornecidas pelo compilador que vericam as precis oes suportadas pelo processador e que podem ser usadas para denir o valor do par ametro KIND, possibilitando assim a portabilidade do c odigo, isto e, a possibilidade deste rodar em diferentes arquiteturas usando uma precis ao m nima especicada pelo programador. Para demonstrar como diferentes compiladores implementam e usam o par ametro de esp ecie, ser ao considerados os compiladores Intel Fortran Compiler for linux (vers ao 9.1), gfortran e o compilador F, todos gratu tos. 3.7.2.1 Compilador Intel Fortran
O compilador Intel Fortran oferece os seguintes tipos intr nsecos, juntamente com as respectivas declara c oes de tipo e esp ecie: Tipo Inteiro. H a 04 par ametros de esp ecie para o tipo inteiro. Declara c ao: INTEGER([KIND=]<n>) [::] <lista de nomes de vari aveis> Sendo <n> das esp ecies 1, 2, 4 ou 8. Se o par ametro de esp ecie e explicitado, as vari aveis na <lista de nomes de vari aveis> ser ao da esp ecie escolhida. Em caso contr ario, a esp ecie ser a o inteiro padr ao: INTEGER(KIND=4); ou seja, a declara c ao INTEGER :: <lista de nomes de vari aveis> equivale a INTEGER(KIND=4) :: <lista de nomes de vari aveis>.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de abril de 2010
18
Tipo e Esp ecie INTEGER(KIND=1) INTEGER(KIND=2) INTEGER(KIND=4) INTEGER(KIND=8) REAL(KIND=4) REAL(KIND=8) REAL(KIND=16)
Tipo e Esp ecie LOGICAL(KIND=1) LOGICAL(KIND=2) LOGICAL(KIND=4) LOGICAL(KIND=8) COMPLEX(KIND=4) COMPLEX(KIND=8) COMPLEX(KIND=16)
Armazenamento (bytes) 1 2 4 8 8 16 32
Fortran.
Programa 3.1: Testa distintas esp ecies suportadas pelo compilador Intel
Fortran.
program t e s t a k i n d i n t e l i m p l i c i t none integer , parameter : : dp= 8 , qp= 16 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a r e a l ( kind= qp ) : : r quad ! ! C a l c u l a a r a i z quadrada de 2 em d i v e r s a s p r e c i s oes . r s i m p l e s= s q r t ( 2 . 0 ) ! Precis ao simples r d u p l a= s q r t ( 2 . 0 dp ) ! P r e c i s ao dupla r quad= s q r t ( 2 . 0 qp ) ! Precis ao qu a d r u p l a ou e s t e n d i d a . ! ! Imprime r e s u l t a d o s na t e l a . print * , r s i m p l e s print * , r d u p l a print * , r quad ! end program t e s t a k i n d i n t e l
Tipo Real. H a 03 par ametros de esp ecie para o tipo real. Declara c ao: REAL([KIND=]<n>) [::] <lista de nomes de vari aveis> Sendo <n> igual a 4, 8 ou 16. Caso o par ametro de esp ecie n ao seja especicado, a esp ecie ser a o real padr ao: REAL(KIND= 4). Tipo Complexo. H a 03 par ametros de esp ecie para o tipo complexo. Declara c ao: COMPLEX([KIND=]<n>) [::] <lista de nomes de vari aveis> Sendo <n> igual a 4, 8 ou 16. Caso o par ametro de esp ecie n ao seja explicitado, a esp ecie ser a o complexo padr ao: COMPLEX(KIND= 4). Tipo L ogico. H a 04 par ametros de esp ecie para o tipo l ogico. Declara c ao: LOGICAL([KIND=]<n>) [::] <lista de nomes de vari aveis> Sendo <n> igual a 1, 2, 4 ou 8. Tipo Caractere. H a somente uma esp ecie do tipo caractere. Declara c ao: CHARACTER([KIND=1],[LEN=]<comprimento>) [::] <lista de nomes de vari aveis>
Cada esp ecie distinta ocupa um determinado espa co de mem oria na CPU. Para o compilador Intel Fortran, o espa co ocupado est a descrito na tabela 3.1. O programa 3.1 a seguir ilustra do uso e as diferen cas de algumas op c oes de esp ecies de tipos de vari aveis. O mesmo programa tamb em indica o uso de alguns atributos na declara c ao de vari aveis, tais como na declara c ao INTEGER, PARAMETER :: DP= 2
O atributo PARAMETER indica que as vari aveis declaradas nesta senten ca devem se comportar como constantes matem aticas, isto e, n ao podem ser alteradas no programa por nenhuma atribui c ao de vari aveis (ver cap tulo 4). Na mesma declara c ao, j a est a sendo inicializado o valor do par ametro DP, sendo este igual a 2.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de abril de 2010
19
Tipo e Esp ecie INTEGER(KIND=1) INTEGER(KIND=2) INTEGER(KIND=4) INTEGER(KIND=8) INTEGER(KIND=16)1 REAL(KIND=4) REAL(KIND=8) REAL(KIND=10)
Tipo e Esp ecie LOGICAL(KIND=1) LOGICAL(KIND=2) LOGICAL(KIND=4) LOGICAL(KIND=8) LOGICAL(KIND=16) COMPLEX(KIND=4) COMPLEX(KIND=8) COMPLEX(KIND=10)
Armazenamento (bytes) 1 2 4 8 16 8 16 20
O mesmo exemplo tamb em ilustra o uso da fun c ao impl cita SQRT(X): R_SIMPLES= SQRT(2.0) a qual calculou a raiz quadrada da constante 2.0 e atribuiu o resultado ` a vari avel R_SIMPLES. 3.7.2.2 Compilador gfortran
Gfortran e o compilador Fortran 95 da GNU (Funda c ao Gnu is Not Unix.), inicialmente desenvolvido como alternativa ao compilador f95 distribu do pelas vers oes comerciais do Unix. Atualmente, o gfortran e parte integrante da plataforma de desenvolvimento de software GCC (GNU Compiler Collection), que e composta por compiladores de diversas linguagens distintas, tais como Fortran 95, C/C++, Java, Ada, entre outros. O comando gfortran consiste simplesmente em um script que invoca o programa f951, o qual traduz o c odigo-fonte para assembler, invocando em seguida o linkador e as bibliotecas comuns do pacote GCC. No gfortran, os par ametros de esp ecie s ao determinados de forma semelhante ao compilador Intel Fortran, discutido na se c ao 3.7.2.1, ou seja, o par ametro indica o n umero de bytes necess arios para armazenar cada vari avel da respectiva esp ecie de tipo. As esp ecies suportadas pelo gfortran s ao descritas na tabela 3.2. O programa testa_kind_gfortran a seguir (programa 3.2) ilustra o uso e as diferen cas entre as diversas esp ecies de tipos de dados no compilador gfortran. 3.7.2.3 Compilador F
Como exemplo do uso do par ametro de esp ecie, a tabela 3.3 ilustra os valores suportados pelo compilador F, conforme fornecidos pelo guia do usu ario2 . H a duas possibilidades para os n umeros da esp ecie: 1. o modo padr ao de opera c ao, tamb em denominado seq uencial, o qual pode, por em, ser especicado explicitamente no momento da compila c ao com a chave -kind=sequential; 2. o esquema de numera c ao bytes, o qual deve ser especicado no momento da compila c ao com a chave -kind=byte: alunos|fulano>F -kind=byte <nome programa>.f90 -o <nome programa> O exemplo a seguir, programa testa_kind_F, ilustra do uso e as diferen cas de algumas op c oes de esp ecies de tipos de vari aveis. program t e s t a k i n d F i m p l i c i t none integer , parameter : : dp= 2 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a complex : : c s i m p l e s complex ( kind= dp ) : : c d u p l a ! ! C a l c u l a a r a i z quadrada de 2 em d i v e r s a s p r e c i s oes . r s i m p l e s= s q r t ( 2 . 0 ) ! Precis ao simples
1 Em 2 The
plataformas de 64 bits, tais como a fam lia de processadores Intel Core 2. F Compiler and Tools (http://www.fortran.com/imagine1/ftools.pdf).
20
Programa 3.2: Testa distintas esp ecies suportadas pelo compilador gfortran .
program t e s t a k i n d g f o r t r a n i m p l i c i t none integer , parameter : : i 1= 1 , i 2= 2 , i 4= 4 , i 8= 8 , i 1 6= 16 integer , parameter : : dp= 8 , qp= 10 integer ( kind= i 1 ) : : v i 1 integer ( kind= i 2 ) : : v i 2 integer ( kind= i 4 ) : : v i 4 integer ( kind= i 8 ) : : v i 8 integer ( kind= i 1 6 ) : : v i 1 6 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a r e a l ( kind= qp ) : : r quad complex : : c s i m p l e s complex ( kind= dp ) : : c d u p l a complex ( kind= qp ) : : c quad ! ! Mostra maiores numeros r e p r e s e n t a v e i s do t i p o i n t e i r o . v i 1= huge ( 1 i 1 ) v i 2= huge ( 1 i 2 ) v i 4= huge ( 1 i 4 ) v i 8= huge ( 1 i 8 ) v i 1 6= huge ( 1 i 1 6 ) print * , E s p e c i e s I n t e i r a s : print * , vi1 , vi2 , v i 4 print * , v i 8 print * , v i 1 6 ! Mostra maiores numeros r e p r e s e n t a v e i s do t i p o r e a l . r s i m p l e s= huge ( 1 . 0 ) ! Precisao simples r d u p l a= huge ( 1 . 0 dp ) ! P r e c i s a o d u p l a r quad= huge ( 1 . 0 qp ) ! P r e c i s a o e s t e n d i d a ! ! C a l c u l a a r a i z quadrada de ( 2 , 2 ) em d i v e r s a s p r e c i s o e s . c s i m p l e s= s q r t ( ( 2 . 0 , 2 . 0 ) ) c d u p l a= s q r t ( ( 2 . 0 dp , 2 . 0 dp ) ) c quad= s q r t ( ( 2 . 0 qp , 2 . 0 qp ) ) ! print * , print * , E s p e c i e s R e a i s e Complexas : print * , r s i m p l e s print * , r d u p l a print * , r quad print * , c s i m p l e s print * , c d u p l a print * , c quad ! end program t e s t a k i n d g f o r t r a n
21
Tipo Real Real Real3 Complex Complex Complex Logical Logical Logical Logical Integer Integer Integer Integer Character
Descri c ao Real precis ao simples (padr ao) Real precis ao dupla Real precis ao qu adrupla Complexo precis ao simples (padr ao) Complexo precis ao dupla Complexo precis ao qu adrupla L ogico 1 byte L ogico 2 bytes L ogico 4 bytes (padr ao) L ogico 8 bytes Inteiro 1 byte Inteiro 2 bytes Inteiro 4 bytes (padr ao) Inteiro 8 bytes Caractere, 1 byte por caractere
r d u p l a= s q r t ( 2 . 0 ) ! Precis ao dupla ! ! N u meros c o m p l ex o s : p a r t e r e a l : r a i z de 2 . c s i m p l e s= cmplx ( s q r t ( 2 . 0 ) , s q r t ( 3 . 0 ) ) c d u p l a= cmplx ( s q r t ( 2 . 0 ) , s q r t ( 3 . 0 ) ) ! ! Imprime r e s u l t a d o s na t e l a . print * , r s i m p l e s print * , r d u p l a print * , c s i m p l e s print * , c d u p l a ! end program t e s t a k i n d F
P ar te i m a g i n a r i a : r a i z de 3 .
3.7.2.4
Para disting uir as esp ecies dos literais (ou constantes) dentre diferentes n umeros fornecidos ao compilador, utiliza-se o suxo _<k>, sendo <k> o par ametro da esp ecie do tipo: Literais inteiros. Constante inteiras, incluindo a esp ecie, s ao especicadas por: [<s>]<nnn...>[_<k>] onde: <s> e um sinal (+ ou ); obrigat orio se negativo, opcional se positivo. <nnn...> e um conjunto de d gitos (0 a 9); quaisquer zeros no in cio s ao ignorados. _<k> e um dos par ametros de esp ecie do tipo: 1, 2, 4 ou 8; esta op c ao explicita a esp ecie do tipo ` a qual o literal pertence. Literais reais. Constantes reais s ao especicadas de diferentes maneiras, dependendo se possuem ou n ao parte exponencial. A regra b asica para a especica c ao de um literal real j a foi denida na se c ao 3.3. Para explicitar a esp ecie do tipo real ` a qual o literal pertence, deve-se incluir o suxo _<k>, onde <k> e um dos par ametros de esp ecie do tipo: 4, 8 ou 16. Por exemplo: 2.0_8: para indicar tipo real, esp ecie 8. Literais complexos. A regra b asica para a especica c ao de um literal complexo j a foi denida na se c ao 3.4. Para explicitar a esp ecie do tipo ` a qual o literal pertence, deve-se incluir o suxo _<k>, onde <k> e um dos par ametros de esp ecie do tipo: 4, 8 ou 16, em cada uma das partes real e imagin aria do literal complexo. Por exemplo: (1.0_8,3.5345_8): para indicar tipo complexo, esp ecie 8. Literais l ogicos. Uma constante l ogica pode tomar uma das seguintes formas: .TRUE.[_<k>]
3 Vari aveis
reais e complexas de precis ao qu adrupla n ao s ao suportadas por todas as vers oes do compilador F.
22
3.7. O conceito de esp ecie (kind) .FALSE.[_<k>] onde <k> e um dos par ametros de esp ecie do tipo: 1, 2, 4 ou 8.
3.7.3
Embora as declara c oes de esp ecie do tipo possam variar para diferentes compiladores, o padr ao da linguagem estabelece um conjunto de fun c oes intr nsecas que facilitam a determina c ao e a declara c ao destas esp ecies de uma forma totalmente port avel, isto e, independente de compilador e/ou arquitetura. As fun c oes intr nsecas descritas nesta e nas subsequentes se c oes ser ao novamente abordadas no cap tulo 7, onde ser ao apresentadas todas as rotinas intr nsecas fornecidas pelo padr ao da linguagem Fortran 95. 3.7.3.1 KIND(X)
A fun c ao intr nseca KIND(X), a qual tem como argumento uma vari avel ou constante de qualquer tipo intr nseco, retorna o valor inteiro que identica a esp ecie da vari avel X. Por exemplo, program t e s f u n k i n d i m p l i c i t none integer : : i , j integer , parameter : : dp= 2 real : : y r e a l ( kind= dp ) : : x ! i= kind ( x ) ! i= 2 j= kind ( y ) ! Depende do s i s t e m a ( j =1 para c o m p i l a d o r F ) . print * , i print * , j end program t e s f u n k i n d Outros exemplos: KIND(0) KIND(0.0) KIND(.FALSE.) KIND(A) KIND(0.0D0) ! ! ! ! ! ! ! ! ! ! Retorna a esp ecie padr~ ao do tipo inteiro. (Dependente do processador). Retorna a esp ecie padr~ ao do tipo real. (Depende do processador). Retorna a esp ecie padr~ ao do tipo l ogico. (Depende do processador). Fornece a esp ecie padr~ ao de caractere. (Sempre igual a 1). Usualmente retorna a esp ecie do tipo real de precis~ ao dupla. (Pode n~ ao ser aceito por todos compiladores).
3.7.3.2
SELECTED_REAL_KIND(P,R)
A fun c ao intr nseca SELECTED_REAL_KIND(P,R) tem dois argumentos opcionais: P e R. A vari avel P especica a precis ao (n umero de d gitos decimais) m nima requerida e R especica o intervalo de varia c ao m nimo da parte exponencial da vari avel. A fun c ao SELECTED_REAL_KIND(P,R) retorna o valor da esp ecie que satisfaz, ou excede minimamente, os requerimentos especicados por P e R. Se mais de uma esp ecie satisfaz estes requerimentos, o valor retornado e aquele com a menor precis ao decimal. Se a precis ao requerida n ao for dispon vel, a fun c ao retorna o valor -1; se o intervalo da exponencial n ao for dispon vel, a fun c ao retorna -2 e se nenhum dos requerimentos for dispon vel, o valor -3 e retornado. Esta fun c ao, usada em conjunto com a declara c ao de esp ecie, garante uma completa portabilidade ao programa, desde que o processador tenha dispon veis os recursos solicitados. O exemplo a seguir ilustra o uso desta fun c ao intr nseca e outros recursos. program t e s s e l e c t e d integer , parameter : : i 1 0= s e l e c t e d r e a l k i n d ( 1 0 , 2 0 0 ) integer , parameter : : dp= 8 r e a l ( kind= i 1 0 ) : : a , b , c r e a l ( kind= dp ) : : d
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de abril de 2010
Cap tulo 3. Tipos de Vari aveis print * , i 1 0 a= 2 . 0 i 1 0 b= s q r t ( 5 . 0 i 1 0 ) c= 3 . 0 e 1 0 i 1 0 , d= 1 . 0 e201 dp print * , a print * , b print * , c print * , d end program t e s s e l e c t e d
23
Pode-se ver que a precis ao requerida na vari avel I10 e dispon vel na esp ecie correspondente ` a precis ao dupla de uma vari avel real para os compiladores mencionados (ver, por exemplo, tabela 3.2). Um outro recurso dispon vel e a possibilidade de especicar constantes de uma determinada esp ecie, como na atribui c ao A= 2.0_I10 A constante A foi explicitamente especicada como pertencente ` a esp ecie I10 seguindo-se o valor num erico com um underscore e com o par ametro de esp ecie do tipo (I10). Deve-se notar tamb em que a deni c ao da esp ecie I10, seguida da declara c ao das vari aveis A, B e C como sendo desta esp ecie, determina o intervalo m nimo de varia c ao da parte exponencial destas vari aveis. Se o par ametro da esp ecie associada ` a constante I10 for distinto do par ametro DP, a vari avel D n ao poderia ter sido declarada tamb em da esp ecie I10, pois a atribui c ao D= 1.0E201_I10 iria gerar uma mensagem de erro no momento da compila c ao, uma vez que a parte exponencial excede o intervalo denido para a esp ecie I10 (200). Contudo, para alguns compiladores, como o gfortran, a compila c ao ir a resultar em I10 = DP, tornando desnecess aria uma das declara c oes acima. Este exemplo demonstra a exibilidade e a portabilidade propiciada pelo uso da fun c ao intr nseca SELECTED_REAL_KIND. 3.7.3.3 SELECTED_INT_KIND(R)
A fun c ao intr nseca SELECTED_INT_KIND(R) e usada de maneira similar ` a fun c ao SELECTED_REAL_KIND. Agora, a fun c ao tem um u nico argumento R, o qual especica o intervalo de n umeros inteiros requerido. Assim, SELECTED_INT_KIND(r) retorna o valor da esp ecie que representa, no m nimo, valores inteiros no intervalo 10r a +10r . Se mais de uma esp ecie satisfaz o requerimento, o valor retornado e aquele com o menor intervalo no expoente r. Se o intervalo n ao for dispon vel, o valor -1 e retornado. O exemplo a seguir mostra a declara ca o de um inteiro de uma maneira independente do sistema: INTEGER, PARAMETER :: I8= SELECTED_INT_KIND(8) INTEGER(KIND= I8) :: IA, IB, IC As vari aveis inteiras IA, IB e IC podem ter valores entre 108 a +108 no m nimo, se dispon vel pelo processador.
3.8
Tipos derivados
Uma das maiores vantagens do Fortran 90/95 sobre seus antecessores est a na disponibilidade ao programador de denir seus pr oprios tipos de vari aveis. Estas s ao os chamados tipos derivados, tamb em freq uentemente denominados de estruturas. A forma geral da declara c ao de um tipo derivado e: TYPE [[,<acesso> ] ::] <nome do tipo > [PRIVATE] <declara c~ oes de componentes > END TYPE [<nome do tipo >] onde cada <declara c ao de componentes > tem a forma <tipo >[[, <atributos >] ::] <lista de componentes >
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de abril de 2010
24
onde aqui o <tipo > pode ser um tipo de vari avel intr nseca ou outro tipo derivado. A declara c ao de uma lista de vari aveis do tipo derivado <nome do tipo > e feita atrav es da linha: TYPE (<nome do tipo >) [::] <lista de nomes> Para tentar-se entender o uso de uma vari avel de tipo derivado, vamos denir um novo tipo: PONTO, o qual ser a constru do a partir de tr es valores reais, representando os valores das coordenadas x, y e z do ponto no espa co cartesiano: program d e f t i p o d e r i m p l i c i t none type : : ponto real : : x , y , z end type ponto ! type ( ponto ) : : c e n t r o , a p i c e ! a p i c e%x= 0 . 0 a p i c e%y= 1 . 0 a p i c e%z= 0 . 0 c e n t r o = ponto ( 0 . 0 , 0 . 0 , 0 . 0 ) ! print * , a p i c e print * , c e n t r o ! end program d e f t i p o d e r No exemplo acima, deniu-se o tipo derivado PONTO, composto por tr es componentes reais x, y e z. Em seguida, declarou-se duas vari aveis como sendo do tipo PONTO: CENTRO e APICE. A seguir, atribuiu-se os valores para estas vari aveis. Finalmente, mandou-se imprimir na tela o valor das vari aveis. Como foi mostrado na atribui c ao APICE%X= 0.0, cada componente da vari avel de tipo derivado pode ser referenciada individualmente por meio do caractere seletor de componente, %. J a a vari avel CENTRO teve os valores de suas componentes denidos pelo construtor de estrutura : CENTRO= PONTO(0.0,0.0,0.0) ou seja, CENTRO%X= 0.0, CENTRO%Y= 0.0 e CENTRO%Z= 0.0. Estruturas denidas desta forma podem ser interessantes quando o programador quer classicar determinados objetos caracterizados por par ametros e/ou qualicadores representados por vari aveis de diferentes poss tipos. E vel construirem-se estruturas progressivamente mais complicadas denindo-se novos tipos derivados que englobam aqueles previamente denidos. Por exemplo, TYPE :: RETA TYPE (PONTO) :: P1,P2 END TYPE RETA TYPE (RETA) :: DIAGONAL_PRINCIPAL ! DIAGONAL_PRINCIPAL%P1%X= 0.0 DIAGONAL_PRINCIPAL%P1%Y= 0.0 DIAGONAL_PRINCIPAL%P1%Z= 0.0 ! DIAGONAL_PRINCIPAL%P2= PONTO(1.0,1.0,1.0) Aqui foi denido o tipo RETA no espa co cartesiano, a qual e totalmente caracterizada por dois pontos, P1 e P2, os quais, por sua vez s ao ternas de n umeros do tipo (x, y, z ). Deniu-se ent ao a vari avel DIAGONAL_PRINCIPAL como sendo do tipo RETA e deniu-se os valores dos dois pontos no espa co P1 e P2 que caracterizam a diagonal principal. Note o uso de dois seletores de componente para denir o valor da coordenada x do ponto P1 da DIAGONAL_PRINCIPAL. Note, por outro lado, o uso do construtor de estrutura para denir a posi c ao do ponto P2, como componente da diagonal principal. O exemplo a seguir, dene o tipo ALUNO, caracterizado por NOME, CODIGO de matr cula, notas parciais N1, N2 e N3 e m edia nal MF. O programa l e as notas e calcula e imprime a m edia nal do aluno.
Autor: Rudi Gaelzer IFM/UFPel Impresso: 12 de abril de 2010
25
! Dados a c e r c a de a l u n o s usando t i p o d e r i v a d o . program a l u n o s i m p l i c i t none type : : a l u n o character ( len= 2 0 ) : : nome integer : : c o d i g o r e a l : : n1 , n2 , n3 , mf end type a l u n o type ( a l u n o ) : : d i s c e n t e ! print * , Nome : read ( a ) , d i s c e n t e%nome print * , c o d i g o : read * , d i s c e n t e%c o d i g o print * , Notas : N1 , N2 , N3 : read * , d i s c e n t e%n1 , d i s c e n t e%n2 , d i s c e n t e%n3 d i s c e n t e%mf= ( d i s c e n t e%n1 + d i s c e n t e%n2 + d i s c e n t e%n3 ) / 3 . 0 print * , print *,> , d i s c e n t e%nome , ( , d i s c e n t e%c o d i g o , ) < print * , Media f i n a l : , d i s c e n t e%mf end program a l u n o s Em Fortran 95, tornou-se poss vel inicializar os valores dos componentes dos tipos derivados. O valor deve ser especicado quando o componente e declarado como parte da deni c ao do tipo. Se o componente n ao for um ponteiro, a inicializa c ao e feita de forma usual, com um sinal de igual seguido da express ao de inicializa c ao. Se o componente for um ponteiro, a u nica inicializa c ao admitida e o s mbolo de atribui c ao de um ponteiro (=>), seguida pela fun c ao intr nseca NULL() (se c ao 7.16). Em ambos os casos os caracteres :: s ao exigidos. Uma inicializa c ao n ao deve necessariamente se aplicar a todos os componentes de um tipo derivado. Um exemplo v alido seria: TYPE :: ENTRY REAL :: VALOR= 2.0 INTEGER INDEX TYPE(ENTRY), POINTER :: NEXT => NULL() END TYPE ENTRY Dada uma declara c ao de matriz tal como TYPE(ENTRY), DIMENSION(100) :: MATRIZ os sub-objetos tais como MATRIZ(3)%VALOR ter ao automaticamente o valor 2.0 e a seguinte opera c ao, que usa uma fun c ao intr nseca ASSOCIATED(MATRIX(3)%NEXT) vai retornar o valor .FALSE. (ver se c ao 7.3). Se as declara c oes de tipos derivados estiverem aninhadas, as inicializa c oes associadas a componentes s ao reconhecidas em todos os n veis. Assim, TYPE :: NODO INTEGER CONTA TYPE(ENTRY) ELEMENTO END TYPE NODO TYPE(NODO) N ocasiona que o componente N%ELEMENTO%VALOR ter a automaticamente o valor 2.0. Os componentes do tipo derivado continuam podendo ser inicializados em declara c oes de vari aveis do tipo, tais como TYPE(ENTRY), DIMENSION(100) :: MATRIZ= ENTRY(HUGE(0.0), HUGE(0), NULL()) em cuja situa c ao a inicializa c ao inicial e ignorada.
26