補足です。
自分の上の奴と、softyaさんのを見れば答えは分かると思います。
ポインタを学習していないと訳が分からないと思うので、その場合は流し読み程度で。
softya(ソフト屋) さんが書きました:
それと 赤鬼 さんが書いているstaticは変数に使うと関数外に変数を書いてもファイル内にスコープが限定されるのでextern参照時は使ってはいけません。
※ 誤解されそうなので補足させていただきました。
補足感謝します、softyaさんの仰るとおりstaticの場合スコープが限定されます。
ですからポインタ経由で扱う必要があります。
この場合externでは参照できません。
変わりにポインタを取得する必要があります。
コード:
//mon_dat.h
#ifndef MON_DEF_H
#define MON_DEF_H
typedef struct
{
int num; //効果を呼び出すときのナンバー
char numb[4]; //図鑑などで表示するときのナンバー
char name[20]; //名前
int atr; //属性
int cost; //コスト
int pow; //攻撃力
int life; //体力
}Mon_t;
//extern Mon_t mon[40];
//変わりにポインタの宣言する必要あり
extern Mont_t* pmon;
#endif
コード:
//mon_dat.cpp
#include "../h/mon_dat.h"
//ポインタを返す関数
Mon_t* mod_dat()
{
static Mon_t mon[40] =
{ //num, "numb", "name", atr, cost, pow, life
{ 1, "001", "モンスター1", 1, 1, 1, 1 },
//略
{ 40, "040", "モンスター40", 4, 5, 3, 3 }
};
//ポインタを返す
return &mon[0];//monでもOK
}
コード:
//sample.cpp
#include "DxLib.h"
#include "../h/sample.h"
#include "../h/mon_dat.h"
//mod_datで取得したポインタを受け取るためのポインタ変数
Mon_t* pmon=NULL;
void sample_main()
{
//構造体がきちんと動作するか確認のためのサンプルプログラムです
/*pmonのポインタはこの前にどこかで取得しておいて下さい。
一応これでも期待した動作が見込めると思います。但しソースコードの可読性が下がるのでお勧めはしません。
そもそもstaticは外部に持ち越す物ではない。*/
DrawFormatString( 280, 280, GetColor( 255 , 255 , 255 ), "%d",pmon->pow );
}
//ポインタ無しの場合
コード:
//mon_dat.h
#ifndef MON_DEF_H
#define MON_DEF_H
typedef struct
{
int num; //効果を呼び出すときのナンバー
char numb[4]; //図鑑などで表示するときのナンバー
char name[20]; //名前
int atr; //属性
int cost; //コスト
int pow; //攻撃力
int life; //体力
}Mon_t;
extern Mon_t mon[40];
#endif
コード:
//mon_dat.cpp
#include "../h/mon_dat.h"
//グローバル空間に実体+初期化
Mon_t mon[40] =
{ //num, "numb", "name", atr, cost, pow, life
{ 1, "001", "モンスター1", 1, 1, 1, 1 },
//略
{ 40, "040", "モンスター40", 4, 5, 3, 3 }
};
/*
この関数は必要なくなります。
void mod_dat()
{
Mon_t mon[40] =
{ //num, "numb", "name", atr, cost, pow, life
{ 1, "001", "モンスター1", 1, 1, 1, 1 },
//略
{ 40, "040", "モンスター40", 4, 5, 3, 3 }
};
}*/
コード:
//sample.cpp
#include "DxLib.h"
#include "../h/sample.h"
#include "../h/mon_dat.h"
void sample_main()
{
//構造体がきちんと動作するか確認のためのサンプルプログラムです
DrawFormatString( 280, 280, GetColor( 255 , 255 , 255 ), "%d", mon[0].pow );
}
どちらにしても、グローバル空間に置かなくてはならないので、構造体そのものを置いても構わないと思います。
個人的にはポインタに慣れておいた方が後々楽になると思うので弄ってみると良いと思います。
ポインタを学習していないなら、何も考えずそのまま、構造体をグローバル空間に置いてしまっても構わないと思います。
後にポインタを学習したときに振り返って、変な人がこんなやり方してたな程度の認識で構いません。
それと、グローバルやローカルと言う言葉が分からなければ少し深く説明さて頂きます。