構造体について質問があります。教えてください!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Tomo
記事: 16
登録日時: 10年前
住所: 埼玉県

構造体について質問があります。教えてください!

#1

投稿記事 by Tomo » 10年前

初めての質問なので改善すべきところがあれば教えてください。
環境は
windows8.1
visualstudio2013
言語はC++です。

龍神録キャラを描画してみようのところで

コード:

--struct.h変更--

//キャラクターに関する構造体
typedef struct{
        int flag;       //フラグ
        int cnt;        //カウンタ
        int power;      //パワー
        int point;      //ポイント
        int score;      //スコア
        int num;        //残機数
        int mutekicnt;  //無敵状態とカウント
        int shot_mode;  //ショットモード
        int money;      //お金
        int img;        //画像
        int slow;       //スローかどうか
        double x,y;     //座標
}ch_t;
とあるのですが
手元にある本では
サンプルを元に書くと

コード:

struct ○○○{
 int flag;       //フラグ
        int cnt;        //カウンタ
        int power;      //パワー
        int point;      //ポイント
        int score;      //スコア
        int num;        //残機数
        int mutekicnt;  //無敵状態とカウント
        int shot_mode;  //ショットモード
        int money;      //お金
        int img;        //画像
        int slow;       //スローかどうか
        double x,y;     //座標
};
となっています
サンプルの下のch_tはどこにやればいいのでしょうか?
この場合typedefの役割が分かりません
typedef 型名 識別子;
は何のために必要なんですか?
またそのあとのload.cppでは
extern int img_ch[2][12];
となっていて
ch_tはそのまま使うというわけではないんですか?
詳しく教えていただけると助かります。

box
記事: 2002
登録日時: 14年前

Re: 構造体について質問があります。教えてください!

#2

投稿記事 by box » 10年前

蜜柑 さんが書きました:

コード:

//キャラクターに関する構造体
typedef struct {
    // ここにメンバーが入る
} ch_t;
これは、構造体タグがない(つまり名前が付いていない)構造体に対して
ch_tという別名を与えています。こうすることで、この構造体を使った変数を定義する際、

コード:

ch_t hoge;
のように書けます。
蜜柑 さんが書きました:

コード:

struct ○○○{
    // ここにメンバーが入る
};
これは、○○○という構造体タグが付いている構造体です。これに対して別名を与えるのであれば、

コード:

typedef struct ○○○{
    // ここにメンバーが入る
} foo;
のように書きます。○○○という構造体に対してfooという別名を与えています。
こうすることで、○○○という構造体を使った変数を定義するとき、

コード:

struce ○○○ bar;
と書いてもいいし、

コード:

foo bar;
と書いてもいいです。
蜜柑 さんが書きました: またそのあとのload.cppでは
extern int img_ch[2][12];
となっていて
ch_tはそのまま使うというわけではないんですか?
詳しく教えていただけると助かります。
これは、上記の構造体の話とは全く別です。
load.cpp以外の他のファイルで実体を定義している配列img_chを
load.cppの中で使います、という宣言です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Tomo
記事: 16
登録日時: 10年前
住所: 埼玉県

Re: 構造体について質問があります。教えてください!

#3

投稿記事 by Tomo » 10年前

細かい説明ありがとうございます。
ということは

コード:

typedef struct ch_t;
ch_t bar{
//メンバー
};
で問題ないですか?
load.cppの

コード:

extern int img_ch[2][12];

graph.cppの

コード:

extern ch_t ch;
extern int img_ch[2][12];

main.cppで定義されたものということであってますか?

アバター
milfeulle
記事: 47
登録日時: 11年前
住所: マリーランド
連絡を取る:

Re: 構造体について質問があります。教えてください!

#4

投稿記事 by milfeulle » 10年前

言語はC++なのですよね? でしたら、構造体はクラスのようにstructをつけなくても型名として使えます。

コード:

struct S {
/* 定義 */
};

int main() {
	S s1; // 宣言
	struct S s2; // C言語風に書いてもOK
}
以下余談です:

(1) 構造体の宣言の感覚; 無名だっていいです
関数の中に構造体〔というかクラス〕を書けます。その場限りなのでタグ名を付けないこともあります。

コード:

int main() {
	struct {
		int x;
		int y;
	} s1;
	
	s1.x = 10;
	s1.y = 20;
}
もちろんつけても構いません。

コード:

int main() {
	struct S {
		int x;
		int y;
	};
	
	S s1;
	s1.x = 10;
	s1.y = 20;
}
(2) typedefの感覚
typedef (長ったらしい型) (好きな名前の型)

typedefは、(長ったらしい型) を (好きな名前の型)に置き換えてくれます。C言語では、C++と違って、

コード:

struct TAG_S {
	int x;
	int y;
};
と宣言したら、TAG_Sのままでは型名として使えなくて、struct TAG_Sとする必要があります。そのため、名前を置き換えて使うことがあります。

コード:

struct TAG_S {
	int x;
	int y;
};
typedef struct TAG_S S; // 「struct TAG_S」を「S」と定義
実は、TAG_SとSは被っても構わないので、

コード:

struct S {
	int x;
	int y;
};
typedef struct S S; // 「struct TAG_S」を「S」と定義
でも構いません。さらに、struct { ~ }自体が型のように見なせて、

コード:

typedef struct S { int x; int y; } S;
と書けます。ついでにタグ名を使わなければ〔循環参照しなければ〕省略できますし、複数行に分けてもいいので、

コード:

typedef struct {
	int x; int y;
} S;
と書いてもよいです。

(2)はC++なら関係のない話です。
ζ*'ヮ')ζプログラミングはみんなで奏でるシンフォニー

box
記事: 2002
登録日時: 14年前

Re: 構造体について質問があります。教えてください!

#5

投稿記事 by box » 10年前

蜜柑 さんが書きました:

コード:

typedef struct ch_t;
ch_t bar{
//メンバー
};
で問題ないですか?
問題ないかどうかは、ご自分で小さいコードを書いて実験してみるとよいでしょう。
ちなみに、typedefの使い方というのは、例えば

コード:

typedef unsigned long ULONG; // unsigned longという型にULONGという別名を付ける
というようなものでありまして、質問者さんが今回書かれている

コード:

typedef struct ch_t;
は、structという単なるキーワード(メンバーがないので型ではない)にch_tという別名を付けようとしているのでアウトです。
蜜柑 さんが書きました: load.cppの

コード:

extern int img_ch[2][12];

graph.cppの

コード:

extern ch_t ch;
extern int img_ch[2][12];

main.cppで定義されたものということであってますか?
main.cppで実体を定義しているかどうかによります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Tomo
記事: 16
登録日時: 10年前
住所: 埼玉県

Re: 構造体について質問があります。教えてください!

#6

投稿記事 by Tomo » 10年前

勘違いしてました
structはデータ型じゃないからtypedefで置き換えられないということに気が付いてませんでした。
自分でも実験しましたがもちろんエラーになりました。
手元にある本と返信をみてやっと気が付きました。
それを踏まえて
main.cpp

コード:

#define GLOBAL_INSTANCE 
#include"GlobalVariable.h"




//現在のキー入力処理を行う
extern int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
extern int CheckStateKey(unsigned char Handle);

//データのロード
extern void load();

//描画メイン
extern void graph_main();

int img_ch[2][12];	//キャラ画像9枚分
ch_t ch;			//キャラクターデータ

//ループで必ず行う3大処理
int ProcessLoop(){
	if (ProcessMessage() != 0)return -1;//プロセス処理がエラーなら-1を返す
	if (ClearDrawScreen() != 0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	return 0;
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

	ChangeWindowMode(TRUE);//ウィンドウモード

	if (DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0) return -1;//初期化と裏画面化

	//メインループ
	while (ProcessLoop()==0){

		graph_main();	//描画メイン

		if (CheckStateKey(KEY_INPUT_ESCAPE) == 1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映


	}

	DxLib_End();
	return 0;
}
key.cpp

コード:

#include"GlobalVariable.h"

int stateKey[256];

int GetHitKeyStateAll_2(){
	char GetHitKeyStateAll_Key[256];
	GetHitKeyStateAll(GetHitKeyStateAll_Key);
	for (int i = 0; i<256; i++){
		if (GetHitKeyStateAll_Key[i] == 1) stateKey[i]++;
		else                            stateKey[i] = 0;
	}
	return 0;
}

int CheckStateKey(unsigned char Handle){
	return stateKey[Handle];
}
graph.cpp

コード:

#include"GlobalVariable.h"

extern ch_t ch;
extern int img_ch[2][12];


void graph_ch(){
	DrawRotaGraphF(ch.x, ch.y, 1.0f, 0.0f, img_ch[0][ch.img], TRUE);
}

void graph_main(){
	graph_ch();
}
load.cpp

コード:

#include"GlobalVariable.h"

extern int img_ch[2][12];

void load(){
	LoadDivGraph("0.png", 12, 4, 3, 73, 73, img_ch[0]);
}
GV.h

コード:

#include"DxLib.h"
#include"Define.h"
define.h

コード:

#include"Struct.h"
struct.h

コード:


struct ch_t{
	int flag;				//フラグ
	int count;				//カウンタ
	int power;				//パワー
	int point;				//ポイント
	int score;				//スコア
	int num;				//残機数
	int invinciblecount;	//無敵状態とカウント
	int shotmode;			//ショットモード
	int money;				//お金
	int img;				//画像
	int slow;				//スロー
	double x, y;			//座標
};
となりました
一部変えました。
コンパイルは通ったのですがキャラが描画されません
0.pngは.cppなどが入っているファイルに直接入れたので読み込めてないわけではないような気がするのですが。
間違っている箇所や、C++ならここは変更すべき!
といったところがあれば指摘していただけるとありがたいです。
またその理由も教えていただけると助かります。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 構造体について質問があります。教えてください!

#7

投稿記事 by みけCAT » 10年前

蜜柑 さんが書きました:コンパイルは通ったのですがキャラが描画されません
0.pngは.cppなどが入っているファイルに直接入れたので読み込めてないわけではないような気がするのですが。
デバッグにおいて、「ここは間違ってないはず」と思い込むのは危険です。
「読み込めてないわけではないような気がする」ではなくて、Log.txtを見るなどしてきちんと読み込めていることを確認してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Tomo
記事: 16
登録日時: 10年前
住所: 埼玉県

Re: 構造体について質問があります。教えてください!

#8

投稿記事 by Tomo » 10年前

返信が遅くなり申し訳ありません。
結局原因が分かりませんでした、
どうか丁寧に説明願えませんか?
あと、いまいちLog,txtの読み方が分かりません。
それも教えていただけると助かります。

閉鎖

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