構造体の初期化で… – プログラミング – Home

通知
すべてクリア

[解決済] 構造体の初期化で…


とんぼ
 とんぼ
(@とんぼ)
ゲスト
結合: 21年前
投稿: 27
Topic starter  

前スレでもありましたが、構造体の初期化について教えてください。

現在、こういった形で構造体を定義しています。
//方向を表す列挙型
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

初歩の質問で大変申し訳ありませんが、
お分かりの方がいらっしゃればご教授の程、よろしくお願いします。


引用未解決
トピックタグ
rikizo
 rikizo
(@rikizo)
ゲスト
結合: 18年前
投稿: 20
 

>MOUSEGESTURE *move;
>//構造体の初期化
>for(int i=0; i<4; i++){
> move->direc[i].enable = FALSE;

初期化されていないポインタの参照先に値をセットしてるから
どこかのメモリを破壊してるからでは?


返信引用
とんぼ
 とんぼ
(@とんぼ)
ゲスト
結合: 21年前
投稿: 27
Topic starter  

rikizoさん、ありがとうございます。

>初期化されていないポインタの参照先に値をセットしてるから
>どこかのメモリを破壊してるからでは?

なんとなく意味は分かるのですが、ポインタの初期化ってどうやるのでしょうか?
そこがいまいちよく分からなくて…。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

ポインタの初期化ってどうやるのでしょうか?

MOUSEGESTURE body;
MOUSEGESTURE *move;
move = &body;

とか

MOUSEGESTURE *move;
move = (MOUSEGESTURE*)malloc(sizeof(MOUSEGESTURE));
...
free(move);

とか。


返信引用
とんぼ
 とんぼ
(@とんぼ)
ゲスト
結合: 21年前
投稿: 27
Topic starter  

επιστημηさん、ありがとうございます!

>MOUSEGESTURE *move;
>move = (MOUSEGESTURE*)malloc(sizeof(MOUSEGESTURE));
>...
>free(move);
だと、
【circle.exe の 0x0041603d でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x00000008 に書き込み中にアクセス違反が発生しました。】
というエラーがまた出てしまいましたが、

>MOUSEGESTURE body;
>MOUSEGESTURE *move;
>move = &body;
でやってみたところ、ちゃんと出来ました。
初歩的な質問に答えていただき、本当にありがとうございました!

またご質問させていただくこともあるかと思いますが、そのときはよろしくお願いしま
すm(__)m


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

>というエラーがまた出てしまいましたが、

たぶん、この間違いしてると思う
***************************************************
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); //ここ
***************************************************


返信引用
とんぼ
 とんぼ
(@とんぼ)
ゲスト
結合: 21年前
投稿: 27
Topic starter  

rinさん、ありがとうございます。

最初はちゃんと処理をしたあとにfreeを入れたつもりでいましたが、
よくよく見てみたら、そうなっていなかったみたいで…。

ご指摘の通り、ちゃんと直したらエラーは出なくなりました。

どうもありがとうございましたm(__)m


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました