2012-03-26 30 views
38

क्या हम सी प्रोग्रामिंग भाषा में structs में कार्यों को परिभाषित कर सकते हैं?structs में कार्यों को परिभाषित करें

+0

खैर, यह इंटरनेट का हिस्सा है, इसलिए ... – Jon

+1

आप struct एक तरह कुछ मतलब है {शून्य च (शून्य) {...}}; ? – tchap

उत्तर

56

नहीं, क्योंकि फ़ंक्शन डेटा नहीं हैं। लेकिन आप एक संरचना के अंदर फ़ंक्शन पॉइंटर्स को परिभाषित कर सकते हैं।

struct foo { 
    int a; 
    void (*workwithit)(struct foo *); 
} 
2

सं

आप structs में समारोह संकेत हो सकता है, लेकिन उस के रूप में पास के रूप में आप मिल जाएगा है।

1

नहीं, आप नहीं कर सकते। संरचनाओं में केवल चर शामिल हो सकते हैं, संरचना के अंदर फ़ंक्शन पॉइंटर्स संग्रहीत करने से आपको वांछित परिणाम मिल सकते हैं।

0

नहीं, आप नहीं कर सकते सी कार्यक्रमों में संरचनाओं के अंदर कार्यों को परिभाषित, लेकिन अगर आपकी फ़ाइल का विस्तार सीपीपी (है कि नहीं सी), आप वर्गों की तरह सदस्य कार्य कर सकते हैं हालांकि इनमें से डिफ़ॉल्ट संशोधक कार्य 'सार्वजनिक' (कक्षा के विपरीत) होंगे।

संरचनाएं a good link, another good link बारे में अधिक जानकारी के लिए इन लिंक पढ़ें, One more good link

सी में एक सम्मेलन ++ के रूप में, क्लासेसभंडारण कार्य करता है और चर दोनों और संरचनाएं के लिए उपयोग किया जाता है उपयोग किया जाता है केवल भंडारण के लिए सूचना (यानी डेटा)

+5

आप शायद क्या मतलब है: "हालांकि, अगर आप इसे एक अलग प्रोग्रामिंग भाषा में संकलित करते हैं जिसे सी ++ कहा जाता है ..." – Lundin

+0

आप सही हैं @ लुंडिन, दरअसल स्तर पर कुछ छात्र खुद को सी कोड को .cpp फ़ाइल के अंदर लिखकर भ्रमित करते हैं, जो वास्तव में एक बुरा अभ्यास है। – aProgrammer

19

आप वास्तव में सी में एक संरचना के अंदर सामान घोषित नहीं कर सकते हैं। यह सी ++ या कोई अन्य ओओ भाषा नहीं है जहां कोई वस्तु किसी प्रकार के दायरे को समाहित करती है।

सी structs बहुत सरल वस्तुएं हैं, यह स्मृति के एक टुकड़े के प्रबंधन के लिए सिर्फ वाक्य रचनात्मक चीनी है। जब आप नई संरचना "इंस्टेंस" बनाते हैं, struct A a;, कंपाइलर केवल अपने आकार के अनुसार स्टैक स्पेस को सुरक्षित करता है, और जब आप a.member करते हैं, तो कंपाइलर उस सदस्य के ऑफसेट को जानता है, इसलिए यह उस सदस्य के ऑफसेट &a + पर जाता है। वे ऑफ़सेट आमतौर पर पिछले सदस्यों के आकार के बराबर नहीं होते हैं, क्योंकि संकलक आमतौर पर स्मृति में कुछ पैडिंग बिट्स को स्मृति में संरेखित करने के लिए जोड़ता है।

आशा है कि इससे थोड़ा सा मदद मिलेगी। आप स्पष्ट रूप से सी स्टैक्चर से थोड़ा अधिक उम्मीद करते हैं :-)

4

नहीं, आपके पास सी प्रोग्राम में संरचना के अंदर फ़ंक्शन नहीं हो सकते हैं। मैंने एक कोड लिखा और एक .c और a .cpp के रूप में सहेजा। .cpp फ़ाइल अपेक्षा के अनुसार अनुपालन करती है और काम करती है, लेकिन .c फ़ाइल संकलित भी नहीं होती है।

यहां आपके संदर्भ के लिए कोड है। इसे एक बार .cpp के रूप में सहेजें और फिर इसे चलाएं। फिर उसी कोड को .c के रूप में सहेजें और इसे संकलित करें। आपको एक संकलन त्रुटियां मिलेंगी।

#include <stdio.h> 
struct C { 
    void Test(int value) { 
     static int var = 0; 
     if (var == value) 
      printf("var == value\n"); 
     else 
      printf("var != value\n"); 

     var = value; 
    } 
}; 

int main() { 
    C c1; 
    C c2; 
    c1.Test(100); 
    c2.Test(100); 
    int ii; 
    scanf("%d",&ii); 
} 
+0

जब से ** ** ** ** ** के अंदर संभव नहीं है ** प्रोग्राम? – baldrs

+0

मेरा मतलब था। एसी प्रोग्राम में स्ट्रक्चर। –

+0

को ठीक कर देगा। धन्यवाद। –

-2

नहीं, लेकिन आप सी ++ संरचना में कर सकते हैं!

+0

इसलिए मैंने "नो" के साथ अपने प्रश्न का उत्तर दिया। क्या आप उस हिस्से को याद करते थे? – NDEthos

-1

हाँ आप संरचना के अंदर फ़ंक्शन घोषित कर सकते हैं कृपया निम्नलिखित स्निपेट देखें।

#include<stdio.h> 
struct A 
{ 
     int a; 
     void (*ptr)(const struct A*); 
}; 
void display(const struct A*p) 
{ 
     //p->a = 10; //It is not possible because structure is constant 
     printf("Display fun :%d\n",p->a); 
} 
void print(struct A*ptr) 
{ 
     ptr->a = 20; 
     printf("Print fun :%d\n",ptr->a); 
} 

int main() 
{ 
     struct A obj = {5}; //Structure initialization 
     display(&obj); 
     print(&obj); 
     return 0; 
} 
संबंधित मुद्दे