![](/img/trans.png)
[英]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.