前スレでもありましたが、構造体の初期化について教えてください。
現在、こういった形で構造体を定義しています。
//方向を表す列挙型
typedef enum tag_MGARROW{
MG_NONE = -1,
MG_UP = 0,
MG_RIGHT =1,
MG_DOWN = 2,
MG_LEFT = 3
}MGARROW;
//それぞれの方向への情報を持つ
typedef struct tag_MGDIRECTION{
BOOL enable;
int length;
}MGDIRECTION;
//マウスジェスチャを行うための要の構造体
typedef struct tag_MOUSEGESTURE
{
BOOL enable; //有効か?
int range; //判定距離
MGDIRECTION direc[4];//それぞれの方向の情報
POINT old; //移動距離を出すための位置
}MOUSEGESTURE;
そこで、WndProcの中で
MOUSEGESTURE *move;
//構造体の初期化
for(int i=0; i<4; i++){
move->direc[i].enable = FALSE;
move->direc[i].length = 0;
}
move->enable = FALSE;
move->old.x = 0;
move->old.y = 0;
move->range = -150; //rangeに適当な値をセットする
初期化したつもりなんですが、実行すると【Run-Time Check Failure #3 - The
variable 'move' is being used without being initialized.】というエラーが出てし
まいます。
また、別な初期化としてZeroMemory(&move, sizeof(move))を入れたら
【circle.exe の 0x0041603d でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x00000008 に書き込み中にアクセス違反が発生しました。】
とこのようなエラーが出てしまいました。
環境;WinXP, Visual Studio2005, VC++ Win32
初歩の質問で大変申し訳ありませんが、
お分かりの方がいらっしゃればご教授の程、よろしくお願いします。
>MOUSEGESTURE *move;
>//構造体の初期化
>for(int i=0; i<4; i++){
> move->direc[i].enable = FALSE;
初期化されていないポインタの参照先に値をセットしてるから
どこかのメモリを破壊してるからでは?
rikizoさん、ありがとうございます。
>初期化されていないポインタの参照先に値をセットしてるから
>どこかのメモリを破壊してるからでは?
なんとなく意味は分かるのですが、ポインタの初期化ってどうやるのでしょうか?
そこがいまいちよく分からなくて…。
ポインタの初期化ってどうやるのでしょうか?
MOUSEGESTURE body;
MOUSEGESTURE *move;
move = &body;
とか
MOUSEGESTURE *move;
move = (MOUSEGESTURE*)malloc(sizeof(MOUSEGESTURE));
...
free(move);
とか。
επιστημηさん、ありがとうございます!
>MOUSEGESTURE *move;
>move = (MOUSEGESTURE*)malloc(sizeof(MOUSEGESTURE));
>...
>free(move);
だと、
【circle.exe の 0x0041603d でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x00000008 に書き込み中にアクセス違反が発生しました。】
というエラーがまた出てしまいましたが、
>MOUSEGESTURE body;
>MOUSEGESTURE *move;
>move = &body;
でやってみたところ、ちゃんと出来ました。
初歩的な質問に答えていただき、本当にありがとうございました!
またご質問させていただくこともあるかと思いますが、そのときはよろしくお願いしま
すm(__)m
>というエラーがまた出てしまいましたが、
たぶん、この間違いしてると思う
***************************************************
MOUSEGESTURE *move;
move = (MOUSEGESTURE*)malloc(sizeof(MOUSEGESTURE));
free(move);
for(int i=0; i<4; i++){
move->direc[i].enable = FALSE;
move->direc[i].length = 0;
}
move->enable = FALSE;
move->old.x = 0;
move->old.y = 0;
move->range = -150;
・
・
・
************************************************
正しい
************************************************
MOUSEGESTURE *move;
move = (MOUSEGESTURE*)malloc(sizeof(MOUSEGESTURE));
for(int i=0; i<4; i++){
move->direc[i].enable = FALSE;
move->direc[i].length = 0;
}
move->enable = FALSE;
move->old.x = 0;
move->old.y = 0;
move->range = -150;
・
・
//処理
・
・
free(move); //ここ
***************************************************
rinさん、ありがとうございます。
最初はちゃんと処理をしたあとにfreeを入れたつもりでいましたが、
よくよく見てみたら、そうなっていなかったみたいで…。
ご指摘の通り、ちゃんと直したらエラーは出なくなりました。
どうもありがとうございましたm(__)m