Im letzten Post wollte ich deutlich machen, welche Art von Fehler passieren, wenn zwischen den TypenPoint3D und Vector3D keinen semantischen Unterschied gemacht wird. Also, wenn ein Rechenergebnis von der Bedeutung ein Vektor ist, es aber in einem Punkt Datentyp gespeichert wird.
Die erste Lösung war, einen zusätzlichen Datentyp Vector3D zu erstellen, welcher sich genau wie ein Point3D verhält, aber von der Bedeutung eine andere hat. Dies lässt sich auch noch ohne concepts realisieren. Dazu das selbe Beispiel von Part1 diesmal in FORTRAN. Und im nächsten Teil gibts dann das erste concept.
Da ich nicht weiß ob es in FORTRAN möglich ist, von einem Array zu erben, noch ob man operator()() überladen kann, hier eine Version mit etwas mehr Tipparbeit.
Wichtig ist aber erstmal nur, dass die selbe Art von Fehlermeldung erzeugt werden kann.
conceptpart2.F90
normal = normalenVector(tri)
1
Error: Can't convert TYPE(vector3d_t) to TYPE(point3d_t) at (1)
module test_m
implicit none
type Point3D_t
real(8) :: xyz(3)
end type
type Vector3D_t
real(8) :: xyz(3)
end type
type Triangle_t
type(Point3D_t) :: points(3)
end type
interface operator(-)
module procedure minus1
end interface
contains
function minus1(p1, p2) result(p3)
implicit none
type(Point3D_t), intent(in) :: p1, p2
type(Point3D_t) :: p3
p3 = Point3D_t( (/ p1%xyz(1)-p2%xyz(1), p1%xyz(2)-p2%xyz(2), p1%xyz(3)-p2%xyz(3) /) )
end function
function normalenVector(tri) result(normal)
implicit none
type(Triangle_t), intent(in) :: tri
type(Point3D_t) :: vec1, vec2
type(Vector3D_t) :: normal
vec1 = tri%points(2)-tri%points(1)
vec2 = tri%points(3)-tri%points(1)
normal = Vector3D_t( (/ vec1%xyz(2)*vec2%xyz(3)-vec1%xyz(3)*vec2%xyz(2), &
& vec1%xyz(3)*vec2%xyz(1)-vec1%xyz(1)*vec2%xyz(3), &
& vec1%xyz(1)*vec2%xyz(2)-vec1%xyz(2)*vec2%xyz(1) /) )
end function
end module
program main
use test_m
implicit none
type(Triangle_t) :: tri
type(Point3D_t) :: normal
tri = Triangle_t((/ Point3D_t((/0, 0, 0/)), Point3D_t((/10, 0, 0/)), Point3D_t((/10, 10, 0/)) /))
normal = normalenVector(tri)
end program