代入できないのですが、

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

代入できないのですが、

#1

投稿記事 by ひよこ » 15年前

ただいま、ソースを実行していてたら、
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です。

Blue

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

#2

投稿記事 by Blue » 15年前

>p.spd=3/5;
p.spd=3.0/5;
とするとどうなりますか?

ひよこ

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

#3

投稿記事 by ひよこ » 15年前

あれ、なんでしょうか、3.0にしたら、上手くいきました。
どうして上手くいったのでしょうか?

array

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

#4

投稿記事 by array » 15年前

私も同じことで悩んだ事があります。

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

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

Dixq (管理人)

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

#5

投稿記事 by Dixq (管理人) » 15年前

int型とint型の計算だからです。
整数÷整数の結果は整数になりますから、
3÷5は0になります。
しかし3.0と書くとdouble型を示しますので、
実数÷整数の結果は実数となり、少数が扱えるのです。

PI2/10*i

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

Blue

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

#6

投稿記事 by Blue » 15年前

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
同じことが言えます。

Dixq (管理人)

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

#7

投稿記事 by Dixq (管理人) » 15年前

ちなみに、計算の順序も考慮して下さい。

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

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

ひよこ

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

#8

投稿記事 by ひよこ » 15年前

そうなんですか。わかりました。わかりやすい説明ありがとうございます。
Blueさん、arrayさん、Dixqさん、ありがとうございました。

ひよこ

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

#9

投稿記事 by ひよこ » 15年前

解決にします。

閉鎖

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