• ベストアンサー

キャストがうまくいきません。

unsigned char *a; unsigened int *b; unsigened int Ui; . . . y = yy*Size; x = Xstart; Ui = (unsigned int)*(a+x+y); *b =Ui; . . 要するにバイトデータをワードデータ領域に転送したいだけなのですが、上記のプログラミングでうまく転送されていない時に予想できる原因は何でしょう? 32ビットマシン、バイトアドレスです。

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

うー。困りました。 これだけでは不確定な要素が多すぎます。 (1)aやbには、きちんとしたポインタが入っているか? unsigned char *a;のようにしただけでは、 「ポインタ変数」が宣言されただけで、 正しいポインタとして使えるわけではありません。 ポインタ変数を宣言したあとに a = (unsigned char *)malloc(...); のようにして、領域を確保しなければなりません。 これは変数bも同じです。 (2)xとyの型は何か? int型かlong型なら、これは問題ないでしょう。 (3)結局何をしたいのか? (3-1)unsigned char(0~255)の値を*bに転送したい。 (3-2)unsigned charが二つ並んだ値をひとつのunsigned intとして*bに転送したい。 (3-2)の場合はこのプログラムではいけません。 Ui = *(unsigned int*)(a+x+y); としてください。 (3-1)の場合は別の問題になります。 あとチェックするべきところは (4)エンディアンの問題はないか? (5)アラインメントの問題はないか? (もっともバイトアドレスということだから大丈夫なのでしょうが) (6)a+x+yのポインタ値は、確保した領域をはみだしてはいないか? 考えられるのは上記のことぐらいです。 それで解決しなければ、すみません、わかりません。

noname#7698
質問者

お礼

アドバイスありがとうございます。 確かNo.1さんのお礼書きのようでした。 左辺に式があるのでここがクサイと(さっき)思いつきました。 しかし Ui = *(unsigned int*)(a+x+y); としてください。 さすが! 専門家ですね。 明日早速ためします。 でも (4)エンディアンの問題はないか? (5)アラインメントの問題はないか? ってよくわかりません。 又、何卒宜しくお願い致します。 *(b+xx+yy) =Ui + *(b+xx+yy); でした。 質問があやふやなので、もう一度明日確かめます。 とりかかりのきっかけができました!

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

 打ち込みミスかどうかはよくわかりませんが・・・ Ui=(unsigned int)(*a+x+y);  では、ないでしょうか?ただし、xとyが、 unsigned char x,y; と言った類と仮定してですが。  ただし、オーバーフローを考えると、 Ui= (unsigned int)(*a)+(unsigned int)x+(unsigned int)y;  かもしれません。xとyの型がunsigned intなら上の文でもいけると思いますが・・・

noname#7698
質問者

お礼

御回答ありがとうございます。 チョットあわてて質問してしまいました。 ええっと? . . yy = y*SizeX; xx = x*sizeof(unsined int); Ui = (unsigned int)*(a+x+y); *(b+xx+yy) =Ui; . . だったような。 このところがうまくいかなくて1日解決しませんでした。 あぁ!

すると、全ての回答が全文表示されます。

関連するQ&A