🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

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

Q&A

解決済

2回答

2286閲覧

Pad[PAD_RIGHT]のPAD_RIGHTに赤い下線部でエラーが出ます。

R-ogiura

総合スコア60

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

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

0グッド

0クリップ

投稿2019/12/06 18:01

編集2019/12/07 04:26

こちらのサイトからBullさんのプログラム解答者様のBullさんから頂いたプログラムに関して質問です。
Bullさんに載せて頂いたプログラムを参考に下に書いた全体のプログラムでのように作ったのですが、なぜかPad[PAD_RIGHT]のPAD_RIGHTに赤い下線部でエラーが出ます。なぜでしょうか。

このプログラムがBullさんから頂いたプログラムです。

#include <DxLib.h> 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 WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更,初期化,裏画面設定 int x = 320; int y = 240; const int PAD_DOWN = 0; const int PAD_LEFT = 1; const int PAD_RIGHT = 2; const int PAD_UP = 3; const int KEY_ESC = 12; // while( 裏画面を表画面に反映, メッセージ処理, 画面クリア ) while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { gpUpdatePad(); if (Pad[PAD_LEFT]) { if (x > 4) x -= 4; } if (Pad[PAD_RIGHT]) { if (x < 622) x += 4; } if (Pad[PAD_UP]) { if (y > 4) y -= 4; } if (Pad[PAD_DOWN]) { if (y < 464) y += 4; } DrawFormatString(x, y, GetColor(255,255,0), "●"); if (Pad[KEY_ESC]) break; } DxLib_End(); return 0; }

こちらが全体のプログラムです。
リンク内容

以下がエラーです。

1>

11>test.cpp 21>D:\DxLib_VC\サンプルプログラム実行用フォルダ\test.cpp(244,7): error C2109: 配列または、ポインターでない変数に添字が使われました。 31>プロジェクト "VisualStudio_2019用.vcxproj" のビルドが終了しました -- 失敗。 4========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== 5 6コード

環境に関して書いていなくてすいません。
環境

  • Windows10
  • visual studio 2019
  • エディタはC++です(タグもC++の方に変えさせていただきます)
  • X64

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

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

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

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

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

raccy

2019/12/06 18:48

「赤い下線部」といいますが、一体何で見ているのでしょうか?また、コンパイルは問題なくできていると考えて良いですか?
R-ogiura

2019/12/06 19:44

ごめんなさい、コンパイルは出来ません。 また張り付けたプログラムが違うものでした。取り替えます。
raccy

2019/12/06 20:14

あなたが聞きたいのは「赤い下線が出る理由」ですか?それとも「コンパイル時にエラーになる理由」ですか?質問からは前者を聞いているように思えます。前者を聞きたいと言うことでよろしいですか?
R-ogiura

2019/12/06 20:44

度々すいません。赤い下線が出る理由がコンパイル時にエラーになる理由ならば、コンパイル時にエラーの源信を聞きたいです。 もし二つとも違う原因により起こっているならば 赤い下線が出る理由とコンパイル時にエラーになる理由の両方が聞きたいです。
raccy

2019/12/06 20:58

「赤い下線」について知りたいのであれば、一体何で見たときの話なのかを明記してください。メモ帳なのあEmacsなのかvimなのかそういったことが他に人にはわかりません。
raccy

2019/12/06 22:10

あと、タグにCとC++の両方がありますが、どちらなのですか?リンク先のコードにはCと書いていますが、エラーにはcppという拡張子が付いています。 CとC++は別の言語です。同じ部分も多いですが、CにはできてC++にはできない部分もあります。どちらなのかはっきりさせて、タグの片方消してください。
R-ogiura

2019/12/06 22:43

ややこしくてすいませんraccyさん、解決しましたので大丈夫です。
raccy

2019/12/06 23:08

一体何が解決したのでしょうか?epistemeさんの回答はコンパイル時のエラーについての解決にはなりますが、「なぜ赤い下線が出るのか」ということについては何の解決にもなっていませんよ。これで解決しましたと言っているのでは、結局あなたが聞きたいことは何だったのかわかりません。コンパイルエラーに対する解決方法だけ聞ければ良かったのですか?「赤い下線」はどうでも良かったのですか?それならそうと赤い下線云々の部分は全て削除して、コンパイルエラーがでたから解決したいと質問を書き直してください。 これではせっかくのepistemeさんの回答が質問に対して飛躍しているように見えてしまいます。
episteme

2019/12/06 23:49 編集

...そやね。僕はコンパイルエラーの原因を指摘したが、赤線については言及していない。 # その赤線が構文上のエラーを指摘していたのでない限り。
R-ogiura

2019/12/07 00:38 編集

epistemeさんのご指摘の通り変数名の重複が原因だったため、配列で置いた変数自体を数値で置いてしまったために起きたエラーだとわかりました。
guest

回答2

0

質問者は赤い下線について興味が無くなってどうでも良くなったようですので、この質問を見て気になった方に向けて回答します。

まず、質問者の環境は未だ不明です。頑なに回答しようとしません。ただ、エラーメッセージからDXライブラリのVisual Studio用ライブラリを使用しており、その中のVisual Studio 2019用のプロジェクトファイルを流用(?)しているようですので、この回答ではVisual Studio 2019の何らかのエディションまたはBuild Tools for Visual Studio 2019を使用しているという前提とします。なお、回答のための検証にはVisual Studio Community 2019 v16.4.0 を用いました。エディタについてもまったくわかりませんが、Visual Studioのエディタをそのまま使う事とし、Visual Studio CodeやAtom等の他エディタは使っていないという前提にします。また、タグから質問者はC++ではなくCとして書いているとします。

Visual Studio Community 2019 を使用した場合のDXライブラリの使い方に基づき、プロジェクトを作成し、DXライブラリを使えるようにしました。そして、質問にあったコードをCのソースコードとして貼り付けて確認しました。Visual StudioのC++でCのコードとして扱われるためには拡張子を".c"にする必要があるため、そのようにしました。結果下記のようになりました。

Cでは違うエラーになる

赤い下線はWinMain!ClearDrawScreen())についてPad[PAD_RIGHT]はつきません。コンパイルエラーも大量にでます。

そもそも、DXライブラリはCから扱えるようにヘッダファイルが構成されていません。C++から使う必要があります。しかし、質問者はタグをCのみにしたことから、Cで書いていると主張しています。ここから、質問者はVisual StudioでCを書くにはどうすればいいのかを知らないのではないかと推測しました。Visual Studioにはウィザード的にCのソースファイルを作成する機能が無いため、代わりにC++ソースファイルを作成した(拡張子が".cpp"になっている)ものでもC++の機能を使わないとCになると思い込んでいる可能性があるということです。Visual Studioを使ってCを書こうとする人がやるよくある間違いですので、今回もそうであるとし、質問のタグは無視してC++として書かれたものと扱おうと思います。

では、拡張子を".cpp"にして再度確認してみます。

CPPでは何も問題ない

今度は全く赤い下線が無くなり、コンパイルも正常に完了しました。意味がわかりません。手元で現象が発生しない問題を解決することがいかに難しいかは皆さんもご存じ通りでしょう。これは難問です。

私は質問文を再度読むことにしました。まず、Bullさんのコードとは一体全体何のことかわかりません。それが書いてあるコードが何処にあるのかも知りません。また、通常質問のコードは現象が発生する最低限のコードや抜粋であって、全体はその補足だと思っていました。しかし、どうやら、質問のコードはBullさんのコードで、それを全体に反映したからエラーとなったようです。引用元を明記せずに他人の書いたコードを載せるというのは社会人だとすると信じられない行動ですが、情報モラルについて学んだことがないインターネット初心者なんでしょう。

ということで、全体のコードで試して見ました。

やっと現象確認

現象が確認できました。では、「赤い下線」の説明をしたいと思います。

Visual Stuidoのエディタでは、ソースコードに問題がある場合、どこに問題があるか一目でわかるように、問題部分に赤い下線を引くようになっています。下線部分の詳細はエラー一覧のエラーで確認できます。この機能は、IntelliSenseによって構文としてあり得ない、型や引数の不一致等の問題を検出したときにあらわれます。ほとんどの場合、IntellSenseで見つかった問題はコンパイル時にもエラーになりますが、エラーメッセージや内容は異なる場合があります。しかし、IntelliSenseは実際にコンパイルして確認しているわけでは無いため、問題ないという場所でもコンパイル時にエラーが起きる場合があります。他にも、IntelliSenseの設定とコンパイルの設定が不一致(C++のバージョンが違う等)ですと、IntelliSenseではエラー扱いでも、コンパイルは問題なくできると言うこともあります。

問題と判定された理由はマウスカーソルを合わせると説明が表示されます。また「エラー一覧」にも書かれています。なお、問題の説明は直接的な対応方法が書いていることは少なく、大抵は期待する何かに対して別の何かになっているという表現です。その場合は、期待する何かになっていない理由を論理的に推測していく必要があります。例えば今回の場合、下記のようになっています。

問題のメッセージ

epistemeさんの回答にあるような変数が重複していると言う話はこのメッセージには書いてありません。そのため、このメッセージを深く分析する必要があります。C++ではa[b]という表現は*(a+b)と同じです。間接演算子*がありますのでa+bは何からのポインタである必要があり、そのためにはabはポインタ型と整数型の組合せで無ければなりません。メッセージは「PAD_RIGHTがポインター型でなければならないが整数型です」という意味です。ここから、Padが整数型だと判断されていると推測できます。しかし、元々書こうとしたコードではPadはグローバルで配列として書いたはずなのでポインター型のはずです(配列はポインター型に暗黙に変換できる)。どこかでPadを整数型としているところがあると推測されます。そうやって探していくとepistemeさんの解答にもあったint Pad = 0;に辿り着くと言うことです。

こういうエラーの時はだいたいこんな所に問題がある場合が多い、という経験から慣れている人も居ますが、そういうものだけに頼ると例外的なモノに出くわしたときに度ツボにはまる場合があります。なぜ、そのメッセージが出るのかを論理的に理解すること、そこから、本当に直すべき所がどこかを論理的に探っていくこと、それができなければ、できるプログラマーになるのは難しいでしょう。

投稿2019/12/07 02:47

編集2019/12/07 02:55
raccy

総合スコア21737

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

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

episteme

2019/12/07 03:03

僕のはその↑過程をぜーんぶすっ飛ばした結論だけっス
R-ogiura

2019/12/07 04:29 編集

raccyさん詳しい解説ありがとうございます。 raccyさんのような解説がうまく、理論的に詳しく説明できたり、できるプログラマーにはなれないですが、今後は詳しい情報を記載することを心がけます。
guest

0

ベストアンサー

変数名の重複が原因。いずれかを改名しよう。

line16: int Pad[32]; line223: int Pad = 0;

投稿2019/12/06 20:59

episteme

総合スコア16612

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

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

R-ogiura

2019/12/06 21:26 編集

いつもお世話になってます。 こんな出来損ないに解答してくださり、ありがとうございます。
episteme

2019/12/06 22:31 編集

error message: error C2109: 配列または、ポインターでない変数に添字が使われました。 から原因を類推できるようになりなさい。 #close しといてね
R-ogiura

2019/12/06 22:44

はい!頑張ります!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問