2015-10-29 23 views
8

मैंने दशमलव संख्या को बेस 2 में परिवर्तित करने के लिए निम्न कोड लिखा था। शायद सबसे अच्छा नहीं है, लेकिन यह ग्रहण पर काम किया। हालांकि, जब मैं इसे विजुअल स्टूडियो पर चलाने की कोशिश करता हूं, तो मुझे यह त्रुटि संदेश लाइन 10 (जोर दिया जाता है) पर मिलता है: "अभिव्यक्ति निरंतर मूल्यांकन नहीं करती"। वह क्यों है?अभिव्यक्ति का निरंतर मूल्यांकन नहीं किया गया- C++

long base2(int number) { 
    int remainder, sizeOfRetNum, isNegative = 0; 
    if (number<0) 
     isNegative = 1; 
    int temp = number; 
    while (temp != 0) { 
     sizeOfRetNum++; 
     temp = temp/2; 
    } 
    char ansString[sizeOfRetNum]; // ********line 10******** 
    int j = sizeOfRetNum - 1; 
    while (number != 0) { 
     remainder = number % 2; 
     number = number/2; 
     if (remainder == 0) 
      ansString[j] = '0'; 
     else 
      ansString[j] = '1'; 
     j--; 
    } 
    long ansNum = atol(ansString); 
    if (isNegative == 1) 
     ansNum = -ansNum; 
    return ansNum; 
} 

उत्तर

13
char ansString[sizeOfRetNum]; 

एक Variable Length Array है और C++ मानक नहीं है। जीसीसी जैसे कुछ कंपाइलर्स उन्हें एक्सटेंशन के रूप में अनुमति देते हैं लेकिन एमएसवीएस उन्हें संकलित नहीं करेगा।

आदेश एक गतिशील सरणी आप बेहतर अभी तक एक सूचक और new

char* ansString = new char[sizeOfRetNum]; 

या उपयोग करने के लिए, समारोह एक std::string है, जो आप के लिए स्मृति प्रबंधन संभालती उपयोग करने के लिए फिर से काम की आवश्यकता होगी प्राप्त करने के लिए।

6

sizeOfRetNum निरंतर मूल्य नहीं है - दूसरे शब्दों में, इसका मान संकलन समय पर ज्ञात नहीं है।

जब आप स्मृति आवंटित करना चाहते हैं और रन टाइम तक मान नहीं जानते हैं, तो आपको गतिशील स्मृति आवंटन का उपयोग करने की आवश्यकता है। यह C12+ में operator new के साथ किया जाता है। new के साथ आप जिस स्मृति को आवंटित करते हैं उसे भी delete या delete[] से मुक्त करने की आवश्यकता है।

char ansString[sizeOfRetNum]; से char * ansString = new char[sizeOfRetNum]; बदलें। फ़ंक्शन रिटर्न से पहले delete [] ansString; पर कॉल करना न भूलें, या आपके पास मेमोरी रिसाव होगा।

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