ページ 1 / 1
質問です
Posted: 2009年12月28日(月) 17:01
by 858
①Dxライブラリで音楽を鳴らしてるんですか、音量ってどうやって調整するのでしょうか?
②int aでプログラムを書いたとします。この変数aをすべて構造体bの中の変数にしたいです。
例えばdefineとか使ってするような簡単な方法ってありますか?
よろしくお願いします。
Re:質問です
Posted: 2009年12月28日(月) 17:27
by sizuma
①
DXライブラリ使ったことないですけど、ChangeVolumeSoundMemを使えば出来そうですね。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
リファレンスを見れば分かると。
②
出来ないと思います。
状況があんまりわからないです。
int aを消して、全部構造体のaとして書き換えればいいのでは?
VC#とかeclipseだとリファクタリングで名前変更できるんですが、VC++だとできないのかな?
VC++2005Expressだとないみたいですが。
仮に、aじゃなかったらマクロで置き換えられるでしょうけど、わざわざそんな分かりにくいことする必要はないと思います。
Re:質問です
Posted: 2009年12月28日(月) 17:47
by 858
ありがとうございます。やはり無理ですよね
int aをしたのようにしたいということです。
struct {
int a;
} b;
結構長いプログラムなのでいちいち直すのも面倒だから聞きました。
あのついでないんですが、ここのサイトで
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif
GLOBAL int img;
ってあります。このGLOBLってなにを定義してるんですか? よくわからないんですか・・・
Re:質問です
Posted: 2009年12月28日(月) 17:53
by softya
>結構長いプログラムなのでいちいち直すのも面倒だから聞きました。
そこは、バグを考えると手を抜かない方が身のためです。
エディタなら一発置き換えできると思いますから。
>GLOBAL
GLOBAL_INSTANCEでグローバル変数の実態の有無を制御しています。
#define GLOBAL extern ならグローバル変数の参照です。
#define GLOBAL ならグローバル変数の実体定義です。
Re:質問です
Posted: 2009年12月28日(月) 18:18
by 858
理解力がなくてすいません。
「GLOBAL_INSTANCEが定義されていればGLOBALという文字は空白に置き換えられる」
「GLOBAL_INSTANCEが定義されていなければGLOBALという文字はexternに置き換えられる」
と書いてあります仮に
define GLOBAL_INSTANCEと定義されていないとGLOBALは空白になるんですよね。
私はやったことがないんですが
例えば
普通 define a 10;
int b=a;
とかしますよね
これを
define a //aの後は空白
とかくと
a a a int b;
と書いてもaは空白と定義されるので実行できるのですか?
根本的にわからないのはここです。最後によろしくお願いします。
Re:質問です
Posted: 2009年12月28日(月) 18:20
by sizuma
softyaさんの書いてるとおりだと。
http://dixq.net/rp/5.html
ここですよね?
今見てきました。
ところで、この部分がどう分岐してるかは分かりますか?
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif
普通の文風にで書くと
if(GLOBAL_INSTANCEが定義されてるか){
GLOBALは空白に代える;
}else{
GLOBALはexternに代える
}
ですね。
ちゃんと読んでないんで、よくわからないですが、ところどころexternを使わない管理をしよう、ってことだと思います。
とりあえずグローバル変数は全部GLOBALって書いといてGLOBAL_INSTANCEがdefineされてたらGLOBALって修飾は消す(空白に置き換える)。他で定義されてるのであれば、GLOBALをexternに置き換える。
ってことでしょうかね。
間違えてたらごめんなさい^^;
Re:質問です
Posted: 2009年12月28日(月) 18:23
by sizuma
a a a int b;
自分で実行してみれば分かると思いますよ。
意地悪とかじゃなくて、そうした方がためになります。
#difine a = 1;
int hoge = a+a+a+a+a+a+a+a;
char piyo = 'a';
で表示してみてください。
Re:質問です
Posted: 2009年12月28日(月) 18:27
by softya
>define a //aの後は空白
>a a a int b;
>と書いてもaは空白と定義されるので実行できるのですか?
#define a //aの後は空白
と書かれていればaは削除なので、int b;とみなされて正常にコンパイル出きますね。
#defineなどの処理はC言語で本格的にコンパイルに入る前に行われる前処理です。
これをプリプロセスと言います。
#defineのやることは単純に単語の置き換えですので、#define aなどと言った書き方も許されます。
Re:質問です
Posted: 2009年12月28日(月) 18:31
by 858
ありがとうございます。今コンパイル環境にいないので後で試して見ます。
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif
つまり、分岐なのはわかりますが。上の部分はdefine GLOBAL_INSTANCEって記述があるにせよ、
ないにせよ、GLOBALの記述がある場合、ヘッダーかメイン関数の前に書かなきゃいけないんですよね?
そう理解してあってます?。この質問で終わりにします。
Re:質問です
Posted: 2009年12月28日(月) 18:40
by softya
GLOBALが参照される前に
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif
が書かれていないとまずいです。
なので、一番先頭に書くか、一番先頭にインクルードされるヘッダファイルに書くのが安全策です。
メイン関数の中にGLOBALを記述することはまず無いはずですので、メイン関数の直前は意味が無いと思いますよ。
Re:質問です
Posted: 2009年12月28日(月) 18:43
by 858
ありがとうございます。
疑問は解決しました。また、勉強してきます。