【问题标题】:Why this line do nothing为什么这条线什么都不做
【发布时间】:2017-12-08 11:20:55
【问题描述】:

我正在试验一些三角函数,代码编译得很好,我想看到一个正方形在 360 度上移动,但是当我运行代码时,我看到正方形只在 x 轴上移动,一切正常,除了一个在我的功能上划线。

void mvdr(int* x, int* y, float d, float sp)
{
    if(d != 0)
        d = (d / 360.0) / 6.283185307179586;

    *x += cos(d)*sp;
    *y += sin(d)*sp; // here's the error
}

我在 gdb 中看到:y 没有变化。

(gdb) n
11       *y += sin(d)*sp; // here's the error
(gdb) p d
$4 = 0.000442097051
(gdb) p sin(d)*sp
$5 = 6.44245094e+09
(gdb) p *y
$6 = 256
(gdb) n
12       }
(gdb) p *y
$7 = 256

我不明白发生了什么,或者我做错了什么,希望你能帮助我。

【问题讨论】:

  • "我在 gdb 中看到:y 没有改变。"您没有更改 y 而是更改 *y 所指向的内容。
  • @WeatherVane 这正是他在 GDB 中看到的内容
  • 不是问的。 y 不变。
  • *y 是一个 int 值。也许float 更改太小而无法注册。显示一些示例值。为什么在 22 世纪你还在使用float
  • 巧合? "6.44245094e+09" 是打印0x180000000 的有效方式。但这仍然会改变 32 位 int

标签: c


【解决方案1】:

要将度数转换为弧度,您应该:

d = (d / 360.0) * 6.283185307179586;

您的转换函数导致的值非常小,对于 sin() 可能不会改变 y 的整数值,对于 cos() 会导致 x 的较大值

【讨论】:

    猜你喜欢
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多