hファイル間での構造体の参照

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

hファイル間での構造体の参照

#1

投稿記事 by nekogori » 14年前

初めて質問させていただきます。nekogoriと申します。まだまだ未熟な初心者です。

今こちらのサイトを参考にしてシューティングゲームに挑戦させてもらっています。
分割コンパイルしていてhファイルで構造体定義をしていたのですが、そこで困りました。

~ Enemy.h ~

コード:

#ifndef DEF_ENEMY_H //二重include防止

#define DEF_ENEMY_H

#define MARU 5
#define ENEMYSHOT01 30

typedef struct{
	int MaruX[MARU] , MaruY[MARU] ;
	int MaruHP[MARU] ;
	int MaruShotC[MARU] ;
	int MaruFlag[MARU] ;
	int MaruGraph ;
	int MW , MH ;
	int MaruShotX[ENEMYSHOT01] , MaruShotY[ENEMYSHOT01] ;
	int MaruShotF[ENEMYSHOT01] ;
	int MaruShotG ;
	int MSW , MSH ;
} Enemy_Maru_t ;

//初期化処理
void Enemy_Maru_Initialize( Enemy_Maru_t *Maru ) ;

//計算処理
void Enemy_Maru_Calc( Enemy_Maru_t *Maru , OrangeShot_t *OrangeShot) ; 

//描画処理
void Enemy_Maru_Graph( Enemy_Maru_t *Maru ) ;

#endif

このhファイルを含めたソースファイルをコンパイルするとこのようなエラーが出ました。

コード:

1>------ ビルド開始: プロジェクト: STG 1, 構成: Debug Win32 ------
1>コンパイルしています...
1>Enemy.cpp
1>c:\users\shiro\documents\visual studio 2008\projects\stg 1\enemy.h(26) : error C2061: 構文エラー : 識別子 'OrangeShot_t'
1>Main.cpp
1>c:\users\shiro\documents\visual studio 2008\projects\stg 1\enemy.h(26) : error C2061: 構文エラー : 識別子 'OrangeShot_t'
1>c:\users\shiro\documents\visual studio 2008\projects\stg 1\main.cpp(63) : error C2660: 'Enemy_Maru_Calc' : 関数に 2 個の引数を指定できません。
1>c:\users\shiro\documents\visual studio 2008\projects\stg 1\main.cpp(66) : error C2275: 'Enemy_Maru_t' : この型は演算子として使用できません
1>        c:\users\shiro\documents\visual studio 2008\projects\stg 1\enemy.h(20) : 'Enemy_Maru_t' の宣言を確認してください。
1>c:\users\shiro\documents\visual studio 2008\projects\stg 1\main.cpp(69) : error C2275: 'Enemy_Maru_t' : この型は演算子として使用できません
1>        c:\users\shiro\documents\visual studio 2008\projects\stg 1\enemy.h(20) : 'Enemy_Maru_t' の宣言を確認してください。
1>Shot.cpp
1>c:\users\shiro\documents\visual studio 2008\projects\stg 1\enemy.h(26) : error C2061: 構文エラー : 識別子 'OrangeShot_t'
1>c:\users\shiro\documents\visual studio 2008\projects\stg 1\shot.cpp(90) : error C2039: 'MaruW' : 'Enemy_Maru_t' のメンバではありません。
1>        c:\users\shiro\documents\visual studio 2008\projects\stg 1\enemy.h(9) : 'Enemy_Maru_t' の宣言を確認してください。
1>c:\users\shiro\documents\visual studio 2008\projects\stg 1\shot.cpp(91) : error C2039: 'MaruH' : 'Enemy_Maru_t' のメンバではありません。
1>        c:\users\shiro\documents\visual studio 2008\projects\stg 1\enemy.h(9) : 'Enemy_Maru_t' の宣言を確認してください。
1>コードを生成中...
1>ビルドログは "~\Documents\Visual Studio 2008\Projects\STG 1\Debug\BuildLog.htm" に保存されました。
1>STG 1 - エラー 8、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
Enemy.hの

//計算処理
void Enemy_Maru_Calc( Enemy_Maru_t *Maru , OrangeShot_t *OrangeShot) ;

OrangeShot_t *OrangeShot が原因だと思うのですが OrangeShot_t  は別のhファイルに定義してあって、どうすればEnemy.hに参照すれば良いかわかりません。
それともほかのやり方があるのでしょうか。( 私にはさっぱり…

OSはWindows7
開発環境はMicrosoft Visual C++ 2008 Express Edition
使用ライブラリはDxLibを使っています。

分かる方どうか教えてください。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: hファイル間での構造体の参照

#2

投稿記事 by YuO » 14年前

nekogori さんが書きました:OrangeShot_t *OrangeShot が原因だと思うのですが OrangeShot_t  は別のhファイルに定義してあって、どうすればEnemy.hに参照すれば良いかわかりません。
a案)
OrangeShot_tが定義されているヘッダファイルをインクルードすることによって,OrangeShot_tの宣言をします。
仮にOrange.hとして,

コード:

#include "Orange.h"
を4行目のあたりに書いておきます。
基本的にはこの方法を使います。

b案)
OrangeShot_tはポインタ型を使っているので,実際には定義が不要です。
なので,Enemy_Maru_Calcの宣言の前に,

コード:

struct OrangeShot_t;
という宣言を加えることで,回避できます。
OrangeShot_tを定義する側がEnemy.hをインクルードしている場合などは,この方法になります。
Enemy_Maru_Calcを呼び出す側が,OrangeShot_tの定義をほとんど必要としない場合にも使えます。

nekogori

Re: hファイル間での構造体の参照

#3

投稿記事 by nekogori » 14年前

ご丁寧な説明ありがとうございます。
a案、b案とも試したのですがうまくいきませんでした。
しかし、自己解決できるよう努力したいと思います。もしだめならまた質問させていただきます。
一応解決とさせていただきます。

nekogori

Re: hファイル間での構造体の参照

#4

投稿記事 by nekogori » 14年前

解決させていながらも返信させていただきます。
一応以下の方法で自己解決することができました。

~Struct.h~ ←新たに構造体用のhファイルを作る。

コード:

#ifndef DEF_STRUCT_H //二重include防止

#define DEF_STRUCT_H


//自機の構造体
typedef struct{
	int ZikiX ;
	int ZikiY ;
	int ZikiGraph ;
	int ZW , ZH ;
} Player_t ;


//敵 丸の構造体
#define MARU 5
#define MARUSHOT 3

typedef struct{
	int MaruX , MaruY ;
	int MaruHP ;
	int MaruShotC ;
	int MaruFlag ;
	int MaruGraph ;
	int MW , MH ;
	int MaruShotX[MARUSHOT] , MaruShotY[MARUSHOT] ;
	int MaruShotF[MARUSHOT] ;
	int MaruShotG ;
	int MSW , MSH ;
} Enemy_Maru_t ;
 
        ・
        ・
        ・
        ・
このhファイルを例えばPlayer.hにインクルードする。

~Player.h~

コード:

#ifndef DEF_PLAYER_H //二重include防止

#define DEF_PLAYER_H

#include "Struct.h"

// 初期化をする
void Player_Initialize( Player_t *Player ) ;

// 動きを計算する
void Player_Calc( Player_t *Player ) ;

// 描画する
void Player_Graph( Player_t Player , Other_Player_t *Other_Player ) ;
 
#endif 
とするとうまくいきました。
ただの自己満足なので返信はしなくてもよいです。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: hファイル間での構造体の参照

#5

投稿記事 by Dixq (管理人) » 14年前

ありがとうございます。
解決された場合もその対処法を記載頂けることで、有用な過去ログとなり、こちら側も助かります。

ただ、対処された方法はYuoさんの a案) と異なるのでしょうか?
対応された方法は一般的な方法で、良いと思います。

閉鎖

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