2013-10-30 12 views
6

की इंटरऑपरेबिलिटी सी सी वैरिएडिक फ़ंक्शन घोषित करने और इसे फोरट्रान से कॉल करने का कोई तरीका है? मुझे स्ट्रिंग के साथ लेबल किए गए वैक्टरों के बीच कुछ डॉट उत्पादों की गणना करने के लिए इस फ़ंक्शन को कॉल करने की आवश्यकता है। मेरा विचार निम्न जैसा कुछ घोषित करना था, जहां तर्कों की परिवर्तनीय सूची में स्ट्रिंग अक्षर शामिल हैं। यदि तर्कों की परिवर्तनीय सूची खाली है, तो मैं मानक लेबल के बीच एक लुकअप करता हूं और गणना करता हूं। उपयोगकर्ता दो लेबल उल्लेख किया था तो मैं उन दो वैक्टर निकालते हैं और उनके डॉट उत्पाद मिलेगा: केवल समस्या यह है कि मैं अपने सी पुस्तकालय संकलन और एक फोरट्रान निष्पादन से लिंक कर सकते हैसी वैरिएडिक फ़ंक्शन और फोरट्रान

extern "C" void compute_dot_product(double * dot_product, ...) 
{ 
    va_list args; 
    va_start(args, NULL); 
    char * label1 = va_arg(args, char *); 
    if (!label1) 
    { 
     // Do standard label lookup and compute dot product 
    } 
    else 
    { 
     // Compute dot product between the vectors with the specified labels 
     char * label2 = va_arg(args, char *); 
    } 
    va_end(args); 
} 

, लेकिन मैं एक क्रम त्रुटि मिलती है जब मैं तर्कों की परिवर्तनीय सूची तक पहुंचने का प्रयास करता हूं। कोई विचार अगर मैं क्या करने की कोशिश कर रहा हूं तो संभव है? एक संभावित समाधान तब दो कार्यों में विभाजित किया जाएगा: एक मानक लेबल लुकअप (0 तर्क केस), जो गैर-मानक लेबल लुकअप (2 तर्क केस) को संभालता है। हालांकि मैं इस समाधान से बचूंगा।

+0

इसे दोनों तरफ से सीडीसीएल के रूप में घोषित करने की आवश्यकता है। आपकी रनटाइम त्रुटि हो सकती है क्योंकि एक तरफ stdcall है और दूसरा cdecl है। – cup

उत्तर

3

मानक अनुरूप (यानी पोर्टेबल) तरीके से एक वैरैडिक फ़ंक्शन को कॉल करना संभव नहीं है।

आप सी फ़ंक्शन की परिभाषा केवल दो पैरामीटर ले सकते हैं (इसलिए यह अब भिन्न नहीं है - फ़ंक्शन के मौजूदा संदर्भों को संशोधित करने की आवश्यकता होगी), सी फ़ंक्शन में दूसरे पैरामीटर के साथ एक पॉइंटर, या तो NULL यह इंगित करने के लिए कि कोई अतिरिक्त चीजें पारित नहीं हो रही हैं, या किसी भी अतिरिक्त चीजों के साथ पॉइंटर्स की एक सरणी (शायद पूर्ण समाप्त) या जो भी हो, पर इशारा करते हैं। F201X में इस प्रकार के फ़ंक्शन के लिए एक इंटरफ़ेस बॉडी दूसरे तर्क के लिए वैकल्पिक विशेषता का उपयोग करने में सक्षम हो सकता है।

+0

यही एक भिन्न कार्य करता है। देखें: http://stackoverflow.com/a/19171063/1162141 – technosaurus

+0

@technosaurus मुझे टिप्पणी या लिंक किए गए उत्तर की प्रासंगिकता दिखाई नहीं दे रही है। – IanH

+0

एक भिन्न कार्य में "..." अनिवार्य रूप से पॉइंटर्स की एक सरणी है (हालांकि वे अभिन्न प्रकार हो सकते हैं) लिंक कुछ संकेतों को दिखाता है कि इन संकेतों को पहले पॉइंटर से शुरू करने के लिए सही प्रकार प्राप्त करने के लिए किया जाता है। तो आपका जवाब "..." +1 के प्रतिस्थापन के रूप में समझ में आता है। – technosaurus

संबंधित मुद्दे