820 likes | 1.03k Views
زیربرنامهها یا برنامههای فرعی. موسوی ندوشنی ویراست بهار 1389. مقدمه. معمولا برنامههای جدی و بزرگ را به برنامههای کوچکتر تجزیه میکنند و پس از نوشتن هر یک از آنها، توسط یک برنامه اصلی کلیه برنامههای فرعی و یا زیربرنامهها با هم ترکیب میشوند. رویکرد فوق شامل فایدههای زیر است.
E N D
زیربرنامهها یا برنامههای فرعی موسوی ندوشنی ویراست بهار 1389 دانشگاه صنعت آب و برق
مقدمه • معمولا برنامههای جدی و بزرگ را به برنامههای کوچکتر تجزیه میکنند و پس از نوشتن هر یک از آنها، توسط یک برنامه اصلی کلیه برنامههای فرعی و یا زیربرنامهها با هم ترکیب میشوند. • رویکرد فوق شامل فایدههای زیر است. • گاهی در یک برنامه، محاسبات مشابهی چند بار تکرار میشود، برای پرهیز از تکرار میتوان محاسبات مشابه را به یک برنامه فرعی سپرد. • هر برنامه فرعی را میتوان مستقل از برنامههای دیگر ترجمه و تست کرد. با این روش کار برنامهنویسی سادهتر خواهد شد. • برنامه فرعی با برنامه اصلی تعامل خواهد داشت. در این تعامل اگر برنامهنویس تصادفا اشتباهی مرتکب شود روی سایر برنامههای فرعی میتواند تاثیر نگذارد. • یک زیربرنامه را میتوان در برنامههای اصلی متفاوت به اشتراک گذاشت و از آن استفاده نمود. دانشگاه صنعت آب و برق
مثال • به برنامه زیر توجه کنید. همانطور که ملاحظه میشود، عمل محاسبه فاکتوریل سه بار تکرار شده است. • Fact_n = 1; Fact_m = 1; Fact_nm = 1 • Read*, n, m • ! calculation of Factorials • Do i = 1,n • Fact_n = Fact_n*i • End do • Do i = 1,m • Fact_m = Fact_m*i • End do • Do i = 1,n-m • Fact_nm = Fact_nm*i • End do • ! calculation of C(m,n) • Comb = Fact_n/(Fact_m*Fact_nm) • Write(*,*) Comb • End دانشگاه صنعت آب و برق
انواع زیربرنامهها • به طور کلی برنامههای فرعی یا زیربرنامهها به دو قسمت تقسیم میشوند. • تابع (function) • زیرروال (subroutine) • همانطور که قبلا ملاحظه شد، توابع به دو قسمت تقسیم میشود. • توابع پیش ساخته و یا کتابخانهای، مانند log، sin، cos و قدر مطلق و ... • توابع مورد نظر کاربر دانشگاه صنعت آب و برق
فرم کلی یک زیربرنامه از نوع تابع • فرم کلی تابع به صورت زیر است. • [type] Functionname([a1,a2, …,an]) • دستورات مربوط به اعلان • متن برنامه یا دستورات اجرایی • EndFunction [name] • به آرگومانهای a1,a2, …, an، آرگومانهای مجازی و یا صوری گویند. • همانطور که ملاحظه میشود، آرگومانهای a1,a2, …, an اختیاری هستند. • مورد اختیاری [type] نوع نام تابع مشخص میکند و در صورت عدم تعیین آن از پیشفرض استفاده میشود. • نوع نام تابع را میتوان در دستورات اعلان داخل بدنه تابع نیز معرفی نمود. دانشگاه صنعت آب و برق
مثال (1) • Function Fact(k) • Fact = 1. • Do i = 1, k • Fact = Fact*i • End do • End Function Fact • Integer Function Fact(k) • Fact = 1 • Do i = 1, k • Fact = Fact*i • End do • End Function Fact • Function Fact(k) • Integer :: Fact = 1 • Do i = 1, k • Fact = Fact*i • End do • End Function Fact • Function Fact(k) • Implicit none • Integer :: Fact = 1 • Integer :: k, i • Do i = 1, k • Fact = Fact*i • End do • End Function Fact دانشگاه صنعت آب و برق
مثال (1) • ! Main program • Read*, n, m • Comb = Fact(n) / ( Fact(m) * Fact(n-m) ) • Write(*,*) Comb • Contains • ! Function subprogram • Integer Function Fact(k) • Fact = 1 • Do i = 1, k • Fact = Fact*i • End do • End Function Fact • End دانشگاه صنعت آب و برق
مثال (2) • زیربرنامه اول • Integer Function Som (a, b, c) • Implicit none • Integer :: a, b, c • Som = a+b+c • End Function Som • زیربرنامه دوم • Logical Function positive(a) • Implicit none • Real :: a • If(a > 0.0) Then • Positive = .true. • Else • Positive = .false. • End if • End Function positive دانشگاه صنعت آب و برق
تابع بدون آرگومان • همانطور که در مثال زیر ملاحظه میکنید، تابع بهکار رفته بدون آرگومان است. • RealFunction pi() • pi = 4.*atan(1.) • Endfunction pi دانشگاه صنعت آب و برق
مثال (2) • program circle • implicit none • Real :: radius • print*, 'Enter radius' • Read*, radius • print*, area(radius) • print*, perimeter(radius) • contains • ! First function • RealFunction area(r) • Real :: r • area = pi()*r**2 • Endfunction area • ! Second function • RealFunction perimeter(r) • Real :: r • perimeter = 2.*pi()*r • Endfunction perimeter • ! Third function • RealFunction pi() • pi = 4.*atan(1.) • Endfunction pi • Endprogram circle دانشگاه صنعت آب و برق
آرگومانهای واقعی با ساختگی • آرگومان صوری یا مجازی (formal) و یا ساختگی (dummy) متغیری است که در عنوان تابع اعلان میشود. • آرگومان واقعی (actual) متغیر یا عباراتی است که در فراخوانی تابع ذکر میشود. • وقتی فراخوانی تابع اجرا میشود، آرگومان واقعی در آرگومان صوری به ترتیب موقعیت آنها از چپ به راست کپی میشوند. آنگاه کنترل به اولین دستور قابل اجرا در بدنه تابع انتقال مییابد. وقتی آخرین دستور در تابع اجرا شد، کنترل به نقطهای که تابع از آن فراخوانده شده است باز میگردد، و اجرای برنامه از اولین دستور اجرایی بعد از آن نقطه ادامه مییابد. دانشگاه صنعت آب و برق
سازگاری آرگومانهای واقعی و صوری یا مجازی • شرایط زیر برای سازگاری باید برقرار باشد. • یکسان بودن اسامی آرگومانهای واقعی و مجازی ضرورتی ندارد. • رعایت ترتیب آرگومانهای واقعی و مجازی الزامی است. • نوع آرگومانهای واقعی و مجازی باید یکسان باشد. • بین آرگومانهای واقعی و مجازی باید رابطه یک به یک برقرار باشد. دانشگاه صنعت آب و برق
Integer :: a, b, c a=10 b=5 c=3 Print*, Small(a,b,c) Print*, Small(a+b,b+c,c) Print*, Small(10,5,3) print*, Small((a), (b), (c)) Contains Integer Function& Small(x,y,z) Implicit none Integer :: x, y, z if(x <= y .AND. x <= z) Then Small = x Elseif(y <= x .AND. y <= z) Then Small = y Else Small = z End if End Function Small End ارتباط آرگومانها (واقعی با صوری) در تابع دانشگاه صنعت آب و برق
دنباله ارتباط آرگومانها (واقعی با صوری) • در تابع، مقادیر آرگومان واقعی به آرگومان صوری منتقل میشود. این انتقال متضمن قواعد زیر است. • اگر آرگومان واقعی عبارت باشد، ابتدا محاسبه شده و در یک محل موقت ذخیره میشود. آنگاه مقدار ذخیره شده منتقل میگردد. • اگر آرگومان واقعی مقدار ثابت باشد، آنگاه به مثابه یک عبارت محسوب شده و وفق بند فوق عمل میشود. • اگر آرگومان واقعی متغیر باشد، آنگاه مقدارش به آرگومان صوری منتقل میشود. • اگر آرگومان متغیری باشد که در داخل پرانتز (A) باشد، آنگاه به منزله یک عبارت محسوب شده و وفق بند عبارت عمل میشود دانشگاه صنعت آب و برق
دنباله ارتباط آرگومانها (واقعی با صوری) دانشگاه صنعت آب و برق
Program Wrong Implicit none ………….. Contains Integer Function F1(…) Implicit none ………….. Contains Real Function F2(…) Implicit none ………….. End Function F2 End Function F1 End یک برنامه اصلی میتواند شامل (contains) چند برنامه فرعی باشد، اما یک برنامه فرعی نمیتواند شامل (contains) برنامه فرعی دیگری باشد. یک برنامه اصلی و چند برنامه فرعی دانشگاه صنعت آب و برق
زیربرنامه یا برنامه فرعی (subroutine) • همانطور که ملاحظه شد، زیربرنامه از نوع تابع یک مقدار را برمیگرداند، بر عکس زیربرنامه از نوع سابروتین دارای خواص زیر است. • مقداری باز نمیگرداند. • در یک عبارت محاسباتی نیز ظاهر نمیشود. • در هنگام فراخوانی به عنوان یک عبارت کامل و تنها ظاهر میشود، و برای این کار از واژه call استفاده میگردد. • سابروتین مقادیری را از آرگومانهای صوری دریافت میکند و پس از انجام محاسبات نتایج را در یک سری از آرگومانهای ساختگی ذخیره میشود. • فرم کلی سابروتین به صورت زیر است. • Subroutine name[(a1, a2, a3,…, an)] • [دستورات مربوط به اعلان] • [دستورات اجرایی] • End Subroutine [name] دانشگاه صنعت آب و برق
مثال • program circle • implicit none • Real :: radius, area, perimeter • print '(A\)', 'Enter radius: ‘ • Read*, radius • call area_peri(radius, area, perimeter) • print*, area • call star • print*, perimeter • call star • contains • ! First subprogram (subroutine) • subroutine area_peri(r, A, P) • Real :: r, a, p • A = pi()*r**2 • P = 2.*pi()*r • End subroutine area_peri • ! Second subprogram (function) • Real Function pi() • pi=4.*atan(1.) • End function pi • ! Thrid subprogram (subroutine) • subroutine star • print "(20('-'))" • End subroutine star • End program circle دانشگاه صنعت آب و برق
خاصیت intent • در تابع از خاصیت intent برای آرگومان ورودی استفاده میشود و خروجی در نام تابع ذخیره میشود، بنابراین از خاصیت intent فقط قسمت in استفاده میشود. • در مورد سابروتین، چون انواع آرگومان وجود دارد، خاصیت intent دارای انواع زیر است. • Intent(in) • Intent(out) • Intent(inout) دانشگاه صنعت آب و برق
مثالها • مثال 1 • Subroutine Means(a, b, c, Am, Gm, Hm) • Implicit none • Real, intent(in) :: a, b, c • Real, intent(out) :: Am, Gm, Hm • ……………………… • End subroutine Means • مثال 2 • Subroutine swap(a, b) • Implicit none • Integer, intent(inout) :: a, b • ……………………… • End subroutine swap دانشگاه صنعت آب و برق
Program example1 Implicit none Integer :: a, b, c ……………… Call large(a, b, c) ……………… contains Subroutine large(u,v,w) Implicit none Integer, intent(in) :: u,v Integer, intent(out) :: w If(u > v) then w = u Else w = v End if End subroutine large مثال تعامل برنامه اصلی و زیربرنامه (1) دانشگاه صنعت آب و برق
Program test Implicit none Integer :: a, b, c=5 a=1 b=2 Call sub(a, b, c) ……………… Contains Subroutine sub(u, v, w) Implicit none Integer, intent(in) :: u Integer, intent(inout) :: v Integer, intent(out) :: w w = u + v v = v*v - u*u End subroutine sub End program test مثال تعامل برنامه اصلی و زیربرنامه (2) دانشگاه صنعت آب و برق
آرگومان واقعی آرگومان صوری a u b v c w نمایش استفاده از خاصیت intent Intent(in) Intent(inout) Intent(out) دانشگاه صنعت آب و برق
ارتباط آرگومانها (واقعی با صوری) در سابروتین • تعامل بین آرگومانهای واقعی با آرگومانهای صوری در زیربرنامه از نوع سابروتین شبیه زیربرنامه از نوع تابع است، با این تفاوت که در تابع تنها از خاصیت intent(in) استفاده میشود. اما در سابروتین از intent(in)، intent(out) و intent(inout) استفاده میگردد. • با توجه به نکته اخیر این مطلب را باید به حافظه سپرد که: • در تعاملاتی که از intent(out) و intent(inout) استفاده میشود، آرگومان واقعی متناظر با هر آرگومان صوری باید متغیر باشد و نه عبارت و یا عدد ثابت. دانشگاه صنعت آب و برق
Program Errors Implicit none Integer :: a, b, c ……………… Call& sub(1,a,a+b,(c),1+a) ……………… Contains Subroutine& sub(u,v,w,p,q) Implicit none Integer, intent(out) :: u Integer, intent(inout) ::v Integer, intent(in) :: w Integer, intent(out) :: p Integer, intent(in) :: q ……………… End Subroutine sub End Program Errors مثال دانشگاهصنعتآب و برق
Program Errors Implicit none Integer :: a, b, c ……………… Call& sub(1,a,a+b,(c),1+a) ……………… Contains Subroutine& sub(u,v,w,p,q) Implicit none Integer, intent(out) :: u Integer, intent(inout) ::v Integer, intent(in) :: w Integer, intent(out) :: p Integer, intent(in) :: q ……………… End Subroutine sub End Program Errors مثال دانشگاه صنعت آب و برق
Program Errors Implicit none Integer :: a, b, c ……………… Callsub(1, a, a+b, & (c) ,1+a) ……………… Contains Subroutine& sub(u,v,w,p,q) Implicit none Integer, intent(out) :: u Integer, intent(inout) ::v Integer, intent(in) :: w Integer, intent(out) :: p Integer, intent(in) :: q ……………… End Subroutine sub End Program Errors مثال دانشگاه صنعت آب و برق
متغیرهای محلی و سراسری یا جهانی یا کلی • متغیر محلی (local variable) • در زیربرنامهها دو نوع متغیر وجود دارد. • متغیر و یا متغیرهایی که از طریق آرگومانها (ساختگی) وارد زیربرنامه میشوند. • متغیر و یا متغیرهایی که در زیربرنامه مورد استفاده قرار میگیرند که ارتباطی با آرگومانها ندارند و به آنها متغیرهای محلی گویند. • متغیرهای محلی تنها زمانی فضای حافظه را اشغال میکنند که زیربرنامه در حال اجرا باشد. در لحظهای که زیربرنامه فراخوانی میشود، فضای حافظه برای متغیرهای محلی ایجاد میشوند. وقتی که کنترل از زیربرنامه خارج شد، متغیرهای محلی آن از حافظه پاک و محو میشوند. • متغیر جهانی یا سراسری یا کلی (global variable) • بر عکس متغیرهای محلی، بعضی از متغیرها خارج از کلیه زیربرنامهها اعلان میشوند. این متغیرها را سراسری گویند. دانشگاه صنعت آب و برق
مثال 1 Integer :: x, y Read*, x, y call swap(x,y) print*, x, y print*, temp contains subroutine swap(a,b) Integer, intent(inout) :: a, b integer :: temp temp = a a = b b = temp End subroutine End در زیربرنامه swap، متغیرهای a و b از طریق آرگومان وارد زیربرنامه شدهاند ولی متغیر temp یک متغیر محلی است. دانشگاه صنعت آب و برق
مثال 2 • Real, parameter :: pi = 3.14159 • Real :: redius • Read*, radius • Print*, area(radius) • Print*, peri(radius) • contains • Function area(r) • Real, intent(in) :: r • area = pi*r**2 • End function area • Function peri(r) • Real, intent(in) :: r • peri = 2.*r*pi • End function • End • همانطور که ملاحظه میگردد ثابت pi در برنامه اصلی و یا میزبان (host) اعلان شده است و زیربرنامهها از آن استفاده مینمایند و لزومی به اعلان pi در زیربرنامهها نیست. • به pi یک متغیر سراسری یا جهانی گویند. دانشگاه صنعت آب و برق
دنباله مثال 2 • Real, parameter :: pi = 3.14159 • Real :: redius • Read*, radius • Print*, area(radius) • Print*, peri(radius) • contains • Function area(r) • Real, intent(in) :: r • pi = 4. ! illegal • area = pi*r**2 • End function area • Function peri(r) • Real, intent(in) :: r • peri = 2.*r*pi • End function • End • چون متغیر pi سراسری است و ضمنا بهصورت ثابت نیز تعریف شده است، برنامه اجازه تغییر مقدار pi در زیربرنامه را نمیدهد. دانشگاه صنعت آب و برق
دنباله مثال 2 • Real :: redius • Read*, radius • Print*, area(radius) • Print*, peri(radius) • contains • Function area(r) • Real, intent(in) :: r • Real, parameter :: pi = 3.14159 • area = pi*r**2 • End function area • Function peri(r) • Real, intent(in) :: r • peri = 2.*r*pi • End function • End • در اینجا pi یک متغیر محلی است که فقط برای زیرنامه area عمل میکند و زیربرنامه peri چون مقدار pi را ندارد، مقدارش برابر صفر است. دانشگاه صنعت آب و برق
دنباله مثال 2 • Real :: pi = 3.14159 • Real :: redius • Print '(A\)', "Enter radius= " • Read*, radius • Print*, area(radius) • Print*, peri(radius) • contains • Function area(r) • Real, intent(in) :: r • real :: pi = 4. • area = pi*r**2 • End function area • Function peri(r) • Real, intent(in) :: r • peri = 2.*r*pi • End function • End • در اینجا مقدار pi بهصورت یک متغیر تعریف شده است. در زیربرنامه area مقدار pi برابر .4 است و مساحت با این مقدار محاسبه میشود. اما مقدار محیط با pi=3.14159 محاسبه میگردد. دانشگاه صنعت آب و برق
دنباله مثال 2 • Real :: pi = 3.14159 • Real :: redius • Print '(A\)', "Enter radius= " • Read*, radius • Print*, area(radius) • Print*, peri(radius) • contains • Function area(r) • Real, intent(in) :: r • pi = 4. • area = pi*r**2 • End function area • Function peri(r) • Real, intent(in) :: r • peri = 2.*r*pi • End function • End • در اینجا چون متغیر pi در زیربرنامه اعلان نشده است، بنابراین با برنامه اصلی تعامل ایجاد میکند. یعنی برنامه اصلی که به زیربرنامه area که میرود مقدار pi=4. میگردد و زمانی که برنامه اصلی به سراغ زیربرنامه peri میرود مقدار pi=4. خواهد بود. دانشگاه صنعت آب و برق
Program scope_2 Implicit none integer :: a=1, b=2, c=3 print*, Add(a) c=4 print*, Add(a) print*, Mul(b,c) Contains Integer Function Add(q) Integer, intent(in) :: q Add = q+c End Function Add Integer Function Mul(x,y) Integer, intent(in) :: x, y Mul = x*y End Function Mul End program scope_2 مثال 3 دانشگاهصنعتآب و برق
program scope_3 Integer :: i, Max=5 Do i=1, Max print*, Sum1(i) End do Contains Integer Function Sum1(n) Integer, intent(in) :: n Integer :: s s=0 Do i=1, n s=s+i End do Sum1=s End Function Sum1 End program scope_3 اثر جانبی (side effect) دانشگاهصنعتآبو برق
program scope_3 Integer :: i, Max = 5 Do i=1, Max print*, Sum1(i) End do Contains Integer Function Sum1(n) Integer, intent(in) :: n Integer :: s, i s = 0 Do i=1, n s = s+i End do Sum1 = s End Function Sum1 End program scope_3 اثر جانبی (side effect) دانشگاهصنعتآبو برق
زیربرنامهها و یا رویههای داخلی و خارجی • ارتباط و تعاملات بین برنامه اصلی و زیربرنامهها و یا رویهها و همچنین بین خود رویهها، شامل نکات مهم و قابل تأملی است. این نکات شامل متغیرها محلی و عمومی(مقادیر ثابت، به اشتراک گذاشتن متغیرها و ثابتها و ...) نیز میگردد. بهطور کلی در این خصوص، دو رویکرد را میتوان از یکدیگر تمیز داد. • رویکرد داخلی • همانطور که تاکنون مشاهده شد، زیربرنامهها بین دستورات contains و End پایان برنامه اصلی یا میزبان (host) احاطه شده بودند و خاصیت تو در تویی نیز برای زیربرنامه برقرار نبود. به این رویکرد، ارتباط به نحو داخلی گویند. دانشگاه صنعت آب و برق
نحو (syntax) زیربرنامه داخلی • [program name] • دستورات اعلان • دستورات اجرایی • [contains • internal subprograms] • End [program [name]] دانشگاه صنعت آب و برق
ویژگیهای رویکرد داخلی برنامه اصلی و زیربرنامهها در یک فایل قرار دارند و لذا یکجا به زبان ماشین ترجمه میشوند. واضح است که در این رویکرد نمیتوان آنها را از مجزا نمود. استفاده از این روش به سهولت انجام میشود. اگر حجم برنامه زیاد باشد ویرایش و اصلاح آن، امر نسبتاً دشواری است. برنامه جداگانه دیگری (غیر از برنامه میزبان) نمیتواند از رویههای داخلی استفاده کند، که البته این محدویت قابل ملاحظهای است. دانشگاه صنعت آب و برق
دنباله ویژگیهای رویکرد داخلی رویهها و یا زیربرنامههای داخلی تمام خصوصیات عناصر پارامترها و متغیرها ( برنامه اصلی) را به ارث میبرند. یعنی در حالت کلی تمام متغیرها و پارامترها برنامه اصلی برای زیربرنامهها قابل رؤیت و قابل استفاده هستند. مثلاً اگر در برنامه میزبان دستور implicit none را اعلان کنید، دیگر نیازی نیست که آن را در زیربرنامهها اعلان نمود. اگر عدد ثابت پی (pi) در برنامه میزبان اعلان شود، میتوان از آن در تمام رویهها (بدون اعلان مجدد) استفاده نمود، مگر این که متغیری به همین نام در رویهای اعلان گردد، که در این صورت ارتباط قطع میشود. دانشگاه صنعت آب و برق
رویکرد خارجی همانطور که مشاهده شد، رویکرد داخلی علیرغم سهولت به لحاظ محدویتهایی که داشت، کاربرد وسیعی ندارد و در مقابل آن رویکرد خارجی سامان یافته است. در این رویکرد کلیه رویهها (اعم از برنامه اصلی و زیربرنامهها) با دستور End خاتمه مییابند و یکی در داخل دیگری نیست و یا: حتی میتوانند در فایلهای مجزا قرار گیرند. در این صورت میتوانند به صورت مجزا نیز ترجمه شوند. دانشگاه صنعت آب و برق
نحو (syntax) زیربرنامه خارجی • subroutine name[(arguments)] • دستورات اعلان • دستورات اجرایی • [contains • internal subprograms] • End [subroutine [name]] • یا • function name([arguments]) • دستورات اعلان • دستورات اجرایی • [contains • internal subprograms] • End [function [name]] دانشگاه صنعت آب و برق
دنباله رویکرد خارجی • رویکرد خارجی خود به دو بخش تقسیم میشود. • برنامه اصلی و زیربرنامهها به صورت بخشهای مجزا از هم در یک و یا چند فایل (حسب مورد) قرار میگیرند و دستور contains بین آنها قرار نمیگیرد، این روش در فرترن 77 مرسوم است. • همه و یا تعدادی از زیربرنامهها در ساختاری قرار میگیرند که به آن ماژول (Module) گویند. این امکان در نسخ پایینتر زبان فرترن وجود نداشت دانشگاه صنعت آب و برق
مثال با رویکرد خارجی program Area_Volume Real :: radius Print*, 'Enter a radius' Read*, radius Print*, 'Area:', Area(radius) Print*, 'Volume:', Volume(radius) End Function Area(r) Real, intent(in) :: r Real, parameter :: pi = 3.14159 Area = pi*(r**2) End Function Volume(r) Real, intent(in) :: r Real, parameter :: pi = 3.14159 Volume = 4.0*pi*(r**3) / 3.0 End دانشگاه صنعت آب و برق
دنباله مثال با رویکرد خارجی program Area_Volume Real :: radius Real :: pi = 3.14159 common pi Print*, 'Enter a radius' Read*, radius Print*, 'Area:', Area(radius) Print*, 'Volume:', Volume(radius) End Function Area(r) Real, intent(in) :: r common pi Area = pi*(r**2) End Function Volume(r) Real, intent(in) :: r common pi Volume = 4.0*pi*(r**3)/3.0 End دانشگاه صنعت آب و برق
قطعه یا ماژول (Module) • همانطور که ملاحظه شد چندین زیربرنامه میتوانند بعد از برنامه اصلی ظاهر شوند. از نسخه 90 به بعد فرترن، این امکان وجود دارد که چند زیربرنامه را در یک جا تجمیع نمود و تشکیل یک قطعه و یا ماژول داد. • مقایسه ماژول با برنامه اصلی • ساختار ماژول بسیار شبیه برنامه اصلی است و هیچ کدام دارای آرگومان نیستند. • ماژول با واژه module شروع و با end module ختم میشود اما برنامه اصلی با program شروع و با end program به پایان میرسد. • ماژول به جز پارهای از دستورات خاص (نظیر اعلان، محدوده عمل و ...) و زیربرنامهها نمیتواند شامل دستورات دیگری باشد. • عناصر داخل ماژول نمیتوانند به تنهایی اجرا شوند و حتما باید ارتباط آن را با یک برنامه اصلی برقرار نمود. دانشگاه صنعت آب و برق
نحو (syntax) ماژول • Module name • Implicit none • Specification part • [Contains • internal subprograms] • End [module [name]] • یا • Module name • [Implicit none • Specification part] • Contains • internal subprograms • End [module [name]] دانشگاه صنعت آب و برق
یک مثال (1) ساده از ماژول Module test Implicit none Real, parameter :: pi = 3.1415926 Real, parameter :: g = 9.80 Integer :: counter End module test دانشگاه صنعت آب و برق
یک مثال (1) ساده از ماژول Module test Implicit none Real, parameter :: pi = 3.1415926 Real, parameter :: g = 9.80 Integer :: counter End module test قسمت ویژه دانشگاه صنعت آب و برق