संपादित करें: जेम्स हॉपकिन के सुझाव को लागू करने के बाद, मुझे अभी भी "अमान्य नाम 'नल' की चेतावनियां मिलती हैं, जो उन अजीब पात्रों की तुलना में काफी बेहतर है। फिर, मैं वापस गया और लाइब्रेरी दस्तावेज़ को फिर से पढ़ा, और यह पता चला कि उस विशेष कार्य के लिए, इस तर्क में नामों के आकार की तुलना में गैर-नल स्ट्रिंग का एक और तत्व होना चाहिए। उस अतिरिक्त स्ट्रिंग का कोई अन्य उद्देश्य है। एक और स्ट्रिंग जोड़ने के बाद, कोड ठीक चलाता है। यह मेरी सारी गलती है, और मुझे बहुत खेद है।स्ट्रू के वेक्टर को पास करने के लिए कैसे करें (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);
फिर, सब कुछ ठीक है। मेरे प्रश्न हैं:
क्या रूपांतरण अपरिभाषित व्यवहार का कारण बनता है? यदि हां, तो क्यों?
स्ट्रू के वेक्टर को पास करने का सही तरीका क्या है (char const * const * const)?
+1 अनुमान अच्छा है। दरअसल, 'फू' फ़ंक्शन के लिए सरणी आकार खोजने की एकमात्र संभावना नल पॉइंटर को ढूंढना है। –
हां, अच्छा अनुमान! जब तक फू फ़ंक्शन हस्ताक्षर वास्तविक नहीं है। @ user347208: क्या यह सटीक फ़ंक्शन हस्ताक्षर है? – neuro
आपकी मदद के लिए बहुत बहुत धन्यवाद! @neuro: सटीक फ़ंक्शन हस्ताक्षर int foo (const char * filename, char const * const * const rowNames, char const * const * const स्तंभ नाम) है। हालांकि, जैसा कि मैंने अपने संस्करण में जो कहा था, मुझे खेद है कि मैंने दस्तावेज़ों को ध्यान से नहीं पढ़ा और अपना समय बर्बाद कर दिया। वैसे भी, आपकी मदद के लिए बहुत बहुत धन्यवाद! – EXP0