LabVIEW 中調用動態庫接口時,如果是值傳遞的結構體,可以根據字段拆解為多個參數;如果參數為結構體指針,可用簇(Cluster)來匹配,其內存連續相當于單字節對齊。
1.值傳遞
接口定義:
typedef struct {int a;int b;
} DataA;void testData1(DataA data, int* a, int* b) {*a = data.a;*b = data.b;
}
LabVIEW 函數原型:
LabVIEW 程序框圖:
2.指針傳遞
指針參數可作為輸入和輸出。接口定義:
typedef struct {int a;int b;
} DataA;void testData2(DataA *data, int* a, int* b) {*a = data->a;*b = data->b;data->a = *b;data->b = *a;
}
LabVIEW 函數原型:
LabVIEW 程序框圖:
3.字節對齊問題?
LabVIEW 中簇是內存連續的,相當于單字節對齊,如果動態庫的結構體不是單字節對齊那就要在簇中補齊。接口定義:
#pragma pack(4)
typedef struct {int a;char b;int c;
} DataB;
#pragma pack()void testData3(DataB* data, int* a, char* b , int *c) {*a = data->a;*b = data->b;*c = data->c;
}
LabVIEW 函數原型:
未補齊數值有問題:?
字節補齊后結果正常:
4.復雜結構體
以包含字節數組和嵌套結構體為例,數組和結構體成員都可以當作內部組合了另一個簇。接口定義:
typedef struct {int c;int d;
} DataSub;typedef struct {int a;char b[20];DataSub sub;
} DataC;void testData4(DataC* data) {data->a = 123;char arr[] = "COVID-19";memcpy(data->b, arr, sizeof(arr));data->sub.c = 2019;data->sub.d = 2022;
}
LabVIEW 函數原型:
LabVIEW 程序框圖:?
運行結果:
要注意的就是【數組至簇轉換】(Array?to?Cluster)要自己指定大小(右鍵菜單),默認 9,最大 256 個元素。
5.用字節數組傳遞結構體
對于大于 256 個元素的數組,沒找到比較簡單的轉換成簇的方式(LabVIEW 有點反直覺的地方就是數組連到簇里會當作指針),索性我直接把接口按字節數組傳遞。LabVIEW 用的大端,PC 上一般小端,所以字節和數值轉換要翻轉一下。接口定義:
typedef struct {int len;char arr[1000];
} DataD;void testData5(DataD* data) {char info[] = "Hello world!";data->len = sizeof(info);memcpy(data->arr, info, data->len);
}
LabVIEW 函數原型:
LabVIEW 程序框圖:
運行結果: