2012-12-10 15 views
6

मैं इस सी कोड है कि मैं कर रहा हूँ परेशानी हो रही समझ है:।कुछ "अजीब" सी कोड

int foo(int f(int,int), int g(int,int), int x) { 

    int y = g(x,x); 
    return f(y,y); 
} 

int sq(int x, int y) { 
    if (x == 1) { return y; } 
    return pl(y, sq(x-1, y)); 
} 

int pl(int x, int y) { 
    if (x == 0) { return y; } 
    return pl(x-1, y+1); 
} 

int main (int argc, const char * argv[]) 
{ 
    printf("sq = %d\n", sq); 
    printf("output=%d\n", foo(sq, pl, 1)); 
    return 0; 
} 

मैं समझ गया कि च दो चर गुणा किया जाता है और छ गुणा किया जाता है, वे जाहिरा तौर पर में बनाया रहे फंक्शन फू में फ़ंक्शन घोषणा के रूप में घोषित दो पैरामीटर हैं -> एफ (int, int) और g (int, int)। लेकिन फिर foo दो तर्कों के साथ पारित किया जाता है - वर्ग और पीएल। दो तर्कों में भी बहुत अजीब मूल्य हैं - 33 9 2 और 3488, एसक्यू और पीएल कार्यों के उन तार्किक पते हैं? यदि वे हैं और वे पूर्णांक के रूप में पारित होते हैं, तो foo उन्हें कैसे स्वीकार करता है? चूंकि foo ने पैरामीटर के स्थान पर घोषणा की है जहां इन तर्कों पर जाना चाहिए।

धन्यवाद, संपादित करें: अच्छा, बहुत बहुत धन्यवाद, चीजों को मंजूरी दे दी!

+0

क्या यह संकलित है? मुझे नहीं लगता था कि पॉइंटर्स के बिना एक मजेदार बनाने के लिए यह आसान था .. मुझे बेवकूफ़ बनाओ, यह होना चाहिए या आप "बहुत अजीब मूल्य" कैसे देखेंगे –

+0

'% p' के साथ पता मुद्रित करें: printf (" sq =% पी \ n ", वर्ग); – perreal

+0

foo 3 तर्क लेता है - दो फ़ंक्शन (int, int) पहचानकर्ता/पॉइंटर्स और एक पूर्णांक। फू को कॉल दो कार्यों और एक पूर्णांक को गुजरता है। यह हल्का विचित्र है, लेकिन विशेष रूप से विदेशी नहीं है। –

उत्तर

4

f और g इन्हें नहीं बनाया गया है। वे केवल foo() फ़ंक्शन के पैरामीटर हैं, जैसा कि आप पहले से ही देखते हैं।

इसके अलावा, printf("sq = %d\n", sq); अपरिभाषित व्यवहार है, क्योंकि sq एक पूर्णांक मान नहीं है, लेकिन एक फ़ंक्शन resp। इस संदर्भ में इसका पता। इसलिए आपको फ़ंक्शन के पते को साफ़ करने के लिए printf("sq = %p\n", sq); लिखना चाहिए।

क्या वास्तव में ऐसा होता है कि आप foo() समारोह sq देना पैरामीटर f और पैरामीटर g के रूप में कार्य pl के रूप में है। foo इन कार्यों को पैरामीटर x के साथ लिखित के रूप में कॉल करता है।

तो अनिवार्य रूप से foo कॉल pl(1,1) और दुकानों y में परिणाम जो तब sq(y,y) के लिए प्रयोग किया जाता है। तो यह इन कार्यों में काम का प्रतिनिधित्व करता है। इन कार्यों को कॉलबैक फ़ंक्शन के रूप में देखा जा सकता है, क्योंकि foo() कॉलर द्वारा दिए गए कार्यों को कॉल करता है।

sq() और pl() अब, मेरी समझ से परे है।

2

मान लीजिए कि मैं आपका प्रश्न समझता हूं और किसी भी सी को याद कर सकता हूं तो foo एक ऐसा फ़ंक्शन है जो पॉइंटर्स को 2 फ़ंक्शन f और g प्लस int में ले जाता है, यह एक int देता है।

दोनों एफ और जी ऐसे कार्य हैं जो 2 इंच लेते हैं और एक int वापस करते हैं।

संख्या आप देख कार्यों pl और वर्ग किलोमीटर के पता है, तो यह ठीक लग रहा है

आप जा सकते हैं और क्या चल रहा है के रूप में मानकों का पूरा विवरण दिया पाने के लिए समारोह संकेत गुजर के बारे में पढ़ने की जरूरत है इस, मदद कर सकता है (भले ही यह सी ++ है) http://www.oopweb.com/CPP/Documents/FunctionPointers/Volume/CCPP/FPT/em_fpt.html

2
int foo(int f(int,int), int g(int,int), int x) 

एक समारोह तीन तर्कों लेने के रूप में foo वाणी, पहले दो हैं (संकेत करने के लिए) कार्यों कि तर्क के रूप में दो int रों लेने के लिए और एक int लौटने के लिए, तीसरा तर्क एक int है।

sq और pl उपयुक्त प्रकार के कार्य हैं, तो कॉल

foo(sq, pl, 1) 

सही है।

4

इस कोड के बारे में बिल्कुल कुछ खास नहीं है। यहां शामिल "अंतर्निर्मित" कुछ भी नहीं है।

ये सामान्य कार्य पॉइंटर्स हैं। सी घोषणा में

int foo(int f(int,int), int g(int,int), int x) 

स्वचालित रूप से

int foo(int (*f)(int,int), int (*g)(int,int), int x) 

कार्य sq के रूप में व्याख्या की है और pl करने के लिए foo

foo(sq, pl, 1); // same as foo(&sq, &pl, 1) 

(& ऑपरेटर वैकल्पिक है) तर्कों के रूप पारित कर रहे हैं और कहा जाता है इन संकेत के माध्यम से foo

के अंदर
int y = g(x,x); // same as (*g)(x,x) 
return f(y,y); // same as (*f)(y,y) 

(कॉल में * ऑपरेटर वैकल्पिक है)।

यह नहीं पता कि आपको यह 3392 और 3488 मान कहां मिला है। फंक्शन पॉइंटर्स "पूर्णांक के रूप में पारित नहीं होते हैं"। यदि आपके डीबगर ने पॉइंटर मानों को 3392 और 3488 के रूप में प्रदर्शित करने का निर्णय लिया है, तो यह आपके डीबगर के साथ एक समस्या होनी चाहिए।

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