Методам обратного вызова 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