2010-06-30 17 views
5

के साथ फ़ंक्शन पॉइंटर सी में ऐसा कुछ संभव है?सी, तर्क पूर्व निर्धारित

#include <stdio.h> 

void print_str(char *str) { 
     printf(str); 
} 

int main() { 

     void (*f_ptr)() = print_str,"hello world"; 

     f_ptr(); 

} 

//see "hello world" on stdout 

संक्षेप में, मैं एक फ़ंक्शन पॉइंटर रखना चाहता हूं जो तर्कों को "स्टोर" करता है। मुद्दा यह है कि फ़ंक्शन पॉइंटर को बाद में मूल डेटा के संदर्भ की आवश्यकता के बिना उपयोग किया जा सकता है।

मैं एक समारोह सूचक और एक तर्क संदर्भ

struct f_ptr { 
void (*f)(); 
void *data; 
} 

void exec_f_ptr(f_ptr *data) { 
    data->f(data->data): 
} 

जोड़ी को कुछ इस तरह इस्तेमाल कर सकते हैं लेकिन सिर्फ तर्क के अंदर के साथ एक समारोह सूचक बुला के रूप में के रूप में सुंदर नहीं होगा।

+1

आप गलत भाषा का उपयोग कर रहे हैं। दूसरा समाधान आमतौर पर सी में उपयोग किया जाता है। हम अलग-अलग हस्ताक्षरों के साथ फ़ंक्शन पॉइंटर्स नहीं ले सकते हैं और उन्हें एक ही कोड के माध्यम से कॉल करने का प्रयास कर सकते हैं। सी ++ में अधिक सुविधाएं हैं और इसके लिए बेहतर अनुकूल है, लेकिन गतिशील टाइपिंग और प्रथम श्रेणी की वस्तुओं के रूप में कार्य करने वाली भाषाएं आमतौर पर इस तरह के कोड के लिए उपयुक्त होती हैं। – stinky472

+0

आप एक मैक्रो '#define DO_FUN (डी) (डी) -> एफ ((डी) -> डेटा) परिभाषित कर सकते हैं, फिर तर्क के साथ एक पॉइंटर को कॉल करने के लिए, आप अपनी एक पंक्ति को 'DO_FUN (डेटा) में बदल देते हैं; ' – maxwellb

+0

ओह, आप निष्पादन समारोह के साथ क्या कर रहे हैं, अब मैं देख रहा हूं? उस स्थिति में, हर कोई सही है, यह आपके पास सबसे अच्छा है। – maxwellb

उत्तर

3

पाने के लिए आप मूल रूप से एक बंद करने के बजाय एक समारोह सूचक के लिए पूछ रहे हैं जा रहे हैं है - "। वस्तु" एक में जो है, डेटा और कोड ऐसी वस्तुएं मानक सी में मौजूद नहीं होती हैं - आप ऐप्पल के ब्लॉक से या अन्य भाषाओं में अज्ञात कार्यों से कुछ प्राप्त कर सकते हैं (या उन्हें समर्थन देने वाली भाषाओं में सीधे बंद होने से) लेकिन आम तौर पर आपको कुछ डेटा प्रकार बनाना होगा जैसा कि आपने खोजा है, स्वयं का।

+0

इस संरचना के बड़े कार्यान्वयन के लिए, फंक्शन पॉइंटर और तर्क, मेरा मानना ​​है कि डीआईकेयू और रॉम एमयूडी के पास कई कार्यों के लिए चारों ओर घूमने वाली संरचना की शैली थी। – maxwellb

0

नहीं, यह struct निकटतम बात आप

4

आप जो चाहते हैं वह closure या curried function है। दुर्भाग्यवश, सी में इनमें से कोई भी नहीं है। (एप्पल सी के अपने संस्करण में introduce closures किया और उम्मीद है कि वे भाषा के कुछ भविष्य संस्करण के लिए अपनाया हो जाएगा, लेकिन यह C99 का हिस्सा नहीं है।)

+0

एक करीबी कार्य बंद है? – Tyler

1

GLib support for closures है, संकेत कॉलबैक के लिए मुख्य रूप से इस्तेमाल किया। यह क्रॉस प्लेटफार्म है, और एक लायक हो सकता है (आपकी आवश्यकताओं के आधार पर)। (GLib closure API भी देखें।)

+0

दिलचस्प होने पर, यह शायद बहुत उपयोगी नहीं है क्योंकि सी में बंद होने वाले सामान्य स्थान को विरासत एपीआई के साथ उपयोग करना है जो संदर्भ को पारित करने की क्षमता को छोड़ देता है - उदाहरण के लिए, यदि आप 'qsort()' का उपयोग करना चाहते हैं लेकिन तुलना पैरामीटर पर निर्भर करती है और पर्याप्त संभावित पैरामीटर हैं जिन्हें आप प्रत्येक के लिए एक अलग कार्य नहीं कर सकते हैं। –

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