ومتغير روتين فرعي تخصيص عند استدعاء ENTRY قبل استدعاء روتين

StackOverflow https://stackoverflow.com/questions/1020464

  •  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 وتخصيص، ثم تتغير الأمور. في هذه الحالة، وأنا واثق من الفيليين أنه لن يحصل المخصصة. وسيكون لديك حادث تحطم طائرة، ولكن هذا سؤال آخر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top