Как узнать, вызывался ли initscr () из ncurses ранее?

Больше любопытства на данный момент, есть ли способ узнать, если initscr() из <ncurses.h> был вызван раньше? Я верю звоню initscr() дважды плохая идея.

2

Решение

Вы можете иметь переменную bool, которая инициализируется как false и устанавливается в true сразу после вызова initscr () (и выполнения другой инициализации). Недостатком является то, что вы должны помнить, что нужно проверять переменную bool и устанавливать ее после вызова initscr ().

В этой ссылке есть простой пример: http://math.hws.edu/orr/s04/cpsc225/curses.html

ПРИМЕЧАНИЕ. Как отмечает Джонатон Леффлер в комментариях, эта ссылка не является хорошим примером в целом, я просто указываю вам на фрагмент кода, где он все инициализирует, чтобы привести пример.

Я не знаком с библиотекой, но, похоже, вы могли бы также объявить WINDOW * и установить для него значение null, а затем проверить, является ли оно нулевым, чтобы узнать, было ли оно вызвано. В документации, которую я нашел по поиску, говорится, что при сбое функция не возвращается, поэтому у вас не будет нулевого указателя, если она будет запущена. По сути, это то же самое, что и использование bool, но, возможно, немного менее загроможденный (и проверка указателей на наличие нулевых значений — это распространенная идиома C).

Самый простой способ сделать это на C ++ — создать класс, который обернет WINDOW * или что-либо еще, возвращаемое функцией, а затем вызвать initscr () в конструкторе. Если для освобождения есть соответствующая функция, вызовите ее в деструкторе. Используя единый шаблон дизайна, класс может быть создан только один раз.

Еще более безопасный способ — обернуть WINDOW * в std :: unique_ptr, но передать в него пользовательский удалитель (Как использовать пользовательское средство удаления с членом std :: unique_ptr?) — при условии, что есть функция, которая освобождает окно.

Тогда вам ничего не нужно в деструкторе, умный указатель справится с этим за вас.

1

Другие решения

когда initscr успешно вызывается, устанавливает переменные stdscr а также curscr, которые только ненулевые после инициализации. Вам не нужны дополнительные переменные для этой цели. проклятия также инициализирует переменные LINES а также COLS, которые обычно дают фактический размер экрана (кроме как указано в use_env страница справочника).

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

5

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector