2012-10-19 44 views
7

मैं सी प्रोग्रामिंग के लिए नया नहीं हूँ। लेकिन मुझे समझ में नहीं आता कि पॉइंटर को सी में संरचना सदस्य के रूप में कार्य करने के लिए उपयोगिता क्या है। उदा।सी में उपयोगी संरचना सदस्य के रूप में कार्य करने के लिए कैसे पॉइंटर्स?

// Fist Way: To keep pointer to function in struct 
    struct newtype{ 
     int a; 
     char c; 
     int (*f)(struct newtype*); 
    } var; 
    int fun(struct newtype* v){ 
     return v->a; 
    } 

    // Second way: Simple 
    struct newtype2{ 
     int a; 
     char c; 
    } var2; 
    int fun2(struct newtype2* v){ 
     return v->a; 
    } 

    int main(){ 

     // Fist: Require two steps 
     var.f=fun; 
     var.f(&var); 

     //Second : simple to call 
     fun2(&var2);  
    } 

क्या प्रोग्रामर इसका उपयोग ऑब्जेक्ट ओरिएंटेड (ओओ) आकार को सी कोड देने और सार वस्तु प्रदान करने के लिए करते हैं? या कोड तकनीकी देखने के लिए।

मुझे लगता है कि उपरोक्त कोड में दूसरा तरीका अधिक सभ्य और सुंदर है। मुट्ठी के रास्ते में, हमें अभी भी &var पास करना होगा, यहां तक ​​कि fun() संरचना का सदस्य है।

यदि संरचना परिभाषा के भीतर फ़ंक्शन पॉइंटर रखना अच्छा होता है, तो कृपया कारण को समझाने में सहायता करें।

+2

सी ++ कक्षाओं में आभासी कार्यों के बारे में सोचें। वे हुड के नीचे एक ही फैशन में लागू होते हैं। –

+2

[एम्बेडेड सिस्टम में फ़ंक्शन पॉइंटर्स के संबंध में] (http://stackoverflow.com/questions/4836245/function-pointers-in-embedded-systems-are-they-useful)। – Lundin

+0

धन्यवाद @ लंदन! वास्तव में बहुत उपयोगी और दिलचस्प जवाब मैंने पाया। –

उत्तर

11

संरचना पर कार्य करने के लिए एक पॉइंटर प्रदान करने से आप गतिशील रूप से संरचना पर प्रदर्शन करने के लिए कौन सा फ़ंक्शन चुन सकते हैं।

struct newtype{ 
    int a; 
    int b; 
    char c; 
    int (*f)(struct newtype*); 
} var; 


int fun1(struct newtype* v){ 
     return v->a; 
    } 

int fun2(struct newtype* v){ 
     return v->b; 
    } 

void usevar(struct newtype* v) { 
    // at this step, you have no idea of which function will be called 
    var.f(&var); 
} 

int main(){ 
     if (/* some test to define what function you want)*/) 
      var.f=fun; 
     else 
      var.f=fun2; 
     usevar(var); 
    } 

यह आपको केवल एक कोड बनाए रखने की क्षमता देता है, लेकिन दो अलग-अलग फ़ंक्शन को कॉल करने की क्षमता देता है बल्कि आपका परीक्षण मान्य है या नहीं।

+0

यह सब सोचता है ना ... C++ (रन टाइम या संकलन बाध्यकारी) में polymorphism कहा जाता है –

1

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

उदा।

struct_my_filesystem.open=my_open; 
struct_my_filesystem.read=my_read; 

आदि

10
इसके उपयोगी

यदि आप "वस्तु आधारित" प्रोग्रामिंग किसी प्रकार का यही प्रयास है।

यदि आपने कभी क्वैक 3 इंजन के स्रोत कोड को देखा है .. आप स्पष्ट रूप से देख सकते हैं कि अधिकांश "इकाइयों" में वे गुण होते हैं जो उन्हें परिभाषित करते हैं, और वे जो काम करते हैं [जो फ़ंक्शन पॉइंटर्स हैं]।

अलग-अलग गुण और कार्य (सी में फ़ंक्शन पॉइंटर्स के माध्यम से) एक "संरचना" ऑब्जेक्ट के गुणों और क्रियाओं को परिभाषित करता है जो वे कर सकते हैं।

उदाहरण के लिए:

struct _man{ 
    char name[]; 
    int age; 
    void (*speak)(char *text); 
    void (*eat)(Food *foodptr); 
    void (*sleep)(int hours); 
    /*etc*/ 
}; 

void grijesh_speak(char *text) 
{ 
    //speak; 
} 

void grijesh_eat(Food *food) 
{ 
    //eat 
} 

void grijesh_sleep(int hours) 
{ 
    //sleep 
} 

void init_struct(struct _man *man) 
{ 
    if(man == NULL){ man = malloc(sizeof(struct _man));} 
     strcpy(*man.name,"Grijesh"); 
     man->age = 25; 
     man->speak = grijesh_speak; 
     man->eat = grijesh_food; 
     man->sleep = grijesh_sleep; 
//etc 
} 

//so now in main.. i can tell you to either speak, or eat or sleep. 

int main(int argc, char *argv[]) 
{ 
    struct _man grijesh; 
    init_struct(&grijesh); 
    grijesh.speak("Babble Dabble"); 
    grijesh.sleep(10); 
    return 0; 
} 
1

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

यह ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग करते समय आप जो करते हैं उसके समान ही है। सी में, आप आमतौर पर संदर्भ चर के आसपास गुजरते हैं, उदा। एक संरचना, चर के एक सेट को समूहबद्ध करना और संभावित रूप से कार्य जो उस संदर्भ के लिए सार्थक हैं। यह ओओ प्रोग्रामिंग में eqvuivalent के करीब है, जहां आप एक वर्ग को तत्काल बनाते हैं और उदाहरण पर आवश्यक चर सेट करते हैं।

2

मैंने जेनिक कंटेनर को सी में लागू करने के लिए अतीत में इसका उपयोग किया है।

उदाहरण के लिए:

typedef struct generic_list_node { 
    void *data; 
    struct generic_list_node *next; 
} generic_list_node_t; 

typedef struct generic_list { 
    generic_list_node_t *head; 
    void *(*copy)(void *data);     
    void (*delete)(void *data);     
    int (*compare)(void *lhs, void *rhs);  
    void (*display)(void *data, FILE *stream); 
} generic_list_t; 

सूची संरचना ही void * का उपयोग कर डेटा आइटम, और कार्यों से ऊपर संकेत द्वारा संकेत के प्रतिनिधियों सभी प्रकार अवगत संचालन प्रतिनिधित्व करने के लिए, डेटा नास्तिक है:

int insert(generic_list_t l, void *data) 
{ 
    generic_list_node_t *cur = l.head; 
    generic_list_node_t *new = malloc(sizeof *new); 
    if (new) 
    { 
    new->data = l.copy(data); 
    new->next = NULL; 

    if (l.head == NULL) 
    { 
     l.head = new; 
    } 
    else 
    { 
     while (cur->next && l.compare(new->data, cur->data) > 0) 
     cur = cur->next; 
     new->next = cur->next; 
     cur->next = new; 
     printf("Successfully added "); 
     l.display(data, stdout); 
     printf(" to list\n"); 

    } 
    return 1; 
    } 

    return 0; 
} 

1. का उपयुक्त रूप से ढीला परिभाषा देखने के लिए "सामान्य" और "कंटेनर"

+0

उत्कृष्ट उपयोग ... धन्यवाद –

1

फ़ंक्शन पॉइंटर्स की उपयोगिता की व्याख्या करने में सहायता करने के लिए यहां एक प्रोजेक्ट है। विरासत और बहुरूपता प्रदान करने वाली सी-आधारित लाइब्रेरी बनाने का प्रयास करें। या, "वर्गों के साथ सी" को पुनः प्रयास करें और पुनः बनाएं। संरचनाओं के अंदर फंक्शन पॉइंटर्स महत्वपूर्ण होंगे। http://www.cs.rit.edu/~ats/books/ooc.pdf

+0

यह उत्कृष्ट संदर्भ था ... धन्यवाद! –

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

  • कोई संबंधित समस्या नहीं^_^