インクルードファイルが多すぎます

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

インクルードファイルが多すぎます

#1

投稿記事 by RGK » 9年前

先日は、ご閲覧いただいた方、ご指導いただきましたお二方、ありがとうございました。

その後、順調に進んでおりましたが、下記のコードにて
「1>c:\documents and settings\kt\my documents\visual studio 2008\projects\whentory\main.cpp(4) : fatal error C1014: インクルード ファイルが多すぎます : 深さ = 1024」

というエラーが出てしまいました。main.cppの上から4番目というところまではわかり、深さとあるので、GLOBALファイルの位置を変えたり、検索した解決策を試していましたが、どうにもうまくいかないため、再度ご質問させていただきたいです。

OS;WindowsXP コンパイラ;Visual Studio 2008です。

画像を表示し、矢印キーで上下左右に操作したいと思っています。(000018.pngの表示がおかしくなってます)

ご指導のほど、お願いいたします。
各ファイルの位置をスクリーンショットで撮ってみました。ご参考にされば幸いです。

http://whitecats.dip.jp/up0/download/1413695665.zip
pass:1111

コード:

// ここから
#define GLOBAL_INSTANCE
#include "../inc/GLOBAL.h"

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						LPSTR lpCmdLine, int nCmdShow )
{
	// 初期化(ウィンドウモード、ウィンドウサイズ、DXライブラリ)
	if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK ||
		SetGraphMode( WX, WY, 16) != DX_CHANGESCREEN_OK ||
		DxLib_Init() == - 1)
	{
		return -1;
	}

	// 画像読み込み
	SetTransColor( 128, 132, 220);
	LoadDivGraph("../dat/img/000018.png", 16, 6, 5, 170, 204,img);

	// 描画位置の初期化
	st_ch.x = 64;
	st_ch.y = 64;
	st_ch.dx = 0;
	st_ch.dy = 0;
	st_ch.dir = 0;

	// 描画先を裏画面に指定
	SetDrawScreen(DX_SCREEN_BACK);

	// メインループ
	while(!ClearDrawScreen() && !ProcessMessage() && !GetHitKeyStateAll(key_buf) && !key_buf[KEY_INPUT_ESCAPE])
	{
		// 32で割れない場合は進む
		if ((st_ch.x%32!=0)||(st_ch.y%32!=0))
		{
			st_ch.x += st_ch.dx;
			st_ch.y += st_ch.dy;
		}
		// それ以外の場合、キーの入力状態を判定する
		// (同時押しは不可)
		else
		{
			st_ch.dx = 0;
			st_ch.dy = 0;
			
			// 上キー入力
			if (key_buf[KEY_INPUT_UP] == 1)
			{
				// 移動後が範囲外になる場合はNG
				if (st_ch.y - 32 >= 0)
				{
					st_ch.dy = -1;
				}
				st_ch.dir = 0;
			}
			// 下キー入力
			else if (key_buf[KEY_INPUT_DOWN] == 1)
			{
				// 移動後が範囲外になる場合はNG
				if (st_ch.y + 32 <= 480 - 32)
				{
					st_ch.dy = 1;
				}
				st_ch.dir = 2;
			}
			// 左キー入力
			else if (key_buf[KEY_INPUT_LEFT] == 1)
			{
				// 移動後が範囲外になる場合はNG
				if (st_ch.x - 32 >= 0)
				{
					st_ch.dx = -1;
				}
				st_ch.dir = 3;
			}
			// 右キー入力
			else if (key_buf[KEY_INPUT_RIGHT] == 1)
			{
				// 移動後が範囲外になる場合はNG
				if (st_ch.x + 32 <= 640 - 32)
				{
					st_ch.dx = 1;
				}
				st_ch.dir = 1;
			}

			// キャラを移動
			st_ch.x += st_ch.dx;
			st_ch.y += st_ch.dy;
		}

		// キャラクタ描画
		if ((st_ch.x%32+st_ch.y%32) < 8) {
			st_ch.img = img_ch[st_ch.dir*3 + 1];
		}
		else if ((st_ch.x%32+st_ch.y%32) < 16) {
			st_ch.img = img_ch[st_ch.dir*3 + 0];
		}
		else if ((st_ch.x%32+st_ch.y%32) < 24) {
			st_ch.img = img_ch[st_ch.dir*3 + 1];
		}
		else if ((st_ch.x%32+st_ch.y%32) < 32) {
			st_ch.img = img_ch[st_ch.dir*3 + 2];
		}
		DrawGraph( st_ch.x, st_ch.y, st_ch.img, TRUE);

		// 裏画面を表画面に描画
		ScreenFlip();
	}

	// DXライブラリ終了処理
	DxLib_End();
	// プログラム終了
	return 0;
}
// ここまで

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: インクルードファイルが多すぎます

#2

投稿記事 by softya(ソフト屋) » 9年前

このエラーはインクルードのネストが深い時に出るエラーではないでしょうか。
「インクルード ファイルが多すぎます 」は誤訳な気がします。
インクルードガードを調べてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: インクルードファイルが多すぎます

#3

投稿記事 by h2so5 » 9年前

元の文が "too many include files" なので誤訳とは言えないと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: インクルードファイルが多すぎます

#4

投稿記事 by softya(ソフト屋) » 9年前

確かに誤訳ではないですね。
分かり辛いメッセージと言ったところでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

LL

Re: インクルードファイルが多すぎます

#5

投稿記事 by LL » 9年前

質問者さんの情報だけでは断言しきれないので憶測になりますが、
インクルードするヘッダーをまとめたヘッダーを作って、それをあちこちで使っていないでしょうか?
また使ってたとして、各種ヘッダーにしっかりとインクルードガードをしていますか?

こんなもの作ってませんか?↓

コード:

//common.h
//いちいち各種ファイルに必要な分のヘッダをインクルードするのが面倒くさいからまとめちゃったヘッダー
//初心者とかレスポンスを気にしない人がよくやる行為
//(ヘッダーファイルが多くなりがちなゲームでの開発ではもっとも非推奨な行為です)
#include<stdio.h>
#include<math.h>
#include<dxlib.h>
#include"自作ヘッダ1"
#include"自作ヘッダ2"
//以下略
インクルードするヘッダが2~3個程度ならともかく、今はパソコンのスペックが高くなっているとはいえ、
毎度毎度大量のヘッダとそれに属するcppファイルを読み込んでたらコンパイルに膨大な時間がかかるようになります。

次に複数箇所で呼び出すヘッダーにはちゃんとインクルードガードかけていますか?

コード:

//インクルードガードはヘッダに必ずつけるようにしましょう。多重インクルードという初歩的なミスを防げるようになります
//オールドスクールなインクルードガード
#ifndef _TEST_H            //defineで定義されているもの(この場合は_TEST_H)があったら無視して#endifまで飛ぶ
#define _TEST_H
//中身
//いろいろな処理など

#endif

コード:

//簡単だけど環境依存のため僕は勧めない
#pragma once        //読み込んだヘッダーを記録してくれて、同じのを読み込もうとしたら無視してくれる
//ヘッダの中身
//処理とか

ヘッダは便利ですが使い方を間違えると壮絶な爆弾と化します。
(例えるならボンバーマンの爆弾見たいに。敵(複雑さ)を解消することも出きるが、置き場所(使い方)を間違えると自爆するのと似た様な物です)

参考サイト
http://marupeke296.com/CPP_HederFileALaCarte.html

http://detail.chiebukuro.yahoo.co.jp/qa ... 1042172720

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: インクルードファイルが多すぎます

#6

投稿記事 by h2so5 » 9年前

LL さんが書きました: こんなもの作ってませんか?↓

コード:

//common.h
//いちいち各種ファイルに必要な分のヘッダをインクルードするのが面倒くさいからまとめちゃったヘッダー
//初心者とかレスポンスを気にしない人がよくやる行為
//(ヘッダーファイルが多くなりがちなゲームでの開発ではもっとも非推奨な行為です)
#include<stdio.h>
#include<math.h>
#include<dxlib.h>
#include"自作ヘッダ1"
#include"自作ヘッダ2"
//以下略
インクルードするヘッダが2~3個程度ならともかく、今はパソコンのスペックが高くなっているとはいえ、
毎度毎度大量のヘッダとそれに属するcppファイルを読み込んでたらコンパイルに膨大な時間がかかるようになります。
ヘッダーをまとめるのは一概に悪いとは言えないと思います。

というのも、インクルードするライブラリのヘッダーが多い場合は、
ヘッダーを一つにまとめてプリコンパイル済みヘッダーを利用したほうがコンパイルが高速化することがあるからです。
もちろん、単純に自作のヘッダーが多いだけの場合は意味がないのですが。

LL

Re: インクルードファイルが多すぎます

#7

投稿記事 by LL » 9年前

ヘッダーをまとめるのは一概に悪いとは言えないと思います。

というのも、インクルードするライブラリのヘッダーが多い場合は、
ヘッダーを一つにまとめてプリコンパイル済みヘッダーを利用したほうがコンパイルが高速化することがあるからです。
もちろん、単純に自作のヘッダーが多いだけの場合は意味がないのですが。



なるほど、しかし数が多い場合は可読性などが落ちませんか?
(このファイルでは特定のhだけインクルードする場合など)

今ちょうど、javaのプログラムを組んでいるので自分の中でimportのコーディングルール等とかぶってしまいます。
(javaのimportはそのクラス内でどんな物を使っているのかを把握するためにあまりワイルドカード(先ほどのcommon.h見たいな物)は使わないようにしています。)
Cだとそこら辺どうなるのでしょうか?

閉鎖

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