ページ 11

分割コンパイルについて質問

Posted: 2011年7月21日(木) 18:03
by ちゃま
今、簡単なRPGゲームを作っています。プログラムを少しづつ書き足したりしてるうちに
ソースがとても長ったらしくなってきたので、分割コンパイルに挑戦したのですが、
エラーが出てしまい困っています。

今、解決できていないのが、GetHitKeyStateAll_2関数に関するエラーです。
この関数は、プログラムのどの部分でも(しょっちゅう)使うので、
違うファイルからでも呼べるようにしたいのです。

これがその関数です

コード:

int GetHitKeyStateAll_2(int KeyStateBuf[]){//GetHitKeyStateAllを拡張する関数
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
                else                            KeyStateBuf[i]=0;
        }
        return 0;
}
ヘッダファイルをインクルードして、呼びだせるようにしてから実行(?)するとこんな感じのエラーが出ます。
「error C2660: 'GetHitKeyStateAll_2' : 関数に 1 個の引数を指定できません。」


ほかのファイルから呼ぶときは、↓のループ文で呼び出します。

コード:

while(!ProcessMessage() && !ClearDrawScreen()
 && !GetHitKeyStateAll_2( Key ) && !Key[KEY_INPUT_ESCAPE]){

}
↑の( Key )の「Key」の下に赤色の波線がでます。


GetHitKeyStateAll_2関数はメインのソースファイルにあって、
ほかのソースファイルにメインのヘッダファイルをインクルードして、
GetHitKeyStateAll_2関数を呼ぶと↑のようなエラーがでます。

分割コンパイルは初めてなので分からないことが多いです。
自分の設計が間違っているのでしょうか?

説明がヘタクソですが、
どこがおかしいのか教えてほしいです。
説明不だったら言ってもらえれば、また書き足します。


コンパイラ名 : VC++ 2010EE
Dxライブラリを使っています。

Re: 分割コンパイルについて質問

Posted: 2011年7月21日(木) 18:11
by softya(ソフト屋)
こちらに分割コンパイルの解説がありますが読まれましたか?
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/

d.1 メイン関数の作り方
d.2 複数のファイルにわけてコンパイルする
d.3 ゲームの設計と分割コンパイル(1)
d.4 ゲームの設計と分割コンパイル(2)
d.5 ゲームの設計と分割コンパイル(3)

まず、読んでみてください。

Re: 分割コンパイルについて質問

Posted: 2011年7月21日(木) 18:17
by ちゃま
そこは3回くらい読みました。

呼んだのですがなかなかしっくりきません・・・
それで、ここで質問させていただきました。

もっと読み直したほうがいいでしょうか?

Re: 分割コンパイルについて質問

Posted: 2011年7月21日(木) 18:22
by softya(ソフト屋)
それでは、GetHitKeyStateAll_2()やKeyに関連した記述をすべて書き出してください。
最初に書かれていませんがプロトタイプ宣言とか書いてあるヘッダがあるはずです。
それぞれが記載されているファイル名とインクルードの状況も書いてください。

Re: 分割コンパイルについて質問

Posted: 2011年7月21日(木) 18:33
by ちゃま
メインソースの一部

コード:


#include "DxLib.h"
#include "adventure_mode.h"
#include "battle_mode.h"



int Key[256];
int White = GetColor(255,255,255);
int Black = GetColor(0,0,0);
int right = 255;


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

	ChangeWindowMode( TRUE );
	SetMainWindowText("RPG");
	SetOutApplicationLogValidFlag(FALSE);
	if(DxLib_Init() == -1 ) return -1;//初期化処理
	SetFontSize(20);

	
	if(gameflag==0){
		gameflag=1;
		opening_mode();
	}
	
	DxLib_End();
    return 0;
}
メインヘッダ

コード:

extern int Key[256];
extern int White;		
extern int Black;
extern int right;


int GetHitKeyStateAll_2();


Re: 分割コンパイルについて質問

Posted: 2011年7月21日(木) 18:40
by ちゃま
いま気付いたのですが、根本の設計からおかしいようです。

ちょっと分割の設計を最初から作りなおしてみます。

それでまた分からなくなったらココにお邪魔します。

Re: 分割コンパイルについて質問

Posted: 2011年7月21日(木) 18:41
by softya(ソフト屋)
ヘッダに//二重include防止 のガードが入ってないですね。これはエラーの原因と無関係ですが。

問題は、
int GetHitKeyStateAll_2();

int GetHitKeyStateAll_2(int KeyStateBuf[])
で宣言と実際の関数で型が違うことにあります。これがエラーの原因です。

それと今気づきましたが、GetHitKeyStateAll_2()は毎フレーム一回だけで良いので、あちこちから呼び出される関数ではありません。
なのでエラー以外に設計自体に問題があると思います。

Key の参照に関しては、
d.4 ゲームの設計と分割コンパイル(2)
に書かれている設計にしたほうが良いと思いますよ。

Re: 分割コンパイルについて質問

Posted: 2011年7月21日(木) 18:42
by ちゃま
せっかくご返信くださったのにすいません。

ありがとうございました。