صفائف السلاسل في جسور فورتران-سي باستخدام ربط متساوي

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

سؤال

أنا أكتب التعليمات البرمجية التي سوف استدعاء وظيفة ج من فورتران باستخدام آلية التشغيل البيني ج فورتران (قدم في فورتران 2003 وتنفيذها في إصدارات أحدث من غفورتران و إيفورت).

هذه الإجابة هو تقريبا ما أحتاج ، ولكن لا أستطيع الحصول تماما رأسي حول ما واجهة إعلان يجب أن تستخدم في فورتران ل ج وظيفة التي تبدو مثل هذا:

int use_array(int n, char * array[]){
    int i;
    for(i=0; i<n; i++){
        printf("Item %d = %s\n",i,array[i]);
    }
    return n;
}

لست واضحا ما يجب أن يكون الإعلان للواجهة في نهاية فورتران:

interface
    function use_array(n, x) bind(C)
        use iso_c_binding
        integer (c_int) use_array
        integer (c_int), value :: n
        character(c_char) WHAT_SHOULD_GO_HERE? :: x
    end function use_array
end interface

أعلم أنني سأضطر إلى التعامل مع مشكلة الإنهاء الفارغ أيضا.

هل كانت مفيدة؟

المحلول

الطريقة التي نقوم بها هي استخدام C_PTR صفيف للإشارة إلى السلاسل.على سبيل المثال:

CHARACTER(LEN=100), DIMENSION(numStrings), TARGET :: stringArray
TYPE(C_PTR), DIMENSION(numStrings) :: stringPtrs

ثم وضعنا سلاسل لدينا في stringArray, ، تذكر أن تنهيها مثل:

DO ns = 1, numStrings
   stringArray(ns) = "My String"//C_NULL_CHAR
   stringPtrs(ns) = C_LOC(stringArray(ns))
END DO

وتمرير stringPtrs إلى وظيفة ج.

وظيفة ج لديه واجهة:

void stringFunc(int *numStrings, char **stringArray) {
    int i;
    for(i=0;i<*numStrings;++i) {
       printf("%s\n",stringArray[i]);
    }
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top