ページ 11

外部ファイルで設定

Posted: 2009年5月05日(火) 19:40
by さが
今作っているゲームで、defineで宣言していたものをiniファイルに移し
プレイヤーが簡単に変更できるようにしようとしたんですが

その中に配列の宣言に使っているものがあり、"定数式が必要です。"と怒られてしまいます。

こういうものを外部ファイルに逃がすことは出来ないのでしょうか。

Re:外部ファイルで設定

Posted: 2009年5月05日(火) 19:49
by box
> こういうものを外部ファイルに逃がすことは出来ないのでしょうか。

iniファイルの読み書きをするために
Windowsが標準で用意している関数に関する知識を
どのくらいお持ちですか?それによります。

Re:外部ファイルで設定

Posted: 2009年5月05日(火) 20:04
by さが
今のところ基本の読み書きしかわかってないです。
WritePrivateProfileSection()
GetPrivateProfileString()

Re:外部ファイルで設定

Posted: 2009年5月05日(火) 20:37
by box
では、次に、

> プレイヤーが簡単に変更できるようにしようとしたんですが

iniファイルを読むためにどういったコードを書いて実現しようとされたか、と、

> その中に配列の宣言に使っているものがあり、"定数式が必要です。"と怒られてしまいます。

エラーが出た箇所のコードを見せていただけますか?

Re:外部ファイルで設定

Posted: 2009年5月05日(火) 20:59
by さが
すいません。一気にやればよかったですね。
コードは添付に乗っけました。define.hがコメントになっているのはマクロしないためです。

エラーですが
\GV.h(27) : error C2057: 定数式が必要です。
\GV.h(27) : error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。

がでます。
これは今まで#defineでマクロ定義していたものを消したために
img_chara[CHARA_NUM]ならCHARA_NUMの値が入ってないと言われてるんだと思います。

先ほどのレスを拝見すると、このimg_charaの宣言より前にCHARA_NUMに値を入れることができると解釈しましたが、どうするのでしょうか。

Re:外部ファイルで設定

Posted: 2009年5月05日(火) 21:22
by たかぎ
値を設定する順番の問題ではありません。
配列を宣言する際の要素数には定数式を指定しなければなりませんが、この場合は定数式になっていません。
普通の配列でこれを解決する方法はありませんので、別のことを考える必要があります。
一番手っ取り早いのは、配列の代わりにstd::vectorクラステンプレートを使う方法です。

Re:外部ファイルで設定

Posted: 2009年5月05日(火) 21:23
by たかぎ
ちょっと言葉足らずでした。
std::vectorを使った上で、iniファイルから値を読み込む順序を改善する必要があります。

Re:外部ファイルで設定

Posted: 2009年5月05日(火) 22:24
by さが
たかぎさんありがとうございます。なるほど配列では出来ないんですか。
VC++の方でlistを使ったことがありますが、発狂しそうになりました。

img_charaは他のimgと扱いが違ってきてしまって厄介ですが、統一したほうがいいんですか?

Re:外部ファイルで設定

Posted: 2009年5月06日(水) 00:31
by たかぎ
> VC++の方でlistを使ったことがありますが、発狂しそうになりました。

本当にそうだとすると、精神が脆弱すぎます。
std::vectorの場合...

> int img_chara[CHARA_NUM];



std::vector<int> img_chara(CHARA_NUM);

とすれば済みます。

> int sound_voice[PLAYER_NUM][COMB_VOICE];

なら

std::vector<std::vector<int> > sound_voice(PLAYER_NUM, std::vector<int>(COMB_VOICE));

となります。
あとは配列と同じように[/url]演算子でアクセスできるようになります。
ただし、配列とは型が異なりますので、関数の仮引数などは修正が必要になります。

また、GLOBALマクロは使えなくなります。
元々このマクロは使わない方がよい代物なので、この際改めましょう。

Re:外部ファイルで設定

Posted: 2009年5月06日(水) 10:18
by さが
vectorは[/url]でアクセスできるんですね。
夜のうちにイテレータ?を使って一応書いてみたんですが、恐らく

>また、GLOBALマクロは使えなくなります。
ここに引っかかって実行できません。

C++を触らずにきてしまったのでどうすればいいのか分かりません。privateとかpublicなどに書き換えていけばいいのでしょうか?

今のところ出ているエラーは
warning LNK4217: ローカルで定義されたシンボル __invalid_parameter がフィクション
   "public: int & __thiscall std::vector<int,class std::allocator<int> >::operator[/url](unsigned int)"
   (??A?$vector@HV?$allocator@H@std@@@std@@QAEAAHI@Z) にインポートされました。
warning LNK4217: ローカルで定義されたシンボル ??1exception@std@@UAE@XZ
    (public: virtual __thiscall std::exception::~exception(void)) がフィクション
   __unwindfunclet$??0logic_error@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z$0 にインポートされました。
error LNK2001: 外部シンボル "__imp___CrtDbgReportW" は未解決です。
などがあります。

Re:外部ファイルで設定

Posted: 2009年5月06日(水) 12:05
by さが
Justyさんのレスを発見し無事エラーを消すことが出来ました。

>DxLib.hの DX_USE_VISUALC_MEM_DEBUGの定義がコメントアウトされていたら
>それを有効にして、ビルドの設定の使用するランタイムライブラリのところを
>マルチスレッド デバッグにしてみて下さい。

何をしているかはさっぱりですが、とりあえずvectorの勉強を進めようかなと思います。