صفائف السلاسل في جسور فورتران-سي باستخدام ربط متساوي
-
13-12-2019 - |
سؤال
أنا أكتب التعليمات البرمجية التي سوف استدعاء وظيفة ج من فورتران باستخدام آلية التشغيل البيني ج فورتران (قدم في فورتران 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]);
}
}
لا تنتمي إلى StackOverflow