2013-11-01 5 views
16

मैं एक quicksort कि मैं यहाँ लिखा नहीं है:त्रुटि: कहा जाता ऑब्जेक्ट प्रकार 'int' एक समारोह या समारोह सूचक

void swap(int& a, int& b); 
int mid(int lo, int hi); 

// My quicksort implementation 
void sort(int vec[], int lo, int hi) 
{ 
     int mid; 
     if (hi > lo) { 
       int i = lo + 1; 
       int j = hi; 
       int p = mid(lo, hi); 
       swap(vec[lo], vec[p]); 
       mid = vec[lo]; 
       while (i < j) { 
         if (vec[i] <= mid) { 
           i++; 
         } else { 
           while (i < --j && vec[j] >= mid); 
           swap(vec[i], vec[j]); 
         } 
       } 
       i++; 
       swap(vec[lo], vec[i]); 
       sort(vec, lo, i); 
       sort(vec, j, hi); 
     } 
} 

void swap(int& a, int& b) 
{ 
     int temp = a; 
     a = b; 
     b = temp; 
} 

int mid(int lo, int hi) 
{ 
     return lo + ((hi - lo)/2); 
} 

मैं g++ -g -c array.cpp -o array.o के साथ एक वस्तु फाइल करने के लिए संकलन की कोशिश की मैं इस त्रुटि मिलती है:

array.cpp:24:14: error: called object type 'int' is not a function or function 
    pointer 
      int p = mid(lo, hi); 
        ~~~^ 
1 error generated. 

सबकुछ सही दिखता है। क्या कोई मुझे गलत समझने में मदद कर सकता है?

+5

आप 'घोषित पूर्णांक मध्य ::mid(lo, hi) का उपयोग गुंजाइश संकल्प ऑपरेटर,' लेकिन फोन 'मध्य (लो, हाय) ' – chris

उत्तर

22

आपके स्थानीय चर mid को उस बिंदु में घोषित किया गया है जो उपयोग के बिंदु के करीब है, इसलिए यह mid() फ़ंक्शन "छाया" करता है; संकलक सोचता है कि आप एक पूर्णांक को "कॉल" करने का प्रयास कर रहे हैं, जो अमान्य है। स्थानीय चर का नाम बदलें इस समस्या को दूर करने के लिए:

int midpoint; 
if (hi > lo) { 
    int i = lo + 1; 
    int j = hi; 
    int p = mid(lo, hi); 
    swap(vec[lo], vec[p]); 
    midpoint = vec[lo]; 
    ... 
} 

नोट: यदि आप भी बजाय चर का नाम बदलने की ::mid(lo, hi) इस्तेमाल कर सकते हैं, लेकिन वह अपने कार्यक्रम के पाठकों को भ्रमित करेंगे।

+0

+1। बेशक, नाम बदलने का विकल्प समारोह को संदर्भित करने के लिए ':: mid' का उपयोग करना होगा। – Angew

+0

धन्यवाद! इससे मदद मिली मेरे पास मूल रूप से पिवट और फ़ंक्शन पिवट() ​​नामक चर था और जब मैंने समस्या को हल करने और ठीक करने के लिए वैश्विक खोज-और-प्रतिस्थापन किया था, तो मुझे यह नोटिस भूल गया कि चर भी बदल गया है। – Pocketkid2

+0

@Angew एक उत्कृष्ट बिंदु के लिए धन्यवाद! मैंने इसका उल्लेख करने के लिए जवाब संपादित किया। – dasblinkenlight

1
int mid(int lo, int hi);  // here you declared mid as function and defined 
           // it later 
// My quicksort implementation 
void sort(int vec[], int lo, int hi) 

{ 
int mid;      // but here you declared mid as local variable 
if (hi > lo) {    // it will shadow int mid(int lo, int hi); 
     int i = lo + 1; 
     int j = hi; 
     int p = mid(lo, hi); // so this is error, mid is integer not a function 

आप एल्गोरिथ्म में चर का नाम बदल सकते हैं या mid समारोह का उपयोग करने के पहले वैश्विक क्षेत्र में परिभाषित

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