アプリ版:「スタンプのみでお礼する」機能のリリースについて

unsigned char *a;
unsigened int *b;
unsigened int Ui;
.
.
.
y = yy*Size;
x = Xstart;
Ui = (unsigned int)*(a+x+y);
*b =Ui;
.
.

要するにバイトデータをワードデータ領域に転送したいだけなのですが、上記のプログラミングでうまく転送されていない時に予想できる原因は何でしょう?
32ビットマシン、バイトアドレスです。

A 回答 (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のポインタ値は、確保した領域をはみだしてはいないか?

考えられるのは上記のことぐらいです。
それで解決しなければ、すみません、わかりません。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

確かNo.1さんのお礼書きのようでした。
左辺に式があるのでここがクサイと(さっき)思いつきました。 しかし

Ui = *(unsigned int*)(a+x+y);
としてください。

さすが! 専門家ですね。
明日早速ためします。 でも

(4)エンディアンの問題はないか?
(5)アラインメントの問題はないか?

ってよくわかりません。
又、何卒宜しくお願い致します。

*(b+xx+yy) =Ui + *(b+xx+yy);

でした。 質問があやふやなので、もう一度明日確かめます。 とりかかりのきっかけができました!

お礼日時:2004/06/03 23:41

 打ち込みミスかどうかはよくわかりませんが・・・



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なら上の文でもいけると思いますが・・・
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。

チョットあわてて質問してしまいました。 ええっと?

.
.
yy = y*SizeX;
xx = x*sizeof(unsined int);
Ui = (unsigned int)*(a+x+y);
*(b+xx+yy) =Ui;
.
.

だったような。 このところがうまくいかなくて1日解決しませんでした。 あぁ!

お礼日時:2004/06/03 23:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!