2012-12-02 8 views
5

Ich bekomme diese WarnungC++ Kürzungs konstanter Wert

warning C4309: 'initializing' : truncation of constant value 

und wenn ich versuche, meine dll auszuführen sendet er nur 4 Bytes statt der 10 Bytes.
Was könnte falsch sein?

Hier ist mein Code:

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

Wie schlug ich versuchte Memcpy:

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

UPDATE

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

es behoben.

+0

Der Code ruft 'pSend()' auf, aber das wird nicht angezeigt. Stattdessen ist 'MySend()'. Gibt es einen Tippfehler oder fehlt etwas? – wallyk

+0

Ich benutze Umleitungen. beide werden erklärt :) – madziikoy

+0

@wallyk 'pSend' wird von innen' MySend' aufgerufen –

Antwort

15

Sie initialisieren einen Puffer von char, der signiert ist. Alles, was über ist, ist jenseits dessen, was es verarbeiten kann, und wird in eine negative Zahl umgewandelt. Die tatsächlichen Daten sind wahrscheinlich in Ordnung, und Sie können die Warnung ignorieren, obwohl es besser wäre, es unsigned char zu machen.

Warum es nur 4 Bytes sendet, klingt das verdächtig wie die Größe eines Zeigers. Sind Sie sicher, dass der Code genau so ist, wie Sie ihn dargestellt haben, indem Sie ein Array verwenden und nicht einen Zeiger, der an eine Funktion übergeben wird? Eine Funktion kennt die Größe eines Arrays nicht, selbst wenn Sie den Parameter als Array deklarieren - Sie müssen die Größe des Arrays in die Funktion übernehmen.

+0

0xEA (storagepkt [5]) ist zu groß für ein char auf Compilern, die char signed betrachten. –

5

ich diese Warnung mit dem folgenden Code reproduzieren:

char aa = 0xff; 

die Warnung mit gelöst

unsigned char aa = 0xff; 

(als Mark Ransom bereits erwähnt, habe ich eine minimale Beispielcode nur hinzugefügt zu reproduzieren die Warnung)

0

ich kann auch diese Warnung mit folgendem Code reproduzieren:

const unsigned short cid = 0xdeadfeeb; 

Das bedeutet, dass der Wert vom Compiler abgeschnitten wird, da er außerhalb des Bereichs unsigned short liegt. Verringern Sie den Wert, um die Warnung zu lösen.

Verwandte Themen