2013-03-01 109 views
2

我有一個從Matlab傳遞給mex的結構。 它正確傳遞,我用mxGetClassName(mxArray_pointer_carrying_struct)驗證它返回結構作爲類的類型。該結構在相應的屬性中包含15個字段,全部30個字符串(15個屬性名稱,15個屬性值)。從mex訪問Matlab結構

我能夠使用mxGetFieldNameByNumber(mxArray_pointer_carrying_struct,index)訪問屬性名稱;

如何訪問屬性值?

我上面做的代碼看起來如下:

extract_settings(const mxArray *p) 
{ 
    mwIndex j = 1; 
    const char *property; 
    mexPrintf("\nInput Arg %i is of type:%s\n",j,mxGetClassName(p)); 
    for(int i = 0;i<=14;i++) 
    { 
     property = mxGetFieldNameByNumber(p, i); %gets property names 
     mexPrintf("%s-- \n",property); %Displays 15 property names 
    } 
} 

我的結構如下看起來:

{ 
TRIGGER_POLARITY : LEVEL_LOW 
EDGE : EDGE_RISING 
. 
. 
. (15 elements as of now) 
} 
+0

你也可以像你用財產一樣獲得價值。 一旦獲得值的字符串,您可以在打印之前使用atoi()或strtoul()將其轉換爲數值等值(僅限數值)。 – 2013-03-01 05:33:08

+0

你能指定它是哪個mxCommand嗎?由於這些值是字符串,我不需要atoi(); – sridutt 2013-03-01 05:37:08

回答

5

你可能尋找mxGetFieldByNumber。還有一個將結構傳遞給MATLAB附帶的MEX文件的完整示例,請參閱this documentation from Mathworks。您可以在MATLAB如下加載例如:

edit([matlabroot '/extern/examples/refbook/phonebook.c']); 

編輯:還有mxGetField它可以讓你訪問使用其名稱的字段。

編輯2:要將結果從mxGetField轉換爲C字符串,您可以使用mxArrayToString。請注意,使用後需要釋放字符串的內存。您可以使用mxIsChar來檢查該字段是否包含MATLAB字符數組。

+0

mxArray * tmp = mxGetFieldByNumber(p,0,i); mexPrintf(「%s \ n」,(char *)mxGetData(mxDuplicateArray(tmp))); 我在上面的for循環中添加了這個,它獲得了值的第一個字符 例如:L,E ...你是否看到我上面的代碼中有任何問題。 – sridutt 2013-03-01 08:56:36

+0

'mxGetData'用於真實數據。我已經用關於字符串的信息更新了我的答案。請看看MATLAB提供的例子,它們非常有用,涵蓋了很多基本的東西。 – 2013-03-01 09:41:56