コンパイルエラー

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

コンパイルエラー

#1

投稿記事 by pot » 14年前

コード:

龍神録の50章とゲームプログラミングの館の3.4章のプログラムを使用し、

コード:

メニュー画面を作成するためにmenu.cppを作り以下のようなプログラムを書いたのですがエラーが出ます。

menu.cpp(37) : error C2059: 構文エラー : 'while'
menu.cpp(37) : error C2143: 構文エラー : ';' が '{' の前にありません。
menu.cpp(37) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)

どうすれば上記のエラーが無くなるでしょうか?
OSはWindowsでコンパイラは VC++ 2008EEを使用しています。
C言語の知識は簡単な関数しか理解出来ない程度です。

コード:

#include "../include/GV.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
	for( int i=0; i<256; i++ ){ 
		if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		} else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

// メニュー項目の表示に必要な構造体を用意する
typedef struct{
        int x, y;       // 座標格納用変数
        char name[128]; // 項目名格納用変数
} MenuElement_t ;


        // メニュー項目要素を5つ作る
        MenuElement_t MenuElement[5]={
                {  80, 100, "ゲームスタート" }, // タグの中身の順番で格納される。xに80が、yに100が、nameに"ゲームスタート"が
                { 100, 150, "おまけ" },
                { 100, 200, "ヘルプ" },
                { 100, 250, "コンフィグ" },
                { 100, 300, "ゲーム終了" },
        };
        int SelectNum = 0; // 現在の選択番号

        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キー更新)
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

                // 計算フェーズ 

                if( Key[ KEY_INPUT_DOWN ] == 1 ){ // 下キーが押された瞬間だけ処理

                        SelectNum = ( SelectNum + 1 ) % 5; // 現在の選択項目を一つ下にずらす(ループする)
                }

		if( Key[ KEY_INPUT_UP ] == 1 ){ // 上キーが押された瞬間だけ処理

			SelectNum = ( SelectNum + 4 ) % 5; // 現在の選択項目を一つ上にずらす(逆ループする)
		}

		if( Key[ KEY_INPUT_DOWN ] == 1 || Key[ KEY_INPUT_UP ] == 1 ){ // 下キーか、上キーが押された瞬間
			for( int i=0; i<5; i++ ){              // メニュー項目数である5個ループ処理
				if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
					MenuElement[i].x = 80; // 座標を80にする
				} else {                       // 今処理しているのが、選択番号以外なら
					MenuElement[i].x = 100;// 座標を100にする
				}
			}
		}
		

		// 描画フェーズ

		for( int i=0; i<5; i++ ){ // メニュー項目を描画
			DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
		}
		}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: コンパイルエラー

#2

投稿記事 by みけCAT » 14年前

このソースコードを見る限り、while文が関数の外に書かれているので、エラーになっているようです。
もしきちんと関数の中に書いているのであれば、ソースコード全体を貼ってください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: コンパイルエラー

#3

投稿記事 by beatle » 14年前

恐らくインデント(字下げ)をきちんと行えば防げるエラーだと感じます。
チェック3 : インデントを揃えよう

pot

Re: コンパイルエラー

#4

投稿記事 by pot » 14年前

http://dixq.net/g/03_04.html
上記のプログラムをmenu.cppにコピペしてとりあえず正常に動作するか確認したのですがエラーになります

> #include "DxLib.h"

> int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

この行で問題が起こるみたいなんですがどのように書き換えれば正常に動作するでしょうか?

だんごさん
記事: 273
登録日時: 14年前

Re: コンパイルエラー

#5

投稿記事 by だんごさん » 14年前

pot さんが書きました:http://dixq.net/g/03_04.html
上記のプログラムをmenu.cppにコピペしてとりあえず正常に動作するか確認したのですがエラーになります
どういうエラーが出ますか?
もしかするとDxLibの設定を行っていない可能性があります。
こちらを参考にすればいいと思います。

最初の質問でのプログラムは関数で囲まれていないためエラーが出ます。
 Dango San

pot

Re: コンパイルエラー

#6

投稿記事 by pot » 14年前

DxLib.hは参照元が間違っていたみたいなので解決しましたが

1>menu.obj : error LNK2005: _WinMain@16 は既に main.obj で定義されています。
1>menu.obj : error LNK2005: _WinMain@16 は既に main.obj で定義されています。
fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

このようなエラーが出てしまいます。
どのような関数を使えば解決出来るでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: コンパイルエラー

#7

投稿記事 by softya(ソフト屋) » 14年前

1>menu.obj : error LNK2005: _WinMain@16 は既に main.obj で定義されています。

これはWinMain関数が多重定義されていた時に出ますので根本的に書き方が間違ってい可能性が高いです。
ソースコードを全部貼り付けてもらった方が良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

pot

Re: コンパイルエラー

#8

投稿記事 by pot » 14年前

龍神録の50章を使用し、その中にmenu.cppを作成し以下のプログラムを書きました。

> int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

この文がmain.cppでも定義されてるため多重定義となってのでしょうか?
その場合どのように書き換えれば正常に動作しますか?

コード:

#include "../../../include/DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
	for( int i=0; i<256; i++ ){ 
		if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		} else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

// メニュー項目の表示に必要な構造体を用意する
typedef struct{
        int x, y;       // 座標格納用変数
        char name[128]; // 項目名格納用変数
} MenuElement_t ;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

        // メニュー項目要素を5つ作る
        MenuElement_t MenuElement[5]={
                {  80, 100, "ゲームスタート" }, // タグの中身の順番で格納される。xに80が、yに100が、nameに"ゲームスタート"が
                { 100, 150, "おまけ" },
                { 100, 200, "ヘルプ" },
                { 100, 250, "コンフィグ" },
                { 100, 300, "ゲーム終了" },
        };
        int SelectNum = 0; // 現在の選択番号

        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キー更新)
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

                // 計算フェーズ 

                if( Key[ KEY_INPUT_DOWN ] == 1 ){ // 下キーが押された瞬間だけ処理

                        SelectNum = ( SelectNum + 1 ) % 5; // 現在の選択項目を一つ下にずらす(ループする)
                }

		if( Key[ KEY_INPUT_UP ] == 1 ){ // 上キーが押された瞬間だけ処理

			SelectNum = ( SelectNum + 4 ) % 5; // 現在の選択項目を一つ上にずらす(逆ループする)
		}

		if( Key[ KEY_INPUT_DOWN ] == 1 || Key[ KEY_INPUT_UP ] == 1 ){ // 下キーか、上キーが押された瞬間
			for( int i=0; i<5; i++ ){              // メニュー項目数である5個ループ処理
				if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
					MenuElement[i].x = 80; // 座標を80にする
				} else {                       // 今処理しているのが、選択番号以外なら
					MenuElement[i].x = 100;// 座標を100にする
				}
			}
		}

		// 描画フェーズ

		for( int i=0; i<5; i++ ){ // メニュー項目を描画
			DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
		}

	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: コンパイルエラー

#9

投稿記事 by softya(ソフト屋) » 14年前

1つのプログラムにWinMainはひとつしか存在できませんので残念ながら無理です。
メニュー処理も本編と無関係に動けるわけはないので、龍神録本編のWinMainからメニュー処理を関数の一つとして呼び出すように記述する必要があります。
その時に次の点にも注意して下さい。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]  補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html

【補足】
練習としては、ゲームプログラミングの館の3.4章のプログラムをメニュー部分だけを別ファイルの別関数に分離する事から始められてはどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

pot

Re: コンパイルエラー

#10

投稿記事 by pot » 14年前

ありがとうございます。頑張ってみます

閉鎖

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