malloc関数の使い方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
楽しいC

malloc関数の使い方

#1

投稿記事 by 楽しいC » 13年前

こんばんは。VC++2010でC言語を使ってゲームを作成しています。
そこで、リスト構造のメモリ領域の確保をしているのですが、いまいちできてるのかわかりません・・。
見ようとしても、確保できてるのか見えないし・・。
このプログラムで正常に確保できてるでしょうか?
そもそも、この場合でも確保するべきなのでしょうか?

ちなみに、このプログラムは、画像のロードを行うプログラムです。

コード:

//初期化
void Image_Initialize(ImageData *image_s){

	//データ初期化
	image_s[0].next = &image_s[1];//ダミー
	
	//プレイヤー歩行データ
	image_s[1].img	= LoadGraph( "media\\player1.png",TRUE);
	image_s[1].size_x = 300/3;
	image_s[1].size_y = 200;
	image_s[1].radius = 50/2;
	image_s[1].num    = 2;
	image_s[1].next   = &image_s[2];

	//プレイヤー構えデータ
	image_s[2].img	  = LoadGraph("media\\player2.png",TRUE);
	image_s[2].size_x = 300;
	image_s[2].size_y = 200;
	image_s[2].radius = 50/2;
	image_s[2].num    = 2;
	image_s[2].next   = &image_s[3];

	image_s[3].next   = NULL;//ダミー	
}

//エラーチェック(エラーを探索)
int ImageError_calc( ImageData *Data ){

struct ImageData *Image_wp=Data;//仕事領域

	Image_wp->next	  = Data->next;	//データへ侵入
	
	//データがなくなるまで探索
	while( Image_wp->next != NULL ){
		if( Image_wp->img == -1 ){

			return -1;//読み込めない(-1を返す)
		}
		Image_wp = Image_wp->next;//次のデータへ侵入
	}
	return 0;
}

コード:

static const int IMG_DATA = 4;

//ロード管理
void Mgr_Load(){

//メモリ領域確保
struct ImageData *image_s = 
( struct ImageData * )malloc( sizeof( struct ImageData ) * IMG_DATA );
 
 if( image_s == NULL ){//メモリ不足
	 MessageBox( NULL, "メモリが不足しています。スタック領域を確保できません。", "memory cannot ", MB_OK);
	 exit(1);
 }
 

//エラーチェック	

int error_ans = 0;

	Image_Initialize( image_s );//プレイヤーデータ読込

	error_ans = ImageError_calc( &image_s[0] );//エラー判定

	if( error_ans == -1 ){//結果がエラーなら
		MessageBox( NULL, "ファイルが読み込めません。プログラムを終了します。", " file not found", MB_OK);
		exit(1);
		}

	free(image_s);//領域解放
}
また、今後作る予定のプレイヤー関数で、Image構造体をポインタで使いたいのですが、関数内で設定するべきですか?
そうすると、敵関数でImage構造体を使いたいときも、関数内でいちいち設定しないとだめですか?

ポインタをたくさん使うプログラムは初めて作るので、いろいろ間違っていたりするかもしれませんので、
ここをこう直したほうがいいなど、アドバイスもお願いします・・。

長々を申し訳ございませんが、ご返答待ってます

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: malloc関数の使い方

#2

投稿記事 by へにっくす » 13年前

うーん間違っちゃいないな。とりあえず。

コード:

//エラーチェック(エラーを探索)
int ImageError_calc( ImageData *Data ){
 
    ImageData *Image_wp=Data;// 仕事領域 ★staticである必要はない
 
    // Image_wp->next    = Data->next; //データへ侵入 ★この一行はいらない
    
    //データがなくなるまで探索
    while( Image_wp->next != NULL ){
        if( Image_wp->img == -1 ){
            return -1;//読み込めない(-1を返す)
        }
        Image_wp = Image_wp->next;//次のデータへ侵入
    }

    return 0;
}
あととりあえず、
ImageError_calcに渡している引数は&image_s[0]でなくimage_sでいいと思う。
楽しいC さんが書きました:今後作る予定のプレイヤー関数で、Image構造体をポインタで使いたいのですが、関数内で設定するべきですか?
それは自分で決めなさい。
やっていくうちに、こうすればよいと言うのが見つかるはず。
written by へにっくす

楽しいC

Re: malloc関数の使い方

#3

投稿記事 by 楽しいC » 13年前

ご返信ありがとうございます!

いろいろ細かいところまで指摘いただきありがとうございます!!


確かに、自分には自分のやり方がありますよね・・完璧にすることだけを考えてました・・・。


今後、また行き詰まったら、質問させていただくかもしれませんが、よろしくお願いします!!

そうならないのが一番いいんですが・・・。

閉鎖

“C言語何でも質問掲示板” へ戻る