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

Cap tulo 3

Tipos de Vari aveis


Em Fortran, h a cinco tipos intr nsecos de vari aveis: tr es tipos num ericos, inteiros, reais e complexos (em ingl es INTEGER, REAL e COMPLEX) e dois tipos n ao num ericos, caracteres e l ogicos (em ingl es CHARACTER e LOGICAL). O primeiro grupo de vari aveis e utilizado em opera c oes matem aticas e e o mais utilizado. O segundo grupo e utilizado para opera c oes que envolvem manipula c oes de texto ou opera c oes l ogicas. Em Fortran 90/95, cada um dos cinco tipos intr nsecos possui um valor inteiro n ao negativo denominado par ametro de esp ecie do tipo (em ingl es, kind type parameter ). A norma padr ao da linguagem determina que qualquer processador deve suportar pelo menos duas esp ecies para os tipos REAL e COMPLEX e pelo menos uma esp ecie para os tipos INTEGER, CHARACTER e LOGICAL. Um outro avan co do Fortran 90 sobre o predecessor Fortran 77 consiste na habilidade em denir novos tipos de vari aveis, baseados nos tipos intr nsecos. Estas s ao os chamados tipos derivados ou estruturas, os quais consistem em combina c oes de partes compostas por tipos intr nsecos e/ou por outros tipos derivados, permitindo gerar objetos de complexidade crescente. Neste cap tulo, vamos inicialmente denir o uso b asicos dos tipos intr nsecos de vari aveis, seguindo pela deni c ao das esp ecies de vari aveis mais comuns, terminando por denir os tipos derivados.

3.1

Declara c ao de tipo de vari avel

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. Vari aveis do tipo INTEGER

3.2

Vari aveis do tipo INTEGER

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

Vari aveis do tipo REAL

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

Autor: Rudi Gaelzer IFM/UFPel

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

Vari aveis do tipo COMPLEX

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

Vari aveis do tipo CHARACTER

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

Vari aveis do tipo LOGICAL

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

Cap tulo 3. Tipos de Vari aveis


.FALSE. Falso.

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

O conceito de esp ecie (kind)

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

Em Fortran 77 as extens oes mais comuns e as correspondentes declara c oes s ao:


vari aveis reais de precis ao dupla: real*8 <lista de nomes de vari aveis> ou double precision <lista de nomes de vari aveis>. vari aveis reais de precis ao estendida (ou qu adrupla): real*16 <lista de nomes de vari aveis>. vari aveis complexas de precis ao dupla: complex*16 <lista de nomes de vari aveis>.

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

3.7. O conceito de esp ecie (kind)


Tabela 3.1: Tabela de armazenamento de vari aveis para o compilador Intel

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)

Armazenamento (bytes) 1=8 bits 2 4 8 4 8 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

Cap tulo 3. Tipos de Vari aveis


Tabela 3.2: Tabela de armazenamento de vari aveis para o compilador gfortran da funda ca o GNU.

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)

Armazenamento (bytes) 1=8 bits 2 4 8 16 4 8 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).

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de abril de 2010

20

3.7. O conceito de esp ecie (kind)

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

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de abril de 2010

Cap tulo 3. Tipos de Vari aveis


Tabela 3.3: Valores de esp ecies (kind) de tipos de vari aveis suportados pelo compilador F.

21

Tipo Real Real Real3 Complex Complex Complex Logical Logical Logical Logical Integer Integer Integer Integer Character

N umero do Kind (Sequ encial) 1 2 3 1 2 3 1 2 3 4 1 2 3 4 1

N umero do Kind (Byte) 4 8 16 4 8 16 1 2 4 8 1 2 4 8 1

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

Literais de diferentes esp ecies

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.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de abril de 2010

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

Fun c oes intr nsecas associadas ` a esp ecie

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

3.8. Tipos derivados

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

Cap tulo 3. Tipos de Vari aveis

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.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de abril de 2010

26

3.8. Tipos derivados

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 12 de abril de 2010