2011-03-18 23 views
6

के माध्यम से फ़ंक्शंस के बीच एक वेक्टर पास करने के लिए मुझे सुझाव दिया गया था कि मुझे वेक्टर जोड़ने के लिए पॉइंटर्स का उपयोग करने का सुझाव दिया गया था जिसे मैं किसी मौजूदा फ़ंक्शन से दूसरे फ़ंक्शन में पास करना चाहता था। मैं वास्तव में उस सूचक के से जानकारी प्राप्त करने के तरीके पर अटक गया हूं। मैंने यहां और वहां पढ़ी कई चीजों की कोशिश की है, इसलिए मुझे दिखाएं कि मैं किस बारे में बात कर रहा हूं।पॉइंटर्स

प्राथमिक कार्यक्रम:

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; 
+3

नहीं आप पर अधिक सुझाव फेंकने के लिए, लेकिन आप इसे एक संदर्भ के रूप में पारित करना चाहिए: आप एक सूचक का उपयोग करें, हालांकि, आप मुख्य में एक सदिश परिभाषित, और फिर उस वेक्टर के पते के पारित करने के लिए की जरूरत है । फिर किसी भी चीज़ को कम करने की आवश्यकता नहीं है, और आपको सभी लाभ मिलते हैं। – jonsca

+0

@jonsca सही है, आपको ट्रैक :: caclulate (अप्रासंगिक सामान, वेक्टर और dvertex) जैसे कुछ करना चाहिए, फिर एक सामान्य वेक्टर के रूप में dvertex के रूप में व्यवहार करना है और इसके साथ किए गए काम अभी भी विधि के बाहर उपलब्ध होंगे। –

+1

कभी-कभी मुझे पॉइंटर्स द्वारा पास करना पसंद है यदि कंटेनर संशोधित किया जाएगा। कॉल साइट पर आमतौर पर पता ऑपरेटर के उपयोग की आवश्यकता होती है: 'func (& my_vertor);' यह एक छोटा अनुस्मारक है कि फ़ंक्शन वास्तव में कंटेनर को संशोधित करता है। यदि आप हमेशा संदर्भ से गुजरते हैं, तो आप फ़ंक्शन घोषणा को देखे बिना संशोधित और गैर-संशोधित कॉल के बीच अंतर नहीं कर सकते हैं। हालांकि, यह पूरी तरह से शैली का मामला है, कोई प्रदर्शन लाभ नहीं है। – dappawit

उत्तर

10

मुझे यकीन है कि क्यों इन आप के लिए संकलित नहीं किया नहीं कर रहा हूँ की जरूरत है, क्योंकि वे तब तक वैध हैं जब तक कि सूचक मान्य नहीं है और शून्य नहीं:

void f(std::vector<int>* v) 
{ 
    if(v != 0) { 
     int n = (*v)[0];  // ok 
     int m = (*v).at(0); // ok 
     int o = v->at(0); // ok 
    } 
} 

लेकिन इसे कभी भी ध्यान न दें। अगर आपको वेक्टर बदलना चाहिए, और यदि आपको नहीं करना चाहिए तो एक संदर्भ का प्रयोग करें। पॉइंटर द्वारा कंटेनर लेने की आवश्यकता होने पर शायद ही कभी होता है।

इसके अलावा, मैं आप 0, नहीं NULL के खिलाफ संकेत जाँच, क्योंकि कभी-कभी NULL(void*)0 सी compilers के अनुसार के रूप में परिभाषित किया गया है सुझाव देते हैं। लेकिन कुछ लोग यहां अन्यथा बहस कर सकते हैं।

+0

सी कंपाइलर एनयूएलएल को '(शून्य *) 0' के रूप में परिभाषित कर सकते हैं, लेकिन सी कंपाइलर्स ≠ सी ++ कंपाइलर्स। एक अनुरूप सी ++ कंपाइलर को "कार्यान्वयन-परिभाषित सी ++ नल सूचक स्थिरांक" (सी ++ 03 मानक §18.1/4) के रूप में एनयूएलएल को परिभाषित करना होगा। चूंकि 0 एक वैध शून्य सूचक स्थिर भी है, इसलिए 0 या न्यूल पसंद करने के लिए कोई तकनीकी कारण नहीं है- पसंद पूरी तरह स्टाइलिस्ट है। मैं व्यक्तिगत रूप से NULL पसंद करता हूं क्योंकि यह स्पष्ट रूप से बताता है कि आप एक पॉइंटर से निपट रहे हैं, जबकि 0 के साथ यह हमेशा संदर्भ से स्पष्ट नहीं है कि आप एक पूर्णांक या सूचक से काम कर रहे हैं या नहीं। –

+0

मैं न्यूल के लिए चेक पसंद करता हूं यह दृष्टिहीन रूप से अधिक विशिष्ट है (नलप्टर के लिए प्रतीक्षा कर रहा है) –

+0

@AdamRosenfield यदि 0 कार्यान्वयन परिभाषित नहीं किया गया है और 'न्यूल' है, तो यह नहीं है कि तकनीकी कारण 'न्यूल' पर 0 चुनने के लिए पर्याप्त है? – wilhelmtell

2

ऊपर मेरी टिप्पणी देखें, लेकिन अपने परिदृश्य काम करने के लिए, आप std::vector<float> * dvertex=NULL; आप वेक्टर संशोधित करने के लिए जा रहे हैं की जरूरत है std::vector<float> * dvertex = new std::vector<float>();

3

होने के लिए, तो आप शायद सिर्फ संदर्भ द्वारा इसे पारित करना चाहते हैं।

void calculate(std::vector<float> *vertex_array) { 
    vertex_array->pushback(1.0f); 
    vertex_array->pushback(2.0f); 
} 

int main() {  
    std::vector<float> vertexes; 
    calculate(&vertexes); 

    std::copy(vertexes.begin(), vertexes.end(), 
     std::ostream_iterator<float>(std::cout, "\n")); 
    return 0; 
} 
संबंधित मुद्दे