खोज…


फोरट्रान से सी बुला रहा है

फोरट्रान 2003 ने भाषा की विशेषताएं पेश कीं जो सी और फोरट्रान (और एक मध्यस्थ के रूप में सी का उपयोग करके अधिक भाषाओं में) के बीच अंतर की गारंटी दे सकती हैं। इन सुविधाओं को ज्यादातर आंतरिक मॉड्यूल iso_c_binding माध्यम से एक्सेस किया जाता है:

use, intrinsic :: iso_c_binding

यहां intrinsic कीवर्ड यह सुनिश्चित करता है कि सही मॉड्यूल का उपयोग किया जाए, न कि उपयोगकर्ता उसी नाम का मॉड्यूल बनाए।

iso_c_binding अंतर- प्रकार के मापदंडों तक पहुँच प्रदान करता है:

integer(c_int) :: foo    ! equivalent of 'int foo' in C
real(c_float) :: bar     ! equivalent of 'float bar' in C

सी प्रकार के मापदंडों का उपयोग यह गारंटी देता है कि डेटा को सी और फोरट्रान कार्यक्रमों के बीच स्थानांतरित किया जा सकता है।

सी चार और फोरट्रान वर्णों की पारस्परिकता संभवतः अपने लिए एक विषय है और इसलिए यहां चर्चा नहीं की गई है


वास्तव में फोर्ट्रान से C फ़ंक्शन को कॉल करने के लिए, पहले इंटरफ़ेस को घोषित किया जाना चाहिए। यह अनिवार्य रूप से C फंक्शन प्रोटोटाइप के बराबर है, और कंपाइलर को संख्याओं और प्रकार के तर्कों इत्यादि के बारे में जानने देता है, bind विशेषता का उपयोग सी में फंक्शन का नाम बताने के लिए किया जाता है, जो फ़ॉर्टन के लिए भिन्न हो सकता है नाम दें।

geese.h

// Count how many geese are in a given flock
int howManyGeese(int flock);

geese.f90

! Interface to C routine
interface
  integer(c_int) function how_many_geese(flock_num) bind(C, 'howManyGeese')
    ! Interface blocks don't know about their context,
    ! so we need to use iso_c_binding to get c_int definition
    use, intrinsic :: iso_c_binding, only : c_int
    integer(c_int) :: flock_num
  end function how_many_geese
end interface

सी पुस्तकालय के खिलाफ जुड़े होने की फोरट्रान कार्यक्रम की जरूरत है (संकलक निर्भर है, यहाँ शामिल हैं?) इस बात का कार्यान्वयन भी शामिल howManyGeese() , और उसके बाद how_many_geese() फोरट्रान से कहा जा सकता है।

फोरट्रान में सी संरचनाएं

bind विशेषता को भी व्युत्पन्न प्रकारों पर लागू किया जा सकता है:

geese.h

struct Goose {
   int flock;
   float buoyancy;
}

struct Goose goose_c;

geese.f90

use, intrinsic :: iso_c_binding, only : c_int, c_float

type, bind(C) :: goose_t
  integer(c_int) :: flock
  real(c_float) :: buoyancy
end type goose_t

type(goose_t) :: goose_f

डेटा अब goose_c और goose_f बीच स्थानांतरित किया जा सकता है। C रूटीन जो Goose टाइप के तर्क लेते हैं, उन्हें Fortran से type(goose_t) साथ बुलाया जा सकता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow