C言語(メモリの動的確保とRECT関数)について
◇-?C言語(メモリの動的確保とRECT関数)について-しん-08/09-09:02(220)-No.481699 ┗?!Re:C言語(メモリの動的確保とRE...-jtaka[BJCB]-08/09-15:28(213)-No.481709 ┗?!?Re:C言語(メモリの動的確保とR...-しん-08/09-17:01(212)-No.481712 ┣?!?!Re:C言語(メモリの動的確保と...-pandora-08/09-21:40(207)-No.481722 ┗?!?!Re:C言語(メモリの動的確保と...-jtaka[BJCB]-08/09-21:42(207)-No.481723 ┗?!?!【解決】Re:C言語(メモリの動...-しん-08/10-08:56(196)-No.481736
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
481699 | C言語(メモリの動的確保とRECT関数)について | しん URL | 2009/08/09-09:02 |
メーカー名:東芝 OS名:WindowsXp パソコン名:PAEX522PDE3 -- C言語とWIN32APIでAPPを書いています。 従来 PtInRect(&data[j].Rect, pt);や SetRect(&data[j].Rect,x,y,x+Width,y+Height);や FillRect(hdc,&Rect,(HBRUSH)GetStockObject(BLACK_BRUSH));や IntersectRect(&rctmp,&data[0].Rect,&data[1].Rect); 等を従来、使用して来ましたが。 maiioc関数やcaiioc関数を使用した時に 前期のPtInRect関数等の使用方法が分かりません。 何方かご教示下さい。 また参考のHPが有りましたらお願いします。 |
▲このページのトップに戻る
481709 | Re:C言語(メモリの動的確保とRECT関数)につ | jtaka[BJCB] | 2009/08/09-15:28 |
記事番号481699へのコメント しんさんは No.481699「C言語(メモリの動的確保とRECT関数)について」で書きました。 >maiioc関数やcaiioc関数を使用した時に malloc、callocのtypoってことでいいのね? どんな確保の仕方をしても、当該APIの引数並びに対応したデータを渡すことに違いは ないと思うんだけど。 具体的に、どういうことをやりたいのかを書いたほうがいいんじゃないのかなぁ。 |
▲このページのトップに戻る
481712 | Re:C言語(メモリの動的確保とRECT関数)につ | しん | 2009/08/09-17:01 |
記事番号481709へのコメント jtaka[BJCB]さん、有難うございます。 説明不足ですいません。 ■(1)構造体作成。 typedef struct BunData{ int x; RECT Rect; } BUNDATA,*LPBUNDATA; BUNDATA bundata[5]; LPBUNDATA lpbundata=bundata; ■(2)当り判定。 pt.x=LOWORD(lp); pt.y=HIWORD(lp); for(j=0;j<5;j++){ if(PtInRect(&bundata[j].Rect, pt)); } ・以上は正常に作動します。 ・bundata[5];の要素を動的確保する為 ■(3)新構造体作成。 typedef struct BunData{ int x; RECT Rect; } BUNDATA; BUNDATA bundata; BUNDATA *lpbundata; ■(4)動的メモリの確保。 lpbundata=(BUNDATA *)malloc(sizeof(BUNDATA)*Const); ■(5)この後,(2)の[PtInRect()]をどの様に記載するのかが分かりません、 ■(6)メモリの確保は確認 ・下記の様なTestでメモリの確保は確認出来るのですが。 for(i=0;i<Const;i++){ lpbundata[i].Rect.left=i*10; lpbundata[i].Rect.top=i*10; lpbundata[i].Rect.right=i*30; lpbundata[i].Rect.bottom=i*30; } ・また、下記の方法でも確認出来ます for(i=0;i<Const;i++){ Rectangle(ps.hdc, lpbundata[i].Rect.left, lpbundata[i].Rect.top, lpbundata[i].Rect.right,lpbundata[i].Rect.bottom); } ・しかし、同じ様に[FrameRect()]をどの様に記載するのかが分かりません、 FrameRect(ps.hdc,??????,(HBRUSH)GetStockObject(BLACK_BRUSH)); |
▲このページのトップに戻る
481722 | Re:C言語(メモリの動的確保とRECT関数)につ | pandora | 2009/08/09-21:40 |
記事番号481712へのコメント しんさんは No.481712「Re:C言語(メモリの動的確保とRECT関数)につ」で書きました。 要するに > BUNDATA bundata[5]; でのデータ領域確保から >lpbundata=(BUNDATA *)malloc(sizeof(BUNDATA)*Const); のmallocを利用した確保に変えたいのですね? そういうことなら 「構造体ポインタ」による領域参照法をよく勉強してください ■(1)構造体作成 で以下の形式で確保したデータ領域は、 > BUNDATA bundata[5]; > LPBUNDATA lpbundata=bundata; ■(2)当り判定 にて、構造体ポインタの配列型参照法で利用してます 明示的に領域宣言をしてデータ領域を確保する方法も、 自身でmallocを利用してデータ領域を確保するのと同じことになります 単純にこうする LPBUNDATA lpbundata; ・・・ lpbundata=(BUNDATA *)malloc(sizeof(BUNDATA)*Const); ・・・ for(j=0;j<5;j++){ if(PtInRect(&(lpbundata+j)->Rect, pt)); } または、こんな方法でも BUNDATA lpbundata[]; ・・・ lpbundata=(BUNDATA *)malloc(sizeof(BUNDATA)*Const); ・・・ for(j=0;j<5;j++){ if(PtInRect(&lpbundata[j].Rect, pt)); } なお、 動的にメモリ確保したら、利用し終わった時点で freeで開放することを絶対忘れずに --(修正&追記します)-- ちなみに、 >BUNDATA bundata[5]; > ・・・ >bundata[5];の要素を動的確保する為 こういった領域の確保に「動的確保」という表現は適切ではありません 動的な確保とは、当該のプログラム内で必要に応じて、プログラム自身がallocによりメモリを取得する ような場合をさします |
▲このページのトップに戻る
481723 | Re:C言語(メモリの動的確保とRECT関数)につ | jtaka[BJCB] | 2009/08/09-21:42 |
記事番号481712へのコメント しんさんは No.481712「Re:C言語(メモリの動的確保とRECT関数)につ」で書きました。 おいらは、mallocなどを使ったプログラムはほとんど書いたことないし、いまは Managedなプログラムをぼちぼち勉強しているような状況なので、あまりくわしく ないんだけど。 Rectの入っている構造体を動的確保しているのならば、その構造体のRectへのポインタを 渡すということに変わりはないと思うんですけど。Rectの中身はちゃんとはいっている ことは確認されているみたいに見えるけど。 それとも、mallocで確保されているオブジェクトのたどり方がわからないっていう ことなんだろうか。ふつうにポインタを前進させたり後退させたりすることで、 できるはずかと。そこらあたりはいろんなところで開設されていると思うから、 それを参照してみる。 # 個人的に、動的に確保する必要があるかどうかも不明な気がしないでもない。 |
▲このページのトップに戻る
481736 | Re:C言語(メモリの動的確保とRECT関数)につ | しん | 2009/08/10-08:56 |
記事番号481723へのコメント pandora さん jtaka[BJCB] さん 有難うございました、一応解決しました。 ■「構造体ポインタ」による領域参照方法の理解不足でした。 ■「動的確保」の表現に不適当な点、有難うございます。 ■「free()」は case WM_DESTROY: free(lpbundata); lpbundata=NULL; PostQuitMessage(0); break; で対応しています。 ■動的確保の必要性について 今回の質問では説明上、要素の数が5ですが、APP使用者に要素の数値を選択してもらう為 動的確保を考えました。 私の理解不足、勘違い、思い込みで、なかなか進みませんでした 有難うございました。 |
何か一言(本ページで参考になったならないを含めて残してあります)
◎:解決 ○:参考になった ×:参考にならなかった !:アドバイスあり
参考 | 回数 | 投稿日時 | 何か一言 |
---|