[英]Using GSL lib functions on data in a struct C
許多 GSl 函數將參數作為雙精度數或雙精度數數組。 然而,我的大部分數據都嵌套在結構數組中。 說像這樣的數組:
struct A
{
double a;
int b;
};
我可以編寫一個包裝器,將數據復制到純雙精度或整型數組中。 但我對更優雅的東西感興趣來解決這個問題。
不是你想要的答案。 但是由於您無法更改 GSL 接口,如果您正在尋找性能,我認為您最好的解決方案可能是從一開始就選擇與工作匹配的數據結構。 所以可能類似於包含雙精度數組的結構。
如果 GSL 接口和原始數據結構都不受您的控制,那么您唯一的選擇可能就是您正在考慮的包裝器。
如果您使用的庫函數可以采用 'stride' 參數,您可能會研究結構包裝和填充。 (但這仍然不會將您的整數轉換為雙精度數。)
“......我的大部分數據都嵌套在結構數組中。......我可以編寫一個包裝器,將數據復制到純雙精度或整數數組中。但我對更優雅的東西感興趣來解決這個問題。 ”
無需編寫包裝器來將數據復制到純double
或int
數組中。 您擁有結構數組這一事實已經提供了對每個存儲值的便捷直接訪問。 使用結構數組訪問數組中的每個單獨struct
是對所需結構進行索引的簡單問題,例如array[n]
其中n
是數組中所需的元素。
在您的示例中, array[n].a
提供對成員a
的double
值的直接訪問,而array[n].b
提供對數組中每個有效索引的int
成員b
直接訪問。
直接訪問數組中每個結構的每個成員的這種索引的簡短示例可能會有所幫助。 下面用顯示的double
和int
值用五個結構初始化array
。 在每個結構的每個成員被輸出之前, 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}
無論您想如何使用它,您對每個成員的訪問都是相同的。 仔細檢查一下,如果您還有其他問題,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.