also wie PickNick und auch ich das sehen, ist das nur logisch, es wird ERST p++ ausgehführt und DANACH der cast auf char-pointer!
PickNicks Lösung musst du verwenden, dann sollte es gehen!
Der 2te fehler ist genau das gleiche Problem, er kann einen void-pointer nicht inkrementieren, weil der Cast erst NACH der Operation durchgeführt werden würde!
@PickNick deine 2te Lösung sieht gruselig aus, du castest die Adresse in einen Zahlenwert um, manipulierst ihn udn dann wieder zu einem Pointer ... (da schüttelt es mich XD)
PS: ich würde statt einem char* lieber einen byte* oder einen uint8* verwenden ... ist jetzt nur ne stilsache, aber char kann auch als unicode interpretiert werden und der hat 16bit!
muss mich selber zusammenreissen nicht immer char zu schreiben
Code:
void uart_send(void* data, unsigned int size) {
while(size--)
uart_putc(*(((byte*)data)++)); /* erst casten, dann inkrementen, dann dereferenzieren */
}
void uart_send(void* data, unsigned int size, unsigned int repeat = 1 ) { //keine Ahnung ob der WinAVR optionale Parameter unterstützt aber macht es noch multifunktionaler!
while(repeat--)
{
for(unsigned int i = 0; i < size; i++)
uart_putc(*(((byte*)data)++)); /* erst casten, dann inkrementen, dann dereferenzieren */
}
}
So viel Klammer muss halt sein wenn man sicher gehen will dass der compiler es auch versteht!
Lesezeichen