mexFunctions : структура в структуре

Я работаю с Scilab, и я использую mexFunctions, включая mex.H файл заголовка.
Я хочу создать структуру в структуре.
Вот мой код :

#include <mex.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs,
                 const mxArray* prhs[])
{
#define  rows5_1 1
#define  cols5_1 1
#define  TOTAL_ELEMENTS5_1 (rows5_1 * cols5_1)

    int      ndim5_1 = 2, dims5_1[2] = {rows5_1, cols5_1};
    int      number_of_fields5=1;
    const char *field_names5_1[] = {"mylong","Nested","myarraydouble"};
    double    mylong[] = {987987};
    mxArray *Nested;
    double myarraydouble[] = {987,654,321};

    double    *pr5;
    mxArray  *field_value5, *struct_array_ptr5_1;
    struct_array_ptr5_1 = mxCreateStructMatrix(1, 1, 3, field_names5_1);
    int       index5;


    // Populate 1 mylong double
    for (index5=0; index5<1; index5++) {
        field_value5= mxCreateDoubleMatrix(1, 1, mxREAL);
        pr5 = mxGetPr(field_value5);
        pr5[0] = mylong[index5];

        mxSetField(struct_array_ptr5_1, index5, "mylong",field_value5);
        mxDestroyArray(field_value5);
    }

// Populate the array myarraydouble
    for (index5=0; index5<1; index5++) {
        field_value5= mxCreateDoubleMatrix(1, 3, mxREAL);
        pr5 = mxGetPr(field_value5);
        for(int i=0; i<3; i++) {
            pr5[i] = myarraydouble[i];
        }
        mxSetField(struct_array_ptr5_1, index5, "myarraydouble", field_value5);
        mxDestroyArray(field_value5);
    }
    if (nlhs)
        plhs[0] =struct_array_ptr5_1;
}

выход :

-->a=mex_5292()
a  =
mylong: 987987
Nested: [0x0 constant]
myarraydouble: [987,654,321]

Теперь я хочу сохранить новую структуру во вложенном поле. Мой код :

// Populate the struct

mxArray *s;
#define  rows5 1
#define  cols5 3
int dims5[3]= {rows5,cols5};
const char *field_names5_2[] = {"inval1","inval3","inval2"};
const char *inval2_names[]= {"hello"};
double    inval1_names[] = {12};
double    inval3_names[] = {34};
s = mxCreateStructMatrix(1, 1, 3, field_names5_2);

mxArray  *inval1,*inval2,*inval3;

//inval1
inval1= mxCreateDoubleMatrix(1, 1, mxREAL);
pr5 = mxGetPr(inval1);
pr5[0] = inval1_names[0];
mxSetField(s, 0, "inval1", inval1);

//Inval3
inval3= mxCreateDoubleMatrix(1, 1, mxREAL);
pr5 = mxGetPr(inval3);
pr5[0] = inval3_names[0];
mxSetField(s, 0, "inval3", inval3);

//Inval 2 //string
inval2 = mxCreateString(inval2_names[0]);
mxSetField(s, 0, "inval2", inval2);

mxDestroyArray(inval1);
mxDestroyArray(inval2);
mxDestroyArray(inval3);

выходные данные: (я могу получить доступ к каждому значению с a(1), a(2), a (3))

-->a=mex_5292()
a  =

inval1: 12
inval3: 34
inval2: "hello"

Теперь я пытаюсь добавить эту структуру 1×1 в имя вложенного поля.

mxSetField(struct_array_ptr5_1, 0, "Nested", s);

но у меня всегда есть ошибка сегментации или что-то вроде этого :

выход с линией :

-->a=mex_5292()
a  =

mylong: 987987
Nested: [1x1 struct]
myarraydouble: [987,654,321]

И

-->a.Nested
ans  =

inval1: unknown
inval3: unknown
inval2: unknown

Я не могу получить доступ к значениям. Если кто-нибудь сможет мне помочь. Я думаю, что проблема исходит от mxSetField, возможно, она не реализована для struct в struct.

1 ответ

  1. У меня есть ответ на мой вопрос :
    Это потому, что он не реализован на Scilab, но тот же код работает на MATLAB.