传递一系列结构元素

时间:2017-05-30 21:16:40

标签: c++ pointers struct

我正在使用NE10 library进行一些矢量计算。该库有一个复数的类型,它是这样的结构:

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()函数作为参数指向两个大小为ne10_float32_t的{​​{1}}类型的数组。输入数组的元素乘以作为第三个参数传递的数字,结果存储在输出数组中。可以找到文档here.

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

array_length

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

1 个答案:

答案 0 :(得分:0)

问题是您提供了正确类型的library(RODBC) database <- "C:\\Path\\To\\Database\\File.accdb" conn <- odbcDriverConnect(paste0('Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=', database)) lapply(c("table4", "table7", "table8", "table9", "table10", "table11"), function(t) sqlQuery(conn, paste0("DELETE FROM ", t))) close(conn) 个参数,但这些参数与假设不匹配。

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

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)

这意味着该函数假定dst和src是指向[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 CONSECUTIVE浮点数数组的指针。

不幸的是,您传递的参数不是这种情况: count&output->r都是指向一个浮点数的指针。所以很快在这个函数试图访问它期望的数组中的第二个项目时,它的代码超出了数组的实际界限,这就是UB。这就是为什么它不起作用,你得到分段错误。

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

  

Premature optimization is the root of all evil
   - Donald Knuth