[英]Passing an array of structures in C++ - structure elements don't exist in the called function, how to properly pass vectors?
[英]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.