<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>http://comp.chem.tohoku.ac.jp/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%E6%8B%A1%E5%BC%B5%E6%A7%8B%E9%80%A0%E4%BD%93%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A7%A3%E6%B1%BA%E7%AD%96</id>
	<title>拡張構造体を使ったプログラミングにおける問題と解決策 - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="http://comp.chem.tohoku.ac.jp/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%E6%8B%A1%E5%BC%B5%E6%A7%8B%E9%80%A0%E4%BD%93%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A7%A3%E6%B1%BA%E7%AD%96"/>
	<link rel="alternate" type="text/html" href="http://comp.chem.tohoku.ac.jp/mediawiki/index.php?title=%E6%8B%A1%E5%BC%B5%E6%A7%8B%E9%80%A0%E4%BD%93%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A7%A3%E6%B1%BA%E7%AD%96&amp;action=history"/>
	<updated>2026-09-07T15:02:42Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.36.2</generator>
	<entry>
		<id>http://comp.chem.tohoku.ac.jp/mediawiki/index.php?title=%E6%8B%A1%E5%BC%B5%E6%A7%8B%E9%80%A0%E4%BD%93%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A7%A3%E6%B1%BA%E7%AD%96&amp;diff=1131&amp;oldid=prev</id>
		<title>Hirano: ページの作成:「Fortran で拡張構造体を利用する場合、言語仕様に伴ういくつかの困難が存在する。 本ページではそれらについて示すとともに…」</title>
		<link rel="alternate" type="text/html" href="http://comp.chem.tohoku.ac.jp/mediawiki/index.php?title=%E6%8B%A1%E5%BC%B5%E6%A7%8B%E9%80%A0%E4%BD%93%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A7%A3%E6%B1%BA%E7%AD%96&amp;diff=1131&amp;oldid=prev"/>
		<updated>2026-05-26T04:21:33Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「Fortran で拡張構造体を利用する場合、言語仕様に伴ういくつかの困難が存在する。 本ページではそれらについて示すとともに…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Fortran で拡張構造体を利用する場合、言語仕様に伴ういくつかの困難が存在する。&lt;br /&gt;
本ページではそれらについて示すとともに、現状での解決策等を提示する。&lt;br /&gt;
&lt;br /&gt;
== 同クラス内での代入 ==&lt;br /&gt;
問題点：拡張後の構造体に拡張前の構造体を代入することができない。&lt;br /&gt;
&lt;br /&gt;
例：&lt;br /&gt;
 type aaa&lt;br /&gt;
   integer :: bbb&lt;br /&gt;
 endtype&lt;br /&gt;
 &lt;br /&gt;
 type,extends(aaa) :: aaa_ex&lt;br /&gt;
   integer :: ccc&lt;br /&gt;
 endtype&lt;br /&gt;
とした場合に aaa_ex = aaa がエラーとなる。&lt;br /&gt;
&lt;br /&gt;
解決策：ユーザー定義代入を定義する。&lt;br /&gt;
&lt;br /&gt;
例:&lt;br /&gt;
 type aaa&lt;br /&gt;
   integer :: bbb&lt;br /&gt;
 endtype&lt;br /&gt;
 &lt;br /&gt;
 type,extends(aaa) :: aaa_ex&lt;br /&gt;
   integer :: ccc&lt;br /&gt;
 contains&lt;br /&gt;
   '''generic :: assignment(=) =&amp;gt; equal'''&lt;br /&gt;
   '''procedure :: equal'''&lt;br /&gt;
 endtype&lt;br /&gt;
&lt;br /&gt;
 subroutine equal(out,in)&lt;br /&gt;
   implicit none&lt;br /&gt;
   class(aaa),intent(inout) :: out&lt;br /&gt;
     !!! intent(inout) 指定は必須。&lt;br /&gt;
     !!! そうしないと代入時に ccc が未定義となる。&lt;br /&gt;
   type(aaa),intent(in) :: in&lt;br /&gt;
 &lt;br /&gt;
   out%aaa = in%aaa&lt;br /&gt;
   !!! 各成分ごとの代入が必要。&lt;br /&gt;
   !!! out = in では subroutine equal の再起呼び出しとなってしまう。&lt;br /&gt;
   !!! この解決策はメンバ変数が多い場合に問題となる。&lt;br /&gt;
 &lt;br /&gt;
 endsubroutine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== オーバーロード時の元関数呼び出し ==&lt;br /&gt;
問題点：プロシージャのオーバーロード時に元のプロシージャが呼び出せなくなる。 &lt;br /&gt;
&lt;br /&gt;
例：&lt;br /&gt;
 module aaa_module&lt;br /&gt;
   implicit none&lt;br /&gt;
 &lt;br /&gt;
   type aaa&lt;br /&gt;
   contains&lt;br /&gt;
     procedure :: sub&lt;br /&gt;
   endtype&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 endmodule&lt;br /&gt;
 &lt;br /&gt;
 module aaa_ex_module&lt;br /&gt;
   use aaa_module,only: aaa&lt;br /&gt;
   implicit none&lt;br /&gt;
 &lt;br /&gt;
   type,extends(aaa) :: aaa_ex&lt;br /&gt;
   contains&lt;br /&gt;
     procedure :: sub    !!! オーバーロード&lt;br /&gt;
   endtype&lt;br /&gt;
 &lt;br /&gt;
 contains&lt;br /&gt;
 &lt;br /&gt;
   subroutine sub(self)&lt;br /&gt;
     implicit none&lt;br /&gt;
     class(aaa_ex) :: self&lt;br /&gt;
 &lt;br /&gt;
     '''元の sub を呼べない。'''&lt;br /&gt;
 &lt;br /&gt;
   endsubroutine&lt;br /&gt;
 &lt;br /&gt;
 endsubroutine &lt;br /&gt;
&lt;br /&gt;
解決策：オーバーロードする関数を generic とし、元の sub を呼び出す場合は詳細なプロシージャ名を指定する。&lt;br /&gt;
&lt;br /&gt;
例:&lt;br /&gt;
 module aaa_module&lt;br /&gt;
   implicit none&lt;br /&gt;
 &lt;br /&gt;
   type aaa&lt;br /&gt;
   contains&lt;br /&gt;
     '''generic :: sub =&amp;gt; sub_original'''&lt;br /&gt;
     '''procedure :: sub_original'''&lt;br /&gt;
   endtype&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 endmodule&lt;br /&gt;
 &lt;br /&gt;
 module aaa_ex_module&lt;br /&gt;
   implicit none&lt;br /&gt;
 &lt;br /&gt;
   type,extends(aaa) :: aaa_ex&lt;br /&gt;
   contains&lt;br /&gt;
     '''generic :: sub =&amp;gt; sub_ex'''   !!! オーバーロード&lt;br /&gt;
     '''procedure :: sub_ex'''&lt;br /&gt;
   endtype&lt;br /&gt;
 &lt;br /&gt;
 contains&lt;br /&gt;
 &lt;br /&gt;
   subroutine sub_ex(self)&lt;br /&gt;
     implicit none&lt;br /&gt;
     class(aaa_ex) :: self&lt;br /&gt;
 &lt;br /&gt;
     '''call self%sub_original()'''&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
 &lt;br /&gt;
   endsubroutine&lt;br /&gt;
 &lt;br /&gt;
 endsubroutine&lt;/div&gt;</summary>
		<author><name>Hirano</name></author>
	</entry>
</feed>