2012-10-30 15 views
5

में Array.Copy() का उपयोग करने में विफल रहा मैं एक सी ++ डेवलपर हूं और हाल ही में WPF पर काम करना शुरू कर दिया है। खैर मैं अपने ऐप में Array.Copy() का उपयोग कर रहा हूं और ऐसा लगता है कि मैं वांछित परिणाम पूरी तरह प्राप्त नहीं कर पा रहा हूं।मेरे WPF ऐप

मैं अपने सी में किया था ++ अनुप्रयोग इस प्रकार है:

static const signed char version[40] = { 
'A', 'U', 'D', 'I', 'E', 'N', 'C', 'E', // name 
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // reserved, firmware size 
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // board number 
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // variant, version, serial 
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0  // date code, reserved 
}; 

unsigned char sendBuf[256] = {}; 
int memloc = 0; 
sendBuf[memloc++] = 0; 
sendBuf[memloc++] = 0; 

// fill in the audience header 
memcpy(sendBuf+memloc, version, 8); // the first 8 bytes 
memloc += 16; // the 8 copied, plus 8 reserved bytes 

मैं इस प्रकार के रूप में मेरे WPF (सी #) अनुप्रयोग में समान आपरेशन किया:

Byte[] sendBuf = new Byte[256]; 

char[] version = 
     { 
       'A', 'U', 'D', 'I', 'E', 'N', 'C', 'E',   // name 
       '0', '0', '0', '0', '0', '0', '0', '0' ,  // reserved, firmware size 
       '0', '0', '0', '0', '0', '0', '0', '0' ,  // board number 
       '0', '0', '0', '0', '0', '0', '0', '0' ,  // variant, version, serial 
       '0', '0', '0', '0', '0', '0', '0', '0'   // date code, reserved 
     }; 

// fill in the address to write to -- 0 
     sendBuf[memloc++] = 0; 
     sendBuf[memloc++] = 0; 

     // fill in the audience header 
     Array.Copy(sendBuf + memloc, version, 8); // the first 8 bytes 
     memloc += 16; 

लेकिन यह मुझ पर एक त्रुटि फेंकता Array.Copy(sendBuf + memloc, version, 8);Operator '+' cannot be applied to operands of type 'byte[]' and 'int' के रूप में।

यह कैसे प्राप्त कर सकता है ???? :) कृपया मदद करें :)

+1

यह सही है। सी # में पागल अंतर्निहित सरणी नहीं है-> पॉइंटर रूपांतरण हर किसी को भ्रमित करने के लिए। – chris

+0

@ क्रिस: फिर हम इसे दोस्त कैसे प्राप्त कर सकते हैं? :) कोई वैकल्पिक तरीका? –

+1

मैं पूछने वाला व्यक्ति नहीं होगा। मैं अभी तक सी # के साथ बहुत अनुभवी नहीं हूं, लेकिन मुझे सी/सी ++ की त्रुटियों के बारे में कुछ चीज़ों को संभालने का तरीका पसंद है। – chris

उत्तर

2
for(int i = 0; i < 8; i++) 
{ 
    sendBuf[i+memloc] = Convert.ToSByte(version[i]); 
} 
+0

उत्तर के लिए धन्यवाद। यह काम नहीं लग रहा है। 'SendBuf' और 'version' दोनों खाली हैं। –

+0

ओह, क्या आप sendBuf में संस्करण कॉपी करने की कोशिश कर रहे हैं? यदि ऐसा है, तो दोनों को उलट दिया जाना चाहिए (साथ ही पूर्णांक)। इसके अलावा, यह आवश्यक हो सकता है कि Arrays एक ही प्रकार के हैं। मुझे यकीन नहीं है कि यह कोशिश करेगा और केवल मूल्यों को डालेगा या नहीं – Brandon

+1

टाइपपेमिस्च अपवाद फेंक दिया गया है। चूंकि संस्करण char है और sendbuf बाइट है। –

0

दो तरीकों से आप कोशिश कर सकते हैं। सबसे पहले जिस तरह से आप एक सीधे प्रतिलिपि System.Buffer.BlockCopy का उपयोग कर() कर सकते हैं

जैसे

// fill in the audience header 
Buffer.BlockCopy(version, memloc, sendBuf, 0, 8); // the first 8 bytes 

दूसरी तरह के सिर्फ चार [] सिस्टम.पाठ उपयोग करने से सभी बाइट्स प्राप्त करने के लिए है नामकरण नामस्थान।

sendBuf = System.Text.Encoding.ASCII.GetBytes(version); 
1

यह आपके लिए अनुवादित है। स्पष्टीकरण इनलाइन हैं।

var sendBuf = new byte[256]; 

// char in C# is a UTF-16 character (at least 2 bytes). Use byte[] here instead. 
byte[] version = 
     { 
       (byte)'A', (byte)'U', (byte)'D', (byte)'I', (byte)'E', (byte)'N', (byte)'C', (byte)'E',   // name 
       0, 0, 0, 0, 0, 0, 0, 0,  // reserved, firmware size 
       0, 0, 0, 0, 0, 0, 0, 0,  // board number 
       0, 0, 0, 0, 0, 0, 0, 0,  // variant, version, serial 
       0, 0, 0, 0, 0, 0, 0, 0   // date code, reserved 
     }; 

int memloc = 0; 

sendBuf[memloc++] = 0; 
sendBuf[memloc++] = 0; 

// C# doesn't allow pointer arithmetic with arrays. memcpy's signature is also reversed. 
Array.Copy(
    version,  // Source 
    0,   // Index of Source 
    sendBuf,  // Destination 
    memloc,  // Index of Destination 
    8);   // The first 8 bytes 
memloc += 16; 
+0

@llianPinzon: Array के बाद अपवाद फेंकता है। स्रोत सरणी प्रकार के रूप में कॉपी करें गंतव्य सरणी प्रकार को असाइन नहीं किया जा सकता है। ' –

+0

मेरे लिए काम करता है। जांचें कि आप अपना 'संस्करण' सरणी कैसे घोषित करते हैं। यह बाइट [] होना चाहिए। SendBuf के समान। इस पर एक नज़र डालें कि मैंने इसे कैसे घोषित किया। –

+0

@llian Pinzon: ठीक है यह ठीक काम करता है :) लेकिन मेरा अगला कदम तारों की सरणी के साथ एक ही ऑपरेशन करना है। 'वर myDBoards = नई [] { " ", " S1010013 ", " S1010014 ", " S1010015 ", " S1010017 ", };' और इसी तरह के आपरेशन इस के साथ किया जाना चाहिए। 'memcpy (sendBuf + memloc, myDBoards [temp], 8);' जहां temp = 2 i.e. "S1010014" मैं इसे कैसे प्राप्त कर सकता हूं? :) –

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