2012-10-30 5 views
5

Sono uno sviluppatore C++ e di recente ho iniziato a lavorare su WPF. Bene, sto usando Array.Copy() nella mia app e sembra che non sia in grado di ottenere completamente il risultato desiderato.Errore nell'uso di Array.Copy() nell'app WPF

che avevo fatto nella mia C++ app come segue:

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 

ho fatto l'operazione simile nel mio WPF (C#) app come segue:

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; 

Ma mi tiri un errore in Array.Copy(sendBuf + memloc, version, 8); come Operator '+' cannot be applied to operands of type 'byte[]' and 'int'.

Come ottenere questo ???? :) per favore aiuto :)

+1

Proprio così. C# non ha pazze conversioni implicite di array-> puntatore per confondere tutti. – chris

+0

@chris: Allora come possiamo raggiungerlo amico? :) Qualunque modo alternativo? –

+1

Non sarei la persona da chiedere. Non ho ancora molta esperienza con C#, ma mi piace il modo in cui gestisce alcuni dei difetti che ho trovato in C/C++. – chris

risposta

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

Grazie per la risposta. Questo non sembra funzionare. Sia 'sendBuf' che' version' sono vuoti. –

+0

Oh, stai provando a copiare la versione in sendBuf? Se è così, i due dovrebbero essere invertiti (così come i numeri interi). Inoltre, potrebbe richiedere che gli array siano dello stesso tipo. Non sono sicuro se tenterà di trasmettere i valori o no, viene generata l'eccezione di Typemismatch – Brandon

+1

. Poiché la versione è char e sendbuf è byte. –

0

Due modi in cui puoi provare. In primo modo si può fare una copia diritta utilizzando System.Buffer.BlockCopy()

esempio

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

L'altro modo è quello di ottenere solo tutti i byte dal char [] utilizzando lo System.Text .Encoding namespace.

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

tradotto per voi. Le spiegazioni sono in linea.

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: genera un'eccezione dopo Array.Copy come' Tipo di matrice di origine non può essere assegnato al tipo di matrice di destinazione. ' –

+0

Funziona per me. Controlla come dichiari la tua matrice 'versione'. Dovrebbe essere byte []. Lo stesso di sendBuf. Dai un'occhiata a come l'ho dichiarato. –

+0

@llian Pinzon: Beh, funziona bene :) Ma il mio prossimo passo è fare la stessa operazione con una serie di stringhe. 'var myDBoards = new [] { "", "S1010013", "S1010014", "S1010015", "S1010017", };' e il funzionamento simile deve essere fatto con questo. 'memcpy (sendBuf + memloc, myDBoards [temp], 8);' dove temp = 2 cioè "S1010014" Come posso ottenerlo? :) –

Problemi correlati