Сделать объекты C++ постоянными

Методы коллбэка C++ могут потребовать создания постоянных объектов C++, то есть объектов, которые продолжают существовать после выхода из метода. Для примера методу коллбэка может потребоваться доступ к объекту, созданному во время предыдущего вызова. Или одному из методов коллбэка может потребоваться доступ к объекту, созданному другим методом коллбэка. Чтобы создать постоянные объекты C++ в вашей S-функции:

  1. Создайте рабочий вектор указателя, чтобы удерживать указатели на постоянный объект между вызовами метода:

    static void mdlInitializeSizes(SimStruct *S)
    {
        ...
    		ssSetNumPWork(S, 1); // reserve element in the pointers vector
                             // to store a C++ object
        ...
     }
    
  2. Сохраните указатель на каждый объект, который вы хотите быть постоянным, в рабочем векторе указателя:

      static void mdlStart(SimStruct *S)
      {
          ssGetPWork(S)[0] = (void *) new counter; // store new C++ object in the
      }                                            // pointers vector
    
  3. Найдите указатель в любом последующем вызове метода для доступа к объекту:

    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
    
  4. Уничтожать объекты, когда симуляция заканчивается:

    static void mdlTerminate(SimStruct *S)
    {
        counter *c = (counter *) ssGetPWork(S)[0]; // retrieve and destroy C++
        delete c;                                  // object in the termination
    }                                              // function