ページ 11

このマクロ関数がなぜ狂うのかわかりません

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に代入すれば分かったことなのに、無駄な質問をしてしまいました・・・。皆さんの貴重な時間を奪ってしまい申し訳ありません。
回答してくれた皆さんありがとうございました。