ファイルを分割してみたらエラーが消えなくなってしまいました。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

ファイルを分割してみたらエラーが消えなくなってしまいました。

#1

投稿記事 by » 16年前

Visual Studio 2008 Express EditionとDXライブラリを使って、ゲーム(と呼べるレベルのものではまだありませんが)を作っています。
ソースファイルを分割しようとしてみたところ、つぎの様なエラーメッセージがでて、その解決方法が分からなくなって困っています。

以下エラーメッセージです。
1>------ ビルド開始: プロジェクト: Game2, 構成: Debug Win32 ------
1>コンパイルしています...
1>char.cpp
1>main.cpp
1>コードを生成中...
1>リンクしています...
1>main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl char_coord(int *,int)" (?char_coord@@YAXPAHH@Z) が関数 _WinMain@16 で参照されました。
1>C:\Documents and Settings\ryosuke\My Documents\Visual Studio 2008\Projects\Game2\Debug\Game2.exe : fatal error LNK1120: 外部参照 1 が未解決です。
1>ビルドログは "file://c:\Documents and Settings\ryosuke\My Documents\Visual Studio 2008\Projects\Game2\Game2\Debug\BuildLog.htm" に保存されました。
1>Game2 - エラー 2、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========



error LNK2019: 未解決の外部シンボル "void __cdecl char_coord(int *,int)" (?char_coord@@YAXPAHH@Z) が関数 _WinMain@16
↑この行で検索をかけてみたところ、「win32 コンソールアプリケーション」を使えばエラーは消えるらしいのですがプロジェクトを作り直しwin32 コンソールアプリケーションを選んで、"stdafx.h"をchar.ccpとgame3.ccpに追加した以外は全く同じコードで試してみたところ、以下のようなエラーメッセージがでました。

1>------ ビルド開始: プロジェクト: game3, 構成: Debug Win32 ------
1>コンパイルしています...
1>game3.cpp
1>c:\documents and settings\ryosuke\my documents\visual studio 2008\projects\game3\game3\game3.cpp(9) : fatal error C1083: include ファイルを開けません。'Keys_Blocks.h': No such file or directory
1>ビルドログは "file://c:\Documents and Settings\ryosuke\My Documents\Visual Studio 2008\Projects\game3\game3\Debug\BuildLog.htm" に保存されました。
1>game3 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

無事にコンパイルできるようにするにはどうしたらいいかご教授ください。

Re:ファイルを分割してみたらエラーが消えなくなってしまいました。

#2

投稿記事 by » 16年前

以下はソースファイルです。

//game3.ccpとmain.ccpは始めの一行以外は同じものです。
#include "stdafx.h"
#include "DxLib.h"
#include "Keys_Blocks.h"

void char_coord(int *Key,int block);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
	
	//Loading pics
	int back_i=0;
	int ground=LoadGraph("Stones.png");

	while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
		//Back
		LoadGraphScreen(-back_i,0,"virgo.jpg",FALSE);
		if(back_i>1080-680)LoadGraphScreen(1080-back_i,0,"virgo.jpg",FALSE);
		if(back_i>1080)back_i=0;
		back_i++;

		//Ground
		int ground=LoadGraph("stones.png");
		for(int i=0;i<20;i++){
			for(int j=0;j<15;j++){
				if(block[j]==1)DrawGraph(i*32,j*32,ground,TRUE);
			}
		}

		//draw_char
		char_coord(Key,block[15][20]);
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}




//char.ccp
#include "stdafx.h"
#include "DxLib.h"
#include <math.h>

#define g 6.6
#define y_max 2.0

typedef struct{
	int x;
	int y;
	int img;
	int direct;//right 1 or left 3
	int inertia;
	int j_flag;
	int sky;
}cha;

void char_coord(int *Key,int block[15][20]){
	//int *coord;

	int dora[12];
	LoadDivGraph("char.png",12,3,4,24,32,dora);

	cha ch;
	ch.x=680/4;
	ch.y=480-32*4;
	ch.direct=1;
	ch.inertia=0;
	ch.j_flag=0;
	ch.sky=0;
	
	int ex_y=ch.y;
	int time1=0,time2=0;
	double t;
	
	//char_x
	if(Key[KEY_INPUT_RIGHT]>0){
		if(ch.sky==1)ch.x+=4;//accerate in the sky
		ch.x+=3,ch.direct=1;//start walking
	}
	if(Key[KEY_INPUT_RIGHT]>10)ch.x+=4,ch.inertia=10;//start running and get inertia force
	if(ch.direct==1 && Key[KEY_INPUT_RIGHT]==0 && ch.inertia==10)ch.inertia--;//inertia force is weakening
	if(ch.direct==1 && ch.inertia<10 && ch.inertia>0)ch.x+=2,ch.inertia--;

	if(Key[KEY_INPUT_LEFT]>0){
		if(ch.sky==1)ch.x-=4;
		ch.x-=3,ch.direct=3;
	}
	if(Key[KEY_INPUT_LEFT]>10)ch.x-=4,ch.inertia=10;
	if(ch.direct==3 && Key[KEY_INPUT_LEFT]==0 && ch.inertia==10)ch.inertia--;
	if(ch.direct==3 && ch.inertia<10 && ch.inertia>0)ch.x-=2,ch.inertia--;
	
	//char_jump
	if(Key[KEY_INPUT_UP]==1 && ch.j_flag<=2){
	time1=GetNowCount();
	ch.j_flag++; //up flag 
	ex_y=ch.y; //where it was
	}
	
	if(ch.j_flag!=0){
		time2=GetNowCount();
		t=(double)(time2-time1)/1000;
		ch.y=ex_y-(int)((sqrt(2*g*y_max)*t-0.5*g*t*t)*(32*2)/y_max);//culc y
		if((int)((sqrt(2*g*y_max)*t-0.5*g*t*t)*(32*2)/y_max)>0)ch.sky=1;
		
		if(block[ch.y/32+1][ch.x/32+1]==1 && ch.sky==1){
			ch.y=(ch.y/32)*32;//discard fractions
			ch.j_flag=0;
			ch.sky=0;
		}
	}
	
	ch.img=dora[((ch.x+ch.y)%12)/4+ch.direct*3];//choosing picture based on coordinates
	if(ch.x>400){
		ch.x=400;//cant move right anymore
		ch.img=dora[(Key[KEY_INPUT_RIGHT]+Key[KEY_INPUT_UP])%3+3];//choosing picture based on KEY_INPUT_RIGHT time 
	}
	DrawGraph(ch.x,ch.y,ch.img,TRUE);

	//coord[0]=ch.x;
	//coord[1]=ch.y;

	//return 0;
}

Re:ファイルを分割してみたらエラーが消えなくなってしまいました。

#3

投稿記事 by » 16年前

//Keys_Blocks.h
int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[/url]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}

int block[15][20] = {
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
[/pre]

長くなってすいません。
よろしくお願いします!

Mist

Re:ファイルを分割してみたらエラーが消えなくなってしまいました。

#4

投稿記事 by Mist » 16年前

> error LNK2019: 未解決の外部シンボル "void __cdecl char_coord(int *,int)" (?char_coord@@YAXPAHH@Z) が関数 _WinMain@16
> ↑この行で検索をかけてみたところ、「win32 コンソールアプリケーション」を使えばエラーは消えるらしいのですがプロジェクトを作り直し

この対応は間違いです、元に戻してください。
未解決シンボルエラーになるのはプロトタイプ宣言と関数の実体の定義が一致していないからです。

プロトタイプ:void char_coord(int *Key,int block);
関数宣言:void char_coord(int *Key,int block[15][20]){

関数のほうの [15][20]はいらないのでは?

Re:ファイルを分割してみたらエラーが消えなくなってしまいました。

#5

投稿記事 by » 16年前

関数の定義や多次元配列を見直したところ、無事コンパイルできました!
Mistさん、本当にありがとうございます!!!

閉鎖

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