के माध्यम से फ़ंक्शंस के बीच एक वेक्टर पास करने के लिए मुझे सुझाव दिया गया था कि मुझे वेक्टर जोड़ने के लिए पॉइंटर्स का उपयोग करने का सुझाव दिया गया था जिसे मैं किसी मौजूदा फ़ंक्शन से दूसरे फ़ंक्शन में पास करना चाहता था। मैं वास्तव में उस सूचक के से जानकारी प्राप्त करने के तरीके पर अटक गया हूं। मैंने यहां और वहां पढ़ी कई चीजों की कोशिश की है, इसलिए मुझे दिखाएं कि मैं किस बारे में बात कर रहा हूं।पॉइंटर्स
प्राथमिक कार्यक्रम:
std::vector<float> * dvertex=NULL;
track.calculate(irrelevant stuff, dvertex)
माध्यमिक कार्यक्रम (ट्रैक, गणना)
track::caclulate(irrelevant stuff, vector<float> * dvertex)
{
...
vector<float> pos;
... pos filled after some calculations
if(! (dvertex==NULL))
{
dvertex = &pos1;
}
वापस प्राथमिक करने के लिए, जब तक कि मैं ऊपर कुछ में गड़बड़, यहाँ कुछ चीजें मैं
की कोशिश की है है 1
(*dvertex).at(0)
float z = (*dvertex).at(0)
(*dvertex)[0]
और सामान का एक समूह है कि बस सादे संकलन नहीं किया। मैं काफी अटक गया हूं क्योंकि मुझे यकीन नहीं है कि मुख्य कार्यक्रम में उस वेक्टर से विशिष्ट मूल्य कैसे प्राप्त करें। मैंने यह भी सोचा कि यह हो सकता है अगर (! (Dvertex == NULL)) बिट, तो मैंने इसे बदल दिया अगर (dvertex == NULL) लेकिन अभी भी कोई खुशी नहीं है। किसी भी तरह की सहायता का स्वागत किया जाएगा।
* संपादित करें/अपडेट करें * मदद के लिए बहुत बहुत धन्यवाद, लेकिन मुझे डर है कि मैं अभी भी गलत कर रहा हूं।
तो सुझाव है कि मैं सिर्फ एक संदर्भ पारित निम्नलिखित: मैं इस किया था:
प्राथमिक
std::vector<float> dvertex;
track.calculate(foo, &dvertex);
माध्यमिक रुके ही
प्राथमिक (शून्य चेक के साथ!)
std::cout<<dvertex[0]<<std:endl;
(वास्तव में डेटा का उपयोग करने के अन्य प्रयासों के बीच)
मैं अभी भी अनुचित तरीके से क्या कर रहा हूं, इस पर किसी भी विचार के लिए बहुत बहुत धन्यवाद। सबकुछ संकलित करता है, प्रोग्राम तब ठंडा हो जाता है जब यह किसी बिंदु पर जाता है कि dvertex से डेटा का उपयोग किया जाता है।
संपादित करें: फाइनल फिक्स
माध्यमिक कार्यक्रम में मैं
*dvertex = pos1;
बजाय
dvertex = &pos1;
नहीं आप पर अधिक सुझाव फेंकने के लिए, लेकिन आप इसे एक संदर्भ के रूप में पारित करना चाहिए: आप एक सूचक का उपयोग करें, हालांकि, आप मुख्य में एक सदिश परिभाषित, और फिर उस वेक्टर के पते के पारित करने के लिए की जरूरत है । फिर किसी भी चीज़ को कम करने की आवश्यकता नहीं है, और आपको सभी लाभ मिलते हैं। – jonsca
@jonsca सही है, आपको ट्रैक :: caclulate (अप्रासंगिक सामान, वेक्टर और dvertex) जैसे कुछ करना चाहिए, फिर एक सामान्य वेक्टर के रूप में dvertex के रूप में व्यवहार करना है और इसके साथ किए गए काम अभी भी विधि के बाहर उपलब्ध होंगे। –
कभी-कभी मुझे पॉइंटर्स द्वारा पास करना पसंद है यदि कंटेनर संशोधित किया जाएगा। कॉल साइट पर आमतौर पर पता ऑपरेटर के उपयोग की आवश्यकता होती है: 'func (& my_vertor);' यह एक छोटा अनुस्मारक है कि फ़ंक्शन वास्तव में कंटेनर को संशोधित करता है। यदि आप हमेशा संदर्भ से गुजरते हैं, तो आप फ़ंक्शन घोषणा को देखे बिना संशोधित और गैर-संशोधित कॉल के बीच अंतर नहीं कर सकते हैं। हालांकि, यह पूरी तरह से शैली का मामला है, कोई प्रदर्शन लाभ नहीं है। – dappawit