void*
データ配列へのポインターを提供するCの単純な関数があります。このメモリブロック内の個々のデータポイントのサイズ(バイト単位)を知っているので、隣接するデータポイントを誤って変更することなく、このブロック内の各データポイントを変更できることを保証する必要があります。この例では、各値を1ずつデクリメントします。
すべてのデータポイントは、8ビット、16ビット、または32ビットのいずれかです。
例えば:
void myFunction(void* data, size_t arraySize, size_t widthPerDataPoint)
{
if(!data)
return -1;
size_t w = widthPerDataPoint;
int numPoints = arraySize / widthPerDataPoint;
int i;
for(i=0; i<numPoints; i++)
{
if(w==1) // 8 bit
(*((int8_t*)data + i))--;
else if(w==2) // 16 bit
(*((int16_t*)data + i))--;
else if(w==4) // 32 bit
(*((int32_t*)data + i))--;
}
}
残念ながら、int8_tなどのデータ型は、C99仕様に従って最小サイズのみを保証し、正確なサイズは保証しません。データをインプレースで再キャストおよび変更して、アレイを壊したり、隣接するデータポイントに触れたりしないことを保証する方法はありますか?また、他のデータ幅(24ビット、60ビットなど)でも何らかの形で機能する同等の手法はありますか?