変数の使い方。宣言の仕方。

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

変数の使い方。宣言の仕方。

#1

投稿記事 by 由良 » 17年前

今晩和。以前一度質問したことのある由良です。
また皆様に教えていただきたい事があって投稿いたしました。

B.cppというファイルで宣言した変数「xxx」を
A.cppというファイルで使用したいのですが、
どうすれば宜しいのでしょうか?
A.cpp中で

DrawGraph( 1 , 280 , xxx , TRUE ) ;

と宣言すると
「error C2065: 'xxx' : 定義されていない識別子です。」
と出てきてしまいます。

変数「xxx」は多用する予定の変数なのでいちいち宣言すると
面倒だと思って他の場所に宣言したのですが、
面倒でもいちいち宣言しないといけないのでしょうか?
是非教えてください。


由良

Re:変数の使い方。宣言の仕方。

#3

投稿記事 by 由良 » 17年前

お返事ありがとうございます。
えっと、一応extern宣言をつかったのですが・・・出来ませんでした。
↓の書き方が不味かったんでしょうか・・・??

******************* A.cpp *******************
#include "DxLib.h"
extern void B();

void A(){
DrawGraph( x座標, y座標, xxx, TRUE);
}
*********************************************

******************* B.cpp *******************
#include "DxLib.h"
int xxx;

void A(){
xxx = LoadGraph("Failname");
}
*********************************************

box

Re:変数の使い方。宣言の仕方。

#4

投稿記事 by box » 17年前

何をしたときに、どううまくいかなかったかを
具体的に書いてください。

A.cppで使っている変数xxxの実体は、
B.cppで定義していますね。

その、「どこか別のファイルで定義した変数」を
利用するときに、externを使います。

ところで、A関数の定義が重複していますが、
よいのでしょうか?

やそ

Re:変数の使い方。宣言の仕方。

#5

投稿記事 by やそ » 17年前

残念!extern命令の使用方法をちょっと勘違いしているようです。
由良さんは関数の宣言をexternで宣言されましたが、肝心の?変数xxxのextern宣言をされていないようです。

B.cppで定義した変数xxxをA.cppで使いたいわけですよね。
ならばA.cppで変数xxxについてextern宣言をしてあげればいいんじゃないでしょうか?

>ところで、A関数の定義が重複していますが、
>よいのでしょうか?
まあ、深読みしてあげれば・・・
******************* B.cpp ******************* 
#include "DxLib.h" 
int xxx; 

void B(){ 
xxx = LoadGraph("Failname"); 
} 
*********************************************
ということでしょうね^^

管理人さんの書いたサンプルプログラムではtest.cppとtest2.cppで変数のexternと関数のexternをお互いに宣言しあう極端な例ですよね。それで、関数のextern宣言をすればその宣言された関数で使用している変数も同様に使用できると勘違いされてしまったのでしょうか???

それともexternの宣言対象を勘違いして”B.cpp"のBだと思ってしまったとか?

管理人

Re:変数の使い方。宣言の仕方。

#6

投稿記事 by 管理人 » 17年前

まず、一つずつ書いた例を示すべきでしたかね・・。

extern宣言したファイルで使いたいものは関数ではなく、xxxという変数ですよね?

xxxをextern宣言すると「xxxという変数がどこかで宣言してあるから探してね!」って意味になるので、xxxが使えるようになるのです。
だから、xxxを使いたいのだから

extern int xxx;

を書いて下さい。

由良

わかりました!

#7

投稿記事 by 由良 » 17年前

今日は現在環境がないので、
明日早速皆さんがいうとおりに
変えてやってみます!

ご丁寧な回答ありがとうございました!


一応明日結果報告致しますので
もうしばらく「質問」のままで
いさせてください。

由良

できました。

#8

投稿記事 by 由良 » 17年前

皆さんの言うとおりに直したらちゃんと動きました!
ありがとうございました!
また何かあったときは宜しくお願い致します。

由良

何度もすみません。

#9

投稿記事 by 由良 » 17年前

度々申し訳ありません。
似たような内容なので一度「解決!」にした場所に
投稿させていただきます。

読み込んだ画像が上手く表示されたりされなかったり
するのですが、何故でしょうか?
「右上の状態??っぽいのをあらわす板用」の部分は
きちんと出ます。が、噴出し、ミニキャラ、表情が
表示されません。


あと、実行するとキーが何も利かなくなってしまい、
「中止」ボタンをクリックして止めないとフリーズ
するエラーが出てしまうのですがそれは何処が問題
なのでしょうか?
以下がソースです。
ご指導、宜しくお願い致します。

**********************main.cpp***************************
#include "DxLib.h"

extern void IhoIho_Atrie();
extern void zyoutai_disp();

int tail,tail2,zyuutan1,zyuutan2,zyuutan3,tana; //背景
int i,j; //その他変数

char KeyBuf[ 256 ] , Key[256];

int hantei[15][20] = { //画面
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,4,0,0,0,0,0,0,2,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,0,0,0,3,6,0,0,0,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,5,5,5,5,5,5,5,5,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了

/* 家背景 */
tail = LoadGraph("tail.PNG");
tail2 = LoadGraph("tail2.PNG");
zyuutan1 = LoadGraph("zyuutan1.PNG");
zyuutan2 = LoadGraph("zyuutan2.PNG");
zyuutan3 = LoadGraph("zyuutan3.PNG");
tana = LoadGraph("tana.PNG");

SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
/*白い壁を描画*/
for(i=0;i<15;i++)
for(j=0;j<20;j++)
if(hantei[j]==1)
DrawBox(j*32,i*32,(j+1)*32,(i+1)*32,GetColor(255,255,255),TRUE);
/*床を描画*/
for(i=0;i<15;i++)
for(j=0;j<20;j++)
if(hantei[j]==0)
DrawGraph(j*32,i*32,tail,TRUE);
/*床を描画2*/
for(i=0;i<15;i++)
for(j=0;j<20;j++)
if(hantei[j]==5)
DrawGraph(j*32,i*32,tail2,TRUE);
DrawGraph(185,50,tana,TRUE);
DrawGraph(312,50,tana,TRUE);
/*絨毯を描画1*/
for(i=0;i<15;i++)
for(j=0;j<20;j++)
if(hantei[j]==2)
DrawGraph(j*32,i*32,zyuutan1,TRUE);
/*絨毯を描画2*/
for(i=0;i<15;i++)
for(j=0;j<20;j++)
if(hantei[j]==3)
DrawGraph(j*32,i*32,zyuutan2,TRUE);
/*絨毯を描画3*/
for(i=0;i<15;i++)
for(j=0;j<20;j++)
if(hantei[j]==4)
DrawGraph(j*32,i*32,zyuutan3,TRUE);
zyoutai_disp(); // 文字を描画

IhoIho_Atrie();//いほいほがアトリエにいる。
}

}
*********************************************************

由良

Re:何度もすみません。

#10

投稿記事 by 由良 » 17年前

続きです。
*********************zyoutai_disp.cpp********************
#include "DxLib.h"

int ita,money,yousei,nakama,irai;//板用
int kane=3000,yousei_ninzu=7,boukensya_ninzu=2,irai_su=0;//板
extern int moji;

void zyoutai_disp(){
/* 右上の状態??っぽいのをあらわす板用 */
ita = LoadGraph("ita.png");
irai = LoadGraph("irai.png");
nakama = LoadGraph("nakama.png");
yousei = LoadGraph("yousei.PNG");
money = LoadGraph("money.png");

DrawGraph(430,20, ita , TRUE ) ; //画像を表示
DrawGraph(450,40, money , TRUE ) ;
DrawFormatString(490,40,moji,"%dG",kane);
DrawGraph(460,80, yousei , TRUE ) ;
DrawFormatString(490,80,moji,"%d",yousei_ninzu);
DrawGraph(510,80, nakama , TRUE ) ;
DrawFormatString(540,80,moji,"%d",boukensya_ninzu);
DrawGraph(560,80, irai , TRUE ) ;
DrawFormatString(590,80,moji,"%d",irai_su);
}
*********************************************************

*********************IhoIho_Atrie.cpp********************
#include "DxLib.h"

extern void IhoIho_card();
extern void IhoIho_Attention1();
extern void IhoIho_Attention2();

int IhoIho_fg=2;//イベントフラグ

void IhoIho_Atrie(){
switch(IhoIho_fg){
// case 1://イベント1
// IhoIho_event1();
// break;
case 2://イベント2
IhoIho_event2();
break;
// case 3://3イベント
// IhoIho_event3();
// break;
default:
break;
}
return ;
}
*********************************************************

******************IhoIho_event2.cpp**********************
#include "DxLib.h"

extern char KeyBuf[ 256 ] , Key[256];//読み込み
extern int counter,moji;//読み込み
extern int MYuri[16]; //主人公ミニキャラ読み込み
extern int Yuri[4],IhoIho[4]; //主人公といほいほ表情読み込み
extern int hukidashi; //読み込み

/* 台詞 */
char disp1[36]="",disp2[48]="",disp3[48]="";
char name[14]="いほいほ :";
char speach1[2][36] = {"あああ。",
"うううううううううううううううう"};
char speach2[2][48] = {"いいいいいいいいいいいい。",
"ええええええええええええええええええええええ。"};
char speach3[2][48] = {"",
"おおおおおおおおおおおお?"};

int a=36,b=48; //文字数

typedef struct{ //キャラクターの座標、向き等を各キャラ毎に指定する。
int x,y,img,muki;
}Yuri_t;

void Inglid_Attention1(){

Yuri_t yuri;

yuri.x = 384;
yuri.y = 224;
yuri.muki = 1;
yuri.img = MYuri[12];

counter = 0;

DrawGraph( yuri.x , yuri.y , yuri.img , TRUE ) ;//画像を描画

DrawGraph( 1 , 280 , hukidashi , TRUE ) ; //噴出しを表示

DrawGraph(44,315,IhoIho[1],TRUE);//いほいほの表情。
DrawFormatString(180,330,moji,"%s",name);//disp配列の文字データを表示

while(counter < 2){
if(Key[KEY_INPUT_RETURN]==2){ // 前回押されてなくて、今回押されていたら
counter++;
}

strncpy(disp1,speach1[counte[/url],a);// aバイトまでの配列要素をdisp1配列にコピー?
strncpy(disp2,speach2[counte[/url],b);// bバイトまでの配列要素をdisp2配列にコピー?
strncpy(disp3,speach3[counte[/url],b);// bバイトまでの配列要素をdisp3配列にコピー?

DrawFormatString(282,330,moji,"%s",disp1);
DrawFormatString(180,350,moji,"%s",disp2);
DrawFormatString(180,370,moji,"%s",disp3);

ScreenFlip() ;
}

return ;
}
*********************************************************

********************Declaration.cpp**********************
#include "DxLib.h"

int MYuri[16]; //主人公ミニキャラ
int Yuri[4]; //主人公表情
int IhoIho[4]; //その他関係者
int counter; //カウンター
int moji;
int hukidashi;//噴出し


void Declaration(){
moji = GetColor( 0 , 0 , 0 ) ; //色の取得

/* 噴出し */
hukidashi = LoadGraph("hukidashi.PNG");

/* ミニキャラ画像 */
LoadDivGraph( "MYuri.png" , 16 , 4 , 4 , 32 , 32 , MYuri ) ;//画像を分割してMYuri配列に保存

/* キャラ「普喜怒哀」表情画像 */
LoadDivGraph( "IhoIho001.png" ,4,4,1,113,121,IhoIho) ;//いほいほ
LoadDivGraph("Yuria001.png",4,4,1,113,121,Yuri);//主人公
}
*********************************************************

やそ

Re:何度もすみません。

#11

投稿記事 by やそ » 17年前

イベントフラグに2をセットして判定され、

case 2://イベント2
IhoIho_event2();
break;
となっていますが、
IhoIho_event2()関数はどこにあるのでしょう?
IhoIho_event2.cppはあくまでソースファイルであって関数ではありません。
void Inglid_Attention1()を呼びたいのかな?
Declaration()関数も呼ばれてなさそう・・・。

ということで、関数などの相関関係を把握し切れていない可能性があります。
一度、関数の相関図やフローチャートを”紙”に書き出して把握するのがよろしいかと^^

また、
/*白い壁を描画*/ ,/*床を描画*/ などのMAP描画は纏められるでしょう。
種類ごとにMAPの配列を全て読み直すのは処理の無駄ですよね。
それならループは1回に纏めましょう!
for(i=0;i<15;i++){
  for(j=0;j<20;j++){
    switch(hantei[j]){ 
      case 1: 
/*白い壁を描画*/ 
       break; 
      case 0:
/*床を描画*/ 
        break; 
・
・
・
      default: 
        break; 
    }
  }
}

由良

Re:何度もすみません。

#12

投稿記事 by 由良 » 17年前

わかりました。やってみます!
いつも素早いご返答ありがとうございます!

また何かあったときは宜しくお願い致します(礼)

閉鎖

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