2010-12-14 19 views
12

मैं मज़ा में सी में एक ढेर बनाने की कोशिश कर रहा हूं, और ढेर का प्रतिनिधित्व करने के लिए संरचना का उपयोग करने के विचार के साथ आया हूं। फिर मैं पुश() और पॉप() संचालन के लिए संरचना में फ़ंक्शन पॉइंटर्स जोड़ता हूं।सी में "यह" सूचक (सी ++ नहीं)

अब तक यह सब अच्छा लगता है, लेकिन, पुश() और पॉप() फ़ंक्शंस के कार्यान्वयन के लिए मुझे इसे किसी भी तरह से संदर्भित करने की आवश्यकता है। वह कैसे कर सकता है (कर सकते हैं?)?

यह मेरा struct

struct Stack { 
    int *data; 
    int current_size; 
    int max_size; 
    int (*push)(int); 
    int (*pop)(); 
}; 

है और एक उदाहरण के रूप में यहाँ आप कल्पना कर सकते हैं धक्का

int push(int val) { 
    if(current_size == max_size -1) 
      return 0; 

    data[current_size] = val; 
    current_size++; 

    return 1; 
} 

है, संकलक पता नहीं क्या current_size, के रूप में यह stack->current_size की तरह कुछ उम्मीद होती है।

क्या किसी भी तरह से इसे दूर करना संभव है?

+0

आपकी स्टैक संरचना में फ़ंक्शन पॉइंटर्स का क्या बिंदु है? – Nyan

+0

इस प्रकार के ढेर को कॉल करने के लिए यह संभव है कि इसका उत्तर पाने का प्रयास करें: 'stack-> push (10);'। अब, अगर उत्तर यहां नहीं दिया गया है तो मुझे पूरा भरोसा हो सकता है कि यह वास्तव में असंभव है। – foo

उत्तर

26

कोई अंतर्निहित this सी में यह स्पष्ट नहीं है बनाओ:

int push(Stack* self, int val) { 
    if(self->current_size == self->max_size - 1) 
      return 0; 

    self->data[self->current_size] = val; 
    (self->current_size)++; 

    return 1; 
} 

आप निश्चित रूप से होगा push और इसी तरह के तरीकों के लिए हर कॉल में struct सूचक पारित करने के लिए की है।

यह अनिवार्य रूप से सी ++ कंपाइलर आपके लिए कर रहा है जब आप कक्षा के रूप में Stack परिभाषित करते हैं और push एट अल विधियों के रूप में परिभाषित करते हैं।

+1

इस प्रकार सी ++ दृश्यों के पीछे काम करता है। यह करो। – aib

+3

यह विचार है, लेकिन एक चर के रूप में 'this' का उपयोग करना अजीब है, अगर कोई कभी भी आपके सी को C++ प्रोग्राम में शामिल करने का प्रयास करता है। –

+0

@ एआईबी, @ विक्टर: अच्छे अंक; मैंने जवाब संपादित कर लिया है। धन्यवाद। – NPE

1

सी इस तरह काम नहीं करता है। यह ऑब्जेक्ट उन्मुख भाषा नहीं है। कार्य संरचनाओं में हेरफेर करने वाले कार्यों को संरचना के लिए एक तर्क के रूप में एक सूचक लेने की आवश्यकता है।

0

आपके फ़ंक्शन पॉइंटर्स विधियां नहीं हैं इसलिए उनके पास कॉलिंग ऑब्जेक्ट के बारे में कोई जानकारी नहीं है। जो भी आप चाहते हैं उसे करने का एकमात्र तरीका ऑब्जेक्ट में पॉइंटर में पास करना है, या उस पॉइंटर ग्लोबल को बनाना है (बाद वाला अनुशंसित नहीं है)।

-2

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

+4

आपने अपनी कार को अंदर की चाबियों से बंद कर दिया है। –

+0

यह स्पष्ट प्रतीत होता है। इसके बारे में कुछ नहीं था, इसे आजमाएं। धन्यवाद – foo

+0

मुझे आश्चर्य है कि इस साइट पर अलग-अलग उपयोगकर्ता दूसरों के सामने प्रश्न देखते हैं। मैं नहीं देखता कि इस तरह के एक प्रश्न को एक मिनट से भी कम समय में चार उत्तरों मिल सकते हैं। – ThomasMcLeod

2

सी में सामान्य दृष्टिकोण पहले पैरामीटर के रूप में this की अपेक्षा करता है।

int push(Stack *self, int val) 
{ 
    if (self->current_size == self->max_size -1) return 0; 
    self->data[self->current_size++] = val; 
    return 1; 
} 

यह अतिरिक्त लाभ यह है कि, जब तक आप बहुरूपता की जरूरत है, तो आप ढेर में डाल करने के लिए काम करता है, क्योंकि आप बस stack->push(stack,10) के बजाय push(stack, 10) कह सकते हैं की जरूरत नहीं है नहीं है।

+0

धन्यवाद। यह मेरा पहला दृष्टिकोण था, लेकिन मैं फ़ंक्शन पॉइंटर्स के साथ कुछ मज़े करना चाहता था और देखना चाहता था कि सी ++ व्यवहार प्राप्त करने के लिए सी प्राप्त करना कितना दूर था। इसका उद्देश्य खुद को और प्रयोग को शिक्षित करना है, कुछ भी गंभीर नहीं है। मैं मानता हूं कि 'पुश (स्टैक, 10)' का उपयोग सी में करने के लिए सबसे समझदार बात है। – foo

-1

के बाद से अपने केवल एक ढेर संरचना के लिए (है कि आप ढेर जाहिरा तौर पर नामित किया गया,) जा रहे हैं, आप इसे एक वैश्विक चर के रूप में परिभाषित कर सकते हैं। यह पॉप/पुश को स्टैक वैरिएबल को सीधे संदर्भित करने की अनुमति देगा।

आप कुछ ऐसा करेंगे:

ढेर।current_size + = 4;

या का उपयोग -> ऑपरेटर अगर आप ढेर करने के लिए एक स्मृति सूचक के रूप में ढेर घोषित करने के लिए निर्णय लेते हैं।

-1
#include <stdio.h> 
#include <stdlib.h> 
#include <malloc.h> 


typedef struct _foo 
{ 
    int q; 
    void (*Bar)(); 
} Foo; 
Foo * This; 

Foo * foo(Foo * f) 
{ 
    This = f; 
    return f; 
} 

void Bar() 
{ 
    printf("%i\n",This->q); 
    This->q++; 
} 


Foo * FooNew() 
{ 
    Foo * foo = malloc(sizeof(Foo)); 
    foo->q = 1; 
    foo->Bar = &Bar; 
} 

int main() 
{ 
    Foo *f = FooNew(); 
    Foo *g = FooNew(); 


    foo(f)->Bar(); 
    foo(f)->Bar(); 
    foo(f)->Bar(); 

    foo(g)->Bar(); 
    foo(g)->Bar(); 
    foo(g)->Bar(); 

    return 0; 
}