2012-06-14 8 views
29

मुझे लगता है कि फ़ंक्शन पॉइंटर्स का उपयोग करना आसान होगा यदि मैंने फ़ंक्शन पॉइंटर के लिए टाइपपीफ बनाया है, लेकिन मुझे लगता है कि मैं कुछ सिंटैक्स या उपयोग या टाइपिफ़ के बारे में कुछ पर जा रहा हूं फ़ंक्शन पॉइंटर्स, और मैं कुछ मदद का उपयोग कर सकता था।फंक्शन पॉइंटर्स के लिए टाइपिफ़ बनाने के लिए कैसे करें

मैं

int foo(int i){ return i + 1;} 
typedef <???> g; 
int hvar; 
hvar = g(3) 

मूल रूप से मैं क्या पूरा करने के लिए मैं एक नहीं बल्कि नई सी प्रोग्रामर हूँ कोशिश कर रहा हूँ और यह मुझे बहुत ज्यादा फेंक रहा है यही कारण है कि मिल गया है। क्या <???> बदलता है?

+3

आपका कोड संभवतः काम नहीं कर सकते क्योंकि अगर जी एक typedef है, आप कर सकते हैं '

समारोह सूचक के उपयोग के नीचे एक साधारण प्रोग्राम के रूप में रेखांकित किया जा सकता है इसे एक समारोह के रूप में कॉल करें। क्या आप वर्णन कर सकते हैं कि आप विशेष रूप से क्या करने की कोशिश कर रहे हैं? – templatetypedef

+0

वास्तव में? मैंने सोचा कि मेरे मालिक ने मुझे यह काम करने के लिए एक टाइपपीफ का उपयोग करने के लिए कहा था। क्या आप # डीफिन के साथ समान कुछ हासिल कर सकते हैं? – SetSlapShot

+1

आपकी विशेष रूप से क्या करने की कोशिश कर रहे हैं? यह स्पष्ट नहीं है कि आप क्या करने का प्रयास कर रहे हैं। – templatetypedef

उत्तर

71

आपका प्रश्न स्पष्ट नहीं है, लेकिन मुझे लगता है कि आप कुछ इस तरह देख सकते हैं:

int foo(int i){ return i + 1;} 

typedef int (*g)(int); // Declare typedef 

g func = &foo;   // Define function-pointer variable, and initialise 

int hvar = func(3);  // Call function through pointer 
+1

फ़ंक्शन प्रकार को टाइप करने के लिए भी संभव है, जो कुछ हद तक असामान्य है, लेकिन चित्रण के लिए स्पष्ट हो सकता है: 'typedef int g (int); जी foo; जी * func = &foo; '। यह एक ही हस्ताक्षर के साथ कई कार्यों को घोषित करने के लिए उपयोगी है (दुर्भाग्य से, परिभाषित नहीं)। –

+2

@ जोनपर्डी ने पोस्टिंग का सुझाव दिया है कि उत्तर के रूप में –

0

समारोह सूचक लौटने समारोह लिखने के मूल रास्ते

int (* call(void)) (int,int); 

यहाँ call एक है फ़ंक्शन जो कुछ भी नहीं लेता है लेकिन एक फ़ंक्शन पॉइंटर देता है जो 2 तर्क लेता है और एक पूर्णांक मान देता है। ब्रैकेट पर ध्यान दें, वे बिल्कुल जरूरी हैं।

#include<stdio.h> 

int sum(int a,int b) //sum is the function returned by call 
{ 
    return a+b; 
} 

int (*call(void)) (int ,int); 

int main() { 
    int (*p)(int,int); // way to declare a function pointer 
    p=call(); 
    printf("%d\n",(*p)(8,3)); 
} 

int(*call(void))(int,int) { 
    return sum; 
} 
+0

यह प्रश्न से संबंधित कैसे है? – morty

2

आप सही कर रहे हैं:

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

typedef int (*g)(int); // typedef समारोह सूचक की:

अपने मामले में आप के रूप में अपने समारोह सूचक g निर्धारित कर सकते हैं।

g फ़ंक्शन के लिए int मान लौटने के लिए एक फ़ंक्शन पॉइंटर है और एक int तर्क ले रहा है।

#include<stdio.h> 

typedef int (*pointer_to_function)(int first_parameter_of_type_int, int second_parameter_of_type_int); 

int my_function_returning_int_and_taking_two_int_arguments(int par1, int par2) 
{ 
    int result = par1 + par2; 
    return result; 
} 

int my_mul_function(int par1, int par2) 
{ 
    int result = par1 * par2; 
    return result; 
} 

int main() 
{ 
    int res; // returning result will be here 
    pointer_to_function my_fun_pointer; // declare function pointer variable; 

    my_fun_pointer = my_function_returning_int_and_taking_two_int_arguments; // function pointer points to `my_function_returning_int_and_taking_two_int_arguments` function 
    res = my_fun_pointer(2,3);  // Call function through pointer 
    printf(" result of `my_function_returning_int_and_taking_two_int_arguments` = %d \n", res); 


    my_fun_pointer = my_mul_function; // now function pointer points to another function: `my_mul_function` 
    res = my_fun_pointer(2,3);  // Call function through pointer 
    printf(" result of `my_mul_function` = %d \n", res); 

    return 0; 
} 

आउटपुट:

result of `my_function_returning_int_and_taking_two_int_arguments` = 5 
result of `my_mul_function` = 6