Fortran: integer * 4 vs integer (4) vs integer (kind = 4)

Eu estou tentando aprender Fortran e estou vendo muitas definições diferentes sendo passadas e eu estou querendo saber se elas estão tentando realizar a mesma coisa. Qual é a diferença entre o seguinte?

  • integer*4
  • integer(4)
  • integer(kind=4)

Em Fortran> = 90, a melhor abordagem é usar funções intrínsecas para especificar a precisão que você precisa – isso garante a portabilidade e que você obtenha a precisão que você precisa. Por exemplo, para obter inteiros i e my_int que suportarão pelo menos 8 dígitos decimais, você poderá usar:

 integer, parameter :: RegInt_K = selected_int_kind (8) integer (kind=RegInt_K) :: i, my_int 

Tendo definido RegInt_K (ou qualquer nome que você selecione) como um parameter , você pode usá-lo em todo o seu código como um símbolo. Isso também facilita a alteração da precisão.

Solicitar 8 ou 9 dígitos decimais normalmente obterá um inteiro de 4 bytes.

integer*4 é uma extensão comum voltando ao FORTRAN antigo para especificar um inteiro de 4 bytes.

integer (4) ou integer (RegInt_K) são curtos para integer (kind=4) ou integer (kind=RegInt_K) . integer (4) não é o mesmo que integer*4 e não é portátil – o padrão de idioma não especifica os valores numéricos dos tipos. A maioria dos compiladores usa o kind=4 para inteiros de 4 bytes – pois estes compiladores integer*4 e integer(4) fornecerão o mesmo tipo inteiro – mas há exceções, portanto, integer(4) é não-portátil e melhor evitado .

A abordagem para reais é semelhante.

UPDATE: se você não quiser especificar tipos numéricos pela precisão necessária, mas pelo armazenamento que eles usarão, o Fortran 2008 fornece um método. reais e inteiros podem ser especificados pelo número de bits de armazenamento depois de use o módulo ISO_FORTRAN_ENV , por exemplo, para um inteiro de 4 bytes (32 bits):

 use ISO_FORTRAN_ENV integer (int32) :: MyInt 

O manual do gfortran tem documentação em “módulos intrínsecos”.

Apenas mais uma explicação explícita do tipo. O compilador tem uma tabela de diferentes tipos numéricos. Todos os tipos inteiros são tipos diferentes do tipo básico – integer . Digamos que o compilador tenha tipos integer (ou real ) de 1 byte, 2 bytes, 4 bytes, 8 bytes e 16 bytes. Na tabela, o compilador tem um índice para cada um desses tipos – esse índice é o número do tipo.

Muitos compiladores escolhem essa numeração:

 kind number number of bytes 1 1 2 2 4 4 8 8 16 16 

Mas eles podem escolher qualquer outra numeração. Uma das possibilidades óbvias é

 kind number number of bytes 1 1 2 2 3 4 4 8 5 16 

Existem compiladores (pelo menos, g77 e NAG) que escolhem esta abordagem. Há também opções para mudar isso. Portanto, números de kind não são integer(kind=4) portáteis integer(kind=4) ou integer(4) significa um inteiro de 4 bytes ou um inteiro de 8 bytes dependendo do compilador.

integer*4 é portátil no sentido de que sempre significa 4 bytes. Mas, por outro lado, não é portátil porque nunca fez parte de nenhum padrão. Programas usando esta notação não são válidos Fortran 77, 90 ou qualquer outro Fortran.

Para ver as opções corretas de como configurar os números, veja a resposta do MSB.

O mesmo conceito vale para tipos de dados real . Veja o parâmetro kind Fortran 90 (a resposta do mataap).