Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Обнуление статического динамически созданого масива

#cpp


В приведенной функции я создаю статический массив. Каким образом его можно единажды
обнулить, при первом входе в функцию?

typedef unsigned char uchar;
typedef unsigned long long int ullong;

// Рекурентный алгоритм нахождения F(n) 
// F(n) - число Фибоначи, n - порядковый номер
ullong Fibonachi_Recursion_With_Memory(const uchar &_n)
{
  static ullong *const M = new ullong[_n + 1]; // Динамически выделеный массив (который
нужно обнулить)

  ////////////////////////////////////////////////////////////////////// - (мой способ)
  static bool emptyVector(false);

  if(!emptyVector)
  {
    for(uchar i = 0; i <= _n; i++) 
      M[i] = 0;
    emptyVector = true;
  }
  //////////////////////////////////////////////////////////////////////

  if(_n <= 2)
    return 1;

  if(M[_n] != 0) 
    return M[_n];

  return
    M[_n] = Fibonachi_Recursion_With_Memory(_n - 1) + Fibonachi_Recursion_With_Memory(_n
- 2);
}

    


Ответы

Ответ 1



Легко! static ullong *const M = new ullong[_n + 1](); Будет работать и в C++03

Ответ 2



Если ваш компилятор поддерживает C++ 2011, то вы можете написать просто static ullong *const M = new ullong[_n + 1] {}; В противном случае вы можете написать отдельную функцию для инициализации этого массива. Например, inline ullong * init( uchar n ) { ullong *p = new ullong[n]; std::memset( p, 0, n * sizeof( ullong ) ); return p; } и static ullong *const M = init( _n + 1 ); Или, опять-таки, если компилятор поддерживает, вы можете использовать лямбда-выражение, объявленное внутри функции перед объявлением static переменной. Например auto l = []( uchar n ) -> ullong * { int *p = new ullong[n]; return ( ullong * )std::memset( p, 0, n * sizeof( ullong ) ); }; static ullong *const M = l( _n + 1 ); И не используйте идентификаторы, которые начинаются с символа подчеркивания или заканчиваются символом подчеркивания, а также идентификаторы, состоящие из одной заглавной буквы. Это плохой стиль программирования.

Комментариев нет:

Отправить комментарий