在函数内部使用fftw3会产生分段错误

FacundoGFlores

测试以下代码,我得到正确的答案:

#include <fftw3.h>
void dump_vector(float *a, int size)
{
    int i;
    for (i = 0; i < size; i++) {
        printf("%f\t", a[i]);
    }
    printf("\n");
}

int main()
{
    float a[] = {1, 2, 3, 4};
    dump_vector(a, 4);
    fftw_plan plan = fftw_plan_r2r_1d(2 * 2, a, a, FFTW_REDFT10, FFTW_ESTIMATE);
    fftw_execute(plan);
    dump_vector(a, 4);
}

结果:

./main
1.000000    2.000000    3.000000    4.000000    
3.992188    4.501953    -334878449985782808576.000000   3.886292

但是我想为dct做一个天真的包装,所以:

#include <fftw3.h>
void dump_vector(float *a, int size)
{
    int i;
    for (i = 0; i < size; i++) {
        printf("%f\t", a[i]);
    }
    printf("\n");
}

void dct(float * array, int xsize, int ysize)
{
    fftw_plan plan = fftw_plan_r2r_1d(xsize * ysize, array, array, FFTW_REDFT10, FFTW_ESTIMATE);
    fftw_execute(plan);
}


int main()
{
    float a[] = {1, 2, 3, 4};
    dump_vector(a, 4);
    dct(a, 2, 2);
    dump_vector(a, 4);
}

结果:

./main
1.000000    2.000000    3.000000    4.000000    
3.992188    4.501953    -334878449985782808576.000000   3.886292    
[1]    10880 segmentation fault  ./main

有什么我想念的吗?

我需要执行此操作,因为然后我想生成一个.so文件以供在另一个应用程序中使用。

弗朗西斯

这个问题比预期的要简单得多:fftw_plan_r2r_1d在的数组上执行DCT / DST double

数组float a[]太小了:4个float存储在4x4 = 16个字节中,而fftw_plan_r2r_1d期望存储4个double(32个字节)。因此,fftw_plan_r2r_1d将尝试读取传递实际数组的末尾。这会触发未定义的行为,例如细分错误或错误的结果。

两种解决方案:

  • 更改float a[]double a[]dump_vector(float *a,...dump_vector(double *a,...
  • 使用fftwf_plan_r2r_1d()建立一个fftwf_plan用于数组float请参阅http://www.fftw.org/doc/Precision.htmllibfftw3f.a必须通过添加-lfftw3f到编译器命令来链接该库

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

3D阵列取消分配会产生分段错误

为什么该程序会产生分段错误?

为什么以下代码会产生分段错误?

为什么下面的代码会产生分段错误

sprintf 产生分段错误

Gcompris 产生分段错误错误

每条命令都会产生分段错误

GDAL DestroyFeature() 方法产生分段错误

printf是否产生分段错误?

包装器__m256的包装器,使用构造函数产生分段错误-Windows 64 + MinGW + AVX问题

为什么会产生分段错误(核心转储)错误?

通过unique_ptr访问结构成员会产生分段错误

为什么这个简单的链表程序会产生分段错误?

在“ for”循环初始化程序中取消引用指针会产生分段错误

将值分配给指针结构会产生分段错误

C中基于字符串的链表会产生分段错误

Ubuntu中的FFTW3:链接错误

为什么使用信号处理程序杀死自己的脚本会产生分段错误?

从程序集(x86 / 64)调用read syscall会产生分段错误(编译器构造)

尝试连接字符串会产生分段错误

检查图的连通性的程序产生分段错误

使用FFTW3库评估FORTRAN中高斯函数的快速傅立叶变换

使用 clang 和外部库 fftw3 的 MATLAB mex 链接错误

具有c-tor和d-tor会产生分段错误,而没有它们则没有分段错误

SQL-插入postgresql表会产生分号错误

将cv :: Mat与多维FFTW3结合使用

退出状态为$?发生分段错误时使用python

将头节点添加到单链表中会产生分段错误错误

分段错误 - MPI FFTW