ومتغير روتين فرعي تخصيص عند استدعاء ENTRY قبل استدعاء روتين
-
06-07-2019 - |
سؤال
ولدي التعليمات البرمجية التي تدعو إلى ENTRY
في SUBROUTINE
قبل SUBROUTINE
. هي المتغيرات المخصصة؟
SUBROUTINE foo
character*5 A,B,C
DIMENSION IA(50),IB(50)
print* A,B,C
RETURN
ENTRY bar
DO 50 I=1,50
TOTAL = TOTAL + IA(I)
50 CONTINUE
print* TOTAL
RETURN
END
وحتى لو كنت CALL bar
قبل foo
المخصصة IA
؟
المحلول
وبقدر ما أعرف، لا التهيئة تجري على كومة تخصيص البيانات إلا إذا كان لديك مفتاح خاص أثناء الترجمة، وهذا ما لا تواجدها في جميع المجمعين (IBM XLF له ذلك، ولكن لا أتذكر ذلك).
وهذا يعني أن تلك المصفوفات سوف تكون كاملة من القمامة العشوائية.
في أي حال، أقترح بشدة أن <م> لا م> استخدام المدخل ما لم تتوقف حياتك على ذلك. كما كنت عرضه، وأنا لا أرى سببا لاستخدامها، وإلا وضع الدولة مسبقا ثم استدعاء رمز الدخول، ولكن هناك أفضل بكثير، وبدائل أكثر نظافة.
إذا كنت تعني المخصصة، ثم يفعل بالتأكيد. هذا الرمز
program hello
call bar
end
SUBROUTINE foo
character A(12345)
a(1) = "hello"
ENTRY bar
print *, a(1)
RETURN
END
ويحصل على ترجمة لهذا الرمز (الاشياء طويلة)
.globl _bar_
_bar_:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -8(%ebp)
movl $1, -4(%ebp)
subl $4, %esp
pushl $0
leal -12(%ebp), %eax
pushl %eax
leal -4(%ebp), %eax
pushl %eax
call ___g95_master_0__
addl $16, %esp
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
leave
ret
.globl _foo_
_foo_:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -8(%ebp)
movl $0, -4(%ebp)
subl $4, %esp
pushl $0
leal -12(%ebp), %eax
pushl %eax
leal -4(%ebp), %eax
pushl %eax
call ___g95_master_0__
addl $16, %esp
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
leave
ret
والذي كما ترون هو في الأساس نفسه (وهي المدخل ليست سوى "نسخ" الروتين بالنسبة للجزء التهيئة، ثم مفترق وقت لاحق) التخصيص الفعلي يحدث في ___ g95_master_0 _
___g95_master_0__:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $12372, %esp
call L8
وأين ترى أن مؤشر مكدس decremented، ويمكنك أن ترى ذلك يحصل على استدعاء في كل من الروتين.
وبطبيعة الحال، إذا الجزء الأول يحتوي على متغير ALLOCATABLE وتخصيص، ثم تتغير الأمور. في هذه الحالة، وأنا واثق من الفيليين أنه لن يحصل المخصصة. وسيكون لديك حادث تحطم طائرة، ولكن هذا سؤال آخر.