{"id":3191,"date":"2017-09-04T14:45:01","date_gmt":"2017-09-04T13:45:01","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3191"},"modified":"2017-09-04T14:49:46","modified_gmt":"2017-09-04T13:49:46","slug":"c-guns-semantik-und-concepts-part-2","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3191","title":{"rendered":"C++ Guns - Semantik und concepts - Part 2"},"content":{"rendered":"<p>Im letzten Post wollte ich deutlich machen, welche Art von Fehler passieren, wenn zwischen den Typen<em>Point3D<\/em> und <em>Vector3D<\/em> keinen semantischen Unterschied gemacht wird. Also, wenn ein Rechenergebnis von der Bedeutung ein Vektor ist, es aber in einem Punkt Datentyp gespeichert wird.<\/p>\n<p>Die erste L\u00f6sung war, einen zus\u00e4tzlichen Datentyp <em>Vector3D<\/em> zu erstellen, welcher sich genau wie ein <em>Point3D<\/em> verh\u00e4lt, aber von der Bedeutung eine andere  hat. Dies l\u00e4sst sich auch noch ohne concepts realisieren. Dazu das selbe Beispiel von Part1 diesmal in FORTRAN. Und im n\u00e4chsten Teil gibts dann das erste concept.<\/p>\n<p>Da ich nicht wei\u00df ob es in FORTRAN m\u00f6glich ist, von einem Array zu erben, noch ob man operator()() \u00fcberladen kann, hier eine Version mit etwas mehr Tipparbeit.<\/p>\n<p>Wichtig ist aber erstmal nur, dass die selbe Art von Fehlermeldung erzeugt werden kann.<\/p>\n<blockquote><p>\nconceptpart2.F90<br \/>\n   normal = normalenVector(tri)<br \/>\n           1<br \/>\nError: Can't convert TYPE(vector3d_t) to TYPE(point3d_t) at (1)\n<\/p><\/blockquote>\n<p><a href=\"http:\/\/roboblog.fatal-fury.de\/wp-content\/uploads\/2017\/09\/conceptpart2.F90.gz\"rel=\"\">conceptpart2.F90.gz<\/a><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nmodule test_m\r\n implicit none\r\n \r\n  type Point3D_t\r\n    real(8) :: xyz(3)\r\n  end type\r\n\r\n  type Vector3D_t\r\n    real(8) :: xyz(3) \r\n  end type\r\n\r\n\r\n  type Triangle_t\r\n      type(Point3D_t) :: points(3)\r\n  end type\r\n\r\n  interface operator(-)\r\n    module procedure minus1\r\n  end interface\r\n  \r\n  contains\r\n\r\n  function minus1(p1, p2) result(p3)\r\n    implicit none\r\n    type(Point3D_t), intent(in) :: p1, p2\r\n    type(Point3D_t) :: p3\r\n\r\n    p3 = Point3D_t( (\/ p1%xyz(1)-p2%xyz(1), p1%xyz(2)-p2%xyz(2), p1%xyz(3)-p2%xyz(3) \/) )\r\n  end function\r\n\r\n  function normalenVector(tri) result(normal)\r\n    implicit none\r\n    type(Triangle_t), intent(in) :: tri\r\n    type(Point3D_t) :: vec1, vec2\r\n    type(Vector3D_t) :: normal\r\n    \r\n      vec1 = tri%points(2)-tri%points(1)\r\n      vec2 = tri%points(3)-tri%points(1)\r\n\r\n      normal = Vector3D_t( (\/ vec1%xyz(2)*vec2%xyz(3)-vec1%xyz(3)*vec2%xyz(2), &amp;\r\n&amp;                  vec1%xyz(3)*vec2%xyz(1)-vec1%xyz(1)*vec2%xyz(3), &amp;\r\n&amp;                  vec1%xyz(1)*vec2%xyz(2)-vec1%xyz(2)*vec2%xyz(1) \/) )\r\n  end function\r\n \r\nend module\r\n\r\nprogram main\r\n  use test_m\r\n  implicit none\r\n  type(Triangle_t) :: tri\r\n  type(Point3D_t) :: normal\r\n    \r\n  tri = Triangle_t((\/ Point3D_t((\/0, 0, 0\/)), Point3D_t((\/10, 0, 0\/)), Point3D_t((\/10, 10, 0\/)) \/))\r\n  normal = normalenVector(tri)\r\nend program\r\n\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>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\u00f6sung war, einen zus\u00e4tzlichen Datentyp Vector3D zu erstellen, welcher sich genau wie [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17,30],"class_list":["post-3191","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp","tag-fortran"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3191"}],"version-history":[{"count":4,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3191\/revisions"}],"predecessor-version":[{"id":3196,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3191\/revisions\/3196"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3191"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}