2012-12-02 22 views
5

sto ottenendo questo avvertimentoC++ troncamento del valore costante

warning C4309: 'initializing' : truncation of constant value 

e quando provo ad eseguire il mio dll si invia solo 4 byte invece dei 10 byte.
Cosa potrebbe esserci di sbagliato?

Ecco il mio codice:

int WINAPI MySend(SOCKET s, const char* buf, int len, int flags) 
{ 

    cout << "[SEND:" << len << "] "; 

    for (int i = 0; i < len; i++) { 
     printf("%02x ", static_cast<unsigned char>(buf[i])); 
    } 

    printf("\n"); 

    //causing the warning: 
    char storagepkt[] = {0x0A, 0x00, 0x01, 0x40, 0x79, 0xEA, 0x60, 0x1D, 0x6B, 0x3E}; 

    buf = storagepkt; 
    len = sizeof(storagepkt); 

    return pSend(s, buf, len, flags); 
} 

UPDATE

int (WINAPI *pSend)(SOCKET s, const char* buf, int len, int flags) = send; 
int WINAPI MySend(SOCKET s, const char* buf, int len, int flags); 

UPDATE

Come suggerito ho provato memcpy:

memcpy((char*) buf, storagepkt, sizeof(storagepkt)); 

UPDATE

unsigned char storagepkt[] = {0x0A, 0x00, 0x01, 0x40, 0x79, 0xEA, 0x60, 0x1D, 0x6B, 0x3E}; 

riparato.

+0

Il codice chiama 'pSend()', ma non viene presentato. Invece è 'MySend()'. C'è un errore di battitura o qualcosa che manca? – wallyk

+0

Sto usando le deviazioni. entrambi sono dichiarati :) – madziikoy

+0

@wallyk 'pSend' viene chiamato da dentro 'MySend' –

risposta

15

Si sta inizializzando un buffer di char che è stato firmato. Tutto ciò che va oltre 0x7f è oltre ciò che può gestire e verrà convertito in un numero negativo. I dati effettivi sono probabilmente OK e puoi ignorare l'avviso, anche se sarebbe meglio farlo unsigned char.

Per quanto riguarda il motivo per cui invia solo 4 byte, sembra sospettosamente simile alla dimensione di un puntatore. Sei sicuro che il codice sia esattamente come lo hai rappresentato, usando un array, piuttosto che un puntatore passato a una funzione? Una funzione non conosce la dimensione di una matrice anche quando si dichiara il parametro come una matrice: è necessario passare la dimensione dell'array alla funzione.

+0

0xEA (storagepkt [5]) è troppo grande per un char su compilatori che considerano il char signed. –

5

posso riprodurre questo avviso con il seguente codice:

char aa = 0xff; 

l'avviso è risolto con

unsigned char aa = 0xff; 

(come Mark Ransom già sottolineato, ho solo aggiunto un codice di esempio minimo per riprodurre l'avviso)

0

Posso anche riprodurre questo avviso con il seguente codice:

const unsigned short cid = 0xdeadfeeb; 

Il che significa che il valore viene troncato dal compilatore, poiché è compreso nell'intervallo unsigned short. Riduci il valore per risolvere l'avviso.

Problemi correlati