ページ 11

型変換int→double

Posted: 2010年11月08日(月) 00:27
by 坂峰
はじめまして、坂峰という者です。
今回は、C言語の型変換について分からない所があったので、質問しました。

開発環境は Visual C++ 2008
開発言語 C言語
OS windows XP

ベクトルの足し算をするためにDrawLine関数を使って斜めの線を
ベクトルで表示させる処理をしました。
すると、エラーではないのですが、警告メッセージが表示されました。
内容は
warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
エラー 0、警告 4

doubleからintへの変換 とあったので、
(double)とやって、double型に変換しました。
すると、同じ内容の警告が表示されてしまいました。
どうすれば、double型にできるのでしょうか?

#include "DxLib.h"
#include<stdio.h>

//構造体
struct point{
double x,y;
};

//関数マクロ
point sum(point a , point b);

char Key[256];
//メインプログラム//
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない

/*プログラムの開始*/

point a;
point b;

a.x=100.0;
a.y=10.0;

b.x=40.61;
b.y=30.51;
point ans = sum(a,b);
DrawFormatString( 0 , 0 , GetColor(255,255,255),"%f%f" , ans.x , ans.y);
DrawLine( (double)a.x , (double)a.y , (double)b.x , (double)b.y , GetColor(255,255,255));
//プログラムの終了

ScreenFlip();//裏画面を表画面に反映
}

DxLib_End();
return 0;
}
point sum(point a,point b){
point c;

c.x = a.x+b.x;
c.y = a.y+b.y;
return c;
}

Re:型変換int→double

Posted: 2010年11月08日(月) 00:49
by パコネコ
DrawLineにはint型を渡さないといけないので、強制的にint型にされたのではないでしょうか?

この失われる可能性とは、例えば
100.535
という数値を整数型に変換するとどうなりますか?
整数では0.535の部分を表わせれないのではないのでしょうか?
つまりこの失われると言われているのはこの部分のことではないでしょうか?

/*
doubleからintへの変換 とあったので、
(double)とやって、double型に変換しました。
すると、同じ内容の警告が表示されてしまいました。
どうすれば、double型にできるのでしょうか?
*/
ちょっと勘違いがあるのではないでしょうか?
double型をdouble型に変換しても意味ないですよね?
キャスト(?変換)したあとに、intの引数に突っ込めばintに変換せれてしまっても仕方ないです。
今の状況では
double→double→int→警告
となってないでしょうか?

質問の内容と題名が反対な気がしたんですが、気のせいでしょうか?
私はこの警告を無視してますが…intにする時点で小数点以下は切り捨てるつもりなので。

どうしても細かい単位で描写したいのなら、別の関数を使うべきではないでしょうか?
(私は詳しくないですが…)

Re:型変換int→double

Posted: 2010年11月08日(月) 07:14
by あたっしゅ
double を int に代入するので

DrawLine( (int)a.x , (int)a.y , (int)b.x , (int)b.y , GetColor(255,255,255));

です。

Re:型変換int→double

Posted: 2010年11月08日(月) 22:21
by 初級者
そもそも、構造体の定義が間違っているのでは?

DrawLine関数がint型を期待しているのであれば、
構造体の定義もそうすべきではないのですか?

Re:型変換int→double

Posted: 2010年11月08日(月) 22:37
by たいちう
> DrawLine関数がint型を期待しているのであれば、
> 構造体の定義もそうすべきではないのですか?

DrawLineにはPIXELを単位としている事情があるのでしょうが、
途中の計算は十分な精度で行い、丸める回数は最小限にしたいもの。
私ならばC++のclassで扱い、四捨五入した値を返すメソッドを定義すると思います。

Re:型変換int→double

Posted: 2010年11月08日(月) 23:01
by 初級者
では、元の質問者さんにおたずねします。
そのプログラムでは、構造体の定義をどうしてもdouble型にしなければならないのですか?

Re:型変換int→double

Posted: 2010年11月08日(月) 23:31
by Dixq (管理人)
Justyさんからの受け売りですが、DirectXの環境でdoubleの計算をしても有効桁数はfloatになります。
試しに何か計算して表示してみると解ります。
ということで、キャストしないといけないし、必要な領域は多いしで、doubleを使う意味はないので、floatでいいと思います。

Re:型変換int→double

Posted: 2010年11月10日(水) 01:18
by たいちう
環境依存ですが、floatよりもdoubleの方が実行速度が速いということがありえますよね。
キャストしないで良いという理由で。
近年はマイナーなのかな?

# 総合的に考えてfloatを薦めることには異論はありません。
# 私は好みでdoubleを使いますけど。

Re:型変換int→double

Posted: 2010年11月10日(水) 20:21
by 坂峰
時間が取れなく、パソコンに触れることが出来ず、返信が遅くなってしまいました。ごめんなさい。

>パコネコ様、あたっしゅ様
なるほど・・・。double→double→int にしてるだけで、キャスト出来ないのですね。
ご回答ありがとうございます。

>初級者様
強制的にint型になることが分からずdoubleにしていました。
double型にしないといけない理由は特にないのですが、精度の高い斜めの線を作りたくてdoubleにしました。
ご回答ありがとうございます。

>たいちう様
C言語がきちんと出来てからC++言語に移行しようと思ってクラスはまったく出来ません・・・。
ご回答ありがとうございます

>管理人様、たいちう様
double型で作ってからfloat型のほうがいいかなぁと思ったんですが
float型だと、最後に f 付けないといけなかったので、double型で書いた後だったのでそのままにしました。
ご回答ありがとうございます。

Re:型変換int→double

Posted: 2010年11月10日(水) 20:23
by 坂峰
皆様、ご回答ありがとうございます。