Реализация алгоритма RLE в стиле метапрограммирования C ++

Из Справочное руководство по загрузке весны

Установка в качестве службы init.d (System V)

Просто добавьте символ jar в init.d для поддержки стандартных команд start, stop, restart и status. Предполагая, что у вас есть приложение Spring Boot, установленное в / var / myapp, для установки приложения Spring Boot в качестве службы init.d просто создайте символическую ссылку:

$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp

После установки вы можете запускать и останавливать обслуживание обычным способом. Например, в системе на базе Debian:

$ service myapp start

Если ваше приложение не запускается, проверьте файл журнала, записанный на /var/log/.log для ошибок.

Продолжайте чтение , чтобы узнать, как защитить развернутую службу.

После выполнения в письменной форме я обнаружил, что моя служба не запускается с этим сообщением об ошибке в logs: start-stop-daemon: непризнанная опция --no-close . И мне удалось исправить это, создав конфигурационный файл /var/myapp/myapp.conf со следующим содержимым

USE_START_STOP_DAEMON=false

1
задан karel 4 March 2019 в 09:55
поделиться

1 ответ

Я не могу выяснить ошибку в коде, может кто-нибудь, пожалуйста, взгляните на нее и помогите мне понять, что я здесь делаю неправильно.

Проблема в том, что вы инициализируете статический элемент cnt следующим образом

template <size_t N>
size_t RLE<N>::cnt = 1 + RLE<N - 1>::cnt;

size_t RLE<0>::cnt = 0;

, поэтому вы получаете cnt == N, когда компилятор использует инициализированное значение RLE<N - 1>::cnt (случай g ++ ), cnt == 1 когда N > 0, когда компилятор использует ноль для RLE<N - 1>::cnt (случай clang ++).

Я не знаю, кто прав, но дело в том, что когда вы пишете

        cout << cnt << *p;
        cnt = 0;

, вы печатаете cnt в RLE<N> - так N или 1, в зависимости от случая - и вы обнулите cnt в RLE<N>.

Но когда вы обнуляете cnt в RLE<N>, cnt в RLE<N-1> остаются неизменными (так N-1 или 1, в зависимости от случая).

Я не вижу большого количества метапрограммирования в вашем коде, но мне кажется, что возможное исправление установлено для всех cnt равным 1

template <size_t N>
size_t RLE<N>::cnt = 1;

size_t RLE<0>::cnt = 1;

и для RNE<N-1>::cnt установлено значение cnt + 1 в Compress() ]

static void Compress(char const p[])
{                
    if (!(*p == *(p + 1)))
    {
        cout << cnt << *p;
        cnt = 0u;
    }

    RLE<N - 1>::cnt = cnt+1u;  <---  add this line

    RLE<N - 1>::Compress(p + 1);
}

Но, честно говоря, я предпочитаю ваш оригинальный (не метапрограммирующий) код.

0
ответ дан max66 4 March 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: