الرمز كما هو معروض ليس فورتران القانوني. يجعل بيان الاستخدام داخل الجسم الواجهة اسمًا متاحًا هو نفس الوسيطة الوهمية. هذا ينتهك قواعد النطاق في اللغة.
يبدو أن عبارة الاستخدام داخل جسم الواجهة لا لزوم لها.
سؤال
عندما أحاول تجميع الكود ضمن العبارة مع IFORT ، فإنه يعيد الخطأ على النحو التالي:
error #8169: The specified interface is not declare
لكنه يعمل بشكل مثالي على Gfortran ، لسبب ما يجب أن أستخدم برنامج التحويل البرمجي Intel لتجميع هذا العمل. اللغة التي أستخدمها هي فورتران. والسبب في ذلك هو أن برنامج التحويل البرمجي "Ifort" لا يرى المتغيرات في الواجهة. لذلك أقوم بتطوير وحدة نمطية تسمى var لإصلاح ذلك. واستخدامه في كل الكتل. لكنه يعود خطأ:
This USE statement is not positioned correctly within the scoping unit.
وحدة VAR مثل المتابعة:
MODULE VAR
CHARACTER(50) :: callbackID
END MODULE
كيف يمكنني إصلاح المشكلة شكرا جزيلا! إصدار المترجم الخاص بي هو Ifort 12.1.0
MODULE DEMO
USE VAR
INTERFACE
SUBROUTINE callback_prototype(callbackID)
USE VAR
CHARACTER(*) :: callbackID
END SUBROUTINE callback_prototype
END INTERFACE
PROCEDURE( callback_prototype ), POINTER :: f_ptr => NULL()
CONTAINS
SUBROUTINE set_callback(func)
IMPLICIT NONE
EXTERNAL :: func
f_ptr => func
call HELLO
END SUBROUTINE
SUBROUTINE invoke_callback(callbackID)
CHARACTER(*) :: callbackID
if (associated(f_ptr)) call f_ptr(callbackID)
END SUBROUTINE
SUBROUTINE HELLO
IMPLICIT NONE
!dosomthing
END SUBROUTINE
END MODULE
المحلول
الرمز كما هو معروض ليس فورتران القانوني. يجعل بيان الاستخدام داخل الجسم الواجهة اسمًا متاحًا هو نفس الوسيطة الوهمية. هذا ينتهك قواعد النطاق في اللغة.
يبدو أن عبارة الاستخدام داخل جسم الواجهة لا لزوم لها.
نصائح أخرى
لا أرى السبب في أنك تريد بيان الاستخدام في الواجهة في المقام الأول. حتى الواجهة يمكن تخطيها ، لأن لديك الإجراء الصحيح الذي يمكن الوصول إليه:
PROCEDURE( invoke_callback ), POINTER :: f_ptr => NULL()