ページ 11

代入できないのですが、

Posted: 2010年2月11日(木) 15:19
by ひよこ
ただいま、ソースを実行していてたら、
for(int i=0;i<10;i++){
        bullet_t p;
        memset(&p,0,sizeof(bullet_t));
        p.x=234+i*10;
        p.y=i*50+25;
        p.flag=1;
        p.spd=3/5;
        p.angle=PI2/10*i;

p.spdが0.6になると思ったのですが、
代入が終わっても0のままなのですがどうしてでしょうか?(0.2とか計算なしで代入するとできます。
構造体です。
//弾に関する構造体
struct bullet_t{
    //フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの種類
    int flag,knd,cnt,col,state,till,eff,kaiten,eff_detail;
    int cnt_till,cnt_stt;
    //座標、角度、速度、ベースの角度、一時記憶スピード,一時的時間(設定時間)
    double x,y,vx,vy,angle,spd,base_angle[1],rem_spd[1],rem_time;
    int c_flag;
    double cx,cy;
    struct bullet_t* next;  //次の要素へのポインタ
};
環境はVC2005です。

Re:代入できないのですが、

Posted: 2010年2月11日(木) 15:25
by Blue
>p.spd=3/5;
p.spd=3.0/5;
とするとどうなりますか?

Re:代入できないのですが、

Posted: 2010年2月11日(木) 15:28
by ひよこ
あれ、なんでしょうか、3.0にしたら、上手くいきました。
どうして上手くいったのでしょうか?

Re:代入できないのですが、

Posted: 2010年2月11日(木) 15:32
by array
私も同じことで悩んだ事があります。

int型で計算を行うので少数は切り捨てされるみたいです。

p.spd がdouble型だと、勝手に右の式も double型で計算してくれると勘違いしがちですよね^^;

Re:代入できないのですが、

Posted: 2010年2月11日(木) 15:32
by Dixq (管理人)
int型とint型の計算だからです。
整数÷整数の結果は整数になりますから、
3÷5は0になります。
しかし3.0と書くとdouble型を示しますので、
実数÷整数の結果は実数となり、少数が扱えるのです。

PI2/10*i

がうまくいくのはPI2の実態が恐らく実数だからですね。

Re:代入できないのですが、

Posted: 2010年2月11日(木) 15:34
by Blue
3 → int型の数値
5 → int型の数値
3 / 5 → int型の数値 よって 0

int型の 0 を double型の変数に入れたら 0.0

3.0 → double型の数値
5 → int型の数値
3.0 / 5 → double型の数値 よって 0.6(に近い値)

double型の 0.6 を double型の変数に入れたら 0.6

ということで

3 / 5.0
でも
(double)3 / 5
同じことが言えます。

Re:代入できないのですが、

Posted: 2010年2月11日(木) 15:35
by Dixq (管理人)
ちなみに、計算の順序も考慮して下さい。

1/2*3.0は0.0になります。

3.0*1/2は1.5になります。

Re:代入できないのですが、

Posted: 2010年2月11日(木) 15:45
by ひよこ
そうなんですか。わかりました。わかりやすい説明ありがとうございます。
Blueさん、arrayさん、Dixqさん、ありがとうございました。

Re:代入できないのですが、

Posted: 2010年2月11日(木) 15:45
by ひよこ
解決にします。