• ベストアンサー

CopyMemory()をmemcpy()に書き換える方法

読み込んだBMP画像をテスクチャに転送しようとしています。 CopyMemory(lpPixel + j + i * iWidth, lpBMPPixel + j*3 + i * iLength, 3); の第二引数から memcpy((BYTE*)LockedRect.pBits + LockedRect.Pitch*i +4*j, &Color, sizeof(DWORD)); の第一引数へ入れたいのですが、 CopyMemory()は LPDWORD型のlpPixelに数値を足して指したメモリブロックに対して、 LPBYTE型のlpBMPPixelに数値を足して(?)指したメモリブロックの情報を 3バイトずつ転送している事。 memcpy()は pBits=テスクチャのメモリブロックの始点 Pitch=テスクチャ1行分のメモリの長さ(改行保障値)で指定したアドレスに DWORD型のColorを直接のデータとして書き込んでいる。 という事まではわかったのですが CopyMemory()側の第二引数   lpBMPPixel + j*3 + i * iLength, から色情報を取り出そうと、型変換したりポインタで受け取ろうとしてみたのですが、 上手く行きませんでした。 ヒント程度で構いませんので、何か教えて頂けると幸いです。

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

これじゃだめだったということですか memcpy(LockedRect.pBits + LockedRect.Pitch * i + 4 * j, lpBMPPixel + iLength * i + 3 * j, 3); CopyMemory(LockedRect.pBits + LockedRect.Pitch * i + 4 * j, lpBMPPixel + iLength * i + 3 * j, 3); テクスチャのフォーマットはD3DFMT_X8R8G8B8に設定してありますか

zaxs5968
質問者

お礼

ありがとうございます >memcpy(LockedRect.pBits + LockedRect.Pitch * i + 4 * j, lpBMPPixel + iLength * i + 3 * j, 3); のままではエラーだったので(BYTE*)にしてみて、 テスクチャフォーマットの方を D3DFMT_A8R8G8B8 → D3DFMT_X8R8G8B8 にしたら表示してくれました。 ひっくり返ってますがあとは自力でなんとかやってみようと思います。 アルファの部分にFF(256)を埋め込む方法も探していたのでほんとに助かりました。 ありがとうございますっ

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

その他の回答 (1)

回答No.2

 こんにちは。 >>CopyMemory()側の第二引数 lpBMPPixel + j*3 + i * iLength, >>から色情報を取り出そうと、型変換したりポインタで受け取ろうとしてみたのですが、 >>上手く行きませんでした。 const int pos = (j * 3) + (i * iLength); const BYTE B = lpBMPPixel[pos]; const BYTE G = lpBMPPixel[pos + 1]; const BYTE R = lpBMPPixel[pos + 2];  では駄目でしょうか?  一応此れも画像処理の一つなので、手書きで代入する事をお勧めします。  場合によっては色素の赤と青を逆に組み替えてコピーしなければいけない様な事もあり、CopyMemory()やmemcpy()の様なモノで一気にコピーしてしまうと、表示がおかしくなったり、色素の確認に梃子摺ったりする事になります。  前後関係が不明瞭である為、以下で上手くいくかは分かりませんが、参考程度に。 for(int y = 0; y < height ; ++y) { for(int x = 0; x < width; ++x) { //24bitビットマップの読み込む位置 const int bmpPos = (iLength * y) + (x * 3); //32bitテクスチャの書き込む位置 const int texPos = (LockedRect.Pitch * y) + (x * 4); //もし逆転しているならば //const int texPos = (LockedRect.Pitch * (height - 1 - y)) + (x * 4); LPBYTE pTexture = ((LPBYTE)LockedRect.pBits) + pos; //青 pTexture[texPos] = lpBMPPixel[bmpPos]; //緑 pTexture[texPos + 1] = lpBMPPixel[bmpPos + 1]; //赤 pTexture[texPos + 2] = lpBMPPixel[bmpPos + 2]; //もしARGB32bitならばアルファを設定する //pTexture[texPos + 3] = 0xff; } }

zaxs5968
質問者

お礼

反応が遅くなって申し訳ありません。 #1の方のご助言とそちらの //もし逆転しているならば の節で直接転送して表示する事は出来たのですが、 やはりちゃんと色素を操作できるようにしたく 頂いた助言を何度も読み直して試していました。 おかげで、ARGB全てを操作可能にして転送する事が出来るようになりましたっ 丁寧な説明&豊富なヒントありがとうございます。 感謝!

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

関連するQ&A

  • 読み込んだBMPデータの行方

    参考書を元にBMPを読み込み、 BYTE*型にデータを移して、画像処理や転送に利用できるようにしたいのですが、 どこに画像データの実体が有るのかがよくわかりません・・。 ---------- static LPBYTE lpDIB = NULL; static LPBITMAPINFO lpbiInfo; static LPDWORD lpPixel; LPBYTE lpBMP; LPBITMAPINFOHEADER lpbiBMPInfo; LPBYTE lpBMPPixel; BYTE* ppp; static int iWidth, iHeight, iLength; int iFileSize; DWORD dwOffset; int i, j; HANDLE fhBMP; DWORD dwRead; HDC hdc; PAINTSTRUCT ps; /*BMP取得*/ //ファイルオープン fhBMP = CreateFile("test.bmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (fhBMP == INVALID_HANDLE_VALUE) { MessageBox(NULL, "test.bmpが見つかりません。", "エラー", MB_OK); return 0; } //ファイルサイズ取得 iFileSize = GetFileSize(fhBMP, NULL); //ファイル読み込みバッファ確保 lpBMP = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, iFileSize); //ファイル読み込み ReadFile(fhBMP, lpBMP, iFileSize, &dwRead, NULL); //ファイルを閉じる CloseHandle(fhBMP); //BMP内のBITMAPINFO取得 lpbiBMPInfo = (LPBITMAPINFOHEADER) (lpBMP + sizeof(BITMAPFILEHEADER)); //先頭からピクセル列までのオフセット取得 dwOffset = *(LPDWORD)(lpBMP + 10); //BMP内ピクセル列の先頭アドレス計算 lpBMPPixel = lpBMP + dwOffset; //ビットマップの大きさ取得 iWidth = lpbiBMPInfo->biWidth; iHeight = lpbiBMPInfo->biHeight; //BMPピクセル列の1ラインの長さを計算 if (iWidth % 4 == 0) { iLength = iWidth * 3; } else { iLength = iWidth * 3 + (4 - (iWidth * 3) % 4); } //DIB用バッファを確保 lpDIB = (LPBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFO) + iWidth * iHeight * 4); //DIB用ポインタ分配 lpbiInfo = (LPBITMAPINFO)lpDIB; lpPixel = (LPDWORD)(lpDIB + sizeof(BITMAPINFO)); //BITMAPINFO設定 lpbiInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpbiInfo->bmiHeader.biWidth = iWidth; lpbiInfo->bmiHeader.biHeight = iHeight; lpbiInfo->bmiHeader.biPlanes = 1; lpbiInfo->bmiHeader.biBitCount = 32; lpbiInfo->bmiHeader.biCompression = BI_RGB; //BMP内のピクセル列を32ビット化してコピー for (i = 0;i < iHeight;i++) for (j = 0;j < iWidth; j++) CopyMemory(lpPixel + j + i * iWidth, lpBMPPixel + j * 3 + i * iLength, 3); //ファイル読み込みバッファ解放 HeapFree(GetProcessHeap(), 0, lpBMP); /*描画*/ hdc = BeginPaint(hWnd, &ps); //DIBをウインドウのDCに描画 StretchDIBits(hdc, 0, 0, iWidth, iHeight, 0, 0, iWidth, iHeight, lpPixel, lpbiInfo, DIB_RGB_COLORS,SRCCOPY); EndPaint(hWnd, &ps); ---------- 描画部分のStretchDIBits()を調べて lpPixelに格納されているように思えたのですが、これはただのDWORDですし。 lpBMPPixelだとしても、描画では全く使われていないのが不可解で。 なぜこう(描画にDWORD)なっているのでしょうか? どこに画像データが有るのでしょうか?

  • memcpyで画像を送りたいのですが・・

    DirectXを使って 片方の画像(テクスチャ)の一部を、もう片方に送りたいのですが・・ 画像を直接送るだけなら、縦横ピクセル分のforで ------------------------------ memcpy((BYTE*)Rect_tgt.pBits + Rect_tgt.Pitch * i + j*4, (BYTE*)Rect_base.pBits + Rect_base.Pitch * i + j*4, 4); ------------------------------ これで送れるのですが、RGBAそれぞれを確認しながら 特定の色を置き換えたり、抜き色操作したくて ------------------------------ BYTE psend[4]; psend[0] = (BYTE)Rect_base.pBits + Rect_base.Pitch * j + i*1; psend[1] = (BYTE)Rect_base.pBits + Rect_base.Pitch * j + i*2; psend[2] = (BYTE)Rect_base.pBits + Rect_base.Pitch * j + i*3; psend[3] = (BYTE)Rect_base.pBits + Rect_base.Pitch * j + i*4; memcpy((BYTE*)Rect_tgt.pBits + Rect_tgt.Pitch * j + i*4, &psend, 4); ------------------------------ などと色々いじりまわしてみているのですが、 一色で塗り潰した画像を使っても、変なパターン模様になってしまいます。 ------------------------------ psend[0] = 255; psend[1] = 255; ........ ------------------------------ 等と直接指定すれば、ちゃんとそれに応じた色が書き出されるので 他の部分は正常だと思うのですが・・ どうすればRGBA1つ1つの色を正しく受け取れるでしょうか?

  • DirectX ~テクスチャに値を書き込む~

    m_pDevice->CreateTexture( 128, 128, 1, 0, D3DFMT_A32B32G32R32F, D3DPOOL_MANAGED, &pTex, NULL ); で生成したテクスチャに浮動小数点の値を 自分で書き込みたいのですが、うまくいきません。 テクスチャのサーフェスをロックしたあと、操作できるようですが・・ ソースコードを記述します。 D3DLOCKED_RECT rect; LPDWORD data; float a = 0.0; float r = 0.56; float g = 0.24; float b = 1.0; /* テクスチャのサーフェスをロック */ surface->LockRect(&rect, NULL, 0); for(int y=128-1; y>=0; y--){ /* 書き込む行の先頭アドレスに移動する */ data = (LPDWORD)((LPBYTE)rect.pBits + rect.Pitch * y); for( int x=0; x<128; x++){ /* カラーデータを書き込む */ *data = ((DWORD)a << 96) | ((DWORD)b << 64) | ((DWORD)g << 32) | ((DWORD)r );     data++; } } スペースで余白を空けることができなくて、少々見にくくなってしまいました。 1つの色につき32bitななので、32bitづつシフトしています。 また、float型は4バイト(32bit)なので間違ってはいないと思うのですが・・。 何かアドバイスできる方はお願い致します。

  • 幾何学変換

    Windowsアプリケーションでボタン一つで画像を45度回転させるプログラムを作りたいのですが、プログラムがよく分かりません。どなたか教えていただけないでしょうか。あと、回転変化後の画像には線形補間法(バイリニア法)を使っての補間処理をして表示させたいのですがよろしいでしょうか。言語はC#です。 自分で色々プログラム組んでるのですがなかなか出来ないです。今組んでるプログラムを実行すると変な風に実行されます。 組んでる途中のプログラム↓↓ private Color[,] SpinImage(Color[,] colImage) { int iHeight = colImage.GetLength(0); int iWidth = colImage.GetLength(1); //Console.WriteLine(iHeight + "\t" + iWidth); double X = 45.0 * Math.PI / 180.0; int iHeight2 = (int)(iWidth * Math.Cos(X) + iHeight * Math.Sin(X)); int iWidth2 = (int)(iWidth * Math.Sin(X) + iHeight * Math.Cos(X)); Color[,] colImage2 = new Color[iHeight2, iWidth2]; //Console.WriteLine(iHeight +"\t" +iWidth); for (int j = 0; j < iHeight-1; j++) { for (int i = 0; i < iWidth-1; i++) { int m = (int)(i * Math.Cos(X) + j * Math.Sin(X)); int n = (int)(-1 * i * Math.Sin(X) + j * Math.Cos(X)) + 100; int iRed = 0; int iGreen = 0; int iBlue = 0; // Console.WriteLine("y:"+ j +"\t i:"+i+"\t m:" +m + "\tn:" + n); iRed = colImage[j, i].R; iGreen = colImage[j, i].G; iBlue = colImage[j, i].B; #region a //if ((j >= 0) && (j < iWidth) && (i >= 0) && (i < iHeight)) //{ // iRed = colImage[i, j].R; // iGreen = colImage[i, j].G; // iBlue = colImage[i, j].B; // colImage[m, n] = Color.FromArgb(iRed, iGreen, iBlue); //} //else //{ // colImage[m, n] = Color.FromArgb(0, 0, 0); //} #endregion if (m < iHeight && n >= 0) { colImage2[m, n] = Color.FromArgb(iRed, iGreen, iBlue); } } } return colImage2; }

  • CBCモードの実装

    void encryptCBC(int data[],int dsize,int iv[]){ //暗号化 int tmp[4]; int i,j; KeyExpansion(key); for (i = 0; i < dsize; i += 4) { memcpy(tmp,&data[i],16); for(j=0;j<4;j++){ tmp[j]^=iv[j]; //16バイトごとに区切ったデータとベクタの排他的論理和 } Cipher(tmp); //暗号化 memcpy(&data[i],tmp,16); memcpy(iv,tmp,16); //ベクタの更新 } } void decryptCBC(int data[],int dsize,int iv[]){ //復号 int tmp[4]; int v[4]; int i,j; KeyExpansion(key); for (i = 0; i < dsize; i += 4) { memcpy(tmp,&data[i],16); invCipher(tmp);  //復号 if(i==0){ //初期ベクタとの排他的論理和 for(j=0;j<4;j++){ tmp[j]^=iv[j]; } }else{ //更新したベクタとの排他的論理和 for (j=0;j<4;j++){ tmp[j]^=v[j]; } } memcpy(v,&data[i],16); //ベクタの更新 memcpy(&data[i],tmp,16); } } AESのCBCモードでの暗号化、復号を実装しようとしています。 2ブロック目以降は正しく復号できているのですが、1ブロック目が元の値に戻りません。 どこが間違っているかどなたか教えていただけないでしょうか?

  • Java ブロック崩し 当たり判定

    こんにちは、Java初心者の者です。 今週の末に、文化祭があるので、その際の出し物で「ブロック崩し」を出すことにしたのですが、 ブロックの当たり判定がおかしいのです。 おかしいというか、正確にはブロックとの当たり判定自体はあるのですが、ブロックと当たったらブロックが消えるようにしているはずが、消えないのです。 一応、消えてはくれるのですがボールとブロックが離れたらまた元の色に戻ってしまいます。 フラグ管理を使っての処理で、ボールとブロックが触れたらフラグを「偽」。そしたらそれに該当するブロックを描画しないようにする仕組みなのですが、どうも上手くいきません。 以下コードです。 ~~~~中略~~~~ //ブロックの座標の設定 int k=0; for(int j=0;j<block_r;j++) { for(int i=0;i<block_g;i++) { block_x[k] = i*block_w; block_y[k] = j*block_h; block[k] = 1; flag[k] = true; k++; } } //ブロックに当たった時の処理 for(int i=0;i<30;i++) { if(flag[i] == true) { if(y + ball_y >= block_y[i] && y <= block_y[i]+block_h && x + ball_x >= block_x[i] && x <= block_x[i] + block_w) { vy = -vy; flag[i] = false; } } } //ブロックの描画 for(int i=0;i<30;i++) { if(flag[i] == true ) { //ブロックの描画 offg.setColor(Color.yellow); offg.fillRect(block_x[i],block_y[i],block_w,block_h); //ブロックの枠線 offg.setColor(Color.black); offg.drawRect(block_x[i],block_y[i],block_w,block_h); } } ~~~~中略~~~~~ paintメソッドの部分だけ載せてます。 どこかおかしいところがあれば、アドバイスを頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • Start:アプレットは初期化されていません、、というエラーが出る。

    アプレットを勉強している初心者です。 落ちものゲームを作ろうと思い、本に載っているサンプルを分かるところから書いていこうとしています。 そうしたら(もちろんまだ全体の途中、というか始めたばかりですが)タイトルのようなエラーが出てしまいました。 今の段階でのソースを載せるので、もし分かる方がいたら、よろしくお願いします。 import java.applet.Applet; import java.awt.*; import java.util.*; import java.awt.event.*; public class jisaku extends Applet{ int square = 8; int nw = 23; int nh = 24;//ブロック位置の最大数 int block[][] = new int[4][4];//動くブロックの形 int board[][] = new int[nh+1][nw+1];//盤面にあるブロックの有無 Dimension d;//表示スクリーン Image offs;//オフスクリーン Graphics grf; public void init(){ //********盤面のブロックの初期化(board[][]の初期化(=フィールドと枠)だけ)************ //フィールドにはブロックはない for(int i = 0; i <= nh; i++){ for(int j = 0; i <= nw; j++){ board[i][j] = 0;//盤面にはブロックはない } } //左右下の固定ブロック for(int i = 0; i <= nh; i++){ for(int j = 0; j <= nw; j++){ board[i][j] = 2; board[i][nw-j] = 1; } } for(int i = 0; i < 3; i++){ for(int j = 0; j <= nw; j++){ board[nh-i][j] = 2; } } //************オフスクリーンの設定********* d = getSize(); offs = createImage(d.width, d.height); grf = offs.getGraphics(); } public void paint(Graphics g){ update(g); } public void update(Graphics g){ //[grf]はオフスクリーンのグラフィックスオブジェクト(というのかな?) //バックをオレンジで塗る grf.setColor(Color.orange); grf.fillRect(0,0,d.width,d.height); //ブロックを描く grf.setColor(Color.blue); for(int i = 0; i <= nh; i++){ for(int j = 0; j <= nw; j++){ if(board[i][j] >= 1){ grf.fillRect(j*square, i*square, square, square); } } } //左右下の枠を描く grf.setColor(Color.red); for(int i = 0; i <= nh; i++){ for(int j = 0; j <3; j++){ grf.fillRect(j*square, i*square, square, square); grf.fillRect((nw-j)*square, i*square, square, square); } } for(int i =0; i < 3; i++){ for(int j = 0; j <= nw; j++){ grf.fillRect(j*square, (nh-i)*square, square, square); } } g.drawImage(offs, 0, 0, this); } }

    • ベストアンサー
    • Java
  • BMPファイルへの書き込みができない

    このプログラムは、左半分を黒、右半分を白の画像をBMPファイルに出力しようとしています。(出来ていません) プログラムの下に質問書いてます!お願いします! #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char *filename; int x; int y; int width; int height; unsigned char data[80][100]; } BMP_DATA; static void WriteBmp(char *filename, BMP_DATA Image) { unsigned long Bmp_size;/*BMPファイルのサイズ*/ unsigned int Bmp_info_header_size;/*情報ヘッダのサイズ*/ unsigned int Bmp_header_size;/*ヘッダのサイズ*/ long Bmp_width;/*幅*/ long Bmp_height;/*高さ*/ unsigned short Bmp_planes;/*プレーン数*/ unsigned short Bmp_color;/*色 = 1[bit] (黒か白かだけ)*/ long Bmp_image_size;/*画像部分のサイズ*/ long Bmp_xppm;/*水平解像度*/ long Bmp_yppm;/*垂直解像度*/ int i,j; unsigned char Bmp_headbuf[54]; /*ヘッダ*/ unsigned char Bmp_Data[13]; FILE *Out = fopen(filename, "wb"); if(Out==NULL){ fclose(Out); exit(1); } /* ヘッダ情報の準備 */ Bmp_info_header_size = 40; Bmp_header_size = 54; Bmp_planes = 1; Bmp_color = 1; Bmp_image_size = Image.height * Image.width; Bmp_xppm = 0; Bmp_yppm = 0; Bmp_size = Bmp_image_size + Bmp_header_size; Bmp_headbuf[0] = 'B'; Bmp_headbuf[1] = 'M'; memcpy(Bmp_headbuf+2, &Bmp_size, sizeof(Bmp_size)); Bmp_headbuf[6] = 0; Bmp_headbuf[7] = 0; Bmp_headbuf[8] = 0; Bmp_headbuf[9] = 0; memcpy(Bmp_headbuf+10, &Bmp_header_size, sizeof(Bmp_header_size)); Bmp_headbuf[11] = 0; Bmp_headbuf[12] = 0; Bmp_headbuf[13] = 0; memcpy(Bmp_headbuf+14, &Bmp_info_header_size, sizeof(Bmp_info_header_size)); Bmp_headbuf[15] = 0; Bmp_headbuf[16] = 0; Bmp_headbuf[17] = 0; memcpy(Bmp_headbuf+18, &Image.width, sizeof(Bmp_width)); memcpy(Bmp_headbuf+22, &Image.height, sizeof(Bmp_height)); memcpy(Bmp_headbuf+26, &Bmp_planes, sizeof(Bmp_planes)); memcpy(Bmp_headbuf+28, &Bmp_color, sizeof(Bmp_color)); memcpy(Bmp_headbuf+34, &Bmp_image_size, sizeof(Bmp_image_size)); memcpy(Bmp_headbuf+38, &Bmp_xppm, sizeof(Bmp_xppm)); memcpy(Bmp_headbuf+42, &Bmp_yppm, sizeof(Bmp_yppm)); Bmp_headbuf[46] = 0; Bmp_headbuf[47] = 0; Bmp_headbuf[48] = 0; Bmp_headbuf[49] = 0; Bmp_headbuf[50] = 0; Bmp_headbuf[51] = 0; Bmp_headbuf[52] = 0; Bmp_headbuf[53] = 0; /* ヘッダ情報書き出し */ fwrite(Bmp_headbuf, sizeof(unsigned char), Bmp_header_size, Out); /* 画像データ書き出し */ for(i=0;i<13;i++) Bmp_Data[i] = 0; for(i=0; i<Image.height; i++){ for(j=0; j<Image.width; j++){ int index = j/8; if(j%8 == 0){ Bmp_Data[index] = Image.data[i][j ] * 128 + Image.data[i][j+1] * 64 + Image.data[i][j+2] * 32 + Image.data[i][j+3] * 16 + Image.data[i][j+4] * 8 + Image.data[i][j+5] * 4 + Image.data[i][j+6] * 2 + Image.data[i][j+7]; } } Bmp_Data[12] = (Bmp_Data[12] & 0xf0); fwrite(Bmp_Data, sizeof(unsigned char), 20, Out); /* ○ */ } fclose(Out); } int main() { BMP_DATA Image; int line = 0; int i,j; Image.x = 0; Image.y = 0; Image.width = 100; Image.height = 80; if(line == 0){ for(i=0; i<Image.height; i++){ for(j=0; j<Image.width; j++){ Image.data[i][j] = 1; } } } while(1){ /* BMPファイルデータを編集 */ for(j=0; j<Image.width; j++){ if(j < 50){ Image.data[line][j] = 0;//black }else{ Image.data[line][j] = 1;//white } } /* すべての列を編集したら、再描画する */ if(line == 63){ /* BMPファイルに書込む */ WriteBmp("display.bmp", Image); break; } line++; } return 0; } 以下の条件で、BMPファイルへ書き込もうとしています ・色の深さ1(黒か白) ・画像のピクセルサイズ(横100×縦80) fwrite関数で1列ずつ書き込もうとしているのですが、 この関数は1バイトずつしか書き込めないみたいで、100ビット書き込もうと思うと、 最低でも104ビット書き込まなくてはならない状況になります。 まず、この4ビットはどう処理すればいいのでしょうか?? あと、display.bmpのファイルがある状態で、プログラムを実行するとちゃんと動くのですが、 プログラム中の○のところのfwrite関数の第三引数を13にすると、BMPファイルが壊れて閲覧できなくなります。(ある程度大きい数字だと、BMPファイルは壊れないのですが、ぐちゃぐちゃの絵になります) その理由もわかりません。 汚い文章&プログラムですが よろしくお願いします><

  • Excellマクロで数値0と空白部分の認識?

    以下はピボットテーブルをマッピングするマクロです。 数値0を色付けしたいのですが、空白部分も色付けしてしまいます。 よろしくお願いします。 For i = 表上端行 + 式行位置1 To 表下端行 - 式行位置3 For j = 表左端列 + 式行位置2 To 表右端列 - 式行位置4 V = Cells(i, j).Value If V >= 300 Then Cells(i, j).Interior.Color = RGB(255, 0, 0) ElseIf V > 0 Then Cells(i, j).Interior.Color = RGB(255, 0, 255) ElseIf V <= -300 Then Cells(i, j).Interior.Color = RGB(0, 0, 255) ElseIf V < 0 Then Cells(i, j).Interior.Color = RGB(0, 255, 255) Else Cells(i, j).Interior.Color = RGB(255, 0, 255) End If Next Next

  • 構造体の領域確保について

    以下のソースでコンパイルは出来るのですが、実行時にセグメンテーション違反のエラーが出ます。 ------------------------------------------------ struct magicpacket { char mgc_syn[6]; char mgc_mac[6][12]; } mgcpkt; /* (1) */ int main(int argc, char **argv) { struct magicpacket *mgc; /* (2) */ char mac[6] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0xff }; make_magic_packet(mgc, mac); /* (3) */ } void make_magic_packet(struct magicpacket *mgc, const char *macaddr) { char *cur; int i, j; /* 初期シーケンス */ for(i = 0; i < 6; i++) { mgc->mgc_syn[i] = 0xff; } /* MAC ADDRESS部 */ cur = &mgc->mgc_mac[0][0]; for(j = 0; j < 16; j++) { memcpy(cur, macaddr, 6); cur += 6; } } ------------------------------------------------ (3)の第一引数を&mgcpkt(1)とするか、(3)の前にmgc = malloc(sizeof(struct magicpacket)); を入れると正常に動作します。(2)では正常にメモリ領域が確保されていないのでしょうか? それとも、他に原因があるのでしょうか。ご教授お願いします。