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

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

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

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

C++

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

DXライブラリ

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

Q&A

4回答

934閲覧

単体で書いたプログラムを複数のヘッダファイルとメインからできたプログラムに移植したいです。

R-ogiura

総合スコア60

C

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

C++

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

DXライブラリ

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

0グッド

0クリップ

投稿2020/01/17 06:05

編集2020/01/18 08:00

こちらの単体のプログラムを分解して複数のプログラムからなる中のplayerhennsuu.hとplayer2.hに変えき替えたいのですが、以下のようなエラーが出たり、実行できても主人公の画像の周りの白い部分が消えないままなどのバグが発生してしまい困っています。

こちらが複数のプログラムです。
メイン
player2.h
key.h
talk.h
タイトル.h
コンティニュー.h
playerhennsuu

単体のプログラムを以下のサイトに載せたように分割しました。
player2.h
playerhennsuu
しかし、以下のようなエラーが出てきます。ちゃんと定義されていると思うのですが何がダメなのでしょうか?

1>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(831,93): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。

以下は全体のエラーです。

1>

11>Source2.cpp 21>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\playerhennsuu.h(7,1): error C2084: 関数 'int gpUpdatePad(void)' は既に本体を持っています。 31>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\key.h(19): message : 'gpUpdatePad' の以前の定義を確認してください 41>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(14,2): error C2065: 'gpUpdatePad': 定義されていない識別子です。 51>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(831,93): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 61>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(834,95): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 71>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(834,48): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 81>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(840,95): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 91>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(840,48): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 101>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(846,95): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 111>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(846,48): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 121>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(856,93): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 131>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(859,95): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 141>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(859,48): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 151>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(869,95): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 161>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(869,48): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 171>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(875,95): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 181>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\player2.h(875,48): warning C4244: '引数': 'double' から 'int' への変換です。データが失われる可能性があります。 191>C:\Users\Daito\Desktop\DxLib_VC\サンプルプログラム実行用フォルダ\Source2.cpp(169,13): warning C4566: ユニバーサル文字名 '\u00A5' によって表示されている文字は、現在のコード ページ (932) で表示できません 201>プロジェクト "VisualStudio_2019用.vcxproj" のビルドが終了しました -- 失敗。 21========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== 22コード

あの後、以下のようにバトルに関するヘッダファイルの部分に以下のものを加えました。

//敵を描画 if (enemystayhere == 0) { DrawExtendGraph(pos[enemyY][enemyX][0] - 14, pos[enemyY][enemyX][1] - 66, pos[enemyY][enemyX][0] + 64, pos[enemyY][enemyX][1] + 66, enemyImage, TRUE); } if (stayhere == 1) { ++enemystayhere; } if (enemystayhere > 0 && enemystayhere < 500) { DrawExtendGraph(pos[1][4][0] - 14, pos[1][4][1] - 66, pos[1][4][0] + 64, pos[1][4][1] + 66, enemyImage, TRUE); } if (enemystayhere > 500) { enemystayhere = 0; stayhere = 0; enemymovelock = 0; }

しかし、if (enemystayhere > 0 && enemystayhere < 500)での描画が出来ません。何時間も考えましたがわからないままです。
どうか解決のために知力を貸してください。

こちらはバトルに関する新しいヘッダファイルです。
//pastebin.com/TrFkBqdu
新しいメインプログラムです。
//pastebin.com/z0VEhu7a
新しい変数のヘッダファイルです。
//pastebin.com/zKxRaZQc

その他のヘッダファイルはいじっていません。

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

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

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

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

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

thkana

2020/01/18 02:08

入門者向けの薄い本を読むことになっていたと思いましたが、読み終えましたか?
R-ogiura

2020/01/18 07:25

はい!でもわからないことや詰まることもあるんです! ご協力お願いいたします。
thkana

2020/01/18 07:43

とりあえず読んだ本の書名を教えといて。「ココを読み返して」になるかもしれないから。
m.ts10806

2020/01/18 07:49

こーどにはまーくだうんをきちんとつかいましょう
R-ogiura

2020/01/18 07:59

読んでる本は新・解きながら学ぶC言語です!どうかよろしくお願いいたします。
episteme

2020/01/18 08:55

その教本には複数の ~.h と ~.c に分割する話が書かれていない?
R-ogiura

2020/01/18 11:33

構造体、クラスなど難しいところ以外は一通りしました。
m.ts10806

2020/01/18 12:07

全部できてないということで、解散。 (それ以外でもできてたらこんな疑問でてくるはずないしなぁ)
Zuishin

2020/01/18 15:04

>  「C言語のテキストに掲載されているプログラムは理解できるのだけど、どうも自分で作ることができない。」と悩んでいませんか? なぜ自分のレベルに合ったものを選ばないのか理解に苦しみます。
guest

回答4

0

C

1if (stayhere == 1) { 2 ++enemystayhere; 3} 4if (enemystayhere > 0 && enemystayhere < 500) { 5 DrawExtendGraph(pos[1][4][0] - 14, pos[1][4][1] - 66, pos[1][4][0] + 64, pos[1][4][1] + 66, enemyImage, TRUE); 6} 7if (enemystayhere > 500) { 8 enemystayhere = 0; 9 stayhere = 0; 10 enemymovelock = 0; 11} 12...

しかし、if (enemystayhere > 0 && enemystayhere < 500)での描画が出来ません。何時間も考えましたがわからないままです。

if - block内に入らないということなら、enemystayhereがインクリメントされていない、すなわち stayhere != 1 と考えられる。 stayhere はどんな条件で1になる?

投稿2020/01/18 04:54

episteme

総合スコア16614

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

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

R-ogiura

2020/01/18 06:53

talkのヘッダファイルよりstart == 80の時にstayhereは1になります。
episteme

2020/01/18 07:13 編集

なら start == 80 となる条件を満たしてないんじゃないの? デバッグを人任せにしてどうするよ。 # てか、元の質問とは別モノなんだから別にスレッド立てるべき
R-ogiura

2020/01/18 07:24

変数の中身を描画してみて確認していましたが、条件はちゃんと満たしています。 自分でできる範囲でのdebugはしたので人任せではないと思いますが。 epistemeさんの方では正しく描画されていることは確認できたのでしょうか? そうですね。別でスレッドを立てます。
guest

0

ODR(One Definition Rule)てのがありましてね、
文字通り 定義はただひとつであるべし の規則。

ヘッダが複数の ~.c に#includeされたとき、
そのヘッダが定義を含んでいると その定義が複数の~.c に存在する
ことになるためODRに違反する。
だからヘッダに定義を置いてはならない。

定義とは、たとえば
int global;
とか
int add(int x, int y) { return x+y; }
とか、実体のあるもののこと。

[別件] グローバル変数過多。収拾つかなくなる(なってる).

投稿2020/01/17 12:56

編集2020/01/17 16:22
episteme

総合スコア16614

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

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

R-ogiura

2020/01/17 16:43

では、多すぎるグローバル変数はどうやって少なくすればいいでしょうか。
episteme

2020/01/17 23:11

- 構造体でまとめる - 引数/戻り値を使う
guest

0

C/C++ のプログラムは複数のコンパイル単位 (一般的に拡張子が .c.cpp であるようなファイル) から成ります。 それぞれのコンパイル単位をそれぞれでコンパイルしてから最後にリンクするという工程を経て実行ファイルが生成されます。

各コンパイル単位ごとに処理するので、他のコンパイル単位には何があるのかわかりません。 なので、どのような実装になっているかはともかくとして何があるのかという「宣言」だけは使う前にする必要があるのです。 その宣言をまとめるのがヘッダファイルの役割です。

つまり、 C/C++ プログラムを複数のファイルに分割するときは原則として複数の .c ファイルに分けた上で「ヘッダファイル (一般に拡張子が .h であるようなファイル)」に宣言を書くのが基本的な運用となります。

例外も色々とありますし、やりようによってはヘッダファイルに定義を詰め込むようなことも出来なくはありませんが、かなり常道から外れたことをしています。


常道を外れていてもあえてそのように構成したいのだという前提で直接的な原因を述べます。

gpUpdatePad が二か所で定義されているという単純ミスです。 key.hplayerhennsuu.h の両方にあります。

エラーになったのでそこでは定義されていないことになってしまい「定義されていない識別子」となっています。


double から int への変換が起こっているのは、 DrawRotaGraph に座標の値として int を渡すべきなのに double を渡しているからです。

intdouble の間で演算をすると結果は double になるので、途中で 2.51.5 といった double 型の値と計算すると結果は double なのです。 情報の欠損が起こる可能性があるので警告は出ますが、 int にまるめても問題ないことがわかっているのであればその警告は無視できます。

投稿2020/01/17 07:20

SaitoAtsushi

総合スコア5446

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

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

0

ヘッダファイル(*.h) の中に変数本体や関数本体を書いてはいけません。
#include したあちこちで同じ変数や同じコードを展開しようとしますよ

変数や関数はソースファイル(*.c)に分割しましょう。
変数宣言、関数宣言をヘッダファイルに書きましょう。

投稿2020/01/17 06:12

編集2020/01/17 07:30
shiracamus

総合スコア5406

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問