• ベストアンサー

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

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

noname#7698
noname#7698

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

  • ベストアンサー
  • 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

  • R8Cマイコンの乗算

    R8C34Mを使っています。 例えば下記のコードを実行したら  unsigned long kai;  unsigned int xx;  unsigned int yy; xx = 0x07d0;  //10進で2000 yy = 0x0064;  //10進で100 kai = xx * yy; kaiは 0x30d40 となるはずが、0x0d40 でした。 kai = (unsigned long)xx * yy; と書き直したら、うまくいきました。 答えが2バイトを超えるのが分かっていたのでkaiはlong長にしました。 どうして右辺もキャストでlong長にしないといけないのでしょうか? また、下記のようにkaiをint長、xx,yyをchar長にした場合は、 kaiは意図する値の0x4e20 になりました。  unsigned int kai;  unsigned char xx;  unsigned char yy; xx = 0x00c8;  //10進で200 yy = 0x0064;  //10進で100 kai = xx * yy; どうして後者の場合はうまくできて、前者の場合はキャストしないといけないのでしょうか? この辺ご存知の方ご教授願います。

  • int型(2バイト)データの分割

    int型(2バイト)データの分割 マイコンのフラッシュ領域にint型のデータ(2バイト)を 1バイトづつ書き込むのに以下のコードを考えています。 unsigned int data; unsigned char dat1,dat2; data = 555; dat1 = 0; dat2 = 0; dat1 = (char)data; dat2 = (char)data >> 8; 以下、dat1とdat2をフラッシュに書き込む。 未熟者でプログラムとして合っているのか解りません。 やり方として問題ないでしょうか? またもっと良い方法があればご教授願います。

  • 放射状ブラー C言語で書いたのですが結果がうまくいっていない

    こんばんは! Windows環境,VS2005で放射状ブラーを以下の様に書きましたが、 結果が添付ファイルの様になってしまい、うまくいきません。 コンパイルは通り実行もできるのですが、結果がうまくいっていないのです。(いろんな画像で試しましたが明らかに うまくいっていない気がするのです) 参考にしたのは、 http://www.sbcr.jp/books/download/art.asp?newsid=2198 の " 第3章 エフェクト処理の応用(その1) IPP_Chap3a.zipの中にある list3_14.cです。 又、web上では、http://d.hatena.ne.jp/matsu4512/20090726/1248575190 参考にしました。 以下が私が書いたものです。Input=24bppのrawファイル名 幅、高さが入った構造体です。 プログラミング思想としては、1次元配列で画像を表しています。 #define NN 17 #define NF 8 int Main24bppToRadialBlur(COMMONDATA *Common_Data_Raw) { FILE *fpt; FILE *fpt_output; int width=Common_Data_Raw->width; int height=Common_Data_Raw->height; int i; unsigned char *layer,*img_output; int rr,gg,bb,oo; int x1=0; int y1=0; int x2=3*width-3; int y2=3*width*height-3*width; WCHAR DebugStr[256]; double ox,oy; ox=(double)(x2-x1)/2.0; oy=(double)(y2-y1)/2.0; double dx,dy; dx=(double)x2-ox; dy=(double)y2-oy; double disMAX; disMAX=sqrt(dx*dx+dy*dy); int x,y; int xx,yy; double rate,rad=0,dis,disI; int pat_sum,pat; double ef=30.0; _wfopen_s(&fpt,Common_Data_Raw->filename,L"rb"); layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); //読み込み fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); img_output=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); //◆画像処理をするスペース for(y=y1;y<=3*width*height-3*width;y+=3*width) { for(x=x1;x<=3*width-3;x+=3) { rr=gg=bb=oo=0; dx=(double)x-ox; dy=(double)y-oy; if(dx!=0.0) { rad=atan(dy/dx); } else { rad=3.14159265/2.0; } //rad+=(3.14159265/2.0); dis=sqrt(dx*dx+dy*dy); rate=ef*dis/disMAX; rate/=((double)NF); pat_sum=0; for(i=0;i<NN;i++) { if(i==NF) { pat=3; } else { pat=1; } disI=(double)(i-NF)*rate; xx=(int)(disI*cos(rad))+x; yy=(int)(disI*sin(rad))+y; rr+=layer[xx+yy] * pat; gg+=layer[xx+yy+1]* pat; bb+=layer[xx+yy+2]* pat; oo+= pat; pat_sum+=pat; } img_output[x+y]=rr/(oo); img_output[x+y+1]=gg/(oo); img_output[x+y+2]=bb/(oo); }//x }//y _wfopen_s(&fpt_output,L"RGBToRadialBlur.raw",L"wb"); fwrite(&img_output[0],sizeof(unsigned char),3*width*height,fpt_output); fclose(fpt); fclose(fpt_output); free(layer); free(img_output);

  • C言語signed long long型の演算

    C言語で以下の演算を行った場合、変数bに格納される値が-1(0xFFFFFFFFFFFFFFFF)になることを期待しておりましたが、参照すると4294967295(0x00000000FFFFFFFF)となってしまいます。 unsigned int a = 1; signed long long b; b = a * (-1); 32bit、64bitのUNIX(Solaris)マシンでそれぞれ確認しましたが、どちらも同じ結果となりました。 変数aの型宣言をsigned intにすると変数bが-1(0xFFFFFFFFFFFFFFFF)になることは確認したのですが、unsigned intだとなぜこのような演算結果となるのかが分かりません。 ※8バイト整数に格納する際に先頭4バイトがなぜ0xFFFFFFFFで補完されないのか? ちなみに変数bの型宣言をsigned long intにすると32bitマシンでは-1となりましたが、64bitマシンでは4294967295となってしまいます。 これは32bitUNIXマシンではsigned long intは4バイト領域であるため-1(0xFFFFFFFF)となり、64bitUNIXマシンでは8バイト領域のため前述と同じ結果になるのだと考えますが、なぜ8バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

  • C++ の new演算子について

    C++ の new演算子について質問です。 new演算子を用いてクラスのインスタンスを作ったときに、 クラスのメンバー関数内で使用される自動変数はメモリの何処に割り付けられますか? 以下の回答の内のいずれかと想定しています。 ・ヒープ領域 ・スタック領域 たとえば、以下のように、クラスTestClassが定義されていたとします。 class TestClass { int x; // int型(4byteとする) char y; // char型(1byte) long z; // long型(4byte) void play(short); } void main(void){ TestClass* pt = new a(); play(10); } void TestClass:: play(short n){ char a; long b; static c; for(int a = 0; a < 10; a++ ){ b = n * a; cout << b; } } main関数内で、インスタンスを作成した時点で ・TestClassのデータメンバx,y,z ⇒ ヒープ領域に確保(4+1+4 = 9byte。もしかしたらアライメント     の関係で もう少し大きく領域を確保するかも) ・play関数で使われる変数n,a,bの領域は何処に確保されるのでしょうか? 変数cは静的変数用領域に保存される? new演算子で作ったインスタンスはdelete演算子を使わないと消えないと勉強しました。(OSが消さない限り) つまり、上記ではmain関数を抜けても、変数x,y,z,n,a,bの実体は残ると考えてよいのでしょうか? そう考えると、n,a,bの実体はスタックではなく、ヒープ領域に確保する気がします、、 どうか、ご教授ください。

  • キャスト変換について

    VineLinuxでc言語を使って、カメラ画像から取得した物体の座標を別のPCのサーバープログラムにソケット通信で送信したい。 座標の変数がfloat型で格納されていて、そのX値とY値をcharでキャストして一つの変数に繋げてコード化し たいんですが、キャストの段階で数字を文字にできなくて 数字がなにかの文字やコードになってしまうので困ってます。 int x; int y; x = (char)Tbl2[1].X; y = (char)Tbl2[1].Y; printf("j - x=%c y=%c\n",x,y);

  • リトルエンディアン→ビッグエンディアン

    (1)リトルエンディアン typedef struct recvData{  int a;  unsigned char b[16]; unsigned char c[8]; unsigned int d[4]; } recvData_t; recvData_t rData; (2)ビッグエンディアン typedef struct sendData{  int a;  unsigned int b[4]; unsigned int c[2]; unsigned int d[4]; } sendData_t; sendData_t sData; 上記のようなリトルエンディアンの構造体の各メンバのデータを、ビッグエンディアンの構造体の各メンバのデータにそれぞれ格納するには どうしたらよいでしょうか?

  • D言語の連想配列をコピーしたい

    D言語で連想配列をコピーしたいのですが、 int[char[]] x; int[char[]] y; for(char[] a,int b;x) { y[a]=b; } などと要素を一つ一つコピーするしかないのでしょうか。 もっと効率のよいコピーはないのでしょうか。

  • モンテカルロ法の面積近似

    Mが2の32乗の、線形合同法で乱数を発生し、 モンテカルロ法を使って、 領域a = {(x,y)|x≧1,y≧2,(x-1)^2 + (y-2)^2 ≦1}の面積の近似値を計算するプログラムを作成し、これを利用してn=10000とした場合の上の領域の面積、および円周率πの近似値を求めよ。 (関数を使う) という課題が出たのですが、乱数の出し方?が変であまり近似されません(^_^;) どなたかどこが変か教えてください(>_<) これだと、2と4になってしまうんです(/_;) #include<stdio.h> #include<stdlib.h> #include<math.h> #define N 100 /*領域Rを含む面積T 領域R=求める面積*/ #define Nx 1 #define Ny 2 /*乱数を発生させる関数*/ unsigned long int random_g(unsigned long int x0, unsigned long int a, unsigned long int c); int main(){ unsigned long int x0, a, c, M; double x, y, s; int n, count_in, count_out; count_in = 0; count_out = 0; printf("x0: ", x0 ); scanf("%d", &x0); a = 61; c = 49; for(n = 0; n < 10000; n++){ /*乱数を発生*/ x = (random_g(x0, 4*a*n+1, c) / (double)4294967296)*Nx + 1; y = (random_g(x0, 4*a*n+1, c) / (double)4294967296)*Ny + 1; if(x >= 1 && y >= 1 && pow(x-1, 2) + pow(y-2, 2) <= 1) count_in++; else count_out++; } s = (double)count_in/(count_in + count_out)*Nx*Ny; printf("s = %f\n", s); printf("pi = %f\n", 2*s); return 0; } unsigned long int random_g(unsigned long int x0, unsigned long int a, unsigned long int c){ int i; x0 = (a*x0 + c); /*printf("%u\n", x0);*/ return x0; }

  • char→10進数

    PICのプラグラムをC言語で書いています。 unsigned charでxを宣言して、xには電圧をAD変換した値(8bit)が代入されます。このxの値を10進数に変換したいのですが、char型をどうすればint型に変換すればいいのか分かりません。 自分なりに作ってみましたが、うまく動作しません。ご教授よろしくお願いします。 /*抜粋*/ unsigned char x; int y,i; float n; ・・・ y=0; for(i=7;i>=0;i--){   n=(((x>>i)<<7)>>7);   if(n==1)n=pow(2,i);   y=y+(int)n; }