cast unsigned char * (uint8_t *) zu const char *

Habe ich eine Funktion, die einen uint8_t * argument :

uint8_t* ihex_decode(uint8_t *in, size_t len, uint8_t *out)
{
    uint8_t i, hn, ln;

    for (i = 0; i < len; i+=2) {
        hn = in[i] > '9' ? (in[i]|32) - 'a' + 10 : in[i] - '0';
        ln = in[i+1] > '9' ? (in[i+1]|32) - 'a' + 10 : in[i+1] - '0';

        out[i/2] = (hn << 4 ) | ln;
    }

    return out;
}

Ich diese Funktion mit :

uint8_t data[SPM_PAGESIZE]; //SPM_PAGESIZE = 256 bytes
uint8_t sysex_data[SPM_PAGESIZE/2];
ihex_decode(data, strlen(data), sysex_data);

Aber in diesem Fall, mein compiler (avr-gcc) return eine Warnung :

main.c|89|warning: pointer targets in passing argument 1 von "strlen" unterscheiden sich im Fehler
/usr/include/string.h|399|note: expected " const char *", aber argument ist vom Typ 'uint8_t *'

So, ich habe eine Lösung gefunden, indem Sie die Typumwandlung der Daten var :

ihex_decode(data, strlen((const char *)data), sysex_data);

Verschwindet die Warnung, aber ich Frage mich, ob diese Lösung sicher ist.

Gibt es eine bessere Möglichkeit ?

Dank

Warum sind Sie mit uint8_t für ein Typ, der offenbar char ?
Weil mein Programm läuft auf dem mikrocontroller. So kann ich nicht negativen Wert.
Das macht keinen Sinn. Die Eingabe von Daten zu sein scheint ASCII-hex, so ist es natürlich char. Die Ausgabe der Daten natürlich bleiben würde, als uint8_t.
So schlagen Sie vor, mich zu ändern uint8_t *in zu char *in ?
Das problem hier ist nicht mit uint8_t, das problem ist, dass Leute, die glauben, dass char ist eine geheimnisvolle, Magische Art. Wenn Sie sorgfältig prüfen, werden Sie finden, dass es keine negativen zahlen in der ASCII-Tabelle. Also mit uint8_t für ASCII-Zeichen ist völlig in Ordnung, in der Tat, es ist die richtige Art zu verwenden. Der C-standard geschieht, zu verwenden, char-Typ für historische/unlogische Gründe, das ist, warum Sie bekommen die Warnung. Nur festgelegten Weg die Warnung, uint8_t ist korrekt.

InformationsquelleAutor Loïc G. | 2011-08-10

Schreibe einen Kommentar