繁体   English   中英

传递结构元素数组

[英]Passing an array of structure elements

我正在使用NE10库进行一些矢量计算。 该库具有一个复数类型,该复数类型如下所示:

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

我想要一个函数,该函数将这些结构的数组(复数的一维数组)作为参数,并仅对数组的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()函数将指向大小为array_length两个ne10_float32_t类型的数组的指针作为参数。 输入数组的元素乘以作为第三个参数传递的数字,结果存储在输出数组中。 该文档可在此处找到

有办法吗? 我知道我可以在for循环中执行此操作

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

但由于性能至关重要,因此我不想这样做,这就是为什么我首先尝试使用NE10提供的矢量运算的原因。

问题是您提供了正确类型的ne10_mulc_float_c()参数,但与假设不符。

根据库的文档页面 ,该函数定义为:

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 CONSECUTIVE浮点数数组的指针。

不幸的是,您传递的参数并非如此: &output->r&input->r都是指向单个浮点数的指针。 因此,一旦此函数尝试访问它期望的数组中的第二项,它的代码就会超出数组的实际范围,这就是UB。 这就是为什么它不起作用,并且您得到细分错误的原因。

您的for循环就很好了。 不要忘记:

过早的优化是万恶之源
- 唐纳德·努斯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM