質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2387閲覧

(基礎的)引数の使い方

mikann_

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/11/22 10:47

編集2016/11/23 03:12

###前提・実現したいこと
斜方投射のプログラムを作っているのですが、以下のようなエラーが出ます。(引数が浮動小数点型の場合、整数絶対値関数 'abs'を使用する?)このエラーはどう言った意味なのでしょう。

###発生している問題・エラーメッセージ

Oblique_projection.c:55:17: warning: using integer absolute value function 'abs' when argument is of floating point type [-Wabsolute-value] magnitude = abs(v); ^

###該当のソースコード

C

1#include <stdio.h> 2#include <math.h> 3#include <stdlib.h> 4#define g 9.80665 5 6int main(void) { 7 8 double DetermineX(double v0, double rad, double t); 9 double DetermineY(double v0, double rad, double t); 10 double DetermineMag(double v0, double rad); 11 12 double x, y, v0, deg, rad, t, magnitude; 13 14 printf("初速度v0 (m/s)、角度θ(°)、時間tを入力して下さい。\n"); 15 printf("v0 = "); 16 scanf("%lf", &v0); 17 18 printf("deg = "); 19 scanf("%lf", &deg); 20 rad = deg*(M_PI/180); 21 22 printf("t = "); 23 scanf("%lf", &t); 24 25 x = DetermineX(v0, rad, t); 26 y = DetermineY(v0, rad, t); 27 magnitude = DetermineMag(v0, rad); 28 29 printf("x=%f y=%f\n", x, y); 30 printf("magnitude=%f \n", magnitude); 31 32 return 0; 33} 34 35double DetermineX(double v0, double rad, double t) { 36 double x; 37 38 x = v0*cos(rad)*t; 39 40 return x; 41} 42double DetermineY(double v0, double rad, double t) { 43 double y; 44 45 y = v0*sin(rad)*t - (1/2)*g*t*t; 46 47 return y; 48} 49 50double DetermineMag(double v0, double rad) { 51 double magnitude, v; 52 53 v = sqrt( v0*v0*( sin(rad)*sin(rad) + cos(rad)*cos(rad) ) ); 54 magnitude = abs(v); 55 56 return magnitude; 57} 58 59

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A.Ichi

2016/11/22 10:58

ソースの55ライン目も見れるとよいのですが
A.Ichi

2016/11/23 03:36

修正ありがとうございます。下記の方にも有ります様にfabsをお使いになられるのが、良いかと思います。
yohhoy

2016/11/23 04:55

警告メッセージは「実引数が浮動小数点型にも関わらず、整数型の絶対値関数absを使っていますよ。(これは本当に意図どおりですか?)」というニュアンスですね。
guest

回答2

0

ベストアンサー

abs()int abs(int n)(参照:abs, labs, llabs, imaxabs - cppreference.com)です。つまり、intを受け取りintを返します。しかし、magnitudevdoubleであるため、暗黙のキャストがあるものと扱われ、

C

1magnitude = (double)abs((int)v);

と解釈されます。暗黙キャストがよしなに働いてくれるので、Cとしては正しいです。しかし、このままではvの少数点以下は失われてしまいますので、想定していない動作になっている可能性があります。それを確認するためにも、コンパイラによっては警告を出すようになっていると言うことです。

doubleのまま絶対値が求めたい場合はdouble fabs(double arg)(参照:fabs, fabsf, fabsl - cppreference.com)を使用してください。intに変換してから絶対値を求めることが正しいのであれば、(int)vと明示キャストしてください。

投稿2016/11/23 04:02

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

このエラーメッセージって「警告:整数の絶対値を求める'abs'に浮動小数点数を渡してますよ」だと思うのですが、コンパイラーがあたかも標準ライブラリーの機能を知っているような口ぶり(?)のメッセージですね・・・

それはともかく、絶対値を求める関数(マクロ?)にはint用にabs、double用にfabsと用意されているので浮動小数点数の絶対値を求める場合はfabsを使うのが適切だと思います。

投稿2016/11/22 11:07

編集2016/11/22 11:07
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2016/11/22 12:15

link拝見しました。興味深い情報ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問