Estou definindo tipos derivados em Fortran e sobrecarregando alguns operadores (por exemplo, o operador +). Isso funciona bem ao trabalhar com objetos escalares e eu estava (otimisticamente) esperando que isso funcionasse perfeitamente com arrays desses objetos, mas não funciona.
No exemplo abaixo, defino um tipo derivado para pontos no plano 2D e sobrecarrego o operador + para definir qual deve ser a soma de dois pontos (essa operação não precisa fazer sentido matematicamente -- este é apenas um exemplo simples...). Isso funciona bem com pontos individuais, mas não com matrizes de pontos.
As mensagens de erro durante a compilação são:
gcc: Entidades de tipo derivado inesperadas no operador numérico intrínseco binário '+'
ifort: Esta operação binária é inválida para este tipo de dados.
Qual é a melhor/mais simples abordagem para fazer isso funcionar com matrizes de pontos?
module points
implicit none
type :: t_point
integer :: x, y
contains
procedure :: add
generic :: operator(+) => add
end type t_point
contains
pure type(t_point) function add(self, other)
class(t_point), intent(in) :: self, other
add = t_point(self%x + other%x, self%y + other%y)
end function add
end module points
program test
use points
implicit none
type(t_point) :: p1, p2, p3
p1 = t_point(0, 1)
p2 = t_point(1, 4)
p3 = t_point(5, -1)
print*, p1 + p1 ! this works: (0, 2)
print*, p1 + p2 ! this works: (1, 5)
print*, p1 + p3 ! this works: (5, 0)
print*, p2 + p3 ! this works: (6, 3)
print*, (/1, 2, 3/) + (/10, 20, 30/) ! this works with intrinsic data types: (11, 22, 33)
print*, (/p1, p2, p3/) + (/p3, p3, p3/) ! compilers do not like this line
end program test