You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++编写DLL供Matlab调用时struct返回值实现及代码问题咨询

核心问题解答

1. 函数是否可以返回自定义结构体

C/C++语法本身支持返回自定义struct类型,Matlab的calllib也可以识别头文件中声明的结构体类型,接收返回的结构体数据。但跨语言调用时,不同编译器的结构体对齐规则可能存在差异,更容易出现数据解析错误,因此更推荐使用指针作为输出参数的方式传递结构体结果,兼容性更好。

2. 是否支持直接返回多个结果

C/C++不支持return output1, output2, output3这种写法,该语句中的逗号是逗号运算符,最终只会返回最后一个表达式output3的值,完全无法实现返回多个结果的需求。如果要返回多组数据,要么将所有返回值封装到一个结构体中统一返回,要么定义多个指针类型的输出参数传递结果。

代码问题修正与优化

你现有代码存在以下核心问题:

  • 输出参数ot为值传递,函数内修改的只是临时副本,调用方无法拿到计算结果
  • 手动申请的vector4数组未释放,存在内存泄漏,且完全没有必要申请新数组,可直接读取输入结构体的指针偏移值
  • 头文件导出函数声明和实现逻辑不匹配,缺少适配Matlab调用的兼容性处理

修正后的头文件代码

#ifndef PCH_H
#define PCH_H

// 统一8字节对齐,和Matlab默认规则匹配,避免结构体数据错位
#pragma pack(push, 8)
struct c_struct { 
    double p1; 
    short p2; 
    long p3; 
    double* p4;
    int p5;
};

struct s_struct {
    double o1;
    double o2;
};
#pragma pack(pop)

#ifdef __cplusplus
extern "C"
{
#endif
    // 第二个参数改为指针,作为输出参数传递结果
    __declspec(dllexport) void addStructFields(struct c_struct* st, struct s_struct* ot);

#ifdef __cplusplus
}
#endif

#endif

修正后的cpp文件代码

#define _CRT_SECURE_NO_WARNINGS
#include "pch.h"
#include <windows.h>
// 移除未使用的头文件,减少编译体积

void addStructFields(struct c_struct* st, struct s_struct* ot) {
    // 无需拷贝整个数组,直接读取p4指针的最后一位元素即可
    double last_p4 = *(st->p4 + st->p5 - 1);
    ot->o1 = st->p1 + st->p2 + st->p3 + last_p4;
    ot->o2 = st->p1 - st->p2 - st->p3 - last_p4;
}
Matlab调用示例
% 先加载DLL,注意把dll和头文件放在同一路径
loadlibrary('你的DLL文件名.dll', 'pch.h');
% 构造输入结构体
input_struct.p1 = 1.5;
input_struct.p2 = int16(2);
input_struct.p3 = int32(3);
input_struct.p4 = [1.1,2.2,3.3,4.4];
input_struct.p5 = length(input_struct.p4);
% 构造输出结构体,提前分配内存
output_struct = struct('o1',0,'o2',0);
% 调用DLL函数,注意传入指针
[~, output_struct] = calllib('你的DLL文件名', 'addStructFields', input_struct, output_struct);
% 查看结果
disp(output_struct.o1)
disp(output_struct.o2)
% 卸载DLL
unloadlibrary('你的DLL文件名');

内容的提问来源于stack exchange,提问作者Jiawei Cao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:30:01