2011-11-17 10 views
7

किसी कारण से, जब मैं अपने प्रोग्राम में "हस्ताक्षरित int" के बजाय एक वैरिएबल को "uint" के रूप में परिभाषित करता हूं, तो यह त्रुटियां होती है। यह अजीब लगता है, क्योंकि uint के रूप में typedef'd है:typedef'd uint का उपयोग त्रुटि का कारण बनता है, जबकि "हस्ताक्षरित int" नहीं है ...?

typedef unsigned int uint; 

... इसलिए मुझे लगता है कि मैं दो दूसरे के स्थान पर इस्तेमाल कर सकते हैं लगता होगा। अधिक सटीक होने के लिए, मैं एक ऐसे फ़ंक्शन का परिणाम असाइन कर रहा हूं जो एक यूंट वैरिएबल में "हस्ताक्षरित int" लौटाता है, फिर वेक्टर आकार बदलने वाले कॉल में उस यूंट का उपयोग करके ... जिस बिंदु पर यह त्रुटियां होती है। यानी, मेरे कोड इस तरह दिखता है:

unsigned int getUInt() 
{ 
    return 3; 
} 

int main(void) { 
    vector<vector<float> > vectVect(100000); 
    for(uint i = 0; i < vectVect.size(); ++i) 
    { 
     vector<float>& myVect = vectVect[i]; 
     uint myUnsignedInt = getUInt(); 
     myVect.resize(myUnsignedInt); 
    } 
    cout << "finished" << endl; 
} 

... और लाइन त्रुटियों इसे myVect.resize रेखा है।

जाहिर है, मेरे पास पहले से ही एक समाधान है, लेकिन मैं समझना चाहता हूं कि यह क्यों हो रहा है, क्योंकि मैं बहुत परेशान हूं। क्या किसी के भी पास कोई सुझाव है?

पीएस - अगर किसी को लगता है कि इससे कोई फर्क नहीं पड़ता है, तो मैं फेडोरा 15 पर जीसीसी v4.1.2 का उपयोग कर रहा हूं ... और इसमें शामिल फ़ाइल जो यूंट को परिभाषित करती है /usr/include/sys/types.h है।

+9

जब भी आपको कोई त्रुटि मिलती है, तो आपको हमेशा अपने प्रश्न में प्रश्न में त्रुटि शामिल करने की आवश्यकता होती है। –

+1

आपको वास्तविक कोड दिखाना चाहिए जो असफल रहा है। विशेष रूप से '# शामिल' एस, 'उपयोग' घोषणाओं, आदि। और जीसीसी 4.6 शायद 4.1 से अधिक मानक अनुरूप है। –

+0

और [जैसा कि आप यहां देख सकते हैं] (http://ideone.com/Y1DRP), त्रुटि आपके द्वारा प्रदान किए गए उदाहरण में नहीं होती है (कम से कम जीसीसी के उस संस्करण के साथ)। –

उत्तर

6

मेरा अनुमान प्रणाली में एक और uint है कि वहाँ है उम्मीद करेंगे। नाम को किसी असामान्य या बेहतर तरीके से लपेटने के लिए अपना नाम बदलने का प्रयास करें।

namespace MY { 
    typedef unsigned int uint; 
} 

for (MY::uint i = 0; .... 
+2

बस इसे उत्तर के रूप में लेने जा रहा है, क्योंकि यह एक अच्छा अनुमान था, और मैंने कभी नहीं पता था कि क्या हो रहा था ... –

-1

मेरा अनुमान है कि यह किसी प्रकार का "पदानुक्रम" बनाने की कोशिश कर रहा है।

दूसरे शब्दों में, हमने:

typedef unsigned int size_t; 
typedef unsigned int uint; 

तो size_t "अधिक विशिष्ट" एक सामान्य unsigned int से है, तो यह समझ में आता है यह uint में बदला जा रहा से रोकने के लिए, हो सकता है "और अधिक विशिष्ट" किसी भी पुराने unsigned int की तुलना में।

मैं इस एक चेतावनी के रूप में अगर कुछ भी है, हालांकि, नहीं एक त्रुटि ...

+3

मुझे नहीं लगता कि यह है। एक 'टाइपपीफ' एक प्रकार के लिए उपनाम बनाता है, न कि एक नया प्रकार। तो उपर्युक्त घोषणाओं को देखते हुए, 'हस्ताक्षरित int',' size_t', और 'uint' सभी समान प्रकार हैं (जैसा कि' हस्ताक्षरित 'और 'int unsigned' हैं)। –

+0

@ किथ थॉम्पसन: यही है * होना चाहिए, मैं सहमत हूं; मैं अनुमान लगा रहा हूं कि संकलक इसके बजाय गलती से ऐसा कर रहा था, लेकिन idk। – Mehrdad