任意のメモリブロックへのvoidポインタ型とブロックバイトサイズの2つの引数を取る関数を書きたかったのです。ブロックに書き込まれるデータの構造体タイプを知っているので、関数は含まれている値を出力する必要があります。
ただし、最初は、私が提案したコードは機能しませんでした。
#define RECORD struct record
struct record {
char nam[32];
double val;
};
void xprint (void *p, long j)
{
j /= sizeof(RECORD);
RECORD r;
while(j--){
r = *((RECORD *)p++);
printf("\n..%s.., ..%lf..\n",r.nam, r.val);
}
return;
}
そこで、主にコードのインクリメント部分で、いくつかの変更を思いつきました。
void print (void *p, long j)
{
j /= sizeof(RECORD);
RECORD r = *((RECORD *)p);
while(j--){
printf("\n%s,\t%8.2lf\n",r.nam, r.val);
r = *(++(RECORD *)p);
}
return;
}
今ではそれは仕事をしましたが、それでもコードはそれほどコンパクトに見えません。
いくつかの検査の後、私は問題が一列に r = *((RECORD *)p++);
並んでいることに気づきました。接尾辞のインクリメントに関しては、pはタイプキャストされなくなったため、pは1バイトだけインクリメントされるようです。
xprint関数を書き直して、接尾辞演算子を引き続き使用できるようにすることはできますが、型キャストされたポインターに適用できますか?