質問です

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

質問です

#1

投稿記事 by 858 » 15年前

①Dxライブラリで音楽を鳴らしてるんですか、音量ってどうやって調整するのでしょうか?
②int aでプログラムを書いたとします。この変数aをすべて構造体bの中の変数にしたいです。
例えばdefineとか使ってするような簡単な方法ってありますか?

よろしくお願いします。

sizuma

Re:質問です

#2

投稿記事 by sizuma » 15年前


DXライブラリ使ったことないですけど、ChangeVolumeSoundMemを使えば出来そうですね。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
リファレンスを見れば分かると。


出来ないと思います。
状況があんまりわからないです。
int aを消して、全部構造体のaとして書き換えればいいのでは?
VC#とかeclipseだとリファクタリングで名前変更できるんですが、VC++だとできないのかな?
VC++2005Expressだとないみたいですが。
仮に、aじゃなかったらマクロで置き換えられるでしょうけど、わざわざそんな分かりにくいことする必要はないと思います。

858

Re:質問です

#3

投稿記事 by 858 » 15年前

ありがとうございます。やはり無理ですよね
int aをしたのようにしたいということです。
    struct {
       int a;
    } b;

結構長いプログラムなのでいちいち直すのも面倒だから聞きました。

あのついでないんですが、ここのサイトで

#ifdef GLOBAL_INSTANCE

#define GLOBAL

#else

#define GLOBAL extern

#endif

GLOBAL int img;

ってあります。このGLOBLってなにを定義してるんですか? よくわからないんですか・・・

softya

Re:質問です

#4

投稿記事 by softya » 15年前

>結構長いプログラムなのでいちいち直すのも面倒だから聞きました。

そこは、バグを考えると手を抜かない方が身のためです。
エディタなら一発置き換えできると思いますから。

>GLOBAL

GLOBAL_INSTANCEでグローバル変数の実態の有無を制御しています。
#define GLOBAL extern ならグローバル変数の参照です。
#define GLOBAL ならグローバル変数の実体定義です。

858

Re:質問です

#5

投稿記事 by 858 » 15年前

理解力がなくてすいません。

「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は空白と定義されるので実行できるのですか?
根本的にわからないのはここです。最後によろしくお願いします。

sizuma

Re:質問です

#6

投稿記事 by sizuma » 15年前

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に置き換える。
ってことでしょうかね。
間違えてたらごめんなさい^^;

sizuma

Re:質問です

#7

投稿記事 by sizuma » 15年前

a a a int b;
自分で実行してみれば分かると思いますよ。
意地悪とかじゃなくて、そうした方がためになります。

#difine a = 1;

int hoge = a+a+a+a+a+a+a+a;
char piyo = 'a';

で表示してみてください。

softya

Re:質問です

#8

投稿記事 by softya » 15年前

>define a //aの後は空白
>a a a int b;
>と書いてもaは空白と定義されるので実行できるのですか?

#define a //aの後は空白
と書かれていればaは削除なので、int b;とみなされて正常にコンパイル出きますね。

#defineなどの処理はC言語で本格的にコンパイルに入る前に行われる前処理です。
これをプリプロセスと言います。
#defineのやることは単純に単語の置き換えですので、#define aなどと言った書き方も許されます。

858

Re:質問です

#9

投稿記事 by 858 » 15年前

ありがとうございます。今コンパイル環境にいないので後で試して見ます。

#ifdef GLOBAL_INSTANCE

#define GLOBAL

#else

#define GLOBAL extern

#endif

つまり、分岐なのはわかりますが。上の部分はdefine GLOBAL_INSTANCEって記述があるにせよ、
ないにせよ、GLOBALの記述がある場合、ヘッダーかメイン関数の前に書かなきゃいけないんですよね?
そう理解してあってます?。この質問で終わりにします。

softya

Re:質問です

#10

投稿記事 by softya » 15年前

GLOBALが参照される前に
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif
が書かれていないとまずいです。
なので、一番先頭に書くか、一番先頭にインクルードされるヘッダファイルに書くのが安全策です。
メイン関数の中にGLOBALを記述することはまず無いはずですので、メイン関数の直前は意味が無いと思いますよ。

858

Re:質問です

#11

投稿記事 by 858 » 15年前

ありがとうございます。
疑問は解決しました。また、勉強してきます。

閉鎖

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