gpt4 book ai didi

有人可以帮助解释这个 fft 代码片段中发生了什么

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:10 25 4
gpt4 key购买 nike

这里是第一篇文章

我一直在研究 fft,尤其是 Rosetta Code C 实现 http://rosettacode.org/wiki/Fast_Fourier_transform#C

我一直在尝试真正理解代码,而不是仅仅复制它,但是我对特定行有问题,更具体地说是该行的一部分。

_fft(out+step, buf+step, n , step*2);

所以我们有一个

typedef double complex cplx;

然后声明了一个cplx类型的数组

cplx buf[] = {1, 1, 1, 1, 0, 0, 0, 0};

我们有 step 作为 int 1

现在我理解的问题是将 int 添加到 cplx 时发生了什么

所以我写了一个测试程序

#include <stdio.h>
#include <math.h>
#include <complex.h>

typedef double complex cplx;

void test(cplx buff[])
{
for(int a = 0; a < 8; a++) {
printf("%g \n", creal(buff[a]));
}
}

int main(int argc, char **argv)
{
cplx buff[] = {1,1,1,1,0,0,0,0};

int step = 1;

test(buff);

test(buff + step);

getchar();

return 0;
}

我得到的是:

1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 2.1231e-314

我无法弄清它的正反面,我可能遗漏了一些关于 C99 的非常基本的东西,因为我似乎无法在这里或通过谷歌找到它

最佳答案

now the problem I am having understanding is what is happening when the int is added to the cplx

其实加法不是<int> + <cplx>但是<int> + <cplx>* (换句话说,一个整数加上一个指向复数的指针)。所以你在这里处理的是所谓的指针算术。为什么你问一个指针?因为在 C 语言中,当在需要指针的表达式中使用时,数组类型会退化为指向数组元素类型的指针。

那么什么是指针运算呢?

好吧,假设我们有一个对象 a这是一个 int 数组(长度无关紧要,只要我们不访问越过它的边界即可)。

int a[N];

然后定义了指针运算,下面三个表达式具有完全相同的含义:

*(a + i)
a[i]
i[a]

是的,最后一个是完全有效的C,继续,试试吧。

这对您的代码片段意味着什么。好吧,一方面,当您将 1 加到您传递给 test 的缓冲区指针时,您要添加一个偏移量。但是由于缓冲区只有 8 个元素长,而你的 test函数访问从指针开始的 8 个连续元素,因为它执行越界访问,调用未定义的行为实际上任何事情都可能合法发生。

关于有人可以帮助解释这个 fft 代码片段中发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27585516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com