2012-02-27 12 views
5

देता है मैं चाहता हूं कि मेरा फ़ंक्शन एक BYTE सरणी लौटाए। कार्य इस प्रकार है।फ़ंक्शन बीईटीई सरणी

BYTE sendRecieveData(BYTE control, unsigned int value){ 

//Open connection to LAC 
HANDLE LACOutpipe; 
HANDLE LACInpipe; 
LACOutpipe=openConnection(MP_WRITE); 
LACInpipe=openConnection(MP_READ); 

//declare variables 
BYTE bufDataOut[3]; 
BYTE bufDataIn[3]; 
DWORD bufInProcess; 
DWORD bufOutProcess; 


//sets CONTROL 
bufDataOut[0]=control; 

//sets DATA to be sent to LAC 
BYTE low_byte = 0xff & value; 
BYTE high_byte = value >> 8; 
bufDataOut[1]=low_byte; 
bufDataOut[2]=high_byte; 

MPUSBWrite(LACOutpipe,bufDataOut,3,&bufOutProcess,1000); 
MPUSBRead(LACInpipe,bufDataIn,3,&bufInProcess,1000); 
MPUSBClose(LACOutpipe); 
MPUSBClose(LACInpipe); 

return bufDataIn[3]; 
} 

यह एक बाइट सरणी वापस नहीं करता है और जब मैं BYTE[] या BYTE[3] करने के लिए BYTE बदल यह मुझे एक त्रुटि देता है।

उत्तर

9

return bufDataIn[3]; का अर्थ है "4 तत्व लौट bufDataIn सरणी के" और इस मामले में यह अपरिभाषित व्यवहार की ओर जाता है के बाद से इस सरणी के आकार 3.

आप स्मृति इस नई सरणी के लिए अपने समारोह के मुख्य भाग में आवंटित कर सकते हैं है और इसके पहले तत्व पर वापस लौटने सूचक:

BYTE* createArray(...) 
{ 
    BYTE* bufDataOut = new BYTE[3]; 
    .... 
    return bufDataOut; 
} 

delete इसे करने के लिए मत भूलना जब आप इसके साथ खत्म:

{ 
    BYTE* myArray = createArray(...); 
    ... 
    delete[] myArray; 
} 

इससे भी बेहतर, std::vector<BYTE> का उपयोग करें और इसके साथ इस बदसूरत मेमोरी प्रबंधन से छुटकारा पाएं;) यह सुनिश्चित करता है कि स्मृति को किसी भी वापसी पथ पर ठीक से मुक्त किया जाता है, भले ही अपवाद फेंक दिया जाता है।

+0

कृपया "आप कर सकते हैं" के साथ "आपको चाहिए" ... स्वैप बहुत अच्छा जवाब दें। +1 –

+0

@BenVoigt: फिक्स्ड। धन्यवाद। – LihO

3

चूंकि आपकी सरणी अपेक्षाकृत छोटी है, इसलिए मैं आपके बफर को फ़ंक्शन तर्क के रूप में पास करने की अनुशंसा करता हूं।

void sendRecieveData(BYTE control, unsigned int value, BYTE (&buffdataIn)[3]). 

अब, एक इस समारोह के रूप में इस का उपयोग करेगा:

BYTE result[3] = {0}; 
sendRecieveData(3, 0, result); 

इस तरह से आप गतिशील स्मृति आवंटन के उपयोग से बचने के लिए और अपने कोड को सुरक्षित कर सकते हैं।

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