宣言した変数を使ったにもかかわらず構文内でエラーが出る。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
DreadNorght
記事: 9
登録日時: 6年前

宣言した変数を使ったにもかかわらず構文内でエラーが出る。

#1

投稿記事 by DreadNorght » 6年前

易しいC++を一通り学習し終えDxLibを使ってこのサイト( https://bituse.info/game/shot/ )を参考にシューティングゲームを作成していたのですが自機に弾を発射させるところのコードでエラーが出てしまいます。エラーはコードの横にメモしておきます。
IDEはVisual Studio 2017です。

コード:

//ヘッダ名はdefine.hです。
#include <windows.h>     

//プレイヤーの速度
#define PLAYER_SPEED 4;

//メッセージボックス
#define MSG(m){\
	MessageBox(NULL,m,"メッセージ",MB_OK);}

//extern宣言してkey配列用意
extern char key[256];

//10Pixel余裕を持たせるための変数を用意
#define MARGIN 10;

//背景スクロール係数
#define SCROLL_SPEED 2;

//一画面に表示する弾数の最大値
#define PSHOT_NUM 20;

//弾の速度
#define PSHOT_SPEED 14;

//弾用の構造体宣言
struct SHOT {
	bool flag;
	double x;
	double y;
	//グラフィックハンドル
	int gh;
	//画像の幅高さ
	int width, height;
};

コード:

//プレイヤーの行動関係のクラス
//ヘッダ名はplayer.h
#include "define.h"

class PLAYER {
private:
	//画像のx,y座標を設定
	double x, y;
	//画像幅
	int width, height;
	//グラフィックハンドル
	int gh[12];
	//移動係数
	float move;
	//カウント
	int xcount, ycount;
	//要素のためのやつ
	int ix, iy, result;
	//生きてるかどうかのフラグ
	bool life;

	//弾用配列
	SHOT shot[PSHOT_NUM];  //']'が必要ですとエラーが出る。

	//カウント
	int count;
private:
	void Move();
	void Draw();
	void Shot();
public:
	PLAYER();
	void All();
};

コード:

//PLAYERクラスメンバ関数の定義
#include "pch.h"  //pch.hではデラックスライブラリとdefine.hをインクルードしています。
#include "player.h"

//コンストラクタの定義は省略させていただきます

void PLAYER::Draw()
{
	//弾描写
	for (int i = 0; i < PSHOT_NUM; i++) {
		if (shot[i]).flag){          //shotに式にはブール型を使用する必要があります、「.」に式が必要ですとエラー。
		DrawGraph(shot[i].x - shot[i].width / 2, shot[i].y - shot[i].height / 2, shot[i].gh, TRUE); 
		}
	}         //ここのカッコに';'が必要ですとエラー。
	//描写
	if (life) {
		DrawGraph(x - width / 2, y - height / 2, gh[result], TRUE);
	}
}


//Shot関数の定義
void PLAYER::Shot()
{
	if (key[KEY_INPUT_Z] == 1 && count % 6 == 0) {
		for (int i = 0; i < PSHOT_NUM; ++i) {  //PSHOT_NUMの後の;に式が必要ですとエラー。
			if (shot[i].flag == false) {
				shot[i].flag = true;
				shot[i].x = x;
				shot[i].y = y;
				break;
			}
		}
	}
	//弾の移動制御
	for (int i = 0; i < PSHOT_NUM; ++i) {  //PSHOT_NUMの後の;に式が必要ですとエラー
		if (shot[i].flag) {
			shot[i].y -= PSHOT_SPEED;
			//画面の外に言ったら消す
			if (shot[i].y < 10) {
				shot[i].flag = false;
			}
		}
	}
}

アバター
usao
記事: 1887
登録日時: 11年前

Re: 宣言した変数を使ったにもかかわらず構文内でエラーが出る。

#2

投稿記事 by usao » 6年前

defineの行の最後のセミコロンが原因ではないでしょうか.

DreadNorght
記事: 9
登録日時: 6年前

Re: 宣言した変数を使ったにもかかわらず構文内でエラーが出る。

#3

投稿記事 by DreadNorght » 6年前

返信ありがとうございます。
define文の最後に宣言されている構造体のセミコロンを外してみると「PCH 警告: ヘッダーの停止はグローバルスコープにある必要があります」とでてきてしまいます。

MψGёN

Re: 宣言した変数を使ったにもかかわらず構文内でエラーが出る。

#4

投稿記事 by MψGёN » 6年前

#define PLAYER_SPEED 4;←このケツについてるセミコロン
これを#defineの行全てにおいて外したほうが良いと言っているのではないでしょうか
#defineはコンパイル直前にソースコードの文字列を置き換えるプリプロセッサだったはずなので
「PLAYER_SPEED」という文字列「4;」に置き換わってしまいます。
するとfor文の中で同じ事が起こると「for (int i = 0; i < PSHOT_NUM; ++i) {」という文字列は
「for (int i = 0; i < 20;; ++i) {」と置き換わり、セミコロンの数が想定と違うことになってしまいます。

DreadNorght
記事: 9
登録日時: 6年前

Re: 宣言した変数を使ったにもかかわらず構文内でエラーが出る。

#5

投稿記事 by DreadNorght » 6年前

指摘していただいたとおりにセミコロンを外したところPSHOT_NUMにおけるエラーはなくなりました!ありがとうございます。しかし、PLAYERクラスメンバ関数のDraw関数のif(shot.flag)のところで「式にはブール型を使用する必要があります」というエラーが出たままになってしまっています。shotはdefine.hで構造体として宣言しているので使えるはずなのですがどうすれば解決するのでしょうか?コードの横にメモでエラー内容は書いておきます。

コード:

void PLAYER::Draw()
{
	//弾描写
	for (int i = 0; i < PSHOT_NUM; i++) {
		if (shot[i]).flag){       //ここでshotに「ブール型の式を使用する必要がある」というエラー。ピリオドに式が必要ですとエラー
		DrawGraph(shot[i].x - shot[i].width / 2, shot[i].y - shot[i].height / 2, shot[i].gh, TRUE); 
		}
	}
	//描写
	if (life) {
		DrawGraph(x - width / 2, y - height / 2, gh[result], TRUE);
	}
}

MψGёN

Re: 宣言した変数を使ったにもかかわらず構文内でエラーが出る。

#6

投稿記事 by MψGёN » 6年前

if (shot ) .flag){
余分なカッコがついていますね…自動入力の弊害でしょうか
これを取ればエラーは消えると思います

DreadNorght
記事: 9
登録日時: 6年前

Re: 宣言した変数を使ったにもかかわらず構文内でエラーが出る。

#7

投稿記事 by DreadNorght » 6年前

余分なカッコに気づけませんでした。
無事解決することができました。
解決策を教えてくださった方々本当にありがとうございました。

返信

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