ページ 1 / 1
構造体について質問があります。教えてください!
Posted: 2015年1月26日(月) 15:59
by Tomo
初めての質問なので改善すべきところがあれば教えてください。
環境は
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はそのまま使うというわけではないんですか?
詳しく教えていただけると助かります。
Re: 構造体について質問があります。教えてください!
Posted: 2015年1月26日(月) 17:19
by box
蜜柑 さんが書きました:
コード:
//キャラクターに関する構造体
typedef struct {
// ここにメンバーが入る
} ch_t;
これは、構造体タグがない(つまり名前が付いていない)構造体に対して
ch_tという別名を与えています。こうすることで、この構造体を使った変数を定義する際、
のように書けます。
蜜柑 さんが書きました:
コード:
struct ○○○{
// ここにメンバーが入る
};
これは、○○○という構造体タグが付いている構造体です。これに対して別名を与えるのであれば、
コード:
typedef struct ○○○{
// ここにメンバーが入る
} foo;
のように書きます。○○○という構造体に対してfooという別名を与えています。
こうすることで、○○○という構造体を使った変数を定義するとき、
と書いてもいいし、
と書いてもいいです。
蜜柑 さんが書きました:
またそのあとのload.cppでは
extern int img_ch[2][12];
となっていて
ch_tはそのまま使うというわけではないんですか?
詳しく教えていただけると助かります。
これは、上記の構造体の話とは全く別です。
load.cpp以外の他のファイルで実体を定義している配列img_chを
load.cppの中で使います、という宣言です。
Re: 構造体について質問があります。教えてください!
Posted: 2015年1月26日(月) 20:11
by Tomo
細かい説明ありがとうございます。
ということは
コード:
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で定義されたものということであってますか?
Re: 構造体について質問があります。教えてください!
Posted: 2015年1月26日(月) 20:40
by milfeulle
言語は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++なら関係のない話です。
Re: 構造体について質問があります。教えてください!
Posted: 2015年1月26日(月) 20:45
by box
蜜柑 さんが書きました:
コード:
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で実体を定義しているかどうかによります。
Re: 構造体について質問があります。教えてください!
Posted: 2015年1月26日(月) 23:59
by Tomo
勘違いしてました
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
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++ならここは変更すべき!
といったところがあれば指摘していただけるとありがたいです。
またその理由も教えていただけると助かります。
Re: 構造体について質問があります。教えてください!
Posted: 2015年1月27日(火) 09:08
by みけCAT
蜜柑 さんが書きました:コンパイルは通ったのですがキャラが描画されません
0.pngは.cppなどが入っているファイルに直接入れたので読み込めてないわけではないような気がするのですが。
デバッグにおいて、「ここは間違ってないはず」と思い込むのは危険です。
「読み込めてないわけではないような気がする」ではなくて、Log.txtを見るなどしてきちんと読み込めていることを確認してください。
Re: 構造体について質問があります。教えてください!
Posted: 2015年2月01日(日) 00:36
by Tomo
返信が遅くなり申し訳ありません。
結局原因が分かりませんでした、
どうか丁寧に説明願えませんか?
あと、いまいちLog,txtの読み方が分かりません。
それも教えていただけると助かります。