[問題] c structure轉matlab疑問

看板MATLAB作者 (百鬼月夜)時間13年前 (2012/12/19 22:12), 編輯推噓6(6018)
留言24則, 2人參與, 最新討論串1/1
各位大大好! 我目前在寫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)

12/19 23:00, , 1F
mxGetPr 得到的東西的型別是ImgInfo*嗎?
12/19 23:00, 1F

12/19 23:05, , 2F
我其實不是很確定,它是說取實數,可是我用它可以寫值進去
12/19 23:05, 2F

12/20 00:58, , 3F
可以是什麼意思,你不是說matlab crash了嗎?
12/20 00:58, 3F

12/20 07:24, , 4F
我有三行printf把值print出來看,有print成功,可是當要
12/20 07:24, 4F

12/20 07:25, , 5F
結束這函式時,它要輸出這結構就會crash。
12/20 07:25, 5F

12/20 14:55, , 6F
你的crash指的是matlab被強迫結束嗎?
12/20 14:55, 6F

12/20 14:55, , 7F
要結束這函式是指這個mex file執行結束了嗎?然後你在matlab
12/20 14:55, 7F

12/20 14:56, , 8F
打這個變數,想看裡面的內容時,matlab crash了?
12/20 14:56, 8F

12/20 19:00, , 9F
沒錯!是matlab被強制結束!它會跳出幾個選項給你選,但在你
12/20 19:00, 9F

12/20 19:01, , 10F
重開matlab之前都無法下指令。結束這函式的確是只該mex fi
12/20 19:01, 10F

12/20 19:05, , 11F
-le執行結束。一執行結束就crash,還無法打這個變數。
12/20 19:05, 11F

12/21 02:31, , 12F
這不叫結束函式,這叫編譯成功。
12/21 02:31, 12F

12/21 02:32, , 13F
話說回來,如果matlab被強制結束,你怎麼知道printf有成功?
12/21 02:32, 13F

12/21 19:04, , 14F
噢噢~可能我表達錯誤!我編譯都是成功的!是執行函式的時候
12/21 19:04, 14F

12/21 19:04, , 15F
才crash!所以才會pringf成功!
12/21 19:04, 15F

12/22 03:14, , 16F
編譯成功不代表printf成功耶,也不代表mxSetData成功
12/22 03:14, 16F

12/22 03:14, , 17F
也不代表輸出結構成功。
12/22 03:14, 17F

12/22 07:34, , 18F
當然是有看到printf資料我才知道printf有成功阿@@!也就是
12/22 07:34, 18F

12/22 07:35, , 19F
輸出結構時失敗才會crash!!mxSetData有沒有成功不確定!因
12/22 07:35, 19F

12/22 07:35, , 20F
為無法輸出結構,所以我不知道有沒有Set成功!
12/22 07:35, 20F

12/22 16:57, , 21F
所以你的意思是在crash之前,你有看過matlab的command
12/22 16:57, 21F

12/22 16:57, , 22F
windows 印出訊息?
12/22 16:57, 22F

12/23 12:17, , 23F
是的~沒有錯!我昨天有更改過程式~是可以輸出結構了~不過方
12/23 12:17, 23F

12/23 12:17, , 24F
法很爛!我晚點PO上來!再請你幫我看一下!
12/23 12:17, 24F
文章代碼(AID): #1GqSjG1J (MATLAB)