ページ 1 / 1
龍神録プログラミング5章について
Posted: 2009年5月05日(火) 15:03
by おかし
はじめまして「おかし」といいます
龍神録プログラミング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です。
関係ありませんが、こういった掲示板に書き込むのは初めてですので、至らない点などあると思いますが回答よろしくお願いします。
Re:龍神録プログラミング5章について
Posted: 2009年5月05日(火) 17:11
by situmon
もしかしたら
初期化宣言されないか(i=0だと=0が初期化宣言)
グローバル宣言で
int img_ch[12]=0;
とやったり
エクスターン宣言
でextern int_ch[12];とやってなかったり、
load.cppで
キャラクター画像を読み込んでなかったりしていませんか?
Re:龍神録プログラミング5章について
Posted: 2009年5月05日(火) 21:14
by おかし
回答ありがとうございます。
しかし、グローバル変数での初期化はしていませんし、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] ) ;
}
こんな感じです。
Re:龍神録プログラミング5章について
Posted: 2009年5月05日(火) 21:22
by situmon
//画像用変数宣言部
GLOBAL int img_ch[2][12]=0;の
=0を消してみてください。
これが原因のきがします。
0を入れたのにそれにまた画像を入れちゃってますよ。
Re:龍神録プログラミング5章について
Posted: 2009年5月05日(火) 21:45
by おかし
消してみましたが、結果は変わりませんでした・・・・・。
エラーの意味は、あの部分の処理が終わっていないという意味で解釈してもよろしいでしょうか?
graph.cppのほうに問題があるのでしょうか?
あと、私の書いたコード、なんか読みにくいですね。今度から気をつけます。
Re:龍神録プログラミング5章について
Posted: 2009年5月05日(火) 21:51
by yu
一度リビルドしてみると良いかもしれません。
Re:龍神録プログラミング5章について
Posted: 2009年5月06日(水) 06:24
by おかし
回答ありがとうございます。
リビルドも試してみましたが、やはり同じようなエラーが出てきてしまいます。
Re:龍神録プログラミング5章について
Posted: 2009年5月06日(水) 13:23
by pooka
GV.hの
#ifdef GLOBAL_INSTANCE
とmain.cppの
#define GLOBAL_INSTANCE
は同じようにGLOBAL_INSTANCEになっていますか?
プロジェクトを一括ダウンロードして、5章を見てみると、
GLOBAL_INSTANCEではなくて_GLOBAL_INSTANCE_
となっていたので確認してみてください。
Re:龍神録プログラミング5章について
Posted: 2009年5月06日(水) 18:43
by おかし
回答ありがとうございます
両方とも、GLOBAL_INSTANCEとなっていたので
_GLOBAL_INSTANCE_と直してビルドしてみましたが、結果かわらずです・・・・。
それと、私のDLしたソースはGLOBAL_INSTANCEなっていたのですが・・・・。
なかなか解決せず申し訳ないです;;
Re:龍神録プログラミング5章について
Posted: 2009年5月06日(水) 18:55
by pooka
一度main.cppを見せてもらってもいいですか?
Re:龍神録プログラミング5章について
Posted: 2009年5月06日(水) 19:38
by おかし
はい。
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;
}
よろしくお願いします。
Re:龍神録プログラミング5章について
Posted: 2009年5月06日(水) 19:51
by pooka
>#define GOBAL_INSTANCE
#define GLOBAL_INSTANCE
Lが抜けてますね^^
Re:龍神録プログラミング5章について
Posted: 2009年5月06日(水) 21:38
by おかし
ありがとうございます。
無事コンパイルできました^^
原因は、タイプミスだったようです・・・・お恥ずかしい・・・・
お手数をおかけしました。
この質問に回答してくださった皆様、本当に本当にありがとうございました。
また質問させてもらうことがありましたらまたよろしくお願いします^^;
再入力の処理
Posted: 2009年5月22日(金) 13:23
by ほのか
お世話になっております。
住所登録プログラムを作成しているのですが、性別入力時に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を入力してください」と表示された後、再入力ではなく次の処理に飛んでしまいます。
どのようにすれば再入力の処理ができますか??;
Re:再入力の処理
Posted: 2009年5月22日(金) 14:10
by pooka
{}の対応関係がおかしいと思うので確認してみてください。
以前と同じなら#define SEI 2となっていると思いますが、
scanf("%s",temp.sei);
で例えば3と入力した場合strlen(temp.sei)の値は1になります。
この場合、continueをしても
while(strlen(temp.sei) >= SEI)
の条件を満たさずループを抜けて次の処理にいってると思います。
そのあたりに注意して変更してみてください。
Re:再入力の処理
Posted: 2009年5月22日(金) 14:18
by ほのか
回答ありがとうございます^^
最後のwhileの部分を
}while(strlen(temp.sei)>=SEI || strcmp(temp.sei,dansei)!=0 && strcmp(temp.sei,jyosei)!=0);
に変えたらきちんと再入力できるようになりました!
ありがとうございました^^