LabVIEW调用DLL传递结构体参数

news2024/12/26 9:20:24

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 程序框图:

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/887968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交叉导轨的内部结构

相对于直线导轨,交叉导轨的知名度是没那么高的,但随着技术水平的提高,精度更高,安装高度更低的交叉导轨也慢慢走近大众的视野,得到更多厂商的青睐,使用范围也更加广泛。 交叉导轨是由两根具有V型滚道的导轨…

数据结构之动态内存管理机制

目录 数据结构之动态内存管理机制 占用块和空闲块 系统的内存管理 可利用空间表 分配存储空间的方式 空间分配与回收过程产生的问题 边界标识法管理动态内存 分配算法 回收算法 伙伴系统管理动态内存 可利用空间表中结点构成 分配算法 回收算法 总结 无用单元收…

leetcode-413. 等差数列划分(java)

等差数列划分 leetcode-413. 等差数列划分题目描述双指针 上期经典算法 leetcode-413. 等差数列划分 难度 - 中等 原题链接 - 等差数列划分 题目描述 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如&#xff0…

【Linux操作系统】Linux系统编程实现递归遍历目录,详细讲解opendir、readdir、closedir、snprintf、strcmp等函数的使用

在Linux系统编程中,经常需要对目录进行遍历操作,以获取目录中的所有文件和子目录。递归遍历目录是一种常见的方法,可以通过使用C语言来实现。本篇博客将详细介绍如何使用C语言实现递归遍历目录的过程,并提供相应的代码示例&#x…

高阶数据结构-图

高阶数据结构-图 图的表示 图由顶点和边构成,可分为有向图和无向图 邻接表法 图的表示方法有邻接表法和邻接矩阵法,以上图中的有向图为例,邻接表法可以表示为 A->[(B,5),(C,10)] B->[(D,100)] C->[(B,3)] D->[(E,7)] E->[…

AgentBench::AI Agent 是大模型的未来

最有想象力、最有前景的方向 “Agent 是 LLM(大语言模型)的最有前景的方向。一旦技术成熟,短则几个月,长则更久,它可能就会创造出超级个体。这解释了我们为何对开源模型和 Agent 兴奋,即便投产性不高,但是我们能想象自己有了 Agent 之后就可以没日没夜地以百倍效率做现在…

Collada .dae文件格式简明教程【3D】

当你从互联网下载 3D 模型时,可能会在格式列表中看到 .dae 格式。 它是什么? 推荐:用 NSDT编辑器 快速搭建可编程3D场景。 1、Collada DAE概述 COLLADA是COLLAborative Design Activity(中文:协作设计活动&#xff09…

剑指offer43.1~n整数中1出现的次数

看到这么大的数据规模就直到用暴力法肯定会超时&#xff0c;但是还是花一分钟写了一个试一下&#xff0c;果然超时 class Solution {public int countDigitOne(int n) {int count 0;for(int i1;i<n;i){countdigitOneInOneNum(i);}return count;}public int digitOneInOneNu…

从零实战SLAM-第九课(后端优化)

在七月算法报的班&#xff0c;老师讲的蛮好。好记性不如烂笔头&#xff0c;关键内容还是记录一下吧&#xff0c;课程入口&#xff0c;感兴趣的同学可以学习一下。 --------------------------------------------------------------------------------------------------------…

字符个数统计(同类型只统计一次)

思路&#xff1a;因为题目圈定出现的字符都是 ascii 值小于等于127的字符&#xff0c;因此只需要定义一个标记数组大小为128 &#xff0c;然后将字符作为数组下标在数组中进行标记&#xff0c;若数组中没有标记过表示第一次出现&#xff0c;进行计数&#xff0c;否则表示重复字…

Layui列表复选框根据条件禁用

// 禁用客服回访id有值的复选框res.data.forEach(function (item, i) {if (item.feedbackEmpId) {let index res.data[i][LAY_TABLE_INDEX];$(".layui-table tr[data-index"index"] input[typecheckbox]").prop(disabled,true);$(".layui-table tr[d…

探索Chevereto图床:使用Docker Compose快速搭建个人图床

家人们!图片在今天的社交媒体、博客和论坛中扮演着至关重要的角色。然而&#xff0c;随着图片数量的增加&#xff0c;寻找一个可靠的图片托管解决方案变得越来越重要。Chevereto图床是一个备受赞誉的解决方案&#xff0c;而使用Docker Compose搭建它更是一种高效、可维护的方法…

【内容安全】微服务学习笔记八:使用腾讯云T-Sec天御对文本及图片内容进行安全检测

个人简介&#xff1a; > &#x1f4e6;个人主页&#xff1a;赵四司机 > &#x1f3c6;学习方向&#xff1a;JAVA后端开发 > &#x1f4e3;种一棵树最好的时间是十年前&#xff0c;其次是现在&#xff01; > ⏰往期文章&#xff1a;SpringBoot项目整合微信支付 &g…

安装paddlepadddle-gpu的正确方式

正确安装paddlepadddle-gpu的方式 1.查看系统CUDA版本2.参照飞桨官网快速pip安装 安装paddlepaddle时&#xff0c;pip install paddlepaddle是直接安装的CPU版本&#xff0c;要安装GPU版本的话&#xff0c;就要注意适配的CUDA版本&#xff0c;安装GPU版本可参照官网教程&#x…

做一个超简单的Python运行

作为一名专业的爬虫代理产品供应商&#xff0c;我知道很多人对Python爬虫有兴趣&#xff0c;但可能不知道该从何处入手。今天&#xff0c;我就来分享一个超简单的Python爬虫入门教程&#xff0c;希望能帮助到你们&#xff01;快点准备起来&#xff0c;让我们开始吧&#xff01;…

【C语言】数据在内存中的存储

大家好&#xff0c;我是苏貝&#xff0c;本篇博客介绍数据在内存中的存储&#xff0c;如果你觉得我写的不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 使用的编译器为VS2019 文章目录 一.数据类型介绍类型的基本归类 二.整形在内存中的存储2.1 原码…

DMA技术

先总结: DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术 主要工作是由DMA控制器来完成的. 下面开始正文 ---------------------------------------------------------------------------- 1、DMA由来 DMA(Direct Memory Access,直接存储器访问)。在&#xf…

主成分分析Python代码

对于主成分分析详细的介绍&#xff1a;主成分分析&#xff08;PCA&#xff09;原理详解https://blog.csdn.net/zhongkelee/article/details/44064401 import numpy as np import pandas as pd标准PCA算法 def standeredPCA(data,N): #data:…

Visualizing and Understanding Convolutional Networks阅读笔记

Visualizing and Understanding Convolutional Networks阅读笔记 摘要1. 前言 [ 1 ] ^{[1]} [1]2. 使用反卷积网络可视化3. 卷积网络可视化 [ 2 ] ^{[2]} [2]3.1 特征可视化3.2 训练过程中特征的演化3.3 特征不变性3.4 架构选择3.5 遮挡敏感性 参考文章 摘要 CNN模型已经取得了…

Linux 5种IO模型

Linux IO模型 网络IO的本质是socket的读取&#xff0c;socket在linux系统被抽象为流&#xff0c;IO可以理解为对流的操作。刚才说了&#xff0c;对于一次IO访问&#xff08;以read举例&#xff09;&#xff0c;数据会先被拷贝到操作系统内核的缓冲区中&#xff0c;然后才会从操…