لا يتعرف برنامج التحويل البرمجي Ifort على الواجهة في Fortran

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

سؤال

عندما أحاول تجميع الكود ضمن العبارة مع 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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top