2010-05-21 18 views
8

संपादित करें: जेम्स हॉपकिन के सुझाव को लागू करने के बाद, मुझे अभी भी "अमान्य नाम 'नल' की चेतावनियां मिलती हैं, जो उन अजीब पात्रों की तुलना में काफी बेहतर है। फिर, मैं वापस गया और लाइब्रेरी दस्तावेज़ को फिर से पढ़ा, और यह पता चला कि उस विशेष कार्य के लिए, इस तर्क में नामों के आकार की तुलना में गैर-नल स्ट्रिंग का एक और तत्व होना चाहिए। उस अतिरिक्त स्ट्रिंग का कोई अन्य उद्देश्य है। एक और स्ट्रिंग जोड़ने के बाद, कोड ठीक चलाता है। यह मेरी सारी गलती है, और मुझे बहुत खेद है।स्ट्रू के वेक्टर को पास करने के लिए कैसे करें (char const * const * const)?

मूल पोस्ट:

हाय,

यह मेरी पहली पोस्ट इतना अच्छा हो कृपया है। मैंने इस मंच में खोज की और googled लेकिन मुझे अभी भी जवाब नहीं मिल रहा है। इस समस्या ने मुझे एक दिन से अधिक समय तक परेशान किया है, इसलिए कृपया मुझे कुछ मदद दें। धन्यवाद।

मुझे लाइब्रेरी फ़ंक्शन foo (char const * const * const) में स्ट्रिंग का वेक्टर पास करने की आवश्यकता है। मैं & वेक [0] पास नहीं कर सकता क्योंकि यह एक स्ट्रिंग के लिए सूचक है। इसलिए, मेरे पास एक सरणी है और उस सरणी में c_str() को पास करें।

अगर मैं ऊपर कोड चलाने के लिए, तो समारोह foo के बारे में कुछ चेतावनियों फेंक:

const char* aR[aNames.size()]; 

std::transform(aNames.begin(), aNames.end(), aR, 
       boost::bind(&std::string::c_str, _1)); 
foo(aR); 

हालांकि, यह यह कुछ अपरिभाषित व्यवहार का कारण बनता है लगता है: निम्नलिखित मेरी कोड है (aNames स्ट्रिंग के वेक्टर है) एआर में अवैध पात्र ('èI' blablabla)।

अगर मैं इस तरह समारोह foo से पहले ar प्रिंट:

std::copy(aR, aR+rowNames.size(), 
      std::ostream_iterator<const char*>(std::cout, "\n")); 
foo(aR); 

फिर, सब कुछ ठीक है। मेरे प्रश्न हैं:

  1. क्या रूपांतरण अपरिभाषित व्यवहार का कारण बनता है? यदि हां, तो क्यों?

  2. स्ट्रू के वेक्टर को पास करने का सही तरीका क्या है (char const * const * const)?

उत्तर

1

वैसे यह मेरे लिए सही लगता है। c_str चार की एक शून्य समाप्ति सरणी बनाएं जो अगले गैर-कॉन्स्ट स्ट्रिंग ऑपरेशन तक स्थिर है। आप c_str पॉइंटर्स को एक कॉन्स char * सरणी में संग्रहीत करते हैं।

मैं कोई बढ़ावा विशेषज्ञ नहीं हूं इसलिए समस्या हो सकती है, लेकिन मेरा अनुमान है कि वेक्टर में आपके तार एक एन्कोडिंग में हैं जो फ़ंक्शन foo में अपेक्षित किसी के साथ असंगत है।

एन्कोडिंग बिंदु से अपना कोड देखें।

my2c

5

foo के बाद से केवल एक सूचक लेता है, मेरे जंगली अनुमान है कि यह एक शून्य-समाप्त सरणी की आवश्यकता है। aR के लिए एक अतिरिक्त तत्व आवंटित करें और इसे NULL असाइन करें।

मेरे सुझाव होगा:

std::vector<const char*> c_strings; 
c_strings.reserve(aNames.size() + 1); 

std::transform(
    aNames.begin(), aNames.end(), 
    std::back_inserter(c_strings), 
    boost::bind(&std::string::c_str, _1) 
    ); 

c_strings.push_back(0); 
foo(&c_strings[0]); 
+0

+1 अनुमान अच्छा है। दरअसल, 'फू' फ़ंक्शन के लिए सरणी आकार खोजने की एकमात्र संभावना नल पॉइंटर को ढूंढना है। –

+0

हां, अच्छा अनुमान! जब तक फू फ़ंक्शन हस्ताक्षर वास्तविक नहीं है। @ user347208: क्या यह सटीक फ़ंक्शन हस्ताक्षर है? – neuro

+0

आपकी मदद के लिए बहुत बहुत धन्यवाद! @neuro: सटीक फ़ंक्शन हस्ताक्षर int foo (const char * filename, char const * const * const rowNames, char const * const * const स्तंभ नाम) है। हालांकि, जैसा कि मैंने अपने संस्करण में जो कहा था, मुझे खेद है कि मैंने दस्तावेज़ों को ध्यान से नहीं पढ़ा और अपना समय बर्बाद कर दिया। वैसे भी, आपकी मदद के लिए बहुत बहुत धन्यवाद! – EXP0

1

इस प्रयास करें:

std::vector<char*> arr(aNames.size()+1); 
for(size_t i = 0; i < aNames.size(); ++i) 
    arr[i] = aNames[i].c_str(); 
arr[arr.size()-1] = NULL; // just in case 
foo(&arr[0]); 
+1

संकलित नहीं होगा - 'c_str' एक 'const char *' –

+0

ठीक है। "कॉन्स char *" तत्वों को पकड़ने के लिए वेक्टर को बदलना अब मेरे लिए संकलित करता है। –

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