龍神録プログラミング5章について

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

龍神録プログラミング5章について

#1

投稿記事 by おかし » 16年前

はじめまして「おかし」といいます
龍神録プログラミング5章についての質問です。

サイトのほうを見てやっているのですが、
1>load.obj : error LNK2001: 外部シンボル ""int (* img_ch)[12]" (?img_ch@@3PAY0M@HA)" は未解決です。
1>graph.obj : error LNK2001: 外部シンボル ""int (* img_ch)[12]" (?img_ch@@3PAY0M@HA)" は未解決です。
1>graph.obj : error LNK2001: 外部シンボル ""struct ch_t ch" (?ch@@3Uch_t@@A)" は未解決です。
1>C:\Documents and Settings\・・\デスクトップ\project\project\プロジェクト\Debug\RyuJin.exe : fatal error LNK1120: 外部参照 2 が未解決です。

といったエラーがでてこまっています。
プロジェクトの一括ダウンロードして見比べてみたのですが、同じように書いてあるように思えます(見落としがあるかもしれません)

できれば、エラーの意味、考えられる原因、対処法を教えていただけると幸いです。
C言語暦は一ヶ月くらいです。

OSはwindowsXP
コンパイラはVC++2008EEです。

関係ありませんが、こういった掲示板に書き込むのは初めてですので、至らない点などあると思いますが回答よろしくお願いします。

situmon

Re:龍神録プログラミング5章について

#2

投稿記事 by situmon » 16年前

もしかしたら
初期化宣言されないか(i=0だと=0が初期化宣言)
グローバル宣言で
int img_ch[12]=0;
とやったり
エクスターン宣言
でextern int_ch[12];とやってなかったり、
load.cppで
キャラクター画像を読み込んでなかったりしていませんか?

おかし

Re:龍神録プログラミング5章について

#3

投稿記事 by おかし » 16年前

回答ありがとうございます。

しかし、グローバル変数での初期化はしていませんし、extern宣言は5章の上のほうの処理を書いた後、全て消してしまいました。(消さないほうがよかった宣言もあるのでしょうか?)

GV.hは、
#include "../../../include/DxLib.h"
#include "define.h"

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include "function.h"			//関数宣言

//画像用変数宣言部
GLOBAL int img_ch[2][12]=0;		//キャラクタ画像9枚分×2

//構造体変数宣言部
GLOBAL ch_t ch;					//キャラクタデータ宣言
load.cppは、
#include "../include/GV.h"

void load(){
	LoadDivGraph( "../dat/img/char/0.png" , 12 , 4 , 3 , 73 , 73 , img_ch[0] ) ;
}
こんな感じです。

situmon

Re:龍神録プログラミング5章について

#4

投稿記事 by situmon » 16年前

//画像用変数宣言部
GLOBAL int img_ch[2][12]=0;の
=0を消してみてください。

これが原因のきがします。

0を入れたのにそれにまた画像を入れちゃってますよ。

おかし

Re:龍神録プログラミング5章について

#5

投稿記事 by おかし » 16年前

消してみましたが、結果は変わりませんでした・・・・・。
エラーの意味は、あの部分の処理が終わっていないという意味で解釈してもよろしいでしょうか?
graph.cppのほうに問題があるのでしょうか?

あと、私の書いたコード、なんか読みにくいですね。今度から気をつけます。

yu

Re:龍神録プログラミング5章について

#6

投稿記事 by yu » 16年前

一度リビルドしてみると良いかもしれません。

おかし

Re:龍神録プログラミング5章について

#7

投稿記事 by おかし » 16年前

回答ありがとうございます。

リビルドも試してみましたが、やはり同じようなエラーが出てきてしまいます。

pooka

Re:龍神録プログラミング5章について

#8

投稿記事 by pooka » 16年前

GV.hの
#ifdef GLOBAL_INSTANCE
とmain.cppの
#define GLOBAL_INSTANCE
は同じようにGLOBAL_INSTANCEになっていますか?
プロジェクトを一括ダウンロードして、5章を見てみると、
GLOBAL_INSTANCEではなくて_GLOBAL_INSTANCE_
となっていたので確認してみてください。

おかし

Re:龍神録プログラミング5章について

#9

投稿記事 by おかし » 16年前

回答ありがとうございます

両方とも、GLOBAL_INSTANCEとなっていたので
_GLOBAL_INSTANCE_と直してビルドしてみましたが、結果かわらずです・・・・。

それと、私のDLしたソースはGLOBAL_INSTANCEなっていたのですが・・・・。

なかなか解決せず申し訳ないです;;

pooka

Re:龍神録プログラミング5章について

#10

投稿記事 by pooka » 16年前

一度main.cppを見せてもらってもいいですか?

おかし

Re:龍神録プログラミング5章について

#11

投稿記事 by おかし » 16年前

はい。
main.cppです。
#define GOBAL_INSTANCE
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	return 0;
}

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

	load();//データロード

	while(ProcessLoop()==0){//メインループ

		graph_main();//描画メイン

		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映
	}

	DxLib_End();//DXライブラリ終了処理
	return 0;
}
よろしくお願いします。

pooka

Re:龍神録プログラミング5章について

#12

投稿記事 by pooka » 16年前

>#define GOBAL_INSTANCE
#define GLOBAL_INSTANCE
Lが抜けてますね^^

おかし

Re:龍神録プログラミング5章について

#13

投稿記事 by おかし » 16年前

ありがとうございます。

無事コンパイルできました^^
原因は、タイプミスだったようです・・・・お恥ずかしい・・・・
お手数をおかけしました。

この質問に回答してくださった皆様、本当に本当にありがとうございました。
また質問させてもらうことがありましたらまたよろしくお願いします^^;

ほのか

再入力の処理

#14

投稿記事 by ほのか » 16年前

お世話になっております。

住所登録プログラムを作成しているのですが、性別入力時に2文字以上入力された場合に再入力する処理と、1か2以外を入力された場合に再入力する処理を入れたいのですが


do{
    printf("性別を入力してください(1:男性/2:女性)>>>");
    scanf("%s",temp.sei);

    /* 最大文字数を超えた場合再入力 */
    if(strlen(temp.sei)>=SEI){
      printf("---文字数超過---\n\n");
      continue;
      }else
      if(strcmp(temp.sei,dansei)!=0 && strcmp(temp.sei,jyosei)!=0){
        printf("1か2を入力してください\n");
        continue;
      }
      puts("");
      }
}while(strlen(temp.sei)>=SEI);



上記のようにすると「1か2を入力してください」と表示された後、再入力ではなく次の処理に飛んでしまいます。
どのようにすれば再入力の処理ができますか??;

pooka

Re:再入力の処理

#15

投稿記事 by pooka » 16年前

{}の対応関係がおかしいと思うので確認してみてください。

以前と同じなら#define SEI 2となっていると思いますが、
scanf("%s",temp.sei);
で例えば3と入力した場合strlen(temp.sei)の値は1になります。
この場合、continueをしても
while(strlen(temp.sei) >= SEI)
の条件を満たさずループを抜けて次の処理にいってると思います。
そのあたりに注意して変更してみてください。

ほのか

Re:再入力の処理

#16

投稿記事 by ほのか » 16年前

回答ありがとうございます^^
最後のwhileの部分を
}while(strlen(temp.sei)>=SEI || strcmp(temp.sei,dansei)!=0 && strcmp(temp.sei,jyosei)!=0);
に変えたらきちんと再入力できるようになりました!

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

閉鎖

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