Ваши методы обратного вызова C++ могут должны быть создать персистентные объекты C++, то есть, объекты, которые продолжают существовать после выходов метода. Например, метод обратного вызова может должен быть получить доступ к объекту, созданному во время предыдущего вызова. Или один метод обратного вызова может должен быть получить доступ к объекту, созданному другим методом обратного вызова. Создать персистентные объекты C++ в вашей S-функции:
Создайте указатель, работают вектор, чтобы содержать указатели на постоянный объект между вызовами метода:
static void mdlInitializeSizes(SimStruct *S) { ... ssSetNumPWork(S, 1); // reserve element in the pointers vector // to store a C++ object ... }
Сохраните указатель на каждый объект, что вы хотите быть персистентными в указателе, работают вектор:
static void mdlStart(SimStruct *S) { ssGetPWork(S)[0] = (void *) new counter; // store new C++ object in the } // pointers vector
Получите указатель в любом последующем вызове метода, чтобы получить доступ к объекту:
static void mdlOutputs(SimStruct *S, int_T tid) { counter *c = (counter *) ssGetPWork(S)[0]; // retrieve C++ object from real_T *y = ssGetOutputPortRealSignal(S,0); // the pointers vector and y[0] = c->output(); // use member functions of } // the object
Уничтожьте объекты, когда моделирование отключит:
static void mdlTerminate(SimStruct *S) { counter *c = (counter *) ssGetPWork(S)[0]; // retrieve and destroy C++ delete c; // object in the termination } // function