2017-05-30 54 views
0

我正在做一些使用NE10 library的向量计算。该库具有用于复数一个类型,其是这样的一个结构:传递一组结构元素

typedef struct 
{ 
    ne10_float32_t r; 
    ne10_float32_t i; 
} ne10_fft_cpx_float32_t; 

我想有一个函数,该函数这些结构的数组(复数1D阵列)作为参数,并执行仅用于数组的r或i元素的矢量计算。下面是得到一个想法这样的功能的例子:

void multiple_real_part_by_two(ne10_fft_cpx_float32_t* output, 
    ne10_fft_cpx_float32_t* input, ne10_uint32_t array_length) 
{ 
    ne10_mulc_float_c (&output->r, &input->r, 2.0, array_length) 
} 

所以想输出数组要像输入数组,但每个R元素的应乘以2。问题在于,上述函数的写法不起作用,并导致分段错误。我认为问题在于我如何将一组r元素传递给ne10_mulc_float_c()函数。

ne10_mulc_float_c()函数将指针指向两个ne10_float32_t大小为array_length的数组。输入数组的元素乘以作为第三个参数传递的数字,结果存储在输出数组中。该文档可以发现here.

有没有办法我可以做到这一点?我知道我可能只是这样做在一个for循环

for (int i = 0; i < array_length; i++) { 
    output[i].r = input[i].r * 2.0 
} 

,但我不想这样做,因为性能是至关重要的,这就是为什么我试图使用由NE10提供的矢量运算摆在首位。

+0

欢迎来到Stack Overflow。请花些时间阅读[The Tour](http://stackoverflow.com/tour),并参阅[帮助中心](http://stackoverflow.com/help/asking)中的资料,了解您可以在这里问。 –

+1

c或C++请选择一个。这些是不同的编程语言。 –

+0

问题是'&output-> r'不是'ne10_float_t'值数组的开始;它是一个指向结构数组中元素的指针。因为这个,你不能有用地使用'ne10_mulc_float_c()'函数来完成这项工作。 –

回答

0

问题是您给ne10_mulc_float_c()正确类型的参数,但它们与假设不匹配。

根据该library's documentation page,该函数被定义为:

ne10_result_t ne10_mulc_float_c (ne10_float32_t *dst, ne10_float32_t *src, 
            const ne10_float32_t cst, ne10_uint32_t count) 

使用以下参数:

[out] dst Pointer to the destination array 
[in] src Pointer to the source array 
[in] cst The constant to multiply by 
[in] count The number of scalar values to be processed 

这意味着该函数假定DST和src都是指向的数组count连续的浮点数。

不幸的是,您通过的参数并非如此: &output->r&input->r都是指向单个浮点数的指针。所以尽快在这个函数试图访问它期望的数组中的第二项时,它的代码超出了数组的真实范围,这就是UB。这就是为什么它不起作用,并且你得到了分段错误。

你的for循环就好了。别忘了:

Premature optimization is the root of all evil
- Donald Knuth

+0

谢谢!这就是我自己的想法,但你的解释更清楚。 我不知道是否可以使用函数'ne10_mulc_vec2f_c()'我的目的,因为它需要作为参数的指针类型 'typedef结构 { ne10_float32_t x的阵列; ne10_float32_t y; } ne10_vec2f_t;' 我可以传递给这个函数指针指向我的'ne10_fft_cpx_float32_t'数组,因为struct元素是相同类型的吗?文档与上述页面相同(http://projectne10.github.io/Ne10/doc/group__MUL__VEC.html) – hulappa

+0

在头文件中,我可以看到ne10_vec2f_t和ne10_fft_cpx_float32_t具有完全相同的结构(与成员名称的例外),所以你可以试试这个,因为你将拥有相同的可复制的布局。使用C有很大的可能性,这是有效的。在C++中,如果函数是使用std :: copy()算法实现的,就有可能失败。在这两种情况下,这都不能保证起作用,例如,如果两种结构都会与不同的隐藏成员发生不同的演变, – Christophe