Download presentation
Presentation is loading. Please wait.
1
ادامه برنامه های فرعی عباسپور 1 متغير ها در برنامه های فرعی هر نوع متغيری که در برنامه فرعی اعلان می شود مخصوص همان برنامه است و در خارج از آن موجوديت ندارد هر متغيری که در برنامه ای فرعی اعلان شود تنها در موقع اجرای آن برنامه فرعی موجوديت پيدا می کند در هنگام احضار يک برنامه فرعی تمام متغير ها ايجاد و حافظه کافی در اختيار آنها قرار می گيرد هر گاه برنامه ای فرعی در حال اجرا نيست تمام متغير های آن از بين رفته حافظه اشغال شده آزاد می گردد
2
ادامه برنامه های فرعی عباسپور 2 لذا در پايان هر CALL يک برنامه فرعی مقادير متغير های آن از بين رفته و قابل دسترسی نخواهند بود با استفاده از دستور SAVE می توان مقادير آنها را از يک CALL تا CALL بعدی نگه داشت و مورد استفاده قرار داد ( مقادير اختصاص داده شده به هر متغير دست نخورده باقی می ماند به صورت پيش فرض By default هر متغيری که در مرحله اعلان مقدار اوليه داده شود خاصيت SAVE می گيرد دستور SAVE به صورت TYPE, SAVE:: variable name REAL, SAVE:: Keep_value
3
ادامه برنامه های فرعی عباسپور 3 مثال FUNCTION func1( a_new ) REAL :: func1 REAL :: a_new REAL, SAVE :: a_old !saved INTEGER :: counter=0 !saved... a_old = a_new counter = counter+1 END FUNCTION func1
4
ادامه برنامه های فرعی عباسپور 4 دستور COMMON جهت اشتراک داده ها بين برنامه اصلی و برنامه های فرعی فرم کلی COMMON/name/ list of variables and arrays COMMON / pool/ name1(10), arrya1 (3,3,3), inflag اين دستور در هر برنامه فرعی قرار گيرد به مقادير مربوط دسترسی خواهد داشت ترتيب نوشتن متغير ها مهم است ولی اسمی آنها می تواند در هر برنامه فرعی متفاوت باشد COMMON / pool/ a1(10), arr1 (3,3,3), dflag
5
ادامه برنامه های فرعی عباسپور 5 قطعه ها Modules اگر چه می توان از دستور Common برای به اشتراک گذاشتن داده ها در برنامه های مختلف استفاده نمود ولی وقتی اطلاعات رد وبدل شده خيلی زياد باشد استفاده از ليست آرگومانها خسته کننده خواهد بود می توان به جای آن از روش قابل انعطاف تری به نام Module استفاده نمود می دانيم که نام اختصاص داده شده به هرثابت و يا متغير فقط در داخل برنامه خود معنی و مفهوم پيدا می کند مثلاً: CHARACTER (80)::line (60) اگر اين اعلان در برنامه های مختلف آورده شود از نظر پردازنده اطلاعاتی متفاوت محسوب شده و برای هرکدام حافظه خاصی اختصاص می يابد. برای اينکه يک داده خاص بتواند در دسترس تعدادی ازبرنامه های فرعی و اصلی باشد از Module استفاده می شود.
6
ادامه برنامه های فرعی عباسپور 6 مثال Module MODULE text CHARACTER (80):: line (60) INTEGER:: linlenght, lineperpage, numpage LOGICAL:: checkin, checkout, checkspell END MODULE text با نوشتن دستور USE text در هر برنامه فرعی و يا اصلی قابل دسترسی خواهند بود انتخاب نام (text) اختياری است و هر مدول بايد نام غير تکراری داشته باشد مدول ها مثل FUNCTION و SUBROUTINE در برنامه اصلی قرار می گيرند يک مدول می تواند مدول ديگری را مورد استفاده قرار دهد و لی نه خودش را هر برنامه می تواند مشتمل بر چندين مدول باشد
7
ادامه برنامه های فرعی عباسپور 7 اجزاء با اشکال فرضی Assumed shape objects ازانجائيکه يک برنامه فرعی ممکن است به کرات در برنامه ديگری مورد استفاده قرار بگيرد که اگر چه Rank آرايه ها يکسان است ولی طول ابعاد آنها ممکن است مختلف باشد ( همينطور برای طول رشته های نويسه ای) F90 اجازه می دهد تا در برنامه های فرعی آرگومانهای ساختگی اندازه های متغيری داشته باشند. مثال: SUBROUTINE sub2(data1, data3, str) REAL, DIMENSION(:) :: data1 INTEGER, DIMENSION(:,:,:) :: data3 CHARACTER(len=*) :: str... END SUBROUTINE sub2
8
ادامه برنامه های فرعی عباسپور 8 صفت INDENT جهت وضوح برنامه نويسی INTENT(IN) يعنی اين آرگومان ساختگی قبل از احضار مقدار مشخصی داشته و در برنامه فرعی تغييری در آن حاصل نمی شود INTENT(OUT) يعنی اين آرگومان ساختگی قبل از احضار مقدار مشخصی نداشته ولی در پايان برنامه فرعی مقدار آن مشخص می شود INTENT(INOUT) يعنی اين آرگومان ساختگی قبل از احضار مقدار مشخصی داشته و در برنامه فرعی مقدار آن بروز Update می شود
9
ادامه برنامه های فرعی عباسپور 9 مثال SUBROUTINE invert(a, inverse, count) REAL, INTENT(IN) :: a REAL, INTENT(OUT) :: inverse INTEGER, INTENT(INOUT) :: count inverse = 1/a count = count+1 END SUBROUTINE invert
10
ادامه برنامه های فرعی عباسپور 10 آرگومان ها با لغت کليدی Keywords Arguments در حالت معمولی تطابق بين آرگومانهای حقيقی و ساختگی بر مبنای محل قرار گيری آنها است می توان تطابق را بر اساس اسامی آرگومانها برقرار نمود از سرگردانی جلو گيری می کند SUBROUTINE sub2(a, b, stat) INTEGER, INTENT(IN) :: a, b INTEGER, INTENT(INOUT):: stat... END SOBROUTINE sub2 می توان به صورت های زير احضار نمود CALL sub2( a=1, b=2, stat=x ) CALL sub2( 1, stat=x, b=2) CALL sub2( 1, 2, stat=x ) لغات کليدی بايد حتماً پس از ترتيب مکانی آورده شوند CALL sub2( 1, b=2, 0 ) !illegal CALL sub2( 1, stat=x, 2) !illegal
11
ادامه برنامه های فرعی عباسپور 11 آرگومانه های اختياری Optional Arguments گاهی اوقات ممکن است تمام آرگومانهای تقلبی در برنامه احضار کننده مورد نياز نباشند. می توان انها را به صورت Optional اعلان نمود SUBROUTINE sub1(a, b, c, d) INTEGER, INTENT(INOUT):: a, b REAL, INTENT(IN), OPTIONAL :: c, d... END SUBROUTINE sub1 مثال احضار CALL sub1( a, b ) CALL sub1( a, b, c, d ) CALL sub1( a, b, c ) آرگومانهای اختياری بايد به ترتيب آورده شوند CALL sub1( a, b, d ) !illegal
12
ادامه برنامه های فرعی عباسپور 12 دستور PRESENT مشخص می کند که آيا در هنگام احضار يک برنامه فرعی ارگومان بخصوص حضور دارد يا خير. مثال: REAL :: inverse_c IF( PRESENT(c) ) THEN inverse_c = 0.0 ELSE inverse_c = 1/c ENDIF از توقف برنامه به صورت ناخواسته جلوگيری می کند
13
ادامه برنامه های فرعی عباسپور 13 آرايه های ديناميکی Dynamic Arrays تاکنون تمام آرايه ها در برنامه ها به صورت استاتيکی بود يعنی حافظه ثابتی اشغال می کنند؛ در زمان اعلان و اجرای برنامه با شکل و اندازه مشخصی باشد –آرايه بايد با حداکثر اندازه محتمل مورد نياز اعلان گردد –هر بار که برنامه اجرا می شود ابعاد برنامه را تغيير دهيم و آن را مجدداً کمپايل نمائيم آرايه های ديناميکی يا تخصيص پذير (Allocatable) در زمان اعلان شکل و اندازه آنها مشخص نمی شود وحافظه ای به آنها اختصاص نمی يابد در زمان اجرا دقيقا به مقدار مورد نياز حافظه در اختيار آنها قرار می گيرد به عبارتی دارای حد بالا و پايين مشخصی نيستند
14
ادامه برنامه های فرعی عباسپور 14 مشخصات آرايه های ديناميکی نحوه اعلان: TYPE, ALLOCATABLE, [attribute]:: name در زمان اعلان مرتبه (Rank) آرايه بايد مشخص شود (با علامت”:”) ولی شکل و اندازه آنها لازم نيست: INTEGER, ALLOCATABLE:: b(:, :) !مرتبه دوم INTEGER, DIMENSION ( : ), ALLOCATABLE:: a !مرتبه اول REAL, DIMENSION ( : ), ALLOCATABL:: c REAL, ALLOCATABL:: array1 (:, :), array2 (:, : ) CHARACTER (30), ALLOCATABLE, DIMENSION (:, :, :)::name LOGICAL, ALLOCATABLE :: truetable (:,:)
15
ادامه برنامه های فرعی عباسپور 15 دادن و گرفتن حافظه Allocating & Deallocating storage با مشخص نمودن اندازه و شکل ارايه ديناميکی حافظه مورد نياز برای آن به صورت زير مشخص می شود: ALLOCAT (name) ALLOCAT (a (3425)) ALLOCAT (b (45, 25)) ALLOCAT (a (3425), b (45, 25), c (65,30,12)) اين دستور فقط می تواند برای آن دسته از آرايه ها بکار رود که قبلاً به صورت ديناميکی اعلان شده اند. مثال: READ (*,*) N ALLOCATE (c (N,N)) N هر عدد صحيح و يا عبارت محاسباتی که مقدار آن قبلاً مشخص شده باشد می تواند باشد
16
ادامه برنامه های فرعی عباسپور 16 کنترل خطا هنگام تخصيص ارايه فرم کلی ALLOCATE (name (bounds) [,STAT=icheck) STAT يک صفت اختياری برای اين دستور Icheck هر نام اختياری و يا متغير صحيح در صورت موفقيت آميز بودن مقدار آن صفر در غير ان مثبت مثال ALLOCATE ( array1 (2,2), array2 (8,12), STAT=k
17
ادامه برنامه های فرعی عباسپور 17 دستور DEALLOCATE برای آرايه ای که قبلاً ALLOCATE شده است حافظه از اين آرايه گرفته می شود فرم کلی DEALLOCATE (name, [STAT=check]) در اين دستور نياز به نوشتن شکل و اندازه آرايه نيست مثال: DEALLOCATE (a,b) DEALLOCATE (c, STAT=test) IF (test /=0) WRITE (*,*) “Deallocation error” STOP END IF
18
ادامه برنامه های فرعی عباسپور 18 توابع ALLOCATED وِِِِِ DEALLOCATED توابع منطقی هستند که آرگومان آنها بايد يک آرايه ديناميکی باشد مثال IF (ALLOCATED (a)) DEALLOCATE (b) IF (.NOT. ALLOCATED (results)) ALLOCATE & (results (4,100), noresults (5)) دستور ALLOCATE و DEALLOCATE را به کرات می توان در مورد يک آرايه در برنامه بکار برد
19
ادامه برنامه های فرعی عباسپور 19 نشت حافظه Memory leaks Allocate و Dealloctae شدن آرايه های استاتيکی توسط خود برنامه انجام می شود حافظه ای که توسط دستور Allocateاشغال شده است با دستور Deallocate يا خاتمه برنامه آزاد می شود حافظه ای که در يک برنامه فرعی (تابع و سابروتين) با دستور Allocate اشغال می شود بايد پس از خروج به صورت Deallocate در آيد. در غير اينصورت به صورت اشغال شده باقی می ماند، بدون اينکه اسم خاصی داشته باشد؛ قابل دسترسی نيز نيست. به عبارتی يک آرايه گم شده است. اگر رجوع به اين برنامه فرعی زياد شود نشت حافظه زياد می شود و ادامه برنامه ممکن است دچار اشکال و خطا در برنامه می شود که مشخص نمودن آن خيلی مشکل است
20
ادامه برنامه های فرعی عباسپور 20 مثال نشت حافظه SUBROUTINE swap (a,b) REAL, DIMENSION (:) :: a,b a و b آرايه های اتوماتيکی هستند که به صورت استاتيکی در برنامه اصلی اعلان می شوند REAL, ALLOCATABLE :: work(:) ALLOCATE (work (size (a)) Work=a a=b B=work DEALLOCATE (work) END SUBROUTINE swap
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.