エラーが出て実行できません

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

エラーが出て実行できません

#1

投稿記事 by 003系 » 8年前

DXライブラリでゲームを作ろうと思い、3週間ほど前からプログラミングの勉強を始めました

プログラムを書いたのですが、実行しようとすると以下の二つのエラーが出て実行できません
エラー番号を検索するなどして努力したのですが、自力で直すことは叶いませんでした

そこで、どうか①「原因となっている箇所」、②「その箇所の正しい記述」、③「エラーの見方」の三つを教えてください

環境は以下の通りです
OS : windows8.1
IDE : Visual Studio 2017 Community
ライブラリ : DXライブラリ



▼-----エラー内容-----▼

エラー LNK2019 未解決の外部シンボル "void __cdecl fSHOT1(int *,int *,int,int,int,int)" (?fSHOT1@@YAXPAH0HHHH@Z) が関数 _WinMain@16 で参照されました。 testProject D:\MyProgram\testProg\testProject\playerShotStraight.obj 1


エラー LNK1120 1 件の未解決の外部参照 testProject D:\MyProgram\testProg\testProject\Debug\testProject.exe 1

▲-----エラー内容-----▲


コード:

#include "DxLib.h"
#define _USE_MATH_DEFINES
#include<math.h>

	//変数定義
	int windowWidth = 1920, windowHeight = 1080;//ウインドウの縦横サイズ
	struct battleman { int x, y, speed; };
	struct shot { int x, y; };

	//関数プロトタイプ宣言
	void fPLAYERMOVE(int *x, int *y, int, int, int);
	void fSHOT1(int *shotx, int *shoty, int, int, int, int);

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	SetOutApplicationLogValidFlag(false), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK), SetGraphMode(windowWidth, windowHeight, 32);
	SetWindowText("playerShotStraight");//ウインドウタイトル設定

	//構造体系
	struct battleman player = { 0,0,20 };
	struct shot shot1[10];
	for (int i = 0; i < 10; i++) {
		shot1[i].x = 0;
		shot1[i].y = 0;
	}

	//メインループ
	while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
		
		//自機移動
		fPLAYERMOVE(&player.x, &player.y, player.speed, windowWidth, windowHeight);
		DrawString(player.x, player.y, "PLAYER", GetColor(64, 64, 255));

		SetMouseDispFlag(true);//マウスカーソルを描画

		//直進弾発射
		fSHOT1(&shot1[10].x, &shot1[10].y, player.x, player.y, windowWidth, windowHeight);
		DrawString(shot1[10].x, shot1[10].y, "SHOT1", GetColor(255, 255, 255));

	}

	DxLib_End();
	return 0;
}

//関数定義

void fPLAYERMOVE(int *x, int *y, int speed, int width, int height) {
	if (CheckHitKey(KEY_INPUT_W)) {
		*y -= speed;
		if (*y <= 0)*y = 0;
	}
	if (CheckHitKey(KEY_INPUT_A)) {
		*x -= speed;
		if (*x <= 0)*x = 0;
	}
	if (CheckHitKey(KEY_INPUT_S)) {
		*y += speed;
		if (*y >= height)*y = height;
	}
	if (CheckHitKey(KEY_INPUT_D)) {
		*x += speed;
		if (*x >= width)*x = width;
	}
}

void fSHOT1(int *shotx[10], int *shoty[10], int px, int py, int width, int height) {
	int count = 0, agility = 20, speed = 20;
	int nowmx = 0, nowmy = 0, se = LoadSoundMem("shot1.ogg");
	float angle;
	struct iseries { int tax, tay, bux, buy, flag, velx, vely; };
	struct iseries shot[10];
	for (int i = 0; i < 10; i++) {
		shot[i].tax = 0;
		shot[i].tay = 0;
		shot[i].bux = 0;
		shot[i].buy = 0;
		shot[i].flag = 0;
		shot[i].velx = 0;
		shot[i].vely = 0;
	}

	if (count < agility) {
		count++;
	} else if (GetMouseInput()&MOUSE_INPUT_1) {
		PlaySoundMem(se, DX_PLAYTYPE_BACK);
		count = 0;
		GetMousePoint(&nowmx, &nowmy);
		for (int i = 0; i < 10; i++) {
			if (shot[i].flag == 0) {
				shot[i].flag = 1;
				shot[i].bux = px;
				shot[i].buy = py;
				shot[i].tax = nowmx;
				shot[i].tay = nowmy;
				angle = atan2f((float)shot[i].tay - (float)shot[i].bux, (float)shot[i].tax - (float)shot[i].bux);
				shot[i].velx = (int)cosf(angle) * speed;
				shot[i].vely = (int)sinf(angle) * speed;
				break;
			}
		}
	}
	for (int i = 0; i < 10; i++) {
		if (shot[i].flag == 1) {
			*shotx += shot[i].velx;
			*shoty += shot[i].vely;
			if (shot[i].bux<0 || shot[i].buy<0 || shot[i].bux>width || shot[i].buy>height) {
				shot[i].flag = 0;
			}
		}
	}
}

梅衣堂ひよ
記事: 24
登録日時: 8年前

Re: エラーが出て実行できません

#2

投稿記事 by 梅衣堂ひよ » 8年前

003系 さんが書きました:

コード:

    void fSHOT1(int *shotx, int *shoty, int, int, int, int);
003系 さんが書きました:

コード:

void fSHOT1(int *shotx[10], int *shoty[10], int px, int py, int width, int height) {
宣言と定義で引数が違いますね。
他にも問題が多数あるようなので細かい指摘については後ほどまとめてあげますね。
結構説明が下手ですのでご了承ください。割と言葉が足りなかったり文字だらけで分かりにくかったりします。

003系

Re: エラーが出て実行できません

#3

投稿記事 by 003系 » 8年前

ありがとうございます!
中々返信がつかなくて「これはもうダメなのかな」と思っていたところでした



>宣言と定義で引数が違いますね。

「つまりこういうこと?」と思い、プロトタイプ宣言の方のコードを以下のように書き換えてみたりしましたがダメでした

コード:

void fSHOT1(int *shotx[10], int *shoty[10], int, int, int, int);
やはり自力ではどうにもできないようです・・・
間違いの指摘の程、よろしくお願いします

梅衣堂ひよ
記事: 24
登録日時: 8年前

Re: エラーが出て実行できません

#4

投稿記事 by 梅衣堂ひよ » 8年前

003系 さんが書きました: 「つまりこういうこと?」と思い、プロトタイプ宣言の方のコードを以下のように書き換えてみたりしましたがダメでした

コード:

void fSHOT1(int *shotx[10], int *shoty[10], int, int, int, int);
逆ですね。むしろ定義の方を宣言に合わせるべきでした。
配列というのは、添え字を付けなければ配列の先頭のポインタの扱いになります。
その為、渡した関数の中でも元の場所と同じように配列変数として扱えます。(1次元のみ。2次元以降は少し工夫が必要になります)
003系 さんが書きました:

コード:

        fSHOT1(&shot1[10].x, &shot1[10].y, player.x, player.y, windowWidth, windowHeight);
次にここ。
C++では、配列は0から数えます。そのため、これでは実在しないshot1の11番目のx、及びyのポインタを引数として渡すようになっています。
003系 さんが書きました:

コード:

 int count = 0, agility = 20, speed = 20;
    int nowmx = 0, nowmy = 0, se = LoadSoundMem("shot1.ogg");
    float angle;
    struct iseries { int tax, tay, bux, buy, flag, velx, vely; };
    struct iseries shot[10];
そしてfSHOTの中で定義されたローカル変数たち。
ローカル変数は、staticを付けないと定義されたブロックを抜けると存在を消されてしまい、次に入った時には新しく作られたものになります。
afillityやspeed、マウスの座標とangleはこのままでも一応問題ないですがcountとshotは中身がまっさらになり、seに至ってはここに入る度にファイルを追加読み込みしています。そしてseは解放されていないので、どんどんメモリを圧迫していきます。

おそらくはどこかのサイトからコピペしてきたりするのでしょうが、コピペするときはソースの意味を理解しないと危険ですので注意してください。
[hr]
オマケ。ソースを少し?改変いたしました。
► スポイラーを表示
結構説明が下手ですのでご了承ください。割と言葉が足りなかったり文字だらけで分かりにくかったりします。

003系

Re: エラーが出て実行できません

#5

投稿記事 by 003系 » 8年前

丁寧な解説、そして付録まで頂いてしまってありがとうございます!

早速オマケのソースをコピペして実行してみました
自分の理想とした振る舞いが行われていて感激しました!

自分は今まで「ゲーム アルゴリズム」と検索して、ヒットした誰かのソースを理解して・コピペして・改変して・・・という風に勉強(?)してきました
そして今回、自分が追記したseの箇所がメモリを圧迫することを知らなかったりオマケのソースに理解できない箇所があったり、自分の未熟さを感じました
(実は構造体やポインタもよく理解しておらず、少し調べただけですお恥ずかしい・・・)

暫くはこれまでの勉強(?)法から離れ、解説本を購入しそれに学ぼうと思います



梅衣堂ひよさん、稚拙な質問にお付き合いいただきありがとうございました
暫くは解説本で修行して、今度は質問する側から回答する側に回れるようになって帰ってこようと思います

改めて、ありがとうございました!

返信

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