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

▲このページのトップに戻る
481699C言語(メモリの動的確保とRECT関数)についてしん URL2009/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が有りましたらお願いします。

▲このページのトップに戻る
481709Re:C言語(メモリの動的確保とRECT関数)につjtaka[BJCB] 2009/08/09-15:28

記事番号481699へのコメント
しんさんは No.481699「C言語(メモリの動的確保とRECT関数)について」で書きました。

>maiioc関数やcaiioc関数を使用した時に
malloc、callocのtypoってことでいいのね?

どんな確保の仕方をしても、当該APIの引数並びに対応したデータを渡すことに違いは
ないと思うんだけど。

具体的に、どういうことをやりたいのかを書いたほうがいいんじゃないのかなぁ。

▲このページのトップに戻る
481712Re: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));

▲このページのトップに戻る
481722Re: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によりメモリを取得する
ような場合をさします

▲このページのトップに戻る
481723Re:C言語(メモリの動的確保とRECT関数)につjtaka[BJCB] 2009/08/09-21:42

記事番号481712へのコメント
しんさんは No.481712「Re:C言語(メモリの動的確保とRECT関数)につ」で書きました。

おいらは、mallocなどを使ったプログラムはほとんど書いたことないし、いまは
Managedなプログラムをぼちぼち勉強しているような状況なので、あまりくわしく
ないんだけど。

Rectの入っている構造体を動的確保しているのならば、その構造体のRectへのポインタを
渡すということに変わりはないと思うんですけど。Rectの中身はちゃんとはいっている
ことは確認されているみたいに見えるけど。
それとも、mallocで確保されているオブジェクトのたどり方がわからないっていう
ことなんだろうか。ふつうにポインタを前進させたり後退させたりすることで、
できるはずかと。そこらあたりはいろんなところで開設されていると思うから、
それを参照してみる。


# 個人的に、動的に確保する必要があるかどうかも不明な気がしないでもない。

▲このページのトップに戻る
481736Re:C言語(メモリの動的確保とRECT関数)につしん 2009/08/10-08:56

記事番号481723へのコメント
pandora さん
jtaka[BJCB] さん

有難うございました、一応解決しました。

■「構造体ポインタ」による領域参照方法の理解不足でした。

■「動的確保」の表現に不適当な点、有難うございます。

■「free()」は
case WM_DESTROY:
free(lpbundata);
lpbundata=NULL;
PostQuitMessage(0);
break;
で対応しています。

■動的確保の必要性について
今回の質問では説明上、要素の数が5ですが、APP使用者に要素の数値を選択してもらう為
動的確保を考えました。


私の理解不足、勘違い、思い込みで、なかなか進みませんでした
有難うございました。

A1.本ページは参考になりましたか? 又はアドバイスがありますか?
解決 参考になった 参考にならなかった アドバイスする

A2.何度目の訪問ですか?
初めて来た   数度目(2〜4) 5回以上来ている   管理人:

A3.何か一言どうぞ(アドレスは書くことができません)

A4.アドレスがあればどうぞ(1つまで)


↑↑↑↑よろしければ押してください↑↑↑↑

何か一言(本ページで参考になったならないを含めて残してあります)
◎:解決 ○:参考になった ×:参考にならなかった !:アドバイスあり

参考回数投稿日時何か一言