作者vulmoon (百鬼月夜)
看板MATLAB
标题[问题] c structure转matlab疑问
时间Wed Dec 19 22:12:29 2012
各位大大好!
我目前在写C转matlab的程式
也就是要用mex去编译.c档
但是现在碰到一个关於structure的传递问题
目前我的构想是透过matlab初始一个structure
然後再将这个structure输出(return)
等等把C code贴在最下方
先说我目前碰到的问题
现在我已经可以把创起来的struct初始成功
输出里面的资料要确认也都OK
但是就在她要把这个struct传出来(return)的时候
出错了!!!!
而且这个错误是会crash掉matlab的
已经搞好久了
还是无解~
原本以为是没有把初始好的struct回存到plhs[0]
所以使用mxSetData把pointer回存回去
但好像还是不行
所以希望版上有经验的大大可以帮帮我
帮我找出问题点在哪边
可以顺利输出~拜托拜托!
感恩
---------- 以下是程式码 ----------
#include "mex.h"
#define Uint8 unsigned char
#define Int8 char
#define Uint16 unsigned short
#define Int16 short
#define Uint32 unsigned int
#define Int32 int
#define NUMBER_OF_STRUCTS (sizeof(*img)/sizeof(ImgInfo))
#define NUMBER_OF_FIELDS (sizeof(field_names)/sizeof(*field_names))
typedef struct
{
Uint8 depth;
Uint16 imgWidth;
Uint16 imgHeight;
Uint16 *imgData;
}ImgInfo;
void Init(ImgInfo *img)
{
img->depth = 2;
img->imgWidth = 256;
img->imgHeight = 256;
img->imgData = (Uint16*)malloc(sizeof(ImgInfo));
memset(img->imgData, 0, sizeof(Uint16)*img->imgWidth*img->imgHeight);
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
const char *field_names[] = {"depth", "imgWidth", "imgHeight", "imgData"};
ImgInfo *img;
mwSize dims[2] = {1, NUMBER_OF_STRUCTS};
plhs[0] = mxCreateStructArray(2, dims, NUMBER_OF_FIELDS, field_names);
img = mxGetPr(plhs[0]);
Init(img);
printf("%d\n", img->depth);
printf("%d\n", img->imgWidth);
printf("%d\n", img->imgHeight);
mxSetData(plhs[0], img);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.25.174.108
※ 编辑: vulmoon 来自: 114.25.174.108 (12/19 22:33)
1F:推 sunev:mxGetPr 得到的东西的型别是ImgInfo*吗? 12/19 23:00
2F:→ vulmoon:我其实不是很确定,它是说取实数,可是我用它可以写值进去 12/19 23:05
3F:推 sunev:可以是什麽意思,你不是说matlab crash了吗? 12/20 00:58
4F:→ vulmoon:我有三行printf把值print出来看,有print成功,可是当要 12/20 07:24
5F:→ vulmoon:结束这函式时,它要输出这结构就会crash。 12/20 07:25
6F:推 sunev:你的crash指的是matlab被强迫结束吗? 12/20 14:55
7F:→ sunev:要结束这函式是指这个mex file执行结束了吗?然後你在matlab 12/20 14:55
8F:→ sunev:打这个变数,想看里面的内容时,matlab crash了? 12/20 14:56
9F:→ vulmoon:没错!是matlab被强制结束!它会跳出几个选项给你选,但在你 12/20 19:00
10F:→ vulmoon:重开matlab之前都无法下指令。结束这函式的确是只该mex fi 12/20 19:01
11F:→ vulmoon:-le执行结束。一执行结束就crash,还无法打这个变数。 12/20 19:05
12F:推 sunev:这不叫结束函式,这叫编译成功。 12/21 02:31
13F:→ sunev:话说回来,如果matlab被强制结束,你怎麽知道printf有成功? 12/21 02:32
14F:→ vulmoon:噢噢~可能我表达错误!我编译都是成功的!是执行函式的时候 12/21 19:04
15F:→ vulmoon:才crash!所以才会pringf成功! 12/21 19:04
16F:推 sunev:编译成功不代表printf成功耶,也不代表mxSetData成功 12/22 03:14
17F:→ sunev:也不代表输出结构成功。 12/22 03:14
18F:→ vulmoon:当然是有看到printf资料我才知道printf有成功阿@@!也就是 12/22 07:34
19F:→ vulmoon:输出结构时失败才会crash!!mxSetData有没有成功不确定!因 12/22 07:35
20F:→ vulmoon:为无法输出结构,所以我不知道有没有Set成功! 12/22 07:35
21F:推 sunev:所以你的意思是在crash之前,你有看过matlab的command 12/22 16:57
22F:→ sunev:windows 印出讯息? 12/22 16:57
23F:→ vulmoon:是的~没有错!我昨天有更改过程式~是可以输出结构了~不过方 12/23 12:17
24F:→ vulmoon:法很烂!我晚点PO上来!再请你帮我看一下! 12/23 12:17