2010-11-19 12 views
27

संरचनाओं में कार्य शामिल हो सकते हैं?संरचना में कार्य

+0

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

उत्तर

33

नहीं है, लेकिन वे समारोह संकेत हो सकते हैं।

तो हाँ, यह किया जा सकता है अपने इरादे सी में बहुरूपता के कुछ फार्म करने के लिए है, तो:

typedef struct { 
    int (*open)(void *self, char *fspec); 
    int (*close)(void *self); 
    int (*read)(void *self, void *buff, size_t max_sz, size_t *p_act_sz); 
    int (*write)(void *self, void *buff, size_t max_sz, size_t *p_act_sz); 
    // And data goes here. 
} tCommClass; 

typedef ऊपर एक संरचना मैं एक सामान्य प्रयोजन संचार पुस्तकालय के लिए बनाया के लिए किया गया था। आदेश चर आरंभ करने के लिए आपको होगा:

tCommClass *makeCommTcp (void) { 
    tCommClass *comm = malloc (sizeof (tCommClass)); 
    if (comm != NULL) { 
     comm->open = &tcpOpen; 
     comm->close = &tcpOpen; 
     comm->read = &tcpOpen; 
     comm->write = &tcpWrite; 
    } 
    return comm; 
} 

tCommClass *makeCommSna (void) { 
    tCommClass *comm = malloc (sizeof (tCommClass)); 
    if (comm != NULL) { 
     comm->open = &snaOpen; 
     comm->close = &snaOpen; 
     comm->read = &snaOpen; 
     comm->write = &snaWrite; 
    } 
    return comm; 
} 

tCommClass *commTcp = makeCommTcp(); 
tCommClass *commSna = makeCommSna(); 

फिर, कार्यों कॉल करने के लिए, कुछ की तरह:

// Pass commTcp as first params so we have a self/this variable 
// for accessing other functions and data area of object. 
int stat = (commTcp->open)(commTcp, "bigiron.box.com:5000"); 

इस तरह, एक ही प्रकार टीसीपी, SNA, RS232 के लिए इस्तेमाल किया जा सकता या यहां तक ​​कि एक ही इंटरफ़ेस के साथ वाहक पिज्जा भी।

+1

तो क्या यह अंतर बी/डब्ल्यू संरचना और कक्षाओं में से एक है? क्योंकि मुझे पता है कि केवल अंतर है कि संरचना में डिफ़ॉल्ट सार्वजनिक है और कक्षा डिफ़ॉल्ट निजी – JoshMachine

+0

@ जोश है, मुझे लगता है कि आप वास्तव में जनता/निजी के बारे में सही हैं, सी ++ में संरचना/संघ के बीच एकमात्र अंतर है। यह प्रश्न सी के बारे में था। मुझे लगता है कि 'संरचना xyz {int fn (शून्य) के बाद से C++ में फ़ंक्शन _are_ की अनुमति है; } ए; 'जी ++ में बस ठीक काम किया। – paxdiablo

+0

ओह ठीक है मुझे सी टैग नहीं मिला। संदेह को समाशोधन के लिए +1! – JoshMachine

5

संपादित करें 'डेटा प्रकार के डेटा

नहीं सी में struct प्रकार केवल शामिल कर सकते हैं के उपयोग के साथ अस्पष्टता अप को साफ कर दिया।

आईएसओ सी 99 मानक की धारा 6.7.2.1 से।

एक संरचना या संघ अधूरा या समारोह प्रकार (इसलिए, एक संरचना ही का एक उदाहरण को शामिल नहीं करेगा, लेकिन एक उदाहरण के ही के लिए सूचक हो सकता है), सिवाय इसके साथ एक सदस्य को शामिल नहीं करेगा कि एक से अधिक नाम वाले सदस्य के साथ संरचना का अंतिम सदस्य अपूर्ण सरणी प्रकार हो सकता है; ऐसी संरचना (और संभवतः युक्त कोई भी संघ, ऐसे सदस्य जो एक ऐसी संरचना है) एक संरचना का सदस्य नहीं होगा या एक सरणी के तत्व नहीं होगा।

+0

+1 मानक – Jay

+0

ओर इशारा करते हुए के लिए "शामिल डेटा प्रकार" एक खतरनाक तरीके से अस्पष्ट (कम से कम एक सी को ++ उपयोगकर्ता है, जहां वे प्रकार घोषणा कर सकते हैं) है - "डेटा होते हैं" और अधिक सटीक लगता है। हालांकि मानक में सभी स्पष्ट स्पष्ट ... :-)। –

0

सी में, संरचनाओं को डेटा मानों पर शामिल करने की अनुमति है, न कि फ़ंक्शन पॉइंटर्स। सी में अनुमति नहीं है लेकिन जीसीसी के साथ चेक किए जाने पर निम्न कार्य सचमुच ठीक काम करता है।

enter code here 

#include <stdio.h> 

struct st_func_ptr{ 
     int data; 
     int (*callback)(); 
}; 

int cb(){ 
     printf(" Inside the call back \n"); 
     return 0; 
} 

int main() { 
     struct st_func_ptr sfp = {10, cb}; 

     printf("return value = %d \n",sfp.callback()); 

     printf(" Inside main\n"); 
     return 0; 
} 

तो, भ्रमित कर रहा हूँ ...

+1

कौन कहता है कि आपके पास 'सी' में किसी स्ट्रक्चर में फ़ंक्शन पॉइंटर्स नहीं हो सकते हैं? – detly

+2

हां, ऐसा लगता है कि आप चीजों को मिला रहे हैं। फ़ंक्शन पॉइंटर्स की अनुमति है, स्वयं कार्य नहीं करते हैं। –

+0

कॉलबैक एक पॉइंटर-टू-फ़ंक्शन है जिसमें int को वापस करने वाले 0 पैरामीटर हैं। सी आप किसी भी कि हस्ताक्षर से कार्य मिलान समारोह संदर्भ द्वारा कालबैक में आवंटित करने के लिए अनुमति देगा। प्रारंभिक सूची का उपयोग यहां नया और विशेष क्या है। printf कथन वैध सी है, लेकिन अच्छी शैली नहीं है। यह इरादों के रूप में भ्रमित है और यदि आपने इसे संरचना परिभाषा से बहुत दूर देखा है तो आप इस बात से परेशान हो सकते हैं कि यह क्या था और शिकार करना है। –

0

यह सब ठीक है। लिनक्स कर्नेल कोड में, आपको कई संरचनाओं में फ़ंक्शन शामिल होंगे। जैसे:

/* 


* The type of device, "struct device" is embedded in. A class 
* or bus can contain devices of different types 
* like "partitions" and "disks", "mouse" and "event". 
* This identifies the device type and carries type-specific 
* information, equivalent to the kobj_type of a kobject. 
* If "name" is specified, the uevent will contain it in 
* the DEVTYPE variable. 
*/ 
struct device_type { 
     const char *name; 
     struct attribute_group **groups; 
     int (*uevent)(struct device *dev, struct kobj_uevent_env *env); 
     void (*release)(struct device *dev); 
     int (*suspend)(struct device * dev, pm_message_t state); 
     int (*resume)(struct device * dev); 
}; 
+0

ठीक है, वे फ़ंक्शंस के लिए पॉइंटर्स हैं - उतना ही, इसे छोड़ने के लिए कुछ प्रयास करने के अलावा, उन्हें उपयोग करने का प्रयास करने का जोखिम होता है जब वे पूर्ण या अन्यथा अमान्य होते हैं, और उन्हें रन टाइम में बदला जा सकता है .. .. –

0

हाँ इसके संभावित एक समारोह की घोषणा करने और समारोह परिभाषा की अनुमति नहीं है और कहा कि समारोह सूचक होना चाहिए।

यह सी 99 टैग की गई संरचना पर आधारित है।

लोकेश वी

0

वे कर सकते हैं, लेकिन वहाँ हमेशा की तरह सी प्रोग्रामिंग में कोई अंतर्निहित लाभ है।

सी में, सभी फ़ंक्शंस वैश्विक स्थान पर हैं, इसलिए आपको किसी फ़ंक्शन में उन्हें टकराकर छिपाने की कोई जानकारी नहीं मिलती है।पक्सडीब्लो का उदाहरण एक संरचना में कार्यों को व्यवस्थित करने का एक तरीका है, लेकिन आपको इसे देखने के लिए हर किसी को किसी भी तरह से अव्यवस्था करना होगा।

सी की मानक संगठनात्मक संरचना हैडर में इंटरफेस और स्रोत में कार्यान्वयन के साथ फ़ाइल है।

कैसे libc से किया जाता है और इस तरह लगभग सभी सी पुस्तकालयों किया जाता है यही कारण है कि।

Moder सी compilers आप को परिभाषित करने के लिए और एक ही स्रोत फ़ाइल में कार्यों को लागू, और यहां तक ​​कि हेडर फाइल में स्थिर कार्यों को लागू अनुमति देते हैं। यह दुर्भाग्य क्या हो जाता है, जहां के रूप में कुछ भ्रम की स्थिति की ओर जाता है, और आप कोई हेडर, आदि आप कार्यान्वयन से इंटरफेस को अलग करने कि जिस तरह से का लाभ खोना साथ structs में कार्यों cramming, स्रोत केवल कार्यक्रमों की तरह असामान्य समाधान प्राप्त कर सकते हैं।

0

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

#include<iostream> 
#include<cstring> 
using namespace std; 

struct full_name 
{ 
    char *fname; 
    char *lname; 
    void (*show)(char *,char*); 
}; 

void show(char *a1,char * a2) 
{ 
    cout<<a1<<"-"<<a2<<endl; 
} 

int main() 
{ 

struct full_name loki; 
loki.fname="Mohit"; 
loki.lname="Dabas"; 
loki.show=show; 
loki.show(loki.fname,loki.lname); 


return 0; 

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