22. November 2024, 16:22
void* memset(void *ptr, uint32 value, size_t bytes){ if(bytes < 1) return 0; uint32 *pt = (uint32*) ptr; // Last two bytes are going to be lost after the bit shift uint32 carry = bytes & 0x3; // Integer division by 4 bytes >>= 2; while(bytes) { *pt = value; pt++; bytes--; } if(carry) { pt++; *pt = value; } return ptr;}
*pt = (value << 24) | (value << 16) | (value << 8) | value;
uint8 *bpt = (uint8 *)pt;while (carry--) *(bpt++) = value;
void *memset(void *ptr, uint32 value, size_t bytes){ uint8 *pt = ptr; while (bytes--) *(pt++) = value; return ptr;}
Prinzipiell spricht aber nichts dagegen, den ganz naiven Ansatz zu gehen:Code: [Auswählen]void *memset(void *ptr, uint32 value, size_t bytes){ uint8 *pt = ptr; while (bytes--) *(pt++) = value; return ptr;}In der Annahme, dass du ein einigermaßen standardkonformes memset schreiben willst, das eben byteweise arbeitet und in der weiteren Annahme, dass deine uintXX-Typen den normalen uintXX_t-Typen entsprechen.
Bei den Typen… Pfiua. Ich denke mal, es steht für „type“ oder „typedef“. Macht man zumindest häufiger, dass an Typen von typedefs ein _t rankommt, bei mir ist es also mehr oder weniger Gruppenzwang.