外部ファイルで設定

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

外部ファイルで設定

#1

投稿記事 by さが » 16年前

今作っているゲームで、defineで宣言していたものをiniファイルに移し
プレイヤーが簡単に変更できるようにしようとしたんですが

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

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

box

Re:外部ファイルで設定

#2

投稿記事 by box » 16年前

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

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

さが

Re:外部ファイルで設定

#3

投稿記事 by さが » 16年前

今のところ基本の読み書きしかわかってないです。
WritePrivateProfileSection()
GetPrivateProfileString()

box

Re:外部ファイルで設定

#4

投稿記事 by box » 16年前

では、次に、

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

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

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

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

さが

Re:外部ファイルで設定

#5

投稿記事 by さが » 16年前

すいません。一気にやればよかったですね。
コードは添付に乗っけました。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:外部ファイルで設定

#6

投稿記事 by たかぎ » 16年前

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

たかぎ

Re:外部ファイルで設定

#7

投稿記事 by たかぎ » 16年前

ちょっと言葉足らずでした。
std::vectorを使った上で、iniファイルから値を読み込む順序を改善する必要があります。

さが

Re:外部ファイルで設定

#8

投稿記事 by さが » 16年前

たかぎさんありがとうございます。なるほど配列では出来ないんですか。
VC++の方でlistを使ったことがありますが、発狂しそうになりました。

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

たかぎ

Re:外部ファイルで設定

#9

投稿記事 by たかぎ » 16年前

> 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:外部ファイルで設定

#10

投稿記事 by さが » 16年前

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:外部ファイルで設定

#11

投稿記事 by さが » 16年前

Justyさんのレスを発見し無事エラーを消すことが出来ました。

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

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

閉鎖

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