PCを新しくしたら

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

PCを新しくしたら

#1

投稿記事 by 独学初心者 » 16年前

こんにちは。
先日は色々とありがとうございました。

ちょっと先日、PCを新しく新調しまして、開発環境を移設したのですが、困ったことになってしまいました。

VC++を使って居るのですが、デバッグができなくなってしまいました。

DXライブラリのサンプルプログラムなら動くのですが、自分が作った方だけ…前PCでは普通に起動するプログラムを、丸写ししたにも関わらず…
ウィンドウ表示した際に強請終了してしまいます。
出力を見てみると、どうやら


Zバッファの作成に失敗しました


と言う一文以降終了処理に入ってる様です…
自分で色々調べ、試した結果上手く行かず、どこが悪いかも見当が付かず、イマイチ理解に苦しんでいます。


知恵をお借りできればと思います。よろしくお願いいたします。

紅葉

Re:PCを新しくしたら

#2

投稿記事 by 紅葉 » 16年前

素人の意見で申し訳ないですが
SDKをインストールし設定をしましたでしょうか?

御津凪

Re:PCを新しくしたら

#3

投稿記事 by 御津凪 » 16年前

> SDKをインストールし設定をしましたでしょうか?
ランタイムパッケージでも実行は可能です。
現PCでコンパイルできているようだと問題はなさそうです。

他のサンプルは実行できているそうなので、差し支えなければ、
実行しないプログラムの、 WinMain 関数の初期化処理周りを見せていただけませんか?

ついでにできれば前PCの環境と現PCの環境を頂けると、
大きな参考になるかと思います。
(というかそれが無いとこれ以上の的確な回答ができません)

独学初心者

Re:PCを新しくしたら

#4

投稿記事 by 独学初心者 » 16年前

紅葉様、御津凪様
ご返答ありがとうございます。

紅葉様
SDKについてですが、パソコンに入れて、VCの方でも設定はしてあります。
多分、前のパソコンと同じように設定し、前のパソコンだと動いてるので、大丈夫だとはおもうのですが…
見落としてることがあるのかもう一度見てみます。

御津凪様
えーっと、main部分と、初期化部分ですね…
main.cpp
#include "DxLib.h"
#include "GlobalVariable.h"

extern void opening();
extern void img_sound_load();
extern void initialization();
extern void SetColor();
extern void Background();
extern void Background2();
extern void EnemyControl();
extern void EnemyCalcDisp();
extern void EnemyShotControl();
extern void EnemyShotCalcDisp();
extern void CollisionDetection();
extern void CollisionDetection2();
extern void CollisionDetection3();
extern void CollisionDetection4();
extern void CollisionDetection5();
extern void PlayerShotCalc();
extern void PlayerShotDisp();
extern void PlayerControl();
extern void BossControl();
extern void BossCalcDisp();
extern void FpsTimeFanction();



int WINAPI WinMain( HINSTANCE hInstance, 
                                   HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        int RefreshTime=0;

        ChangeWindowMode( TRUE ) ;
        if( DxLib_Init() == -1 ) return -1; 
		
		
		img_sound_load();                               //画像、サウンドのロード
		initialization();                               //初期化
        SetDrawScreen( DX_SCREEN_BACK ) ;               //裏画面を使用する。
        SetColor();                                     //色を取得する

        while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){
                RefreshTime = GetNowCount();            //今の時間を取得
                ClearDrawScreen();                      //裏画面のデータを全て削除
				switch(function_status){
					case 0:

						  opening();

			              break;

					case 2:
				
				          Background();                           //背景描写
				
				          PlayerControl();                        //プレイヤー描写
				
				          PlayerShotCalc();                       //ショットする
				
				          PlayerShotDisp();                       //ショット描写
				
				          EnemyControl();                         //敵描写
				
				          EnemyCalcDisp();                        //敵計算
												
				          EnemyShotControl();                     //敵ショット計算 
				
				          EnemyShotCalcDisp();                    //敵ショット描写
						  
					  BossControl();                          //ボス描写
						  
     				  BossCalcDisp();                         //ボス表示
				
				          CollisionDetection();                   //当たり判定計算(自ショット/敵機)
				
				          CollisionDetection2();                  //当たり判定計算(敵ショット/自機)
				
				          CollisionDetection3();                  //当たり判定計算(敵機/自機)
						  
					  CollisionDetection4();                  //当たり判定(自機/ボス)
						  
					  CollisionDetection5();                  //当たり判定(自ショット/ボス)
						  
					  Background2();                          //スコアボード描写
						  
					  counter++;
						  
					  break;
				          
				}

                FpsTimeFanction();                      //FPS計算

                ScreenFlip() ;                          //裏画面データを表画面へ反映
				

              

                if(Key[KEY_INPUT_ESCAPE]==1)    break;  //Escapeが押されたら終了
                while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
        }
                
        DxLib_End() ;
        return 0 ;
}
initial.cpp
#include "DxLib.h"
#include "ExternGV.h"


void initialization(){
	int function_status=0;
	int i,j;
    Player.x=200.0;
    Player.y=400.0;
    Player.counter=70;
    Player.status=0;
	Player.range=4;
 	Player.flag=1;
	Player.num=5;
	for(int i=0;i<PLAYER_MAX_SHOT1;i++)
                for(int j=0;j<PLAYER_MAX_SHOT2;j++)
					PlayerShot[j].flag=0;
	for(i=0;i<ENEMY_TOTAL_NUM;i++){
                    enemy.flag=0;EnemyShot.flag=0;
                for(int j=0;j<ENEMY_TOTAL_SHOT_NUM;j++)
					EnemyShot.EnemyShots[j].flag=0;
	}


}


こ、これでいいのかな…?

御津凪

Re:PCを新しくしたら

#5

投稿記事 by 御津凪 » 16年前

遅くなりました。

見たところ初期化部分に特におかしな箇所はなさそうなので、
恐らくコンパイル環境に問題があるかもしれません。
Zバッファ作成失敗、ということは DxLib_Init 関数内で起こっている様子ですし。

たとえば、下記のような単純なサンプルコードをコンパイルし、
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    ChangeWindowMode(TRUE);
    if(DxLib_Init() == -1) return -1;
    DxLib_End();
    return 0;
}
作成された実行ファイルが同様のエラーログを出すようであれば、
もしかしたらDXライブラリのファイルが壊れている可能性が有りますので、
再度ダウンロードしてみてください。

他にも、下記の方法を試してみてください。
・リリース版でコンパイル、実行
・フルスクリーン表示を行う
・ディスプレイの表示サイズを変えてみる(期待薄)

それと、終了したとき、VC++ の出力ウインドウの末尾行の文に、
プログラム '[***] xxxx.exe: ネイティブ' はコード 0 (0x0) で終了しました。
が、あるはずなので、そこが、「コード -1 (0xffffffff)」となっているのであれば、
DxLib_Init 関数が失敗している(return -1; が実行されている)証拠です。
もしここが「コード 0 (0x0) 」だった場合は、DxLib_Init 関数は成功したが、
その後の処理で失敗をしている可能性が高いです。
(つまり、WinMain 関数が正常に最後まで実行された)

もう一つ、ブレイクポイント(あるいはステップ実行)を使ってデバッグを行えば、
判明しやすいかもしれません。
(Debugビルドじゃないとデバッグ実行できないので注意)

色々とチェックしてほしい点がありますが、それぞれ確認してみてください。

独学初心者

Re:PCを新しくしたら

#6

投稿記事 by 独学初心者 » 16年前

御津凪様
途中報告なのですが、今のところ
フルスクリーン起動と解像度変更は駄目っぽいです;
それから、いただいたコードをコピペして…の場合は起動いたしました。

次はDXライブラリをダウンロードしなおそうかと考えていますが、そのまえにご指摘があったところがありましたので、なにか絞り込めないかとおもい、ご報告させていただきます。

それは、終了時の末尾ですが、いただいたコード、DXライブラリのサンプルプログラムではおきないのに、自作のほうのみ「コード -1 (0xffffffff)」が出る、ということです。

自分のコードだけで出るって事は…なんなんでしょう?ほんとに…

御津凪

Re:PCを新しくしたら

#7

投稿記事 by 御津凪 » 16年前

恐らく、DXライブラリと競合している部分がある可能性があります。

プロジェクトのプロパティで、
C/C++ → 警告レベルを 4 にしてビルドしてみてください。
恐らく警告が沢山出ると思います。
その警告を修正していけば、なんとなく直るような気がします。

それ以前にリンク時での警告が出ていればそれが一番怪しいのですが。

グローバルで宣言している変数が一番怪しい
(DXライブラリのグローバル変数と衝突している可能性がある)ので、
たとえば、
typedef struct Global{
    int data;
} Global;

extern Global g_game;
のようにして、一つの構造体にまとめてみるのも一つの手です。
(ただし、変数名をいちいち書き換える必要がある)
一旦そのプロジェクトを複製して、初期化処理以外を削除した状態で実行していく感じで、
どれが悪さをしているか確認したほうがいいですね。

# 書きながらDXライブラリのソースコードを眺めて見ましたが、
# グローバル変数に "WinData" って名前の変数(あるいは関数)は有りますか?
# それがあればそれが問題なのかも。

独学初心者

Re:PCを新しくしたら

#8

投稿記事 by 独学初心者 » 16年前

こんばんわ。
うーん…やっぱりどうもさっぱりです;

が、関係があるのかどうかいまいちわかりかねるのですが、少しだけ進展?がありましたのでご報告までに。
警告の方を4にしてみたところ、いくつか出ていた警告などで気になったので、

int WINAPI…のところにブレイクポイントを置いてデバックしてみたところ
自動変数欄に
- hPrevInstance 0x00000000 {unused=??? } HINSTANCE__ *

unused CXX0030: エラーです: 式を評価できません

と言った記述が見つかりました。
ググったりいろいろ自分でも手を出してみたのですが、何のことやらさっぱりで…不甲斐ないばかりです。
おそらく、ここ以前に何かがあってこうなってるってことなんでしょうけれども…

グローバル関数にWinDateとかいった記述が見つかればよかったんですが…

うううーん…元のやつとまったく同じなのにこの差は一体なんなんだろう…

御津凪

Re:PCを新しくしたら

#9

投稿記事 by 御津凪 » 16年前

hPrevInstance は、普通使用しない変数なので、それは無視してください。

コードを削っていって、どこかで正常に実行できれば、
直前に削ったコードが問題があるということになります。

この方法なら確実に原因がつかめるはずです。
(製作規模によっては酷な方法ですが)

あるいは、一度作り直してみるという奥の手もありますが^^;

独学初心者

Re:PCを新しくしたら

#10

投稿記事 by 独学初心者 » 16年前

御津凪様
ご返答ありがとうございます。

一個消してはまた…という作業を、目下続行中です。
仕事の合間合間なので、なかなかはかどらないのですが;

で、やってるときになんとなく気になったのが
どうやら、hinstance等のあたりが、本体の関数で参照されてないというところが、何べんやってもでてくる一文のもようです。
それが、WINAPI…の()内の小文字系すべて同じ記述「'小文字の引数' : 引数は関数の本体部で 1 度も参照されません。」が出てきます。

この警告がどうにも消し方がわからんので、ぼけっとエクスプローラーを眺めていたら
…おかしい。DXlib.hのファイルが、サンプルプログラムとサイズが違う…
サンプルプログラムだと、161kbだったものが、自分のやつだと138kb…
怪しい…怪しすぎる…

と思い、サイズの大きいサンプルプログラムの.hの方を上書きしたら…

出るわ出るわ、リンクエラーの山です。その数240個。

error LNK2001: 外部シンボル "__RTC_CheckEsp" は未解決です。

ですとか

未解決の外部シンボル __RTC_CheckEsp が関数 "void __cdecl SetColor(void)" (?SetColor@@YAXXZ) で参照されました。

ですとか…
もう、一から作り直すしかないのでしょうか…?
こ、こいつぁ一体…

御津凪

Re:PCを新しくしたら

#11

投稿記事 by 御津凪 » 16年前

つまり、DXライブラリのバージョンが違った、というオチですかね?

DXlib.h を開くと、先頭にバージョンが書かれているので、チェックしてみて下さい。

あと、リンカエラーが出るのはヘッダファイルだけ別のバージョンになったので、
当然出ます。
ライブラリファイルも一緒に上書きしないといけません。
それでも削除されている関数があったりすると思うので、そこを修正すればコンパイルは出来るはずです。


あと、 hinstance 辺りの警告の対処方法ですが、3通り有ります。

1.
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
    // ...
}
として、変数名を外す。

2.
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,
                   int       nCmdShow)
{
    hInstance;
    hPrevInstance;
    lpCmdLine;
    nCmdShow;
    // ...
}
と、書く。

3.
プロジェクトのプロパティ→C/C++→詳細→指定の警告を無効にする
で、警告の番号(この場合は 4100)を指定する。
(コンパイル時にその番号の警告が出なくなる)

があります。

独学初心者

Re:PCを新しくしたら

#12

投稿記事 by 独学初心者 » 16年前

御津凪様
御返答ありがとうございました。

…目から鱗です…
DXのヘッダ=いじっちゃいけないと言うイメージがあったものですから…

正にver.が違っていました。

おっしゃった通りコピーして、無事にリンクエラーが激減です。


幾つか残ってるのを見たら、自分でなんとかできそうなモノでした。

リンクエラーとか、まだ全然よくわかってなかったので、山の様なエラーを見た時は冷や汗でした…


おかげでなんとかなるとこまでこれました。

拙い説明を読み、丁寧にご説明いただきありがとうございました。

閉鎖

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