宣言の仕方を工夫しようで

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

宣言の仕方を工夫しようで

#1

投稿記事 by NI » 16年前

初歩的な質問なんですが、龍神録プログラミングの館の5章で変更のあるプログラムを書いて、
ビルドしたんですが、main.cppでエラーが起きました。なぜ起きたのか教えてください。
お願いします。
              main.cppのソース
#define GLOBAL_INSTANCE
#include "../include/GV.h"

//現在のキー入力処理を行う
int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
int CheckStateKey(unsigned char Handle);

//データのロード
void load();

//描画メイン
void graph_main();

int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用)
//キャラクタデータ宣言

//ループで必ず行う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;//初期化と裏画面化

load();//データロード

while(ProcessLoop()==0){//メインループ

graph_main();//描画メイン

if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
}

DxLib_End();//DXライブラリ終了処理
return 0;
}
このソースで実行すると以下のエラーが出ます。

main.cpp
c:\documents and settings\test\デスクトップ\ゲームプログラミング\project\project\1章\mydat\source\main.cpp(15) : error C2086: 'int img_ch[2][12]' : 再定義されました。

はね

Re:宣言の仕方を工夫しようで

#2

投稿記事 by はね » 16年前

エラー文の通りですが int img_ch がどこか他の場所に書いていませんか?

ちょい編集です。

同じ変数名(この場合は配列ですが)があるとPCはわからなくなります。
なので対処法としてはint img_ch2など名前を変えるか、メンバ変数にするか、
namespaceと使うなどあります。

推測ですが、main.cppのint img_chを消せばいけそうです。

NI

Re:宣言の仕方を工夫しようで

#3

投稿記事 by NI » 16年前

はい。Load.cppとGraph.cppに書いてあります。

pooka

Re:宣言の仕方を工夫しようで

#4

投稿記事 by pooka » 16年前

エラーの通りで、int img_ch[2][12]が再定義されています。
5章をみるとGV.hに
GLOBAL int img_ch[2][12];
とあるのでmain.cppの
int img_ch[2][12];
を消してみてください。

NI

Re:宣言の仕方を工夫しようで

#5

投稿記事 by NI » 16年前

> int img_ch[2][12];
> を消してみてください。
実行してみました。そうすると以下のエラーが起きます。main.obj : error LNK2005: "int (* img_ch)[12]" (?img_ch@@3PAY0M@HA) は既に load.obj で定義されています。
graph.obj : error LNK2005: "int (* img_ch)[12]" (?img_ch@@3PAY0M@HA) は既に load.obj で定義されています。
graph.obj : error LNK2005: "struct ch_t ch" (?ch@@3Uch_t@@A) は既に main.obj で定義されています。
LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
C:\Documents and Settings\TEST\デスクトップ\ゲームプログラミング\project\project\1章\Debug\RyuJin.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

pooka

Re:宣言の仕方を工夫しようで

#6

投稿記事 by pooka » 16年前

環境が書かれていませんが、とりあえずリビルドしてみてください。
あとソースコードを記載する時は、規約に則ってプレタグを使うようにしてください。

NI

Re:宣言の仕方を工夫しようで

#7

投稿記事 by NI » 16年前

> 環境が書かれていませんが、とりあえずリビルドしてみてください。
> あとソースコードを記載する時は、規約に則ってプレタグを使うようにしてください。
ソースコードについてはこれから十分気をつけます。
後、リビルドとはなんの事でしょうか?

さが

Re:宣言の仕方を工夫しようで

#8

投稿記事 by さが » 16年前

まず5章を読み直すことからじゃないの?

NI

Re:宣言の仕方を工夫しようで

#9

投稿記事 by NI » 16年前

すでに何回も読み直しました。
もしかしたら
 (後は「main.cpp」「graph.cpp」「load.cpp」にある変数の宣言部と、extern宣言を全て消してください。)
というところが間違っているかもしれません。
変数の宣言部やextern宣言というところがよく分からないので

pooka

Re:宣言の仕方を工夫しようで

#10

投稿記事 by pooka » 16年前

コンパイラは何を使用していますか?
Visual C++ならメニューのビルド→ソリューションのリビルドでリビルドできます。

NI

Re:宣言の仕方を工夫しようで

#11

投稿記事 by NI » 16年前

> コンパイラは何を使用していますか?
> Visual C++ならメニューのビルド→ソリューションのリビルドでリビルドできます。
分かりました。やってみます。

NI

Re:宣言の仕方を工夫しようで

#12

投稿記事 by NI » 16年前

やってみましたが、以下のエラーが出ました。
main.obj : error LNK2005: "int (* img_ch)[12]" (?img_ch@@3PAY0M@HA) は既に load.obj で定義されています。
graph.obj : error LNK2005: "int (* img_ch)[12]" (?img_ch@@3PAY0M@HA) は既に load.obj で定義されています。
graph.obj : error LNK2005: "struct ch_t ch" (?ch@@3Uch_t@@A) は既に main.obj で定義されています。
LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
C:\Documents and Settings\TEST\デスクトップ\ゲームプログラミング\project\project\1章\Debug\RyuJin.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

pooka

Re:宣言の仕方を工夫しようで

#13

投稿記事 by pooka » 16年前

じゃあビルド→ソリューションのクリーンを行ってから、再度ビルドしてみてください。

dic

Re:宣言の仕方を工夫しようで

#14

投稿記事 by dic » 16年前

斜め読みですが
extern 絡みでしょう

NI

Re:宣言の仕方を工夫しようで

#15

投稿記事 by NI » 16年前

> じゃあビルド→ソリューションのクリーンを行ってから、再度ビルドしてみてください。
やってみました。前回と同じ結果になりました。

pooka

Re:宣言の仕方を工夫しようで

#16

投稿記事 by pooka » 16年前

> はい。Load.cppとGraph.cppに書いてあります。
もしかしてLoad.cppとGraph.cppにも
extern int img_ch[2][12];
って書いてますか?
書いていたら消してみてください。

NI

Re:宣言の仕方を工夫しようで

#17

投稿記事 by NI » 16年前

Load.cppとGraph.cppには
int img_ch[2][12];
と書いてあります。
後、main.cppにもexternは書いていません。

pooka

Re:宣言の仕方を工夫しようで

#18

投稿記事 by pooka » 16年前

GV.hに
extern int img_ch[2][12];
と書くだけで他の所には宣言しないようにしてください。
つまり、Load.cpp、Graph.cpp、main.cppはexternを消しただけではなく
int img_ch[2][12];
も書かないようにしてください。

NI

Re:宣言の仕方を工夫しようで

#19

投稿記事 by NI » 16年前

> GV.hに
> extern int img_ch[2][12];
> と書くだけで他の所には宣言しないようにしてください。
> つまり、Load.cpp、Graph.cpp、main.cppはexternを消しただけではなく
> int img_ch[2][12];
> も書かないようにしてください。
>
上記のことを実行してみました。そうすると以下のエラーが起きました。(エラーが二個減りました)
graph.obj : error LNK2005: "struct ch_t ch" (?ch@@3Uch_t@@A) は既に main.obj で定義されています。

C:\Documents and Settings\TEST\デスクトップ\ゲームプログラミング\project\project\1章\Debug\RyuJin.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

pooka

Re:宣言の仕方を工夫しようで

#20

投稿記事 by pooka » 16年前

5章をもう一度よく読んでみてください。
それと今main.cppはどんな感じになっていますか?
#define GLOBAL_INSTANCE
#include "../include/GV.h"

//ループで必ず行う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;//初期化と裏画面化

	load();//データロード

	while(ProcessLoop()==0){//メインループ
		
		graph_main();//描画メイン

		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映
	}

	DxLib_End();//DXライブラリ終了処理
	return 0;
}
main.cppは5章まででこんな感じになると思います。

#すべての章のプロジェクトファイルを一括ダウンロードできるので、その中の5章のファイルと比較したほうが早く解決できるかもしれません。

NI

Re:宣言の仕方を工夫しようで

#21

投稿記事 by NI » 16年前

プロジェクトファイルを一括ダウンロードして、自分が書いたソースと比べて直すことが出来ました。
関わってくださいました皆様、本当にありがとうございました!

閉鎖

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