在结构C中的数据上使用GSL lib函数

时间:2019-01-14 22:48:31

标签: c arrays struct gsl

许多GSl函数将参数作为双精度或双精度数组。但是,我的许多数据却嵌套在结构数组中。像这样的数组:

struct A
{
  double a;
  int b;
};

我可以编写一个包装器,将数据复制到纯双精度或整数数组中。但是我对更优雅的解决方法感兴趣。

2 个答案:

答案 0 :(得分:1)

不是您想要的答案。但是,由于您无法更改GSL接口,因此,如果您正在寻找性能,我认为最好的解决方案可能是从一开始就选择与工作匹配的数据结构。所以也许像一个包含双精度数组的结构。

如果GSL接口和原始数据结构都不受控制,那么您唯一的选择可能就是您正在考虑的包装器。

如果正在使用的库函数可以采用'stride'参数,则可以研究结构的包装和填充。 (但这仍然无法将您的int转换为double。)

答案 1 :(得分:0)

  

“ ......我的大部分数据都嵌套在结构数组中。   可以编写一个包装器,将数据复制到一个纯数组中   加倍或整数。但是我对更优雅的东西感兴趣   解决这个问题。”

无需编写包装程序即可将数据复制到纯doubleint的数组中。您拥有结构数组的事实已经可以方便地直接访问每个存储的值。使用结构数组访问数组中的每个单独的struct只需索引所需的结构即可,例如array[n],其中n是数组中的所需元素。

在您的示例中,array[n].a提供对成员{{1}的double值的直接访问,而a提供对array[n].b成员{{1}的直接访问},用于数组中的每个有效索引。

此索引的一个简短示例可以直接访问数组中每个结构的每个成员,可能会有所帮助。以下代码使用显示为intb的五个结构初始化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

您对每个成员的访问权限都将相同。仔细研究一下,如果您还有其他问题,请告诉我。