簡體   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