質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

0回答

865閲覧

構文エラーの解決方法が知りたいです。

aqskr

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2023/04/30 09:50

編集2023/04/30 15:01

実現したいこと

環境はWindows10、visualstudio2022、DXライブラリです。

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

前提

ここに質問の内容を詳しく書いてください。
(例)
TypeScriptで●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

以下の部分で赤い下線部が出ており、

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー C2059 構文エラー: '定数' chatGPTgame2023 C:\Users\Desktop\chatGPTgame2023\main.cpp 15
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー (アクティブ) E0040 識別子が必要です chatGPTgame2023 C:\Users\Desktop\chatGPTgame2023\main.cpp 15

の二つのエラーが出る。

// プレイヤーの移動速度 const int MOVE_SPEED = 5;

該当のソースコード

[https://91.gigafile.nu/0507-b2450a2a1401b6f73eeed7cb12d80e587](url)

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

<編集>
以下のプログラムになぜか同じプログラムが二回書かれていたためエラーが起きていました。

#include "DxLib.h" #include "enemy.h" #include <math.h> // 敵キャラクターの画像 int g_enemy_image; // 攻撃の画像 int g_attack_image; // 敵キャラクターの座標 int g_enemy_x, g_enemy_y; // 攻撃しているかどうかを表すフラグ int g_is_attacking; // 敵キャラクターの画像を読み込む関数 void LoadEnemyImage() { g_enemy_image = LoadGraph("enemy.png"); } // 攻撃の画像を読み込む関数 void LoadAttackImage() { g_attack_image = LoadGraph("attack.png"); } // 敵キャラクターの位置を更新する関数 void UpdateEnemyPosition(int* player_x, int* player_y) { // プレイヤーまでの距離を計算 double distance = sqrt(pow(g_enemy_x - *player_x, 2) + pow(g_enemy_y - *player_y, 2)); if (distance > ATTACK_DISTANCE) { // プレイヤーに近づく if (*player_x > g_enemy_x) { g_enemy_x += MOVE_SPEED; } else { g_enemy_x -= MOVE_SPEED; } if (*player_y > g_enemy_y) { g_enemy_y += MOVE_SPEED; } else { g_enemy_y -= MOVE_SPEED; } g_is_attacking = 0; } else { // プレイヤーに攻撃 g_is_attacking = 1; AttackPlayer(*player_x, *player_y); } } // 敵キャラクターを描画する関数 void DrawEnemy() { if (g_is_attacking) { DrawGraph(g_enemy_x - 32, g_enemy_y - 32, g_attack_image, TRUE); } else { DrawGraph(g_enemy_x - 32, g_enemy_y - 32, g_enemy_image, TRUE); } } // 攻撃を行う関数 void AttackPlayer(int player_x, int player_y) { // プレイヤーにダメージを与える処理を書く } // 敵キャラクターの画像を解放する関数 void DeleteEnemyImage() { DeleteGraph(g_enemy_image); } // 攻撃の画像を解放する関数 void DeleteAttackImage() { DeleteGraph(g_attack_image); } #include "DxLib.h" #include "enemy.h" #include <math.h> // 敵キャラクターの画像 int g_enemy_image; // 攻撃の画像 int g_attack_image; // 敵キャラクターの座標 int g_enemy_x, g_enemy_y; // 攻撃しているかどうかを表すフラグ int g_is_attacking; // 敵キャラクターの画像を読み込む関数 void LoadEnemyImage() { g_enemy_image = LoadGraph("enemy.png"); } // 攻撃の画像を読み込む関数 void LoadAttackImage() { g_attack_image = LoadGraph("attack.png"); } // 敵キャラクターの位置を更新する関数 void UpdateEnemyPosition(int* player_x, int* player_y) { // プレイヤーまでの距離を計算 double distance = sqrt(pow(g_enemy_x - *player_x, 2) + pow(g_enemy_y - *player_y, 2)); if (distance > ATTACK_DISTANCE) { // プレイヤーに近づく if (*player_x > g_enemy_x) { g_enemy_x += MOVE_SPEED; } else { g_enemy_x -= MOVE_SPEED; } if (*player_y > g_enemy_y) { g_enemy_y += MOVE_SPEED; } else { g_enemy_y -= MOVE_SPEED; } g_is_attacking = 0; } else { // プレイヤーに攻撃 g_is_attacking = 1; AttackPlayer(*player_x, *player_y); } } // 敵キャラクターを描画する関数 void DrawEnemy() { if (g_is_attacking) { DrawGraph(g_enemy_x - 32, g_enemy_y - 32, g_attack_image, TRUE); } else { DrawGraph(g_enemy_x - 32, g_enemy_y - 32, g_enemy_image, TRUE); } } // 攻撃を行う関数 void AttackPlayer(int player_x, int player_y) { // プレイヤーにダメージを与える処理を書く } // 敵キャラクターの画像を解放する関数 void DeleteEnemyImage() { DeleteGraph(g_enemy_image); } // 攻撃の画像を解放する関数 void DeleteAttackImage() { DeleteGraph(g_attack_image); }

正しくは

#include "DxLib.h" #include "enemy.h" #include <math.h> // 敵キャラクターの画像 int g_enemy_image; // 攻撃の画像 int g_attack_image; // 敵キャラクターの座標 int g_enemy_x, g_enemy_y; // 攻撃しているかどうかを表すフラグ int g_is_attacking; // 敵キャラクターの画像を読み込む関数 void LoadEnemyImage() { g_enemy_image = LoadGraph("enemy.png"); } // 攻撃の画像を読み込む関数 void LoadAttackImage() { g_attack_image = LoadGraph("attack.png"); } // 敵キャラクターの位置を更新する関数 void UpdateEnemyPosition(int* player_x, int* player_y) { // プレイヤーまでの距離を計算 double distance = sqrt(pow(g_enemy_x - *player_x, 2) + pow(g_enemy_y - *player_y, 2)); if (distance > ATTACK_DISTANCE) { // プレイヤーに近づく if (*player_x > g_enemy_x) { g_enemy_x += MOVE_SPEED; } else { g_enemy_x -= MOVE_SPEED; } if (*player_y > g_enemy_y) { g_enemy_y += MOVE_SPEED; } else { g_enemy_y -= MOVE_SPEED; } g_is_attacking = 0; } else { // プレイヤーに攻撃 g_is_attacking = 1; AttackPlayer(*player_x, *player_y); } } // 敵キャラクターを描画する関数 void DrawEnemy() { if (g_is_attacking) { DrawGraph(g_enemy_x - 32, g_enemy_y - 32, g_attack_image, TRUE); } else { DrawGraph(g_enemy_x - 32, g_enemy_y - 32, g_enemy_image, TRUE); } } // 攻撃を行う関数 void AttackPlayer(int player_x, int player_y) { // プレイヤーにダメージを与える処理を書く } // 敵キャラクターの画像を解放する関数 void DeleteEnemyImage() { DeleteGraph(g_enemy_image); } // 攻撃の画像を解放する関数 void DeleteAttackImage() { DeleteGraph(g_attack_image); }

であります。

またmain.cppは以下のように書くことでビルドできました。

#include <stdio.h> #include <math.h> #include "DxLib.h" #include "enemy.h" #include "controller.h" #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define CHAR_SIZE 32 // プレイヤーの座標 int player_x, player_y; // プレイヤーの移動速度 const int move_spped = 5; // プレイヤーの位置を更新する関数 void update_player_position() { // キーボードの状態を取得 int key_up = CheckHitKey(KEY_INPUT_UP); int key_down = CheckHitKey(KEY_INPUT_DOWN); int key_left = CheckHitKey(KEY_INPUT_LEFT); int key_right = CheckHitKey(KEY_INPUT_RIGHT); // キーボードの状態に応じてプレイヤーを移動 if (key_up) { player_y -= MOVE_SPEED; } if (key_down) { player_y += MOVE_SPEED; } if (key_left) { player_x -= MOVE_SPEED; } if (key_right) { player_x += MOVE_SPEED; } } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int nCmdShow) { // 初期化 SetGraphMode(1470, 780, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 SetWindowSizeExtendRate(1.0f); if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 if (DxLib_Init() == -1) { return -1; } SetDrawScreen(DX_SCREEN_BACK); // 画像の読み込み player_x = SCREEN_WIDTH / 2; player_y = SCREEN_HEIGHT / 2; LoadEnemyImage(); LoadAttackImage(); // メインループ while (ProcessMessage() == 0) { // 画面をクリア ClearDrawScreen(); // プレイヤーの更新 update_player_position(); DrawBox(player_x - CHAR_SIZE / 2, player_y - CHAR_SIZE / 2, player_x + CHAR_SIZE / 2, player_y + CHAR_SIZE / 2, GetColor(255, 255, 255), TRUE); // 敵キャラクターの更新 UpdateEnemyPosition(&player_x, &player_y); DrawEnemy(); // 画面を反転 ScreenFlip(); } // 終了処理 DeleteEnemyImage(); DeleteAttackImage(); DxLib_End(); return 0; }

以下はそのままで大丈夫でした。
enemy.h

#ifndef ENEMY_H_INCLUDED #define ENEMY_H_INCLUDED #define MOVE_SPEED 2 // 敵キャラクターの移動速度 #define ATTACK_DISTANCE 100 // プレイヤーに攻撃する距離 // 敵キャラクターの画像を読み込む関数 void LoadEnemyImage(); // 攻撃の画像を読み込む関数 void LoadAttackImage(); // 敵キャラクターの位置を更新する関数 void UpdateEnemyPosition(int* player_x, int* player_y); // 敵キャラクターを描画する関数 void DrawEnemy(); // 攻撃を行う関数 void AttackPlayer(int player_x, int player_y); // 敵キャラクターの画像を解放する関数 void DeleteEnemyImage(); // 攻撃の画像を解放する関数 void DeleteAttackImage(); #endif // ENEMY_H_INCLUDED

controllr.h

#include "DxLib.h" #ifndef DEF_KEY_H //二重include防止 #define DEF_KEY_H int Key[256]; int gpUpdateKey() { char tmpKey[256]; GetHitKeyStateAll(tmpKey); for (int i = 0; i < 256; i++) (tmpKey[i] == 0) ? (Key[i] = 0) : Key[i]++; return 0; } int Pad[32]; //ジョイパッドのボタンのための関数 int gpUpdatePad() { int padStat = GetJoypadInputState(DX_INPUT_KEY_PAD1); //入力状態を padStat に格納 for (int i = 0; i < 28; i++) { //ボタン28個分ループ if (padStat & (1 << i)) { //ボタンiの入力フラグが立っていたら Pad[i]++; //加算 } else { //入力がなければ Pad[i] = 0; //0 にする } } return 0; } int PrevPadState = 0; //適切な初期値は0かなきっと int CurrPadState = 0; //適切な初期値は0かなきっと void UpdatePadState() { //「前回」情報を更新 PrevPadState = CurrPadState; //「今回」情報を更新 CurrPadState = GetJoypadInputState(DX_INPUT_KEY_PAD1); //引数はこれで良いのかな? } #endif

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aqskr

2023/04/30 14:39 編集

編集に書いたことにより無事ビルドできました。
aqskr

2023/04/30 10:16

それはリンカの問題なので別です。よく読んでください。
Zuishin

2023/04/30 10:24

君の質問はずっと同じ原因だよ。
melian

2023/04/30 10:37

enemy.h で、 #define MOVE_SPEED 2 としているため、プリプロセッサで、 const int 2 = 5; に置き換えられています。
otn

2023/04/30 14:07

↑なるほど。 そういう原因なら、今後プログラム書くときは、変数と定数の一覧表を作って、何という名前の変数・定数をどこで何のつもりで使ったかを確認しながら、プログラムを書きましょう。
episteme

2023/04/30 14:46

広義(?)の「ODR違反」と言えるでしょうねぇ...
aqskr

2023/04/30 15:01

しかし、なぜmain.cppが以下のような ```ここに言語を入力 #include <stdio.h> #include <math.h> #include "DxLib.h" #include "enemy.h" #include "controller.h" #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define CHAR_SIZE 32 // プレイヤーの座標 int player_x, player_y; // プレイヤーの移動速度 const int move_speed = 5; // プレイヤーの位置を更新する関数 void update_player_position() { // キーボードの状態を取得 int key_up = CheckHitKey(KEY_INPUT_UP); int key_down = CheckHitKey(KEY_INPUT_DOWN); int key_left = CheckHitKey(KEY_INPUT_LEFT); int key_right = CheckHitKey(KEY_INPUT_RIGHT); // キーボードの状態に応じてプレイヤーを移動 if (key_up) { player_y -= MOVE_SPEED; } if (key_down) { player_y += MOVE_SPEED; } if (key_left) { player_x -= MOVE_SPEED; } if (key_right) { player_x += MOVE_SPEED; } } int main() { // 初期化 SetGraphMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32); ChangeWindowMode(TRUE); if (DxLib_Init() == -1) { return -1; } SetDrawScreen(DX_SCREEN_BACK); // 画像の読み込み player_x = SCREEN_WIDTH / 2; player_y = SCREEN_HEIGHT / 2; LoadEnemyImage(); LoadAttackImage(); // メインループ while (ProcessMessage() == 0) { // 画面をクリア ClearDrawScreen(); // プレイヤーの更新 update_player_position(); DrawBox(player_x - CHAR_SIZE / 2, player_y - CHAR_SIZE / 2, player_x + CHAR_SIZE / 2, player_y + CHAR_SIZE / 2, GetColor(255, 255, 255), TRUE); // 敵キャラクターの更新 UpdateEnemyPosition(&player_x, &player_y); DrawEnemy(); // 画面を反転 ScreenFlip(); } // 終了処理 DeleteEnemyImage(); DeleteAttackImage(); DxLib_End(); return 0; } ``` の時は ```ここに言語を入力 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー LNK2001 外部シンボル WinMain は未解決です chatGPTgame2023 C:\Users\Desktop\chatGPTgame2023\LIBCMT.lib(exe_winmain.obj) 1 エラー LNK1120 1 件の未解決の外部参照 chatGPTgame2023 C:\Users\Desktop\chatGPTgame2023\x64\Release\chatGPTgame2023.exe 1 ``` のエラーが出るのかわかりません
Zuishin

2023/04/30 15:08

だから同じ原因だって。 今まで六年間ずっと教えてもらい続けてたことをちゃんと読めばわかる。
episteme

2023/04/30 15:14

> エラー LNK2001 外部シンボル WinMain は未解決です chatGPTgame2023 Windowsモードでコンパイル/リンクしてるからでしょ。
aqskr

2023/05/02 12:38 編集

>>Windowsモードでコンパイル/リンクしてるからでしょ。 いまいちピンときませんがありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問