许多GSl函数都将参数作为双精度或双精度数组。然而,我的大部分数据都嵌套在结构数组中。像阵列一样说:
struct A
{
double a;
int b;
};
我可以编写一个包装器,将数据复制到一个纯double或int数组中。但我对一些更优雅的东西很感兴趣。
"…我的大部分数据都嵌套在结构数组中可以编写一个包装器,将数据复制到纯doubles或int。但我对更优雅的东西感兴趣围绕着这个。">
无需编写包装器将数据复制到纯double
或int
的数组中。您有一个结构的数组,这一事实已经提供了对每个存储值的方便直接访问。结构的数组访问数组中的每个单独的struct
只需为所需的结构(例如array[n]
)编制索引即可,其中n
是数组中所需的元素。
在您的示例中,对于数组中的每个有效索引,array[n].a
提供对成员a
中double
值的直接访问,而array[n].b
提供对int
成员b
的直接访问。
直接访问数组中每个结构的每个成员的这种索引的一个简短示例可能会有所帮助。下面用五个结构初始化array
,其中显示了double
和int
的值。然后,在输出每个结构的每个成员(例如)之前,int
值在循环中递增1
#include <stdio.h>
typedef struct A { /* struct A (with a typedef for convenience) */
double a;
int b;
} A;
int main (void) {
/* array of struct A */
A array[] = {{1.1, 1}, {2.2, 2}, {3.3, 3}, {4.4, 4}, {5.5, 5}};
size_t nelem = sizeof array / sizeof *array; /* no. elements */
for (size_t i = 0; i < nelem; i++) {
array[i].b++; /* increment int/output stored values */
printf ("array[%zu]: {%3.1f, %d}n", i, array[i].a, array[i].b);
}
}
示例使用/输出
请注意,存储在结构的数组中的每个struc
中的整数值是如何通过1
递增的,然后将该数组中的各个struct
中的值直接用作printf
:输出的参数
$ ./bin/arraystruct
array[0]: {1.1, 2}
array[1]: {2.2, 3}
array[2]: {3.3, 4}
array[3]: {4.4, 5}
array[4]: {5.5, 6}
无论您想如何使用,您对每个成员的访问权限都是相同的。仔细看看,如果你还有问题,请告诉我。
不是您想要的答案。但是,由于您无法更改GSL接口,如果您正在寻找性能,我认为您的最佳解决方案可能是从一开始就选择与工作匹配的数据结构。所以可能是一个包含双精度数组的结构。
如果GSL接口和原始数据结构都超出了您的控制范围,那么您唯一的选择可能是您正在考虑的包装器。
如果您正在使用的库函数可能采用"跨步"参数,那么您可能会研究结构打包和填充。(但这仍然无法将int转换为doubles。)