LINUX.ORG.RU

Сообщения penetrator3000

 

Дополнение enum базового класса

Вот пример как сделано сейчас:

#include <iostream>
#include <map>


class BaseEnumClass
{
public:
	BaseEnumClass()
	{
		m_mapping[EnumClass::BASE_A] = 100;
		m_mapping[EnumClass::BASE_B] = 110;
	}

	enum EnumClass
	{
		BASE_A = 10
		, BASE_B = 11
	};

	std::map<int, int> m_mapping;
};

class DerivedEnumClass
		: public BaseEnumClass
{
public:
	DerivedEnumClass()
	{
		m_mapping[EnumClass::DERIVED_C] = 120;
		m_mapping[EnumClass::DERIVED_D] = 130;
	}
	enum EnumClass
	{
		DERIVED_C = 12
		, DERIVED_D = 13
	};
};


int main(int argc, char** argv)
{
	DerivedEnumClass d;
	for (const auto& [key, value] : d.m_mapping)
	{
		std::cout << key << " -> " << value << std::endl;
	}
	std::cout << d.m_mapping[DerivedEnumClass::DERIVED_C] << std::endl;
	std::cout << d.m_mapping[BaseEnumClass::BASE_A] << std::endl;
	return 0;
}

Сам код сильно утрирован, но суть показана верно. Подскажите пожалуйста можно ли как-то переписать этот код используя enum class, либо какие-то другие сущности?

Необходимо (обязательно) уметь делать так:

m_mapping[EnumClass::DERIVED_C] = 120;
И так:
std::cout << d.m_mapping[BaseEnumClass::BASE_A] << std::endl;

Т.е. уметь обращаться в мапу (которая находится в базовом классе) по Id, которые есть как и в базовом классе, так и в наследнике.

Обязательно должа быть возможность обращения по ВНЯТНОМУ идентификатору. Ну и желательно не следить самому за id которые хранятся в enum (по идее можно в базовом классе делать просто отрицательные значения, а в наследнике не задавать значение (просто с нуля пойдёт нумерация)), но может есть что-то более красивое.

 ,

penetrator3000
()

Конечный автомат, велосипед

Добрый день. В целях самообразования решил запилить очередной велосипед. Имеется конечный автомат (F), событие (E), текущее состояние конечного автомата (S), менеджер, принимающий события (M)

Пока что получается следущее взаимодействие:

  • некоторая сущность кладёт в M событие E
  • M по своим правилам (их можно опустить) посылает E в F
  • F «пересылает» E своему текущему S
  • S соответствующим образом обрабатывает E, после чего должен сообщить F в каком состоянии он должен остаться/перейти после того как обработает E.

Возникает вопрос по последнему пункту: есть ли паттерны/механизмы «подписки/регистрации» в базовом классе?

По идее я могу сделать так:

  • Создать класс FSM под конкретную задачу
  • Отнаследоваться от FSM_I
  • Внутри FSM описать классы под каждые состояния и сделать по одному экземпляру
  • Хранить адрес текущего состояния и изменять его

Но такой механизм мне не очень нравится, хочется решить как-то более красиво, наверняка такие способы есть.

( Вот что я примерно имею ввиду )

Получаю следующий вывод:

---- f1 ----
stateA -> stateA
stateA -> stateA
stateA -> stateB
stateB -> stateA
Понятное дело что нормально работать будет только 1 экземпляр FSM, но это можно допилить (т.к. пример писался на коленке). В целом мысль думаю понятна.

Юзать можно что угодно (либу собираю с поддержкой C++17), но не готовые либы, хочется самому набить шишки (потом пойдёт многопоточность и т.п.).

 ,

penetrator3000
()

Шаблоны, быдлокод, часть 1

Добрый день, начал разбираться с шаблонами в С++, сейчас знаю их хреново.

Есть тестовая программа.

Подскажите, пожалуйста, как надо изменить строку 57, либо конструктор класса Storage, чтобы заработала строка 57. В идеале я хочу просто иметь shared_ptr<T>, но при этом нужно уметь передавать параметры, спецефичные для <T>. Подскажите как это адекватно делать? Как я понял такая штука не прокатит (из-за разворачивания):

std::make_shared<T>(std::forward<Args>(args)...)

Может есть ещё замечания?

 ,

penetrator3000
()

Вывод имени значения enum class. enum class => std::string

Можно ли как-то написать это умнее/короче? Правильный ли такой подход в целом?

Если подход не правильный - реквестирую ссылки.

 ,

penetrator3000
()

Conan, пакетные менеджеры в С++

Хотелось бы узнать мнение по поводу conan.

Есть ли смысл обмазываться пакетами с помощью conan'a? Какие подводные камни? В conan'e привлекает удобство, но интересно как обстоят дела на самом деле.

Если я правильно нагуглил там совсем мало пакетов. Допустим google-test не нашел.

Часто ли появляются новые пакеты? Мб есть альтернативы круче?

 ,

penetrator3000
()

catch2 vs gtest

Какой фреймворк стоит брать для нового проекта? Если брать catch2 то с помощью чего создавать mock объекты удобнее всего?

Или gtest/gmock - непобедим?

 , ,

penetrator3000
()

Статистика warning'ов при сборке проекта на C++

Есть ли утилита, которая умеет генерировать файл/отчёт в удобном для чтения формате по warning'ам во время сборки проекта? Сейчас есть проект который собирается с помощью cmake, при сборке проекта (debug) используются следующие флаги:

-Wall -Wextra -Wshadow -Wnon-virtual-dtor

В идеале данная утилита должна уметь парсить warning'и g++, и группировать их по критичности, после чего должен получаться отчёт (в идеале ещё чтобы отдельно сообщалось о новых warning'ах).

Сейчас в проекте слишком много warning'ов (знаю что плохо, но пока нет возможности их поправить), при сборке проекта просто нереально заметить какой-то новый warning.

Кстати может быть есть ещё must-have флаги при debug сборке с помощью g++?

 , ,

penetrator3000
()

Сборка либы, которая использует openssl

Добрый день, есть либа, в которой используется openssl. На убунте собирается нормально, но дома никак не могу собрать (стоит manjaro).

В самой либе точно код нормальный, видимо у меня что-то с openssl. Подскажите плз как узнать/продиагностировать что не так?

По логам не могу распарсить что не так (ну точнее могу, но не понимаю почему возникает такая ошибка, т.к. буквально несколько часов назад прекрасно всё собирал на другой машине).

Обновление ../source/ATE/Signalling/SIP/ProductInfo_R.cpp для сборки ATE/Release/libSIP4_2.a
g++ -c SIP_TLS_Connection.cpp
In file included from /usr/ATE/3_0/include/ATE/Debug/Trace.h:16:0,
                 from /usr/ATE/3_0/include/ATE/Debug/SubsysTrace.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TCP_Connection.h:6,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:6,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp: In destructor ‘virtual Tm_SIP_TLS_Connection::~Tm_SIP_TLS_Connection()’:
/home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:54:23: error: invalid use of incomplete type ‘SSL {aka struct ssl_st}’
   TASSERT( 1 == m_pSSL->references );
                       ^
/usr/ATE/3_0/include/ATE/Debug/TraceMacro.h:97:6: note: in definition of macro ‘TASSERT’
  if (condition) ; else \
      ^~~~~~~~~
In file included from /usr/include/openssl/crypto.h:31:0,
                 from /usr/include/openssl/comp.h:16,
                 from /usr/include/openssl/ssl.h:47,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/usr/include/openssl/ossl_typ.h:144:16: note: forward declaration of ‘SSL {aka struct ssl_st}’
 typedef struct ssl_st SSL;
                ^~~~~~
In file included from /usr/ATE/3_0/include/ATE/Debug/Trace.h:16:0,
                 from /usr/ATE/3_0/include/ATE/Debug/SubsysTrace.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TCP_Connection.h:6,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:6,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:54:25: error: invalid use of incomplete type ‘SSL {aka struct ssl_st}’
   TASSERT( 1 == m_pSSL->references );
                         ^
/usr/ATE/3_0/include/ATE/Debug/TraceMacro.h:97:6: note: in definition of macro ‘TASSERT’
  if (condition) ; else \
      ^~~~~~~~~
In file included from /usr/include/openssl/crypto.h:31:0,
                 from /usr/include/openssl/comp.h:16,
                 from /usr/include/openssl/ssl.h:47,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/usr/include/openssl/ossl_typ.h:144:16: note: forward declaration of ‘SSL {aka struct ssl_st}’
 typedef struct ssl_st SSL;
                ^~~~~~
In file included from /usr/ATE/3_0/include/ATE/Debug/Trace.h:16:0,
                 from /usr/ATE/3_0/include/ATE/Debug/SubsysTrace.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TCP_Connection.h:6,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:6,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:59:27: error: invalid use of incomplete type ‘SSL_CTX {aka struct ssl_ctx_st}’
   TASSERT( 1 == m_pSSL_CTX->references );
                           ^
/usr/ATE/3_0/include/ATE/Debug/TraceMacro.h:97:6: note: in definition of macro ‘TASSERT’
  if (condition) ; else \
      ^~~~~~~~~
In file included from /usr/include/openssl/crypto.h:31:0,
                 from /usr/include/openssl/comp.h:16,
                 from /usr/include/openssl/ssl.h:47,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/usr/include/openssl/ossl_typ.h:145:16: note: forward declaration of ‘SSL_CTX {aka struct ssl_ctx_st}’
 typedef struct ssl_ctx_st SSL_CTX;
                ^~~~~~~~~~
In file included from /usr/ATE/3_0/include/ATE/Debug/Trace.h:16:0,
                 from /usr/ATE/3_0/include/ATE/Debug/SubsysTrace.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TCP_Connection.h:6,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:6,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:59:29: error: invalid use of incomplete type ‘SSL_CTX {aka struct ssl_ctx_st}’
   TASSERT( 1 == m_pSSL_CTX->references );
                             ^
/usr/ATE/3_0/include/ATE/Debug/TraceMacro.h:97:6: note: in definition of macro ‘TASSERT’
  if (condition) ; else \
      ^~~~~~~~~
In file included from /usr/include/openssl/crypto.h:31:0,
                 from /usr/include/openssl/comp.h:16,
                 from /usr/include/openssl/ssl.h:47,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/usr/include/openssl/ossl_typ.h:145:16: note: forward declaration of ‘SSL_CTX {aka struct ssl_ctx_st}’
 typedef struct ssl_ctx_st SSL_CTX;
                ^~~~~~~~~~
/home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:67:20: warning: ‘void ERR_remove_state(long unsigned int)’ is deprecated [-Wdeprecated-declarations]
  ERR_remove_state(0);
                    ^
In file included from /usr/include/openssl/ct.h:13:0,
                 from /usr/include/openssl/ssl.h:61,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/usr/include/openssl/err.h:248:1: note: declared here
 DEPRECATEDIN_1_0_0(void ERR_remove_state(unsigned long pid))
 ^
/home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp: In member function ‘bool Tm_SIP_TLS_Connection::EstablishTLS()’:
/home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:296:47: warning: ‘const SSL_METHOD* TLSv1_client_method()’ is deprecated [-Wdeprecated-declarations]
  m_pSSL_CTX = SSL_CTX_new(TLSv1_client_method());
                                               ^
In file included from /usr/include/openssl/ct.h:13:0,
                 from /usr/include/openssl/ssl.h:61,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/usr/include/openssl/ssl.h:1626:1: note: declared here
 DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *TLSv1_client_method(void)) /* TLSv1.0 */
 ^
/home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp: In static member function ‘static void Tm_SIP_TLS_Connection::ReleaseSSL()’:
/home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:432:20: warning: ‘void ERR_remove_state(long unsigned int)’ is deprecated [-Wdeprecated-declarations]
  ERR_remove_state(0);
                    ^
In file included from /usr/include/openssl/ct.h:13:0,
                 from /usr/include/openssl/ssl.h:61,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/include/ATE/Signalling/SIP/SIP_TLS_Connection.h:4,
                 from /home/zef/build/2018-03-14/ATE/Signalling/SIP/4_2/source/ATE/Signalling/SIP/SIP_TLS_Connection.cpp:11:
/usr/include/openssl/err.h:248:1: note: declared here
 DEPRECATEDIN_1_0_0(void ERR_remove_state(unsigned long pid))
 ^
make: *** [/usr/ATE/maketempl/linux/gcc4.7/protei.mak:93: ATE/Release/ATE/Signalling/SIP/SIP_TLS_Connection.o] Error 1

 , , ,

penetrator3000
()

Выбора стола тред

Доброе время суток. Создаю новую тему по мотивам этой.

В общем кто знает где можно достать не шибко дорогие столы (г. СПб).

Гугл выдаёт жесткий совок.

Интересует что-то типа 1, 2 (именно по эргономике)

Если кратко нужна просто рабочая поверхность, максимум 1 ящик. Может кто знает фирму которая производит минималистичные столы родом не из совка.

На заказ уже пытался делать (правда через знакомых), но получился какой-то монстр на ножках из икеи.

 ,

penetrator3000
()

Выбора монитора тред

Добрый день.

В общем интересует мнение о выборе домашнего монитора. Бюджет ~40к.

Основные требования чтобы был 4к, с нормальной цветопередачей, и чтобы можно было в игрушки норм играть на нём.

Пока что глаз упал только на такой вариант.

Может есть более удачные варианты?

UPD: диагональ думал около 27"

 ,

penetrator3000
()

Ревью кода

Добрый день.

Посоветуйте, пожалуйста, площадку (если таковые имеются) где энтузиасты занимаются review кода.

Стоит ли связываться подобными штуками? Какие подводные камни?

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

И да 90% кода скорее всего будет изобретение велосипеда.

 , ,

penetrator3000
()

Две версии библиотеки libruli x86 и x64 одновременно без виртуалок и т.п.

Добрый день.

Есть бинарник, который собирается либо x86 либо x86_64 на одной машине.

Ему необходимо линковаться с libruli => мне необходимо иметь на компе 2 версии данной библиотеки.

sudo apt install libruli4 libruli4:i386
#######################################

Reading package lists... Done
Building dependency tree       
Reading state information... Done
libruli4 is already the newest version (0.33-1.1).
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 libruli4 : Conflicts: libruli4:i386 but 0.33-1.1 is to be installed
 libruli4:i386 : Depends: liboop4:i386 but it is not going to be installed
                 Conflicts: libruli4 but 0.33-1.1 is to be installed
E: Unable to correct problems, you have held broken packages.

Команда выше не работает. ЧЯДНТ? Почему они конфликтуют? Надо собирать вручную?

http://www.nongnu.org/ruli/ на исходный код тут битая ссылка, откуда можно взять исходники? http://savannah.nongnu.org/cvs/?group=ruli

 , ,

penetrator3000
()

Доступ к определённым резурсам через прокси сервер с использованием ssh

Добрый день.

Есть сервак, на котором стоит squid (первый раз с ним работаю). К самому серваку я подключаюсь через openvpn + ssh.

Подскажите, пожалуйста, как я легко могу настроить проксирование ОПРЕДЕЛЁННЫХ ресурсов через сервер (к которым только он имеет доступ)? Т.е. если я вижу что необходимо попасть на сайт x.ru то я пытаюсь сделать это через прокси. Доступ ко всем остальным ресурсам должен идти через мой комп (от которого я подключаюсь к серваку)

 , , ,

penetrator3000
()

Создание простой формы в Qt Designer

Добрый день.

Имеется задача под свои нужды изобрести велосипед + лучше освоиться в питоне. Нужно повторить (примерно) интерфейс приложения gtimer.

С Qt я раньше дела не имел (в универе доводилось работать с WinForms + WPF). Прошу, дать ссылку на хорошую статью, где максимально сжато изложены принципы построения интерфейса.

Приложение будет иметь одну форму и внешний вид не так важен. Важно чтобы это был Python3 + Qt5.

Смешные шутки типа ссылки на гугл не приветствуются, спасибо!

 , , , ,

penetrator3000
()

openvpn не добавляются nameserver'ы

Добрый день.

Есть конфиг от админа и arch linux. При запуске openvpn (пробовал различные способы) - всегда получаю одно и тоже сообщение:

Sun Apr 16 22:15:18 2017 /etc/openvpn/update-resolv-conf tun0 1500 1570 172.18.240.227 255.255.254.0 init which: no resolvconf in ((null)) dhcp-option DNS 192.168.100.143 dhcp-option DNS 192.168.100.145 dhcp-option DOMAIN protei /etc/openvpn/update-resolv-conf: line 56: -x: command not found

но пакет resolvconf у меня установлен, и конфиг точно правильный

Подскажите, пожалуйста что я делаю неправильно, либо как это можно диагностировать?

 

penetrator3000
()

Прокси через openvpn

Добрый вечер.

Есть удалённый ПК (У), у которого есть доступ к определённым сетям и компам. У меня есть доступ только к У и ещё нескольким компам той сети (через ssh (openvpn)) - могу ли я как-то настроить проксирование (притвориться компьютером У, чтобы получить доступ ко всем доступным для У компьютерам через ssh).

Напрямую (с моего компа) через ssh меня естественно не пускает.

Спасибо!

 , , , ,

penetrator3000
()

gdb, ошибка «Cannot access memory at address» когда выполняю пошаговое выполнение программы

Добрый день!

Столкнулся со следующей проблемой. Имею программу, собранную на другом компе + исходники. Есть необходимость заняться её отладкой. Указываю gdb путь до исходников, ставлю breakpoint'ы, вроде всё ок.

Начинаю пошаговое выполнение программы (n), и в определенный момент (всегда в одном и том же месте (где находится просто if)) получаю следующую ошибку: «Backtrace stopped: Cannot access memory at address 0x2e323935»

Вот что пишет bt после того как я получаю данную ошибку:

#0 0x08048310 in ?? ()
#1 0x2e383631 in ?? ()
#2 0x2e303031 in ?? ()
#3 0x30310033 in ?? ()
#4 0x00000011 in ?? ()
#5 0x00000003 in ?? ()
#6 0x09b8bc48 in ?? ()
Backtrace stopped: Cannot access memory at address 0x2e323935

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

Сама суть заключается в том, что обращения к нулевым указателям и т.п. - нет, т.е. само приложение (без отладки) работает нормально.

Буду признателен за помощь, спасибо!

 , ,

penetrator3000
()

RSS подписка на новые темы