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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

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

Q&A

解決済

1回答

317閲覧

分割コンパイルしたとき、他のファイルのデータを読み取れない

jyarin

総合スコア12

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

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

0グッド

0クリップ

投稿2020/01/20 14:48

編集2020/01/20 22:06

前提・実現したいこと

分割コンパイルをする中で、別のソースファイルに入っている数値を読み取りたい

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

読み取ったはずの数値が反映されない
(ソースコードを見て欲しいのですが、/sonota.cpp/のint choice()でm_SelectNumの値を読み取ったはずなのに、/main.cpp/のwhile内に行ったら、m_SelectNumの値が何であろうとGame1p_Act()に行ってしまうのです)

該当のソースコード

c++

/* sonota.cpp*/ #include "DxLib.h" #include "Game2p.h" static int m_SelectNum; void startmenu() { //メニュー画面 typedef struct { int x, y; char name[128]; } MenuElement_t; MenuElement_t m_MenuElement[4] = { { 100, 100, "ひとりであそぶ" }, { 100, 150, "ふたりであそぶ" }, { 100, 200, "せってい" }, { 100, 250, "おまけ" }, }; static int m_yazirusiiti; m_SelectNum = 0; while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) { gpUpdateKey(); if (Keyboard_Get(KEY_INPUT_DOWN) == 1) { m_SelectNum = (m_SelectNum + 1) % 4; } if (Keyboard_Get(KEY_INPUT_UP) == 1) { m_SelectNum = (m_SelectNum + 3) % 4; } m_yazirusiiti = ((m_SelectNum + 1) * 50) + 50; if (Keyboard_Get(KEY_INPUT_RETURN) >= 1) { break; } //描画 for (int i = 0; i < 4; i++) { DrawFormatString(m_MenuElement[i].x, m_MenuElement[i].y, GetColor(255, 255, 255), m_MenuElement[i].name); DrawFormatString(80, m_yazirusiiti, GetColor(255, 255, 255), "→"); } } } int choice() { return m_SelectNum; } /*sonota.h*/ #pragma once void startmenu(); int choice(); /*main.cpp*/ #include "DxLib.h" #include "Game2p.h" #include "Game1p.h" #include "sonota.h" int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) { startmenu(); if (choice() == 0) { Game1p_Act(); } if (choice() == 1) { Game2p_Act(); } if (choice() == 2) { settei(); } if (choice() == 3) { omake(); } } }

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

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

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

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

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

yuki23

2020/01/20 23:06

分割コンパイルしないときに正常に動くことは確認しましたか?
jyarin

2020/01/21 03:48

返信ありがとうございます。 分割コンパイルをしなくても、同じミスが生じました。 元の文章に間違いがあると気づけ、そしてその原因は自分解決出来ました。
guest

回答1

0

自己解決

ENTERを押してmeinメニューと各モードとの間を切り替えられるようにしていたのですが、

ENTERを押しっぱなしにしたときにも、モードを切り替えられるようになってしまっていて、そのため例えば、設定を開こうとしたときに、

settei()に入るため、ENTERキーを押す

settei()モードになるが、まだENTERキーが押されている判定になっており、よってmainモードに帰ってくる

startmenu()に入る

まだENTERキーが押されている判定のままで、m_SelectNumが0になってしまう

Game1p_Act()が始まる

となっていたみたいです。

投稿2020/01/21 03:57

jyarin

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問