分割コンパイルの時の関数の使い方を教えてください

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

分割コンパイルの時の関数の使い方を教えてください

#1

投稿記事 by ss » 7年前

新プログラミングの館で勉強を始めてから、まだ少ししかたっていないので、用語など間違っていたら
指摘をお願いします

私が作りたいのはロックマンのような横スクロールのゲームです

Microsoft Visual C++ 2010を使い、プログラムを書いていますが
書いていて膨大な長さになってしまったので、分割コンパイルに挑戦したいと思いました

ゲームの流れは
オープニング
ステージ1
ステージ2
エンディング
といった感じです

今はゲームのオープニングを作り終えました

私の考えでは
bool型でopという関数を作っておきます(ゲームを起動したときはtrueになっている)
そしてオープニングが終わったらfalseになり、ステージ1が始まる予定です

しかし上手くいきません
これがプログラムです

main.cpp

コード:

#include "DxLib.h"
#include "OP.h"

bool op=true;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
		
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

			if( op == true ){
				op_movie();
			}
        }
        
        DxLib_End(); // DXライブラリ終了処理
        return 0;
} 
OP.cpp

コード:

#include "DxLib.h"

static int line=0;
static int w=GetColor( 255, 255, 255); //白色

void op_movie(){
	if( line <= 640 ){
		line++;
	}

	DrawLine (  0,  200, line,  200, w ); // 線を描画

	if( line >= 640){
		op=false;
	}
}
*オープニングのコードは非常に長いので、白い線が横切るだけにします(横切ったらオープニング終了)

OP.h

コード:

#ifndef DEF_OP_H

#define DEF_OP_H

//OPの線
void op_movie();

#endif
なぜか"error C2065: 'op' : 定義されていない識別子です。"と出てきてしまいます
どうすればオープニングを終えることができるのでしょうか

Rittai_3D
記事: 525
登録日時: 8年前

Re: 分割コンパイルの時の関数の使い方を教えてください

#2

投稿記事 by Rittai_3D » 7年前

main.cpp

コード:

#include "DxLib.h"
#include "OP.h"

bool op=true;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
		
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

			if( op == true ){
				op_movie();
			}
        }
        
        DxLib_End(); // DXライブラリ終了処理
        return 0;
} 
OP.cpp

コード:

#include "DxLib.h"

static int line=0;
static int w=GetColor( 255, 255, 255); //白色

void op_movie(){
	if( line <= 640 ){
		line++;
	}

	DrawLine (  0,  200, line,  200, w ); // 線を描画

	if( line >= 640){
		op=false;
	}
}
*オープニングのコードは非常に長いので、白い線が横切るだけにします(横切ったらオープニング終了)

OP.h

コード:

#ifndef DEF_OP_H

#define DEF_OP_H

//OPの線
void op_movie();

#endif
opという変数はmain.cpp内でしか使用できません。
つまり、opをOP.cpp内で定義すればエラーは消えます。

こうすればいいのでは?というコード書いておきます。

コード:

// OP.h
void Run()
{
   if( op ) {
// もし、opがtrueなら〜の処理をする。
   }
}

// main.cpp
#include "DxLib.h"
#include "OP.h"
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
        
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0) {
            Run();
        }
        
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}
のように書けば良いと思います。関数名は適宜変更して下さい。
初心者です

box
記事: 1760
登録日時: 10年前

Re: 分割コンパイルの時の関数の使い方を教えてください

#3

投稿記事 by box » 7年前

ss さんが書きました: なぜか"error C2065: 'op' : 定義されていない識別子です。"と出てきてしまいます
「なぜか」そうなる、ということは、まあほとんどないと思います。
何かしら原因があるはずです。
今回は、OP.cppの中で、変数opを定義せずにいきなり使っているからでありましょう。

じゃあ、どうすればコンパイルが通るか?

1)OP.hの中で変数opを定義する。
2)main.cppの中でopをtrueに初期化する。
3)OP.cppでOP.hをインクルードする。

こんなところでしょうか。
試していないので、うまくいくかどうかはわかりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: 分割コンパイルの時の関数の使い方を教えてください

#4

投稿記事 by softya(ソフト屋) » 7年前

分割やらOPからゲーム本編への遷移は「新ゲーム・プログラミングの館」のゲームプログラミング設計とメニュー画面の作り方を参考にしてください。
http://dixq.net/g/

さて今回の問題ですが、
>なぜか"error C2065: 'op' : 定義されていない識別子です。"と出てきてしまいます
グローバル変数として不完全だからです。
extern bool op;
をmain.hに定義して参照可能にしないといけません。
OP.cppには#include "main.h"を追加します。

ただし、「新ゲーム・プログラミングの館」の推奨の方法(グローバル変数は使わない)とはかなり異なる方法であるとお断りしておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

長峰
記事: 32
登録日時: 7年前

Re: 分割コンパイルの時の関数の使い方を教えてください

#5

投稿記事 by 長峰 » 7年前

私も初心者ですが、似たような経験があるので調べたことを載せておきます。

ssさんが使っている変数opは、プログラム中のもっとも外側のブロックで宣言されているため、グローバル変数になっています。

グローバル変数は、プログラム全体に対して定義される変数ではありますが、
宣言の有効な範囲がプログラム全体に及ばず、同じファイル内のみで有効なファイルスコープになっています。

そのため、他の回答者の方々がおっしゃる通り、externを使って宣言のみを行うか、ヘッダーをインクルードして、変数を使用している部分を有効範囲に含める必要があります。


参考までにグローバル変数の概要と、スコープのWikiへのリンクを載せておきます。
http://e-words.jp/w/E382B0E383ADE383BCE ... 695B0.html
http://ja.wikipedia.org/wiki/%E3%82%B9% ... C%E3%83%97

ss

Re: 分割コンパイルの時の関数の使い方を教えてください

#6

投稿記事 by ss » 7年前

みなさんありがとうございます
上手くできました

しかし理解したかと言うと、そうでもありません

もう一度はじめから勉強をし直してみます
またわからないことが出てきたら力を貸してください

ありがとうございました

閉鎖

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