ページ 1 / 1
このマクロ関数がなぜ狂うのかわかりません
Posted: 2015年6月12日(金) 20:11
by sadora3
コード:
#include<stdio.h>
#include<math.h>
#define rad(a) (a * 3.141592653589 / 180.0)
void main(){
printf("%f %f\n", cos(rad(0)), cos(rad(10)));
printf("%f %f\n", cos(rad(10)), cos(rad(20)));
printf("%f %f\n\n", cos(rad(20)), cos(rad(30)));
for(int i = 0; i < 30; i += 10){
printf("%f %f\n", cos(rad(i)), cos(rad(i + 10)));
}
}
[実行結果]
1.000000 0.984808
0.984808 0.939693
0.939693 0.866025
1.000000 0.984808
0.984808 -0.731856
0.939693 0.243351
このようなプログラムを書いたのですが、forの中のマクロ関数の部分がおかしくなります。
printf("%f %f\n", cos(rad(i)), cos(rad((i + 10))));
このようにすると正常に動いてくれるのですが、どうしておかしくなったのでしょうか?
Re: このマクロ関数がなぜ狂うのかわかりません
Posted: 2015年6月12日(金) 20:19
by usao
そのマクロだと
rad(i + 10)
は,
(i + 1 * 3.141592653589 / 180.0)
になってしまうのではないでしょうか.
Re: このマクロ関数がなぜ狂うのかわかりません
Posted: 2015年6月12日(金) 20:52
by naohiro19
コンパイル時に以下のように展開されるからです。
cos(0*3.141592653589 / 180.0), cos(10*3.141592653589 / 180.0)
Re: このマクロ関数がなぜ狂うのかわかりません
Posted: 2015年6月12日(金) 22:07
by box
こういう風に書きましょう。4行目。
コード:
#include <stdio.h>
#include <math.h>
#define rad(a) ((a) * 3.141592653589 / 180.0)
int main(void)
{
printf("%f %f\n", cos(rad(0)), cos(rad(10)));
printf("%f %f\n", cos(rad(10)), cos(rad(20)));
printf("%f %f\n\n", cos(rad(20)), cos(rad(30)));
for(int i = 0; i < 30; i += 10){
printf("%f %f\n", cos(rad(i)), cos(rad(i + 10)));
}
return 0;
}
Re: このマクロ関数がなぜ狂うのかわかりません
Posted: 2015年6月13日(土) 03:17
by sadora3
ああ!なるほどです!
普通にaに代入すれば分かったことなのに、無駄な質問をしてしまいました・・・。皆さんの貴重な時間を奪ってしまい申し訳ありません。
回答してくれた皆さんありがとうございました。