<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3911334</guid>
        <pubDate>Wed, 09 Oct 2024 15:07:35 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3911334</link>
        <description><![CDATA[Eretic: Спасибо за советы :)<br>Курс подходит к концу, сейчас Spring Boot учим и затем диплом. По ООП наконец более-менее понял суть. Да и gcc освоил заодно (на курсах по линуксу), оказалось в целом более-менее годный инструмент. Сейчас на нём часть дипломной работы делаю (работа с железом и легкое сопряжение с программой на Java).<br>Еще раз, всем спасибо&#33;]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905467</guid>
        <pubDate>Sun, 09 Jun 2024 17:18:41 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905467</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905448'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-06-08T18:36:58+00:00">08.06.24, 18:36</time></span><div class='quote '>Боюсь я тебя не совсем понял, или даже совсем не понял.</div></div>Не бойся, хоть не понял. Клиент – слово в контексте нашего разговора неоднозначное, я об этом не подумал. Под клиентом я подразумевал не приложение, а конкретно сетевого агента. Т.е. в твоём случае это класс сокета.<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905448'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-06-08T18:36:58+00:00">08.06.24, 18:36</time></span><div class='quote '>И занимает данный класс чуть больше 100 строк кода, это вместе с комментариями и пустыми строками-разделителями. Это разве перегруз?</div></div>А мог бы строк 20-30. Класс соединения ещё 15-20.<br>
Но вот в чём ты точно неправ, так в том, что измеряешь сложность в строках. Хоть это и имеет отношение к сказанному мной, но опосредованное. Следуя твоей логике, тебе и IOBuffer не нужен, ибо можно очередь слепить прям в Socket, разве нет?<br>
Посмотри, что реально требуется сокету. (Осторожно&#33; Далее синтетика, не отлаживалась и даже не компилилась.) В конкретно твоём случае, вероятно, адрес &quot;127.0.0.1&quot; жёстко задан, но никто ж не запрещает класс сделать универсальным?<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class Socket</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;/* ... */</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;Socket(const std::string&amp; addr, unsigned short port);</div><div class="code_line">&nbsp;&nbsp;~Socket();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;bool send(void* msg, size_t size);</div><div class="code_line">&nbsp;&nbsp;template &#60;typename T&#62;</div><div class="code_line">&nbsp;&nbsp;bool send(const T&amp; var) { return send(&amp;var, sizeof(var)); }</div><div class="code_line">&nbsp;&nbsp;int lastError() const;</div><div class="code_line">};</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>Класс, решающий одну конкретную задачу – передачу массивов информации в addr по порту port. Класс в конструкторе устанавливает соединение, живёт, пока соединение существует и как следствие отказывается создаваться, если сервер не отвечает на попытку коннекта. Выкидываем все проверки, потому что они становятся не нужны.<br>
И тут бац&#33; в ТЗ заказчику захотелось, чтоб приложение отслеживало соединение и восстанавливало его. Ну что ж, решаем задачу ещё одним классом. Как-то так:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class Connect</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;/* ... */</div><div class="code_line">&nbsp;&nbsp;int sock;</div><div class="code_line">&nbsp;&nbsp;int reconnect() { /* ... */ return sock; }</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;Connect(const std::string&amp; addr, unsigned short port): sock(-1)/* ... */ { reconnect(); }</div><div class="code_line">&nbsp;&nbsp;~Connect() { close(sock); }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;int getId() const { return reconnect(); }</div><div class="code_line">};</div></ol></div></div></div></div>Класс, решающий ровно одну задачу: установление соединения и поддержка его живым. Теперь он владеет сокетом, а класс сокетов его у него запрашивает. Класс сокетов приобретает вид:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class Socket</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;/* ... */</div><div class="code_line">&nbsp;&nbsp;Connect conn;</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;Socket(const std::string&amp; addr, unsigned short port): conn(addr, port) {}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;bool send(void* msg, size_t size) { /* ... */ return ::send(conn.getId(), /* ... */ ) != -1); }</div><div class="code_line">&nbsp;&nbsp;/* ... */</div><div class="code_line">};</div></ol></div></div></div></div>Заметь, даже в таком реконнектирующимся сетевом агенте код будет проще. Введённые тобою методы для состояния соединения просто не нужны, т.к. по сути они без нужды выносят наружу внутренние кишки класса, которыми пользователю заморачиваться нет никакого смысла.<br>
Что касается третьей задачи – перевода чисел в строки – это вообще странно видеть в задачах сетевого агента. Не всё ли равно ему, что нужно передать? Пусть подготовкой массива байт занимается вызывающая сторона. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-06-09T17:45:17+00:00">09.06.24, 17:45</time></span></span><br>
P.S. Просто не следует думать, что чем больше понапихано в класс, тем лучше. Почти всегда нет. Жирные интерфейсы не оправдываются.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905463</guid>
        <pubDate>Sun, 09 Jun 2024 16:03:35 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905463</link>
        <description><![CDATA[Eretic: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905445'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-08T16:06:46+00:00">08.06.24, 16:06</time></span><div class='quote '>Контейнеры в контексте ...ну, этого раздела нашего форума, скажем так, это не те контейнеры. Это те же коллекции, но в std. Почему контейнеры, а не коллекции? Та фик его знает, но классы коллекций Стандарт называет именно контейнерами. Это общепринятое название в среде Плюсов, так что никто не путается. Коллекциями обычно называются вообще любые классы, которые что-то хранят, а контейнерами те, которые в std.</div></div><br>
Не заметил поначалу. В том то и дело, что нам другие контейнеры выдают: механизм изоляции в Линуксе. То есть то, на чем работает Docker и подобные. И ладно бы рассматривали &quot;внутренности&quot; (clone() и тд), но в основном то упор на использование утилит и Docker&#39;a.<br>
Вот и удивляюсь, при чем тут курсы по программированию? Нафига программисту умение работать с контейнерами?]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905448</guid>
        <pubDate>Sat, 08 Jun 2024 18:36:58 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905448</link>
        <description><![CDATA[Eretic: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905445'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-08T16:06:46+00:00">08.06.24, 16:06</time></span><div class='quote '>Вообще же, грамотная декомпозиция задачи по составным деталькам – главный отличительный признак программера от кодера. Ну т.е.: &quot;клиент не умеет работать без сервера, значит и не надо его этому учить; у нас есть пункт, по которому клиент должен ждать сервера, значит нужен отдельный класс подключения, т.к. клиент этого не умеет; у нас есть желание сделать реконнект после потери коннекта, значит нужен отдельный поток управления, эксплуатирующий класс подключения&quot;. Как-то так. Нынче у тебя класс решает сразу три задачи, почему и оказался перегружен кодом, не связанным с решением основной задачи и погряз в вызовах, когда не нужно и &quot;на всякий случай&quot;. Поверь, крупные комплексы без грамотной декомпозиции ты не вывезешь. И никто не вывезет, у любого профи есть некий предел охвата сложности создаваемого им продукта. Снова обращаю внимание, что это не касается конкретно Плюсов, это общий, не зависимый от языка, аспект проектирования.</div></div><br>
Боюсь я тебя не совсем понял, или даже совсем не понял.<br>
Вот все методы класса Socket:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;Socket(int port)</div><div class="code_line">&nbsp;&nbsp; &nbsp;~Socket()</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void close_socket()</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool is_connected()</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool is_closed()</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual bool do_connect()</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual bool send_string(std::string msg)</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual bool send_int(int num)</div></ol></div></div></div></div><br>
О каких трех решаемых задачах сокетом идёт речь? Тут по моему как раз всё предельно просто - это банальная обёртка на socket, не делающая ничего лишнего, кроме как умения коннектиться и отсылать данные. И занимает данный класс чуть больше 100 строк кода, это вместе с комментариями и пустыми строками-разделителями. Это разве перегруз?<br>
<br>
Решениние о повторном коннекте, если его еще нет, принимается в отдельном потоке output_thread(), что в целом и похоже на:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>Qraizer</span><div class='quote '>у нас есть желание сделать реконнект после потери коннекта, значит нужен отдельный поток управления, эксплуатирующий класс подключения&quot;.</div></div><br>
Собственно код треда:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void output_thread(IOBuffer *io_buffer, std::mutex* is_exit, Socket *sock)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;OUTString str;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;- thread (wr) start.&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (!is_exit-&#62;try_lock())</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;str.clear();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;str.append_string(io_buffer-&#62;_wait());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (!str.empty())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// строка принята, подсчитываем и отправляем на сервер</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int sum = str.calck_string(str);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;- thread (wr) receive: &quot; &#60;&#60; str &#60;&#60; &quot; sum = &quot; &#60;&#60; sum &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (sock-&#62;is_connected())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!sock-&#62;send_int(sum))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::cerr &#60;&#60; &quot;- thread (wr): can&#39;t send message to server.&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;- connect.....&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::flush(std::cout);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (sock-&#62;do_connect()) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;- ok.&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!sock-&#62;send_int(sum))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::cerr &#60;&#60; &quot;- thread (wr): can&#39;t send message to server.&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::cerr &#60;&#60; &quot;server not found.&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;- thread (wr) exit.&quot; &#60;&#60; std::endl;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<br>
А вот нашел условие ТЗ:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Программа №1. <br>
Должна состоять из двух потоков и одного общего буфера. <br>
Поток 1.  Принимает строку, которую введет пользователь.   Должна быть проверка, что строка состоит только из цифр и не превышает 64 символа. После проверки строка должна быть отсортирована по убыванию и все элементы, значение которых чётно, заменены на латинские буквы «КВ». После данная строка помещается в общий буфер и поток должен ожидать дальнейшего ввода пользователя.<br>
Поток 2. Должен обрабатывать данные, которые помещаются в общий буфер. После получения данных общий буфер затирается. Поток должен вывести полученные данные на экран, рассчитать  общую  сумму всех  элементов, которые являются численными значениями.  Полученную сумму передать в Программу №2. После этого поток ожидает следующие данные.<br>
<br>
Примечание №1 по Программе №1: Взаимодействие потоков должно быть синхронизировано,  поток №2  не должен постоянно опрашивать общий буфер. Механизм синхронизации не должен быть глобальной переменной.<br>
Примечание №2 по Программе №1: <strong class='tag-b'>Работа программы должна быть максимально независима от статуса запуска программы №2</strong>. Это значит, что внезапный останов программы №2 не должен приводить к немедленным проблемам ввода у пользователя.<br>
При перезапуске программы №2 необходимо произвести <strong class='tag-b'>передподключение</strong>.<br>
</div></div><br>
То есть здесь прямо прописано, что клиент умеет работать без сервера. Просто должен переподключиться когда сервер объявится.<br>
<br>
Ну и для кучи:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Программа №2. <br>
Ожидает данные от  Программы №1. При получении  данных происходит анализ из скольки символов состоит  переданное значение. Если оно больше 2-ух символов и если оно кратно 32 выводит сообщение о полученных данных, иначе выводится сообщение об ошибке. Далее программа продолжает ожидать данные.<br>
Примечание №1 по Программе №2: Работа программы должна быть максимально независима от статуса запуска программы №1. Внезапный останов программы №1 не должен приводить к немедленным проблемам отображения. Необходимо ожидать подключение программы №1 при потере связи между программами.<br>
<br>
Примечание по заданию: Не обязательно все размещать в одном классе. Может быть разработана иерархия классов. Чем более функционален интерфейс класса, тем лучше.<br>
</div></div>Типичный сервер, в режиме ожидания клиента.<br>
<br>
Вот server.cpp я бы сейчас реализовал совершенно по другому.]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905445</guid>
        <pubDate>Sat, 08 Jun 2024 16:06:46 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905445</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905443'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-06-08T15:04:30+00:00">08.06.24, 15:04</time></span><div class='quote '>Если мы умеем распознавать пропажу связи, то почему бы не уметь её восстанавливать, чтобы завершить задачу?</div></div>Я ж написал:<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905428'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T17:49:53+00:00">07.06.24, 17:49</time></span><div class='quote '>Не классы должны её решать, это должно решаться на стороне, которая их использует.</div></div>Вообще же, грамотная декомпозиция задачи по составным деталькам – главный отличительный признак программера от кодера. Ну т.е.: &quot;клиент не умеет работать без сервера, значит и не надо его этому учить; у нас есть пункт, по которому клиент должен ждать сервера, значит нужен отдельный класс подключения, т.к. клиент этого не умеет; у нас есть желание сделать реконнект после потери коннекта, значит нужен отдельный поток управления, эксплуатирующий класс подключения&quot;. Как-то так. Нынче у тебя класс решает сразу три задачи, почему и оказался перегружен кодом, не связанным с решением основной задачи и погряз в вызовах, когда не нужно и &quot;на всякий случай&quot;. Поверь, крупные комплексы без грамотной декомпозиции ты не вывезешь. И никто не вывезет, у любого профи есть некий предел охвата сложности создаваемого им продукта. Снова обращаю внимание, что это не касается конкретно Плюсов, это общий, не зависимый от языка, аспект проектирования.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905443'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-06-08T15:04:30+00:00">08.06.24, 15:04</time></span><div class='quote '>Лучше подскажите, нафига мне углубляться в изучение контейнеров под Линукс? Я же вроде не на сисопа пошел учиться...</div></div>Контейнеры в контексте ...ну, этого раздела нашего форума, скажем так, это не те контейнеры. Это те же коллекции, но в std. Почему контейнеры, а не коллекции? Та фик его знает, но классы коллекций Стандарт называет именно контейнерами. Это общепринятое название в среде Плюсов, так что никто не путается. Коллекциями обычно называются вообще любые классы, которые что-то хранят, а контейнерами те, которые в std.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905443</guid>
        <pubDate>Sat, 08 Jun 2024 15:04:30 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905443</link>
        <description><![CDATA[Eretic: На момент написания и и слова такого не знал - &quot;коллекции&quot;, находил что-то подходящее в инете и пробовал на его основе что-то делать. Я тогда еще даже на Java с коллекциями был не знаком, чего уж тут про плюсы говорить? Да и сейчас в целом не знаком, пошла нормальная учёба на жабу и времени просто не стало отвлекаться на что-то другое. <br>
Понятно, что сейчас меня бы и под дулом пистолета не заставили наследовать std::string. <br>
Сегодня даже понял для чего нужны все эти модификаторы static, private и тд.<br>
И вообще, было бы на написание хотя бы пара недель, а не три дня (первые два ушли на изучение сокетов), подозреваю что нашел бы подходящие потокозащищенные коллекции и не пришлось бы городить это безобразие. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905419'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T14:38:03+00:00">07.06.24, 14:38</time></span><div class='quote '>Не помню точно, но вроде &quot;bool is_closed()&quot; пишется не так.<br>
is_closed будет если есть событие на чтение, и при этом<br>
число байт для чтения равно 0.</div></div>Сейчас точно не вспомню, но от recv() пришлось отказаться в пользу данного способа. Толи она возвращала туфту по таймауту, толи висла напрочь. Не помню. Помню только что нашел этот способ проверки коннекта на сайте линуксоидов и он показал прекрасные результаты.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905427'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T16:36:50+00:00">07.06.24, 16:36</time></span><div class='quote '>Есть и другая причина неэффективности. Вместо того, чтобы в цикле посимвольно добавлять то одно, то другое поочерёдно, проще было бы пробежаться сразу с шагом 2 и insert()-ить. Главное – не забыть скорректировать i на длину new_symb-1.</div></div>Так там не просто вставка, а <strong class='tag-b'>подмена</strong> чётных символов на заданную подстроку. Думаю просто пробег с шагом 2 ничего не даст, или же придется перед вставкой сначала удалять символ. А это не самая быстрая операция. Отсюда и последовательный цикл - так тупо быстрее.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905427'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T16:36:50+00:00">07.06.24, 16:36</time></span><div class='quote '>Вообще говоря, странно видеть в Плюсовой программе ограничения на объёмы данных. Все эти char buffer[1024], #define MAX_INPUT_BUFF 64 </div></div>Велосипед не мой, это было в ТЗ указано - ограничить входящую строку до 64-х символов. Чтобы не писать магических циферь в коде использовал через #define.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905427'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T16:36:50+00:00">07.06.24, 16:36</time></span><div class='quote '>Не понимаю, почему народ предпочитает while(true) вместо спецом для этого предназначенного for(;;) ...</div></div><br>
Потому что это одно и то же ;) <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905428'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T17:49:53+00:00">07.06.24, 17:49</time></span><div class='quote '>Не следует ожидать, что коннект может пропасть посреди дороги, и его нужно восстанавливать. Ну, в смысле, то, что может пропасть, ожидать, конечно, нужно, но вот восстанавливать его не следует. Ну, в смысле, ...блин.</div></div>Если мы умеем распознавать пропажу связи, то почему бы не уметь её восстанавливать, чтобы завершить задачу?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905428'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T17:49:53+00:00">07.06.24, 17:49</time></span><div class='quote '>Соединение с сервером – задача клиента. Без оного клиент бесполезен.</div></div>В ТЗ вообще не упоминалось про сервер-клиент, это скорее я подметил похожие принципы и так реализовал. Там же было сказано, что программа №1 принимает данные от пользователя и отправляет их программе №2, если она конечно запущена. Если программы №2 не обнаружено, то выводит сообщение об ошибке и продолжает работу. То есть, клиент работает постоянно, независимо от связи с сервером. <br>
Там же и &quot;протокол&quot; обмена был задан: программа №2 сама контролирует корректность принятых данных. То есть некий а-ля CRC, но на примитивном уровне. Про подтверждение приёма там не было ни слова. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-06-08T15:10:57+00:00">08.06.24, 15:10</time></span></span><br>
Лучше подскажите, нафига мне углубляться в изучение контейнеров под Линукс? Я же вроде не на сисопа пошел учиться...<br>
Или все-таки пригодится?]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905433</guid>
        <pubDate>Sat, 08 Jun 2024 00:38:04 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905433</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905431'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T20:20:58+00:00">07.06.24, 20:20</time></span><div class='quote '>В данном случае просто просится:</div></div><br>
Я понимаю, но невыносимо захотелось <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">goto</span></span> :rolleyes:]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905431</guid>
        <pubDate>Fri, 07 Jun 2024 20:20:58 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905431</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905427'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T16:36:50+00:00">07.06.24, 16:36</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905419'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T14:38:03+00:00">07.06.24, 14:38</time></span><div class='quote '>is_closed будет если есть событие на чтение, и при этом<br>
число байт для чтения равно 0.</div></div>Для UDP точно пустые пакеты допускаются. Сам юзал в качестве эдаких эвентов. Они ж connectless. Для TCP не уверен, но в любом случае всегда можно проверить состояние ошибки.</div></div><br>
Для UDP в &quot;is_closed&quot; нет необходимости.<br>
При нормальном закрытии соединения никакой ошибки не возникает,<br>
вот это я точно помню. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-06-07T20:29:22+00:00">07.06.24, 20:29</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905429'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T18:07:39+00:00">07.06.24, 18:07</time></span><div class='quote '><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">using namespace std;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp;int cnt = 10;</div><div class="code_line">&nbsp;&nbsp;for(;;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;cout &#60;&#60; &nbsp;cnt &#60;&#60; endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (!cnt) goto quit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cnt = ~-cnt;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;quit: return 0;</div><div class="code_line">}</div></ol></div></div></div></div></div></div><br>
В данном случае просто просится:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">if (!cnt) break;</div></ol></div></div></div></div><br>
<br>
-----<br>
Проверил по своим исходникам. Действительно, если было событие на чтение,<br>
а число принятых байт 0 - значит TCP соединение было закрыто с той стороны.<br>
<br>
<a class='tag-url' href='https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-recv' target='_blank'>recv</a>]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905429</guid>
        <pubDate>Fri, 07 Jun 2024 18:07:39 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905429</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905427'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T16:36:50+00:00">07.06.24, 16:36</time></span><div class='quote '>Не понимаю, почему народ предпочитает while(true) вместо спецом для этого предназначенного for(;;) ...</div></div><br>
Ну не знаю ...  :scratch: Лично я всегда, когда пользую оператор <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">goto</span></span> - всегда стараюсь использовать и инструкцию<span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue"> for(;;)</span></span>. Для надёжности&#33; :good: <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">using namespace std;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp;int cnt = 10;</div><div class="code_line">&nbsp;&nbsp;for(;;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;cout &#60;&#60; &nbsp;cnt &#60;&#60; endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (!cnt) goto quit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cnt = ~-cnt;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;quit: return 0;</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905428</guid>
        <pubDate>Fri, 07 Jun 2024 17:49:53 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905428</link>
        <description><![CDATA[Qraizer: Из разряда не &quot;причесать&quot;, а вполне себе недостатки. Даже в учебных проектах видеть их не очень хочется, правда.<ul class="tag-list"><li>У всех классов всё торчит наружу. Ну нет необходимости всё публиковать. Только то, что нужно пользователям классов, остальное нужно закрывать. Типичный пример см. выше. Наружу выводим функцию с блокировками и под ними зовём приватные методы, которые блокировкой уже не озадачиваются. Тут это не особо важно, т.к. классы относительно просты, но когда у тебя методы зовут другие методы, так ты уменьшишь оверхед и существенно минимизируешь вероятность случайно напрограммить дидлоки.</li><li>Классы INPString и OUTString имеют базовым std::string, который не предназначен служить базой чему-либо. Опять же, в твоём случае всё относительно просто, но вот почитай <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=445466&view=findpost&p=3904682' target='_blank'>тут</a> и чуток повыше, там сам список. Возможно тебе имело смысл агрегировать в них std::string, а не наследоваться от него, но формально в этих классах вообще нет нужды, всё легко решается в обычном процедурном стиле: набор из нескольких функций над std::string.</li><li>Никогда не пиши функции в стиле как INPString::replace_even(). Ты сначала уничтожаешь clear() состояние экземпляра класса и только потом начинаешь создавать новое. Это можно делать только безотказным способом, но ни push_back(), ни append() не являются безотказными, они могут бросить исключение при нехватке памяти (или там повреждения хипа). Всегда — всегда&#33; — сначала следует подготовить новое состояние и только потом уничтожать старое. Очень неприятно в каком-нибудь Блендере при копировании коллекции объектов, например кучи домов с улицы на улицу, получить &quot;Not enough memory&quot; и не только не получить копию, но и исходную улицу полностью потерять. Вот примерный правильный вариант (не стал реализовывать свой совет выше):<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void replace_even(const std::string&amp; new_symb)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::string &nbsp;tmp;</div><div class="code_line">&nbsp;&nbsp;std::string&amp; self = *this;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for (int i = 0; i &#60; self.size(); i++)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (i &amp; 0x01)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;tmp.push_back(self[i]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;tmp.append(new_symb);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;std::swap(self, tmp);</div><div class="code_line">}</div></ol></div></div></div></div>Обрати внимание, ни одного try{}, но код абсолютно отказоустойчив. Хоть в себя самого вставляй себя самого. Если случится страшное, *this не поменяет своего состояния, т.к. tmp лежит на стеке, и его деструктор его разрушит, т.к. даже при размотке стека по исключениям язык гарантирует вызов деструкторов всех объектов, чьи области определения снимаются, не попрощавшись. И только в самом конце std::swap() меняет местами новое и старое состояния, так что по выходу разрушится старое, а не неполностью подготовленное новое. И – да, std::swap() гарантирует безотказность для сущностей std (где явно не заявлено обратное). И заметь, это замечание не по языку конкретно, это по проектированию архитектуры в целом. Ну т.е. отказоустойчивость является независимым от языка аспектом.</li></ul>С сокетами отдельная тема. В смысле, сокеты – это отдельная тема. Для 80-ых прошлого тысячелетия архитектура сокетов возможно была вершиной программерского гения, но с позиции хотя бы рубежа веков это не архитектура, а один сплошной дуршлаг с кое-как залатанными кое-какими дырами. Так что не буду ничего писать за твои принципы организации работы с ними. Лишь пара замечаний.<ul class="tag-list"><li>У тебя нет какого-то конкретного протокола между клиентом и сервером. В принципе ну и ладно, задача несложная, но даже тут ты в итоге вынужден был написать много &quot;на всякий случай&quot;. Представь себе задачу посложнее, и запросто утонешь в попытках разгрести этот ад. Впрочем, это всё ж из разряда &quot;причесать&quot;.</li><li>Не следует ожидать, что коннект может пропасть посреди дороги, и его нужно восстанавливать. Ну, в смысле, то, что может пропасть, ожидать, конечно, нужно, но вот восстанавливать его не следует. Ну, в смысле, ...блин.  :blush:<br>
Короче, сугубо архитектурно, снова без акцента конкретно на языке. Соединение с сервером – задача клиента. Без оного клиент бесполезен. Вывод: коннект в конструкторе и эксепшн в случае отказа. Не нужно позволять иметь экземпляры класса, которые в принципе неспособны ни на что. Ну и да, дисконнект = конец клиента. Теперь представь, что клиент у тебя ровно так и написан. Насколько упростится код его методов? Насколько повысится его надёжность? Тут-то у тебя несложный случай, но опять же представь себе сервис 24/7/365 с мульёном клиентов и распределёнными по доменам серверами. Из этого не следует делать вывод, что дисконект = конец работы, но это однозначно говорит о том, что это внешняя по отношению к классу сокетов проблема. Не классы должны её решать, это должно решаться на стороне, которая их использует. Если очень хочется реализовать автореконнект, следует 100500 раз подумать (хотя бы из соображений сетевой безопасности, ибо коннекты редко рвутся просто так, без неожидаемых действий третьих лиц ;) , в частности) и ежели уж решить, то решать это в отдельных классах, которые сами с твоими сокетами будут работать. Ведь по-любому новое подключение = заново инициализировать. Особенно, когда у тебя протокол.</li><li><span class="tag-color tag-color-named" data-value="gray" style="color: gray">Всё ж скажу, коли начал предыдущим пунктом. </span>Не следует использовать SO_REUSEADDR без необходимости. (И даже при необходимости не стоит.) Это прекрасная возможность перехватить <s class='tag-s'>явки/пароли</s> твой трафик, для чего даже повышения прав не надо.</li></ul> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-06-07T18:02:07+00:00">07.06.24, 18:02</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899605'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T16:43:14+00:00">31.01.24, 16:43</time></span><div class='quote '>Проблема даже не в том, что именно ++ я не знаю (там стажировка на лето, ещё 10 раз выучу).</div></div>В целом же, для первого проекта на незнакомом языке очень и очень неплохо. Серьёзно. У меня вот первые шаги были поскромнее. Но вот то, что отказали в итоге, не удивительно.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905427</guid>
        <pubDate>Fri, 07 Jun 2024 16:36:50 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905427</link>
        <description><![CDATA[Qraizer: Позволишь покомментировать?<br>
Из того, что называется &quot;причесать&quot;.<ul class="tag-list"><li>Незачем везде пихать virtual. У тебя конкретные классы, позднее связывание им не упало от слова совсем.</li><li>Захваченные std::unique_lock&lt;&gt; блокировки нет нужны освобождать явно, это делает деструктор блокировки. Собственно для этого они и проектировались. Иначе хватило бы и явно лочить сам мютекс безо всякого std::unique_lock. К примеру IOBuffer::_wait() может выглядеть просто как<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">std::string _wait()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::unique_lock&#60;std::mutex&#62; lk(io_mutex);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;io_cond.wait(lk, [this]{return !buf.empty();});</div><div class="code_line">&nbsp;&nbsp;return get_unlock();</div><div class="code_line">}</div></ol></div></div></div></div></li><li>Проверка &#33;buf.empty() внутри IOBuffer::get_unlock() не нужна. Ты уже захватил блокировку в IOBuffer::_wait(), в которую попадаешь, когда условная переменная тебе позволит, и никто другой это не успеет изменить. Но. У тебя есть дублирующий функционал в IOBuffer::get(), который мешает. Тебе следовало бы решить, как тебе надо, и оставить только один метод из этих двух. А чтоб IOBuffer::get_unlock() не звал кто ни попадя, существуют приватные методы.</li><li>На std::list&lt;std::string&gt; ты реализовал по сути собственный std::queue&lt;&gt;. :unsure: </li><li>Незачем создавать IOBuffer динамически. Это Плюсы, тут можно создавать экземпляры прям на стеке, прям экземпляры, прям без неочевидных ссылок. Тогда б не забыл его deleteнуть, компилер разрушить объект по его выходу из области видимости не забудет. С сокетом аналогично.</li><li>По этой же причине INPString::replace_even() неэффективен, т.к. принимает параметр по значению, т.е. new_symb является новым объектом, точной копией оригинала. Это может быть оправдано, если он меняется, а оригинал должен остаться неизменным, но у тебя он только форвардится в append(), так что не вижу никаких препятствий определить его как const std::string&amp; new_symb – явная ссылка, причём константная. Ну и далее ещё несколько таких мест.</li><li>Есть и другая причина неэффективности. Вместо того, чтобы в цикле посимвольно добавлять то одно, то другое поочерёдно, проще было бы пробежаться сразу с шагом 2 и insert()-ить. Главное – не забыть скорректировать i на длину new_symb-1.</li><li>OUTString::append_string() какой-то странный. Фактически он просто присваивает.</li><li>Я бы везде в параметрах указатели заменил на ссылки.</li><li>В конструкторах и деструкторах нет нужды вызывать clear() для контейнеров-агрегатов. Они и так ...э-эм, это делают.</li><li>Вообще говоря, странно видеть в Плюсовой программе ограничения на объёмы данных. Все эти char buffer[1024], #define MAX_INPUT_BUFF  64 итп. Та и в C тоже, коль на то пошло, но там есть хоть какое-никакое оправдание, а тут просто <s class='tag-s'>лень</s> недостаток опыта, в смысле. Все контейнеры умеют управлять своим хранилищем, только попроси.</li><li>Контейнеры указателей опасны. Весьма. Не стоит. У тебя std::list&lt;&gt;, он более-менее лоялен, но всё ж. Используй std::shared_ptr&lt;&gt;, если уж очень надо указатели.</li><li>Не понимаю, почему народ предпочитает while(true) вместо спецом для этого предназначенного for(;;) ...</li></ul>Не стоит к этому относиться слишком уж буквально. Просто советы на будущее. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-06-07T16:42:22+00:00">07.06.24, 16:42</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905419'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T14:38:03+00:00">07.06.24, 14:38</time></span><div class='quote '>is_closed будет если есть событие на чтение, и при этом<br>
число байт для чтения равно 0.</div></div>Для UDP точно пустые пакеты допускаются. Сам юзал в качестве эдаких эвентов. Они ж connectless. Для TCP не уверен, но в любом случае всегда можно проверить состояние ошибки.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905419</guid>
        <pubDate>Fri, 07 Jun 2024 14:38:03 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905419</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905339'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-06-07T06:08:44+00:00">07.06.24, 06:08</time></span><div class='quote '>Собственно код клиента/сервера:</div></div><br>
Не помню точно, но вроде &quot;bool is_closed()&quot; пишется не так.<br>
is_closed будет если есть событие на чтение, и при этом<br>
число байт для чтения равно 0.<br>
Проверь, если не лень. :)]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905339</guid>
        <pubDate>Fri, 07 Jun 2024 06:08:44 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905339</link>
        <description><![CDATA[Eretic: Собственно код клиента/сервера:<br>
<span class="b-attach" data-size="6127" data-hits="120" data-attach-id="65953" data-attach-post-id="3905339">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3905339&amp;attach_id=65953' title='Скачать файл' target='_blank'>Shared.zip</a> (, : 120)
		</span><br>
Он конечно ужастен, но времени не было причесать (даже объявления классов не успел вынести в хидеры), а классы проектировались вообще наобум :) И немного отклонился от ТЗ - вместо обмена данными двух программ сделал классический клиент/сервер, когда клиентов можно назапускать сколько захочешь.]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905338</guid>
        <pubDate>Fri, 07 Jun 2024 05:57:15 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905338</link>
        <description><![CDATA[Eretic: Ясно. В гугле конечно не забанили, но толковой инфы что-то не находил, чтобы коротко и ясно. Полно описаний установки MSYS2, но в них подразумевается, что человек уже знает что к чему и зачем.]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905257</guid>
        <pubDate>Thu, 06 Jun 2024 07:45:36 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905257</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905235'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-06-05T16:09:10+00:00">05.06.24, 16:09</time></span><div class='quote '>1) Клиент - это кто шлет запрос, а сервер - кто отвечает на них. Но у меня такая ситуация, что запросы возможны с любой стороны, как и ответы.</div></div><br>
Обмен между &quot;клиентом&quot; и &quot;сервером&quot; в большинстве случаев - двусторонний. Разница только в том - кто &quot;задает работу&quot; (клиент) и кто &quot;её работает&quot; (сервер). <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905235'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-06-05T16:09:10+00:00">05.06.24, 16:09</time></span><div class='quote '>Так кого лучше сделать клиентом, а кого сервером - GUI на Java или DLL на Си (она как раз отвечает за обмен данными с оборудованием по RS232, точнее будет отвечать, когда реализую)?</div></div><br>
Ну тут как бы очевидно - Java напрямую с железом работать не может. Вернее может - но через подключаемые либы, которые реализуются  &quot;не на Javа&quot;. Соответственно клиента пишешь на Java, а на С/C++ сервер, который будет обрабатывать запросы и взаимодействовать с RS232.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3905235'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-06-05T16:09:10+00:00">05.06.24, 16:09</time></span><div class='quote '>2) Хочу использовать GCC, чтобы основная часть DLL нормально компилировалась как под винду, так и под линукс (кроме api-зависимой части работы непосредственно с RS232). Объясните мне уже, чем отличаются все эти /clang от /usr и /ucrt? Просто MSYS2 по дефолту создал в винде все папки, а что мне нужно то? В чем отличия всех этих компиляторов? Нафига такое многообразие? Извиняюсь, если уже где-то говорили об этом, мог и пропустить - времени вообще ни на что не хватает</div></div><br>
clang32/64 отличается от mingw32/64 только тем, что является для mingw32/64 фронтендом, вернее для тамошнего gcc. А вообще Clang является фронтэндом для компиляции множества языков программирования: C, C++, Objective-C и Objective-C++. Он работает вместе с компилятором LLVM и является частью проекта LLVM. Его использовать предпочтительнее gcc по причине лучшей скорости и более детальному анализу кода. В системах Windows/Linux clang и его binutils использует все от gcc. А вот в в в системах семейства *BSD/macOSX для clang своя реализация стандартной библиотеки С++ (которая обгоняет реализацию стандарта по сравнению с GCC, но и где-то уступает). Но это для тебя несущественно. Просто используй clang 32 или 64, в зависимости от нужной тебе разрядности.<br>
<br>
А вот с UCRT другой вопрос. Если тебе не волнуют системы ниже Windows 8.0 - используй UCRT. Говорят, это более легковесная реализация CRT, но не работает на более ранних версиях Винды. Хотя зачем рисковать перед дипломом - может комиссия из олдфагов, которые признают только Windows 7? А еще лучше прокачай этот вопрос сам - тебя же не банили в Гугле? ;)]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905235</guid>
        <pubDate>Wed, 05 Jun 2024 16:09:10 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3905235</link>
        <description><![CDATA[Eretic: Всем привет&#33;<br>Мне естественно отказали, но я и не больно то надеялся, всё-таки первый раз в жизни что-то на ООП делал  :D <br>Сейчас уже завершаем знакомство с линуксом (убунтой), так что ради интереса скомпилировал и под линукс - прекрасно работает, без каких-либо изменений в исходниках.  Даже не верится, что смог создать сорсы под две совершенно разные системы. И непонятно что им там не понравилось? Возможно мой ООП-подход, в стиле Java :) Чуть позже выложу сорсы, может кому и пригодятся (они на другом компе) :) <br><br>Ну да ладно. Сейчас готовлю проект для диплома. GUI уже создана на Java Swing, всё работает, данные принимает и выдает ответы обратно, в Controller, который пересылает их в Model (естественно реализовал модель MVC). <br>Теперь пару вопросов осталось решить:<br>1) Клиент - это кто шлет запрос, а сервер - кто отвечает на них. Но у меня такая ситуация, что запросы возможны с любой стороны, как и ответы. Так кого лучше сделать клиентом, а кого сервером - GUI на Java или DLL на Си (она как раз отвечает за обмен данными с оборудованием по RS232, точнее будет отвечать, когда реализую)?<br>2) Хочу использовать GCC, чтобы основная часть DLL нормально компилировалась как под винду, так и под линукс (кроме api-зависимой части работы непосредственно с RS232). Объясните мне уже, чем отличаются все эти /clang от /usr и /ucrt? Просто MSYS2 по дефолту создал в винде все папки, а что мне нужно то? В чем отличия всех этих компиляторов? Нафига такое многообразие? Извиняюсь, если уже где-то говорили об этом, мог и пропустить - времени вообще ни на что не хватает :(<br><br>PS: просто прошло столько времени, что я уже и не помню чем компилировал под винду - комп то уже новый.]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899831</guid>
        <pubDate>Mon, 05 Feb 2024 14:05:11 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899831</link>
        <description><![CDATA[Eretic: Ну как, найдётся желающий протестировать под линуксом?]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899781</guid>
        <pubDate>Sun, 04 Feb 2024 16:26:42 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899781</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899780'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-04T16:07:22+00:00">04.02.24, 16:07</time></span><div class='quote '>А зачем мне winsock, если у меня и без него всё работает? Говорю же, у меня подключено как раз вот это:</div></div><br>
А потому, что дальше у тебя возникнет желание использовать WinAPI, а с &quot;линуксовым&quot; тулчейном тебя поприветствует облом. Нет в нем поддержки Windows, только ограниченная эмуляция (трансляция) линуховых вызовов в виндовые.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899780</guid>
        <pubDate>Sun, 04 Feb 2024 16:07:22 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899780</link>
        <description><![CDATA[Eretic: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899778'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-02-04T14:25:13+00:00">04.02.24, 14:25</time></span><div class='quote '>#ifdef _WIN32<br>
    // Заголовки для Windows с использованием MinGW-w64<br>
   #include &lt;winsock2.h&gt;<br>
   #include &lt;ws2tcpip.h&gt;<br>
   #pragma comment(lib, &quot;ws2_32.lib&quot;)<br>
</div></div><br>
А зачем мне winsock, если у меня и без него всё работает? Говорю же, у меня подключено как раз вот это:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899778'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-02-04T14:25:13+00:00">04.02.24, 14:25</time></span><div class='quote '>#else<br>
    // Заголовки для Linux<br>
   #include &lt;sys/socket.h&gt;<br>
   #include &lt;arpa/inet.h&gt;<br>
   #include &lt;netinet/in.h&gt;<br>
   #include &lt;unistd.h&gt;<br>
#endif<br>
</div></div><br>
И прекрасно работает под виндой. Еще разберусь, почему клиент не опознаёт потерю связи и можно сдать задание. С другой стороны, не распознает и фиг с ней, всё равно данные будут потеряны (в задаче нет ни слова о их хранении до восстановления связи).<br>
<br>
Но в принципе можно проверить. Если есть желающий попробовать компильнуть под линуксом и проверить в работе, то пишите. Как только закончу - вышлю :) Заодно и узнаем, можно ли обойтись без #ifdef.]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899778</guid>
        <pubDate>Sun, 04 Feb 2024 14:25:13 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899778</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899777'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-04T13:29:01+00:00">04.02.24, 13:29</time></span><div class='quote '> которые должны быть реализованы под любую платформу. Разве нет?</div></div><br>
Чтобы код был кроссплатформенным, нужно примерно следующее:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifdef _WIN32</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Заголовки для Windows с использованием MinGW-w64</div><div class="code_line">&nbsp;&nbsp; &nbsp;#include &#60;winsock2.h&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;#include &#60;ws2tcpip.h&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;#pragma comment(lib, &quot;ws2_32.lib&quot;)</div><div class="code_line">#else</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Заголовки для Linux</div><div class="code_line">&nbsp;&nbsp; &nbsp;#include &#60;sys/socket.h&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;#include &#60;arpa/inet.h&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;#include &#60;netinet/in.h&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;#include &#60;unistd.h&#62;</div><div class="code_line">#endif</div></ol></div></div></div></div><br>
Тулчейн /mingw32 будет использовать первую часть (виндовую), а /msys будет использовать вторую часть (линуховую). Соответственно, и в дальнейшей реализации нужно писать отдельные части для виндовс и линух, помещая их в блоки #ifdef. В стандарте С++ нет унифицированной работы с TCP/IP, поэтому указанные выше заголовки - платформозависимые.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899777</guid>
        <pubDate>Sun, 04 Feb 2024 13:29:01 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899777</link>
        <description><![CDATA[Eretic: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899776'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-02-04T10:12:09+00:00">04.02.24, 10:12</time></span><div class='quote '>ужно просто прочесть расшифровку MinGW - Minimalist GNU for Windows.</div></div><br>
Так я сейчас перешел с minGW на MSYS2. <br>
К тому же из инклюдов у меня только:<br>
#include &lt;iostream&gt;<br>
#include &lt;thread&gt;<br>
#include &lt;algorithm&gt;<br>
#include &lt;list&gt;<br>
#include &lt;condition_variable&gt;<br>
#include &lt;mutex&gt;<br>
#include &lt;chrono&gt;<br>
#include &lt;sys/socket.h&gt;<br>
#include &lt;sys/select.h&gt;<br>
#include &lt;arpa/inet.h&gt;<br>
#include &lt;unistd.h&gt;<br>
<br>
Вроде ничего специфического, чисто плюсовые примочки, которые должны быть реализованы под любую платформу. Разве нет?]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899776</guid>
        <pubDate>Sun, 04 Feb 2024 10:12:09 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899776</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899773'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-04T06:15:58+00:00">04.02.24, 06:15</time></span><div class='quote '>Но ведь я компилирую gcc? То есть тем самым компилятором, что является основным в линуксе. Что тут может пойти не так?</div></div><br>
Все просто. Нужно просто прочесть расшифровку MinGW - Minimalist GNU for Windows. Там нет и не может быть заголовочных файлов для Linux, т.к. это инструмент заточен именно для Windows.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899773</guid>
        <pubDate>Sun, 04 Feb 2024 06:15:58 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899773</link>
        <description><![CDATA[Eretic: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899770'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2024-02-03T14:29:43+00:00">03.02.24, 14:29</time></span><div class='quote '>А нет ли там файлов &quot;windows.h&quot;, &quot;winsock.h&quot;, &quot;winsock2.h&quot;, &quot;wininet.h&quot; ?</div></div><br>
Есть. Но это вариант виндозный и немного не то. Хотя на нём конечно получилось бы намного красивее и проще, чем сейчас замучиваю с select() :) <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899770'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2024-02-03T14:29:43+00:00">03.02.24, 14:29</time></span><div class='quote '>Поскольку кроме поставленной задачи, ты начал решать<br>
ещё одну задачу - &quot;кросплатформенность&quot;. Ещё не известно, что сложнее.</div></div><br>
Меня больше пугают установки неизвестных доселе пакетов, структуры которых я не понимаю. Теперь вот более-менее разобрался. О кроссплатформенности мне пока рано думать. Я же в качестве студента на каникулы заявку подал. Вряд ли кто-то ожидает, что бестолковый студент сразу начнет решать сложнейшие задачи, вызывающие головную боль даже у профессионалов :) <br>
А программки заработали. Единственный косяк - это забыл что в первый параметр select() нужно передавать значение на 1 больше сокета (максимального из набора) и почти час не мог понять - отчего постоянно выходит только по таймауту. Да, функция допотопная, но зато совместимость 100% и задаче отвечает полностью (приложения не должны зависеть друг от друга, а продолжать спокойно работу в случае закрытия одного их них) :) <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-04T06:16:55+00:00">04.02.24, 06:16</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899770'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2024-02-03T14:29:43+00:00">03.02.24, 14:29</time></span><div class='quote '>При попытке собрать приложение плд Линуксом исходники просто не компилируются.</div></div><br>
Но ведь я компилирую gcc? То есть тем самым компилятором, что является основным в линуксе. Что тут может пойти не так?]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899770</guid>
        <pubDate>Sat, 03 Feb 2024 14:29:43 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899770</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899763'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-03T03:24:42+00:00">03.02.24, 03:24</time></span><div class='quote '>Сейчас прошелся поиском и не нашел в папке minGW ключевых инклюдов:<br>
inet.h и socket.h</div></div><br>
А нет ли там файлов &quot;windows.h&quot;, &quot;winsock.h&quot;, &quot;winsock2.h&quot;, &quot;wininet.h&quot; ?<br>
Вариант поиска:<br>
Во всех файлах *.h ищем ключевое слово &quot;socket&quot;. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-03T14:34:54+00:00">03.02.24, 14:34</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899763'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-03T03:24:42+00:00">03.02.24, 03:24</time></span><div class='quote '>так что по любому что-то делать нужно. А я то наивно думал, что самое сложное позади :(</div></div><br>
Сложности только начинаются.<br>
Поскольку кроме поставленной задачи, ты начал решать<br>
ещё одну задачу - &quot;кросплатформенность&quot;. Ещё не известно, что сложнее.<br>
Наверняка будет много сюрпризов. Обычный из них - всё было хорошо и правильно для Виндуса.<br>
При попытке собрать приложение плд Линуксом исходники просто не компилируются.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899769</guid>
        <pubDate>Sat, 03 Feb 2024 09:35:57 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899769</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899763'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-03T03:24:42+00:00">03.02.24, 03:24</time></span><div class='quote '>Так то я не против попробовать снова, но что делать с текущим minGW?</div></div><br>
Это вопрос тем, кто посоветовал  :jokingly:]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899764</guid>
        <pubDate>Sat, 03 Feb 2024 06:02:58 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899764</link>
        <description><![CDATA[Eretic: MSYS2 вроде заработал, всего одна ошибка при установке. Проект компилируется, правда только из терминала, VSCode поломался и ни в какую не создаёт нормальные json файлы. Подружить бы его с makefile для cmake, но пока итак пойдёт. <br>Осталось только доделать.<br>Всем спасибо за помощь и советы&#33;]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899763</guid>
        <pubDate>Sat, 03 Feb 2024 03:24:42 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899763</link>
        <description><![CDATA[Eretic: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899762'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T23:22:27+00:00">02.02.24, 23:22</time></span><div class='quote '>Но все же MSYS2 - эмулятор Linux и у него кроме mingw-w64-* есть еще свой тулчейн /msys.</div></div><br>
Thanks за пример, даже не верится, что под винду заработает без WSAxxxx. В целом, то же самое, что я уже делал неоднократно, вот например из последнего: <a class='tag-url' href='https://github.com/MrDemonid/Sync-time-from-NTP' target='_blank'>https://github.com/MrDemonid/Sync-time-from-NTP</a><br>
<br>
Но тогда уж вопрос на засыпку. У меня все попытки установить MSYS2 провалились, скорее всего из-за ошибок установки. И сейчас у меня просто minGW, в которой нет даже намёка на MSYS, то есть тупо вообще нет соответствующей консоли, так что ничего доставить не могу. И как быть? Ставить заново MSYS2? Так то я не против попробовать снова, но что делать с текущим minGW?<br>
Сейчас прошелся поиском и не нашел в папке minGW ключевых инклюдов:<br>
inet.h и socket.h<br>
так что по любому что-то делать нужно. А я то наивно думал, что самое сложное позади :(]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899762</guid>
        <pubDate>Fri, 02 Feb 2024 23:22:27 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899762</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899749'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T14:08:34+00:00">02.02.24, 14:08</time></span><div class='quote '>Совершенно несложно учесть разницу в конструкторах объектов-сокетах. Делов-то на один API-вызов. Но не сокетами ж едиными. Есть ещё файлы в &#036;TEMP (...я бы так и вообще намутил basic_socketstream&lt;&gt; и натравил на std::​(i|o|io)stream), eсть готовые библиотеки, если религия заказчик не возражает.</div></div><br>
Можно вполне и так. Если не учесть, что ранее <strong class='tag-b'>macomics</strong> пацанов туманил относительно MSYS2 :lol: <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899622'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T20:24:54+00:00">31.01.24, 20:24</time></span><div class='quote '>Затем, что по заданию она должна компилироваться на linux. И вот тут косяк, если из-за как-то не учтенной особенности linux, не выученной своевременно, программа просто не сможет откомпилироваться.<br>
<br>
Вот элементарный пример. Для взаимодействия предложили использовать socket. Но на Windows для работы с socket надо использовать WSAStartup и WSACleanup, которых нету в linux. Т.е. с виду работоспособный код для Windows под linux просто выдаст ошибку отсутствия функций.</div></div><br>
Действительно, разная реализация сокетов в Windows и Linux имеет место. Но, что касаемо MSYS2, то лучше сперва прокачать вопрос, а потом утверждать. Дело в том, что перечисленные мною выше тулчейны не смогут собрать код для Linux-сокетов, просто не найдут Linux-специфических заголовков. Но все же MSYS2 - эмулятор Linux и у него кроме mingw-w64-* есть еще свой тулчейн /msys. Приведу пример, топикстартеру, уверен,  пригодится ...<br>
<br>
<strong class='tag-b'>Сперва установим необходимое</strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">pacman -S msys/gcc</div><div class="code_line">pacman -S msys/gcc-libs</div><div class="code_line">pacman -S msys/binutils</div><div class="code_line">pacman -S msys/cmake </div><div class="code_line">pacman -S msys/ninja</div></ol></div></div></div></div><br>
Да, при установке некоторые пакеты могут быть поставлены как зависимости к ранее поставленным пакетам, в этом случае можно повторно не ставить. К примеру установка /msys/gcc может подтянуть сразу /msys/gcc-libs и /msys/binutils. Я уже не помню, но что-то такое было. Не суть.<br>
<br>
<strong class='tag-b'>Тестируем &quot;родной&quot; тулчейн</strong><br>
<br>
По уже знакомому сценарию делаем проект, пусть в каталоге <span class="tag-font" data-value="Courier" style="font-family:Courier"><strong class='tag-b'><span class="tag-color tag-color-named" data-value="purple" style="color: purple">~/dev/projects/echo-test</span></strong></span>, туда кладем файлы:<br>
<br>
<span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">server.cpp</span></span><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;cstring&#62;</div><div class="code_line">#include &#60;sys/socket.h&#62;</div><div class="code_line">#include &#60;netinet/in.h&#62;</div><div class="code_line">#include &#60;unistd.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;int server_fd, new_socket, valread;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct sockaddr_in address;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int opt = 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int addrlen = sizeof(address);</div><div class="code_line">&nbsp;&nbsp; &nbsp;char buffer[1024] = {0};</div><div class="code_line">&nbsp;&nbsp; &nbsp;const char *hello = &quot;Hello from server&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;socket failed&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit(EXIT_FAILURE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &amp;opt, sizeof(opt))) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;setsockopt&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit(EXIT_FAILURE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;address.sin_family = AF_INET;</div><div class="code_line">&nbsp;&nbsp; &nbsp;address.sin_addr.s_addr = INADDR_ANY;</div><div class="code_line">&nbsp;&nbsp; &nbsp;address.sin_port = htons(8080);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; if (bind(server_fd, (struct sockaddr *)&amp;address, sizeof(address)) &#60; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;bind failed&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit(EXIT_FAILURE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (listen(server_fd, 3) &#60; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;listen&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit(EXIT_FAILURE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((new_socket = accept(server_fd, (struct sockaddr *)&amp;address, (socklen_t*)&amp;addrlen)) &#60; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;perror(&quot;accept&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;exit(EXIT_FAILURE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;valread = read(new_socket, buffer, 1024);</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;%s\n&quot;, buffer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;send(new_socket, hello, strlen(hello), 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;Hello message sent\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">client.cpp</span></span><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;cstring&#62;</div><div class="code_line">#include &#60;sys/socket.h&#62;</div><div class="code_line">#include &#60;arpa/inet.h&#62;</div><div class="code_line">#include &#60;unistd.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;int sock = 0, valread;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct sockaddr_in serv_addr;</div><div class="code_line">&nbsp;&nbsp; &nbsp;const char *hello = &quot;Hello from client&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char buffer[1024] = {0};</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((sock = socket(AF_INET, SOCK_STREAM, 0)) &#60; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cerr &#60;&#60; &quot;\n Socket creation error \n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;serv_addr.sin_family = AF_INET;</div><div class="code_line">&nbsp;&nbsp; &nbsp;serv_addr.sin_port = htons(8080);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (inet_pton(AF_INET, &quot;127.0.0.1&quot;, &amp;serv_addr.sin_addr) &#60;= 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cerr &#60;&#60; &quot;\nInvalid address/ Address not supported \n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (connect(sock, (struct sockaddr *)&amp;serv_addr, sizeof(serv_addr)) &#60; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cerr &#60;&#60; &quot;\nConnection Failed \n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;send(sock, hello, strlen(hello), 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;Hello message sent\n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;valread = read(sock, buffer, 1024);</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; buffer &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">CMakeLists.txt</span></span><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">cmake_minimum_required(VERSION 3.0)</div><div class="code_line">project(TestThreads)</div><div class="code_line">&nbsp;</div><div class="code_line">set(CMAKE_CXX_STANDARD 11)</div><div class="code_line">set(CMAKE_EXE_LINKER_FLAGS &quot;${CMAKE_EXE_LINKER_FLAGS} -static&quot;)</div><div class="code_line">&nbsp;</div><div class="code_line">add_executable(server server.cpp)</div><div class="code_line">add_executable(client client.cpp)</div></ol></div></div></div></div><br>
<span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">build.sh</span></span><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#!/usr/bin/sh</div><div class="code_line">&nbsp;</div><div class="code_line">mkdir build</div><div class="code_line">cd build</div><div class="code_line">cmake -G Ninja ..</div><div class="code_line">ninja</div></ol></div></div></div></div><br>
Запускаем сборку. Следует заметить, что в пакетном файле переменную окружения PATH мы не модифицируем. Тем самым запускается &quot;родная&quot; версия <span class="tag-font" data-value="Courier" style="font-family:Courier">cmake</span>, которая также ищет &quot;родные&quot; компиляторы и бинутилсы, которые располагаются непосредственно в <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="purple" style="color: purple">/usr/bin</span></span>. После сборки получаем два исполняемых файла формата PE (виндовых). Однако, хоть и проект был собран статически, одна динамическая зависимость осталась. Для работы исполняемым файлам нужно положить рядом <span class="tag-font" data-value="Courier" style="font-family:Courier">msys-2.0.dll</span> (его можно взять из /usr/bin).<br>
<br>
Запускаем сперва server.exe - программа висит и ждёт. Запускаем во втором окне client.exe. Обе программы завершают свою работу. При этом в окне sever.exe видим вывод:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Hello from client</div><div class="code_line">Hello message sent</div></ol></div></div></div></div><br>
А в окне client.exe:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Hello message sent</div><div class="code_line">Hello from server</div></ol></div></div></div></div><br>
Вот, собственно, такими нехитрыми манипуляциями мы собрали Linux-специфичный проект, и запустили его под M&#036; Windows  :thanks:]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899761</guid>
        <pubDate>Fri, 02 Feb 2024 19:55:36 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899761</link>
        <description><![CDATA[Eretic: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899760'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T18:46:20+00:00">02.02.24, 18:46</time></span><div class='quote '>Ну, я пытался оградить тебя от условных переменных, потому что их нет в WinAPI. Точнее, есть, в лице событий, и они в общем-то удобнее в использовании, но менее функциональны, т.к. способны – посредством WaitForMultipleObjects() – покрыть лишь некоторый поддиапазон возможных комбинаций условий. Но коли ты уже взялся за них, на здоровье.</div></div><br>
Рыская по инету я естественно встречал это понятие, но не понял о чём вообще речь. Потом случайно набрел на книгу некоего Уильямс Э. - &quot;Параллельное программирование на C++&quot;. Прочитал главы, посвященные мьютексам и понял что мне нужно :) Поскольку читал бегло, еще не всё понял, а контейнеры потоков вообще пропустил. Но на досуге добью книжёнку.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899760'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T18:46:20+00:00">02.02.24, 18:46</time></span><div class='quote '>голова поломается ещё</div></div><br>
Уже пухнет :) Сколько сегодня инета перелопатил - уму непостижимо. Но в целом картина многопоточности более-менее становится понятной. Во многом похожа на виндозную, разве что нет некоторых удобных вещей (или я их пока не нашел), а может просто кажется в силу моей привычки. <br>
=============================================<br>
Первый модуль готов, ввод/вывод работает как положено, строго по заданию (нет постоянного опроса буфера, нет глобальных переменных и тд).<br>
Завтра займусь сокетами. Надеюсь удастся подобрать что-нибудь универсальное. А то время поджимает.]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899760</guid>
        <pubDate>Fri, 02 Feb 2024 18:46:20 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899760</link>
        <description><![CDATA[Qraizer: Ну, я пытался оградить тебя от условных переменных, потому что их нет в WinAPI. Точнее, есть, в лице событий, и они в общем-то удобнее в использовании, но менее функциональны, т.к. способны – посредством WaitForMultipleObjects() – покрыть лишь некоторый поддиапазон возможных комбинаций условий. Но коли ты уже взялся за них, на здоровье.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899759'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T17:50:42+00:00">02.02.24, 17:50</time></span><div class='quote '>Проблемка в том, что<br>
io_cond.wait(guard, []{return &#33;buf.empty();});<br>
ругается, мол нельзя использовать this.</div></div>Можно. Просто передай его списком захвата:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">io_cond.wait(guard, [this]{return !buf.empty();});</div></ol></div></div></div></div><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899759'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T17:50:42+00:00">02.02.24, 17:50</time></span><div class='quote '>А главное вместо лямбды нельзя подставить функцию.</div></div>Можно. Подойдёт любой функциональный объект с синопсисом bool(). В частности и простые функции, но с ними неудобно то, что у них не должно быть параметров, а лямбды с захватом это решают влёгкую. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-02T18:48:15+00:00">02.02.24, 18:48</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899759'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T17:50:42+00:00">02.02.24, 17:50</time></span><div class='quote '>Заработало&#33;&#33;&#33;</div></div>А. О. Ну нормалёк, чё. :good: <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-02T18:53:07+00:00">02.02.24, 18:53</time></span></span><br>
P.S. С this в списке захвата, как и с любым указателем или ссылкой, нужно быть аккуратным. Время жизни лямбды может превысить время жизни подссыльного объекта. В общем случае я бы рекомендовал захватывать через weak_ptr. Но не счас, слишком много сразу – голова поломается ещё.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899759</guid>
        <pubDate>Fri, 02 Feb 2024 17:50:42 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899759</link>
        <description><![CDATA[Eretic: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899747'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T14:00:16+00:00">02.02.24, 14:00</time></span><div class='quote '>Дык и используй мьютексы.</div></div><br>
Пытаюсь. Правда немного по другому.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">class IOBuffer</div><div class="code_line">{</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::list&#60;std::string&#62; buf;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::condition_variable io_cond;</div><div class="code_line">....</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual void put(std::string in_str) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::lock_guard&#60;std::mutex&#62; lock(io_mutex);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;buf.push_back(in_str);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;io_cond.notify_one();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;virtual std::string _wait()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::unique_lock&#60;std::mutex&#62; guard(io_mutex);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;io_cond.wait(guard, []{return !buf.empty();});</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::string tmp = get_unlock();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;guard.unlock();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">....</div><div class="code_line">&nbsp;</div><div class="code_line">void output_thread(IOBuffer *io_buffer)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;OUTString str;</div><div class="code_line">&nbsp;&nbsp; &nbsp;str.clear();</div><div class="code_line">&nbsp;&nbsp; &nbsp;str.append_string(io_buffer-&#62;_wait());</div></ol></div></div></div></div><br>
То есть в начале потока, что должен извлекать данные с общего буфера и отправлять в другую программу, вызываем метод _wait(), который по идее организует остановку потока до тех пор, пока не придут данные в буфер (io_cond.notify_one()).<br>
Проблемка в том, что <br>
io_cond.wait(guard, []{return &#33;buf.empty();});<br>
ругается, мол нельзя использовать this. А главное вместо лямбды нельзя подставить функцию. Вот пытаюсь придумать, как обойти ограничение, очень уж идея понравилась на счет засыпания треда. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-02T17:52:47+00:00">02.02.24, 17:52</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899746'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T13:19:39+00:00">02.02.24, 13:19</time></span><div class='quote '>Это одна из реализаций компилятора языка С/C++. Так же есть реализации от Microsoft (MSVC), Intel (Intel OneAPI), GNU Compiller Collection (gcc или g++).</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899748'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T14:03:30+00:00">02.02.24, 14:03</time></span><div class='quote '>Надеюсь, ситуация прояснилась.<br>
</div></div><br>
Спасибо ребята, теперь более менее понятно. Скоро линукс по программе, там уже поглубже копну :) <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-02T17:58:42+00:00">02.02.24, 17:58</time></span></span><br>
Кстати, что за ошибку выдаёт VSCode:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">на вложенную функцию &quot;this&quot; нельзя ссылаться внутри тела лямбды, если она не находится в списке записей</div></ol></div></div></div></div><br>
Это где я в лямбду пытаюсь подставить строку из класса. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-02T18:05:42+00:00">02.02.24, 18:05</time></span></span><br>
Заработало&#33;&#33;&#33;<br>
Надо было this в [] добавить:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">io_cond.wait(guard, [this]{return !buf.empty();});</div></ol></div></div></div></div>]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899755</guid>
        <pubDate>Fri, 02 Feb 2024 14:38:35 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899755</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899754'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T14:22:38+00:00">02.02.24, 14:22</time></span><div class='quote '>Это даже не противоречит</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899754'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T14:22:38+00:00">02.02.24, 14:22</time></span><div class='quote '>Пакетный менеджер для MinGW</div></div><br>
Противоречие самое малое - пакетный менеджер, он для MSYS2, а не для MinGW. MinGW - там часть. Противоречие в том, что не MinGW там &quot;главный&quot; :lol: <br>
Иными словами что кого включает. MSYS2 и его утиль включает MinGW. Но не наоборот. Это как сказать, что &quot;Linux - это дополнительные пакеты, который добавляет к gcc возможности частичной установки по мере необходимости&quot; ;)]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899754</guid>
        <pubDate>Fri, 02 Feb 2024 14:22:38 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899754</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899748'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T14:03:30+00:00">02.02.24, 14:03</time></span><div class='quote '>Немножко наоборот </div></div>Это даже не противоречит<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899748'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T14:03:30+00:00">02.02.24, 14:03</time></span><div class='quote '>MSYS2 - это система эмуляции Linux-окружения (если точнее - ArchLinux-окружения). В ней различные реализации MinGW-w64 подключаются как тулчейны. Для каждого вида тулчейна имеется набор предсобранных библиотек. И конечно, чтобы этим пользоваться - нужно нужное ставить с помощью пакетного менелдера pacman.</div></div><br>
сказанному тут<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899746'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T13:19:39+00:00">02.02.24, 13:19</time></span><div class='quote '>MSYS и MSYS2 это дополнительные пакеты, который добавляет к MinGW возможности частичной установки по мере необходимости. Это позволяет не загружать, достаточно объемную, коллекцию программ из MinGW. Т.е. по сути это менеджеры пакетов, включенных в состав MinGW. Если этот менеджер что-то оставил пустым, то вы просто не установили этот пакет. Если он вам нужен, то его надо просто добавить.</div></div><br>
Есть там эмуляция среды linux или нет - не важно. Главное эффект. Пакетный менеджер для MinGW]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899749</guid>
        <pubDate>Fri, 02 Feb 2024 14:08:34 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899749</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899745'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T12:30:27+00:00">02.02.24, 12:30</time></span><div class='quote '>Уточнил на счет взаимодействия программ. Действительно на сокетах. Хорошая &quot;крссплатформенная&quot; засада</div></div>Совершенно несложно учесть разницу в конструкторах объектов-сокетах. Делов-то на один API-вызов. Но не сокетами ж едиными. Есть ещё файлы в &#036;TEMP (...я бы так и вообще намутил basic_socketstream&lt;&gt; и натравил на std::​(i|o|io)stream), eсть готовые библиотеки, если <s class='tag-s'>религия</s> заказчик не возражает.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899748</guid>
        <pubDate>Fri, 02 Feb 2024 14:03:30 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899748</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899746'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T13:19:39+00:00">02.02.24, 13:19</time></span><div class='quote '>MSYS и MSYS2 это дополнительные пакеты, который добавляет к MinGW возможности частичной установки по мере необходимости.</div></div><br>
Немножко наоборот :lol: MSYS2 - это система эмуляции Linux-окружения (если точнее - ArchLinux-окружения). В ней различные реализации MinGW-w64 подключаются как тулчейны. Для каждого вида тулчейна имеется набор предсобранных библиотек. И конечно, чтобы этим пользоваться - нужно нужное ставить с помощью пакетного менелдера pacman.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899745'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T12:30:27+00:00">02.02.24, 12:30</time></span><div class='quote '>Я же не знаю какие папки и для чего нужны.</div></div><br>
На первых шагах тебе будет достаточно понять какие тулчейны есть в MSYS2. Давай сделаем поиск:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">pacman -Ss gcc</div></ol></div></div></div></div><br>
Среди всего вывода выбираем именно gcc:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">clangarm64/mingw-w64-clang-aarch64-gcc-compat</div><div class="code_line">mingw32/mingw-w64-i686-gcc </div><div class="code_line">mingw64/mingw-w64-x86_64-gcc</div><div class="code_line">ucrt64/mingw-w64-ucrt-x86_64-gcc</div><div class="code_line">clang32/mingw-w64-clang-i686-gcc-compat </div><div class="code_line">clang64/mingw-w64-clang-x86_64-gcc-compat</div></ol></div></div></div></div><br>
Т.е. имеем список тулчейнов:<br>
<ul class="tag-list"><li>clangarm64</li><li>mingw32</li><li>mingw64</li><li>ucrt64</li><li>clang32</li><li>clang64</li></ul>Естественно, для того чтобы ими пользоваться - их нужно предварительно установить той же программой pacman. Сама же среда MSYS2 изначально устанавливает только базовые наборы утилит, при установке MSYS2 тулчейны автоматически не ставятся. Надеюсь, ситуация прояснилась.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899747</guid>
        <pubDate>Fri, 02 Feb 2024 14:00:16 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899747</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899745'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T12:30:27+00:00">02.02.24, 12:30</time></span><div class='quote '>Если в винде есть такое замечательное средство, как WaitForXXXXObject и мьютексы для пробуждения трэда, то в std::thread я ничего похожего не нашел.</div></div>Дык и используй мьютексы. Поток исполнения сам по себе объектов синхронизации не содержит, даже в WinAPI. Что-то типа (внимание, синтетика&#33;):<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">std::queue&#60;std::string&#62; msgs;</div><div class="code_line">std::mutex &nbsp; &nbsp; &nbsp; &nbsp; queueLock;</div><div class="code_line">std::timed_mutex &nbsp; &nbsp; evQueue;</div><div class="code_line">&nbsp;</div><div class="code_line">void queueAdd(const std::string&amp; str)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::lock_guard&#60;std::mutex&#62; guard(queueLock);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;msgs.emplace(str);</div><div class="code_line">&nbsp;&nbsp;evQueue.unlock();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">std::string queueGet()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::lock_guard&#60;std::mutex&#62; guard(queueLock);</div><div class="code_line">&nbsp;&nbsp;std::string &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; str(std::move(msgs.front()));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;msgs.pop();</div><div class="code_line">&nbsp;&nbsp;if (msgs.empty()) evQueue.lock();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return str;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">std::mutex evExit;</div><div class="code_line">&nbsp;</div><div class="code_line">void workThread()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;using namespace std::literals::chrono_literals;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;while (!evExit.try_lock())</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (evQueue.try_lock_for(100ms))</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;evQueue.unlock();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;doSome(queueGet());</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;evExit.lock();</div><div class="code_line">&nbsp;&nbsp;evQueue.lock();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::thread th1(workThread);</div><div class="code_line">&nbsp;</div><div class="code_line">/* ... */</div><div class="code_line">&nbsp;&nbsp;evExit.unlock();</div><div class="code_line">&nbsp;&nbsp;th1.join();</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899746</guid>
        <pubDate>Fri, 02 Feb 2024 13:19:39 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899746</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899745'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T12:30:27+00:00">02.02.24, 12:30</time></span><div class='quote '>Даже в данном случае. Что за clang?</div></div><br>
Это одна из реализаций компилятора языка С/C++. Так же есть реализации от Microsoft (MSVC), Intel (Intel OneAPI), GNU Compiller Collection (gcc или g++).<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899745'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T12:30:27+00:00">02.02.24, 12:30</time></span><div class='quote '>что за ulang и чем всё это отличается от minGW?</div></div><br>
Не знаю где вы нашли ulang. Я первый раз о таком услышал от вас, но вот MinGW это пакет утилит для Windows, который собирает все (или большинство) программ из коллекции GCC. Сама GCC разрабатывается как Open Source проект под Unix операционные системы и включает кучу различных утилит, реализующих интерпретацию программ <a class='tag-url' href='https://ru.wikipedia.org/wiki/GNU_Compiler_Collection#Языки' target='_blank'>на многих языках программирования</a> (не только C/C++, но и другие).<br>
<br>
MSYS и MSYS2 это дополнительные пакеты, который добавляет к MinGW возможности частичной установки по мере необходимости. Это позволяет не загружать, достаточно объемную, коллекцию программ из MinGW. Т.е. по сути это менеджеры пакетов, включенных в состав MinGW. Если этот менеджер что-то оставил пустым, то вы просто не установили этот пакет. Если он вам нужен, то его надо просто добавить.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899745'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-02T12:30:27+00:00">02.02.24, 12:30</time></span><div class='quote '>И здесь тупик. Если в винде есть такое замечательное средство, как WaitForXXXXObject и мьютексы для пробуждения трэда, то в std::thread я ничего похожего не нашел. Или цитату стоит воспринимать как опрос раз в секунду-две, с последующим засыпанием? Есть у кого дельные мысли?</div></div><br>
Можно сделать lock на буфер.]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899745</guid>
        <pubDate>Fri, 02 Feb 2024 12:30:27 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899745</link>
        <description><![CDATA[Eretic: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899708'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-02-01T19:35:34+00:00">01.02.24, 19:35</time></span><div class='quote '>1) Тулчейн для clang64<br>
2) cmake для clang64<br>
3) ninja для clang64<br>
</div></div><br>
Да, папки были пустые. Меня это удивило, но раз инсталлятор так сделал, значит так надо. Я же не знаю какие папки и для чего нужны.<br>
Беда всех инет FAQ по minGW и MSYS в том, что ни в одном не нашел хотя бы краткого описания: что за пакеты ставят, для чего? Везде просто инструкции, типа ставим xxxx-yyyy-zzzz.??? и будет счастье :)<br>
Даже в данном случае. Что за clang? что за ulang и чем всё это отличается от minGW? Это хорошо когда человек знает что ему нужно, а когда нет времени читать книги на сотни страниц? <br>
===============================================<br>
Ну да ладно. Главное работает :)<br>
<br>
Потоки сделал. Классы для приёма и первичной обработки внешних данных (первый поток) и для дальнейшей обработки вторым потоком сделал. Работают. Правда там упоминается один буфер на два потока, я сделал класс буфера (там же мьютекс для доступа нужен) с std::list, хуже не будет, зато избавляет от некоторых проблем.<br>
Теперь осталось еще одно условие: <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">поток №2 не должен постоянно опрашивать общий буфер.</div></ol></div></div></div></div><br>
И здесь тупик. Если в винде есть такое замечательное средство, как WaitForXXXXObject и мьютексы для пробуждения трэда, то в std::thread я ничего похожего не нашел. Или цитату стоит воспринимать как опрос раз в секунду-две, с последующим засыпанием? Есть у кого дельные мысли?<br>
<br>
И еще. Уточнил на счет взаимодействия программ. Действительно на сокетах. Хорошая &quot;крссплатформенная&quot; засада  :D]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899728</guid>
        <pubDate>Fri, 02 Feb 2024 08:51:41 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899728</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899704'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-01T16:14:51+00:00">01.02.24, 16:14</time></span><div class='quote '>Это уже MSYS2 с оф. сайта установлена.</div></div><br>
Напомню, команда <span class="tag-font" data-value="Courier" style="font-family:Courier"><span class="tag-color tag-color-named" data-value="blue" style="color: blue">pacman -Ss название</span></span> показывает все, что найдено в репозитарии. А вот установленные пакеты обозначаются отдельно. См. скрин по стрелкам.<br>
<span class="b-attach" data-size="41182" data-hits="498" data-attach-id="65416" data-attach-post-id="3899728">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3899728&amp;attach_id=65416' title='Скачать файл' target='_blank'>msys2_install.png</a> (, : 498)
		</span>]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899708</guid>
        <pubDate>Thu, 01 Feb 2024 19:35:34 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899708</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899704'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-01T16:14:51+00:00">01.02.24, 16:14</time></span><div class='quote '>Это уже MSYS2 с оф. сайта установлена.</div></div><br>
Для сборки моего примера должны быть установлены:<br>
<br>
1) Тулчейн для clang64<br>
2) cmake для clang64<br>
3) ninja  для clang64<br>
<br>
Ошибка типа &quot;С compiler тру-ляля unknown&quot; говорит лишь о том, что хоть и путь /clang64/bin включен в build.sh, но по факту этот тулчейн не установлен, ЕМНИП. Надо аккуратно все установить, ну или в build.sh в путях прописать путь к другому, установленному тулчейну, например, /mingw64/bin.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899707</guid>
        <pubDate>Thu, 01 Feb 2024 19:33:26 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899707</link>
        <description><![CDATA[Eretic: А вот эта версия заработала&#33;<br>И даже VSCode подхватил, автоматом создав task.json, правда в него он прописал пути до старого, давно удаленного пакета. Переправил на нынешний пакет и всё ок.<br>Спасибо огромное&#33; Наконец-то займусь делом, тем более тут еще идеек подкинули :) <br><br>До этого две версии инсталляторов:<br>mingw-w64-v11.0.0.zip<br>mingw-get-setup.exe<br>и всякие msys, типа:<br>msys2-x86_64-20240113.exe]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899706</guid>
        <pubDate>Thu, 01 Feb 2024 19:24:17 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899706</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899702'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2024-02-01T15:52:53+00:00">01.02.24, 15:52</time></span><div class='quote '>Попробуй тут почитать - вдруг поможет.<br>
Или здесь</div></div><br>
Запутаешь человека ссылками на это старьё&#33; &gt;:( <br>
<br>
Установка MSYS2 уже включает разновсяческие тулчейны из mingw-w64 (<strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color: red">не нужно отдельно ставить MINGW</span></strong>). Если они не установлены, они ставятся с помощью pacman. Тамошние потуги сборки внешних библиотек и инструментов также в большей части бесполезны, т.к. либы также ставятся с помощью pacman. На примере pkg-conf ...<br>
<br>
Смотрим что у нас установлено:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">pacman -Ss pkg-conf</div></ol></div></div></div></div><br>
Решили установить нужное:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">pacman -S clang64/mingw-w64-clang-x86_64-pkg-config</div></ol></div></div></div></div><br>
Очень много либ уже пердкомпилировано и собрано, остается только вот так установить. А самостоятельно собирать нужно ну что-то уж совсем экзотическое.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899705</guid>
        <pubDate>Thu, 01 Feb 2024 17:55:35 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899705</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899704'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-01T16:14:51+00:00">01.02.24, 16:14</time></span><div class='quote '>Это уже MSYS2 с оф. сайта установлена.</div></div><br>
Все же попробуйте установить linux на VirtualBox. Хотя странно у вас MinGW себя ведет. Я вам еще в #3 давал <a class='tag-url' href='https://github.com/Vuniverse0/mingwInstaller/releases/download/1.2.0/mingwInstaller.exe' target='_blank'>ссылку на скачивание MinGW</a> (повторю, если не нашли для своей ОС). Это уже сразу Online установщик для MinGW-64<br>
<br>
У меня, скачанный по этой ссылке MinGW-64, нормально собирает пример от <strong class='tag-b'>Majestio</strong> через g++ (не через его build.sh). Правда я немного изменил его, используя int вместо double в задержке и выставил задержку в основном потоке. Так же добавил сообщения о завершении потока.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;thread&#62;</div><div class="code_line">#include &#60;chrono&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">void printWithDelay(int tid, int delay) {</div><div class="code_line">&nbsp;&nbsp;for (int i = 0; i &#60; 5; ++i) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::this_thread::sleep_for(std::chrono::milliseconds(delay));</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;Thread ID = &quot; &#60;&#60; tid &#60;&#60; &quot; echo &quot; &#60;&#60; i &#60;&#60; &quot; . . .&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;Thread [&quot; &#60;&#60; tid &#60;&#60; &quot;] exit.&quot; &#60;&#60; std::endl;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp;std::thread t1(printWithDelay, 1, 500);</div><div class="code_line">&nbsp;&nbsp;std::thread t2(printWithDelay, 2, 750);</div><div class="code_line">&nbsp;&nbsp;std::thread t3(printWithDelay, 3, 900);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;t1.join();</div><div class="code_line">&nbsp;&nbsp;t2.join();</div><div class="code_line">&nbsp;&nbsp;t3.join();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::this_thread::sleep_for(std::chrono::milliseconds(20000));</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Вот так у меня выглядит вывод в консоль от этой программы<br>
<span class="b-attach" data-size="14497" data-hits="555" data-attach-id="65412" data-attach-post-id="0">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=0&amp;attach_id=65412' title='Скачать файл' target='_blank'>Screenshot_20240201_204347.png</a> (, : 555)
		</span><br>
<br>
ADD: Скрин из wine под linux, но запускал установленный MinGW g++.exe. Он кстати более низкой версии, чем в установленный на linux<br>
<br>
<span class="b-attach" data-size="44193" data-hits="533" data-attach-id="65413" data-attach-post-id="3899705">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3899705&amp;attach_id=65413' title='Скачать файл' target='_blank'>Screenshot_20240201_210240.png</a> (, : 533)
		</span>]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899704</guid>
        <pubDate>Thu, 01 Feb 2024 16:14:51 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899704</link>
        <description><![CDATA[Eretic: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">build.sh: line 7: cmake: command not found</div></ol></div></div></div></div><br>
Сейчас переустановлю переустановлю... <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-01T16:22:53+00:00">01.02.24, 16:22</time></span></span><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">$ sh build.sh</div><div class="code_line">mkdir: cannot create directory ‘build’: File exists</div><div class="code_line">CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):</div><div class="code_line">&nbsp;&nbsp;Compatibility with CMake &#60; 3.5 will be removed from a future version of</div><div class="code_line">&nbsp;&nbsp;CMake.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Update the VERSION argument &#60;min&#62; value or use a ...&#60;max&#62; suffix to tell</div><div class="code_line">&nbsp;&nbsp;CMake that the project does not need compatibility with older versions.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">-- The C compiler identification is unknown</div><div class="code_line">-- The CXX compiler identification is unknown</div><div class="code_line">CMake Error at CMakeLists.txt:2 (project):</div><div class="code_line">&nbsp;&nbsp;No CMAKE_C_COMPILER could be found.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Tell CMake where to find the compiler by setting either the environment</div><div class="code_line">&nbsp;&nbsp;variable &quot;CC&quot; or the CMake cache entry CMAKE_C_COMPILER to the full path to</div><div class="code_line">&nbsp;&nbsp;the compiler, or to the compiler name if it is in the PATH.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">CMake Error at CMakeLists.txt:2 (project):</div><div class="code_line">&nbsp;&nbsp;No CMAKE_CXX_COMPILER could be found.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Tell CMake where to find the compiler by setting either the environment</div><div class="code_line">&nbsp;&nbsp;variable &quot;CXX&quot; or the CMake cache entry CMAKE_CXX_COMPILER to the full path</div><div class="code_line">&nbsp;&nbsp;to the compiler, or to the compiler name if it is in the PATH.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">-- Configuring incomplete, errors occurred!</div><div class="code_line">ninja: error: loading &#39;build.ninja&#39;: ═х єфрхЄё  эрщЄш єърчрээ√щ Їрщы.</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Andrey@DESKTOP-8J6CIOK MSYS /D/Dev/Projects/CPP/Work</div><div class="code_line">$ pacman -Ss ninja</div><div class="code_line">clangarm64/mingw-w64-clang-aarch64-cninja 3.7.9-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;cninja, an opinionated cmake config manager</div><div class="code_line">clangarm64/mingw-w64-clang-aarch64-gn 0.2131.85944ebc-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;Meta-build system that generates build files for Ninja (mingw-w64)</div><div class="code_line">clangarm64/mingw-w64-clang-aarch64-ninja 1.11.1-3</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ninja is a small build system with a focus on speed (mingw-w64)</div><div class="code_line">mingw32/mingw-w64-i686-cninja 3.7.9-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;cninja, an opinionated cmake config manager</div><div class="code_line">mingw32/mingw-w64-i686-ninja 1.11.1-3</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ninja is a small build system with a focus on speed (mingw-w64)</div><div class="code_line">mingw64/mingw-w64-x86_64-cninja 3.7.9-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;cninja, an opinionated cmake config manager</div><div class="code_line">mingw64/mingw-w64-x86_64-gn 0.2131.85944ebc-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;Meta-build system that generates build files for Ninja (mingw-w64)</div><div class="code_line">mingw64/mingw-w64-x86_64-ninja 1.11.1-3</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ninja is a small build system with a focus on speed (mingw-w64)</div><div class="code_line">ucrt64/mingw-w64-ucrt-x86_64-cninja 3.7.9-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;cninja, an opinionated cmake config manager</div><div class="code_line">ucrt64/mingw-w64-ucrt-x86_64-gn 0.2131.85944ebc-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;Meta-build system that generates build files for Ninja (mingw-w64)</div><div class="code_line">ucrt64/mingw-w64-ucrt-x86_64-ninja 1.11.1-3</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ninja is a small build system with a focus on speed (mingw-w64)</div><div class="code_line">clang32/mingw-w64-clang-i686-cninja 3.7.9-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;cninja, an opinionated cmake config manager</div><div class="code_line">clang32/mingw-w64-clang-i686-ninja 1.11.1-3</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ninja is a small build system with a focus on speed (mingw-w64)</div><div class="code_line">clang64/mingw-w64-clang-x86_64-cninja 3.7.9-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;cninja, an opinionated cmake config manager</div><div class="code_line">clang64/mingw-w64-clang-x86_64-gn 0.2131.85944ebc-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;Meta-build system that generates build files for Ninja (mingw-w64)</div><div class="code_line">clang64/mingw-w64-clang-x86_64-ninja 1.11.1-3 [installed]</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ninja is a small build system with a focus on speed (mingw-w64)</div><div class="code_line">msys/ninja 1.11.1-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ninja is a small build system with a focus on speed</div><div class="code_line">msys/ninja-emacs 1.11.1-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ninja is a small build system with a focus on speed (Emacs mode)</div><div class="code_line">msys/ninja-vim 1.11.1-1</div><div class="code_line">&nbsp;&nbsp; &nbsp;Ninja is a small build system with a focus on speed (vim mode)</div></ol></div></div></div></div><br>
Это уже MSYS2 с оф. сайта установлена.]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899702</guid>
        <pubDate>Thu, 01 Feb 2024 15:52:53 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899702</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899694'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-02-01T13:52:59+00:00">01.02.24, 13:52</time></span><div class='quote '>Похоже сборка криво встала, уже в который раз.<br>
Буду делать на каком-нибудь C++ под винду.</div></div><br>
Попробуй <a class='tag-url' href='https://uzverss.livejournal.com/38682.html' target='_blank'>тут</a> почитать - вдруг поможет.<br>
Или <a class='tag-url' href='https://ics.uci.edu/~pattis/common/handouts/mingweclipse/mingw.html' target='_blank'>здесь</a>]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899697</guid>
        <pubDate>Thu, 01 Feb 2024 14:16:27 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899697</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>Eretic</strong>, сделал тебе пример. Попробуй у себя ...<br>
<br>
Создай подкаталог для проекта, например: ~/dev/projects/test-threads<br>
Создай в нем три файла:<br>
<br>
<strong class='tag-b'>test-threads.cpp</strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;thread&#62;</div><div class="code_line">#include &#60;chrono&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">void printWithDelay(int id, double delay) {</div><div class="code_line">&nbsp;&nbsp;for (int i = 0; i &#60; 5; ++i) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::this_thread::sleep_for(std::chrono::milliseconds(static_cast&#60;int&#62;(delay * 1000)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;Thread [&quot; &#60;&#60; id &#60;&#60; &quot;] wrote: &quot; &#60;&#60; i &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp;std::thread t1(printWithDelay, 1, 0.5);</div><div class="code_line">&nbsp;&nbsp;std::thread t2(printWithDelay, 2, 0.6);</div><div class="code_line">&nbsp;&nbsp;std::thread t3(printWithDelay, 3, 0.7);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;t1.join();</div><div class="code_line">&nbsp;&nbsp;t2.join();</div><div class="code_line">&nbsp;&nbsp;t3.join();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<strong class='tag-b'>CMakeLists.txt</strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">cmake_minimum_required(VERSION 3.0)</div><div class="code_line">project(TestThreads)</div><div class="code_line">&nbsp;</div><div class="code_line">set(CMAKE_CXX_STANDARD 11)</div><div class="code_line">set(CMAKE_EXE_LINKER_FLAGS &quot;${CMAKE_EXE_LINKER_FLAGS} -static&quot;)</div><div class="code_line">&nbsp;</div><div class="code_line">add_executable(test-threads test-threads.cpp)</div></ol></div></div></div></div><br>
<strong class='tag-b'>build.sh</strong><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#!/usr/bin/sh</div><div class="code_line">&nbsp;</div><div class="code_line">export PATH=/clang64/bin:$PATH</div><div class="code_line">&nbsp;</div><div class="code_line">mkdir build</div><div class="code_line">cd build</div><div class="code_line">cmake -G Ninja ..</div><div class="code_line">ninja</div></ol></div></div></div></div><br>
Запусти сборку:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">sh build.sh</div></ol></div></div></div></div><br>
Если все пройдет нормально, то в каталоге проекта появится подкаталог <strong class='tag-b'>build</strong>, а в нем исполняемый файл. Если ninja не найден - установи его.<br>
<br>
Посмотреть варианты и что установлено:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">pacman -Ss ninja</div></ol></div></div></div></div><br>
Установить, например, clang64/mingw-w64-clang-x86_64-ninja:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">pacman -S clang64/mingw-w64-clang-x86_64-ninja</div></ol></div></div></div></div><br>
<strong class='tag-b'>И да, все манипуляции производятся в <span class="tag-color tag-color-named" data-value="red" style="color: red">терминальном окне MSYS2</span>.</strong> И не забывай - в Linux и вообще в *nix названия файлов и каталогов - регистрозависимые.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899694</guid>
        <pubDate>Thu, 01 Feb 2024 13:52:59 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899694</link>
        <description><![CDATA[Eretic: Разница только в том, что gcc выдаёт на одну ошибку больше:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">D:\Dev\Projects\CPP\Work\main.cpp:20:10: error: &#39;thread&#39; is not a member of &#39;std&#39;</div><div class="code_line">&nbsp;&nbsp; 20 | &nbsp; &nbsp; std::thread th(input_thread);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^~~~~~</div><div class="code_line">D:\Dev\Projects\CPP\Work\main.cpp:4:1: note: &#39;std::thread&#39; is defined in header &#39;&#60;thread&#62;&#39;; did you forget to &#39;#include &#60;thread&#62;&#39;?</div><div class="code_line">&nbsp;&nbsp; &nbsp;3 | #include &#60;vector&#62;</div><div class="code_line">&nbsp;&nbsp;+++ |+#include &#60;thread&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;4 | #include &#60;string&#62;</div></ol></div></div></div></div><br>
#include &lt;thread&gt; разумеется присутствует.<br>
Похоже сборка криво встала, уже в который раз.<br>
Буду делать на каком-нибудь C++ под винду. И надеюсь скомпилируется у них на gcc. А нет, так и чёрт с ними, итак целый день убил на бесконечную переустановку gcc :)]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899693</guid>
        <pubDate>Thu, 01 Feb 2024 12:41:47 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899693</link>
        <description><![CDATA[macomics: А как вы собираете: через gcc или g++?]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899680</guid>
        <pubDate>Thu, 01 Feb 2024 11:57:26 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899680</link>
        <description><![CDATA[Eretic: Спасибо ребята.<br>
Но пока, будете смеяться, никак не запущу поток. Выскакивает ошибка:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">D:\Dev\Projects\CPP\Work\main.cpp:20:10: error: &#39;thread&#39; is not a member of &#39;std&#39;</div><div class="code_line">&nbsp;&nbsp; 20 | &nbsp; &nbsp; std::thread th(input_thread);</div></ol></div></div></div></div><br>
#include &lt;thread&gt;<br>
подключилось без проблем. И какого дьявола gcc нужно?]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899679</guid>
        <pubDate>Thu, 01 Feb 2024 11:18:28 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899679</link>
        <description><![CDATA[Dushevny: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899605'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T16:43:14+00:00">31.01.24, 16:43</time></span><div class='quote '>как передать данные из одной программы в другую,</div></div>Я бы начал с проблемы &quot;как из всех запущенных копий другой программы выбрать нужную, в которую хотим прередать&quot;.]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899674</guid>
        <pubDate>Thu, 01 Feb 2024 10:25:56 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899674</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899605'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T16:43:14+00:00">31.01.24, 16:43</time></span><div class='quote '>А тут сразу gcc, да еще под линукс, который я и в глаза не видел.</div></div><br>
Можно поставить эмулятор и в нём работать.<br>
я использую VirtualBox + Fedora - отлично работает. <br>
Для &quot;Убинты&quot; пришлось gcc отдельно устанавливать, а в Федору<br>
сразу всё было встроено.<br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-01T10:32:59+00:00">01.02.24, 10:32</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899605'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T16:43:14+00:00">31.01.24, 16:43</time></span><div class='quote '>1) потоки в C++ создаются через std::thread? <br>
2) Потоком можно сделать класс? Точнее экземпляр класса? Есть какие то тонкости?<br>
3) какие стандартные средства есть для синхронизации доступа к данным между потоками? Просто я в винде всю жизнь использовал мьютексы и семафоры, а вот что есть в ++ даже не представляю.</div></div><br>
1) в Линуксе я использовал &quot;pthread_create&quot; и другие функции<br>
из &lt;pthread.h&gt;<br>
2) Да. Только так и работаю. Сделал базовый класс-поток, в котором<br>
виртуальная потоковая процедура - член класса. В библиотеку его,<br>
поскольку он полезен. Класс-поток конкретного проекта является наследником<br>
базового класса.<br>
3) Любые средства, какие есть в Линуксе. Те же семафоры.<br>
Тут лучше книги почитать. Лично я привык пользоваться критическими<br>
секциями, а в Линуксе я их не нашёл. Поэтому сделал класс &quot;критическая секция&quot;<br>
из семафора. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-02-01T10:36:45+00:00">01.02.24, 10:36</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899605'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T16:43:14+00:00">31.01.24, 16:43</time></span><div class='quote '>4) основная проблема: как передать данные из одной программы в другую, чтобы работало и на винде и на линуксе?</div></div><br>
Если необходимо такое, тогда можно попытаться<br>
освоить кросс-платформенную библиотеку.<br>
Вообще многое можно использовать. Файлы, сокеты итд.<br>
Книги надо читать.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899629</guid>
        <pubDate>Thu, 01 Feb 2024 05:07:06 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899629</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899628'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T23:11:11+00:00">31.01.24, 23:11</time></span><div class='quote '>Надеюсь не критично.<br>
Ну всё, завтра настрою и опробую.</div></div><br>
Гуд&#33; Последнюю команду можно (и нужно) запускать хотя бы раз в неделю. Просто чтобы поддерживать MSYS2 в актуальном состоянии. В моем случае это выглядит вот так:<br>
<span class="b-attach" data-size="46061" data-hits="968" data-attach-id="65407" data-attach-post-id="3899629">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3899629&amp;attach_id=65407' title='Скачать файл' target='_blank'>msys2_full_update.png</a> (, : 968)
		</span>]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899628</guid>
        <pubDate>Wed, 31 Jan 2024 23:11:11 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899628</link>
        <description><![CDATA[Eretic: С VPN поначалу тоже ошибки пошли:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">pacman -Syyuu</div><div class="code_line">:: Synchronizing package databases...</div><div class="code_line">&nbsp;clangarm64 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;429.2 KiB &nbsp; 391 KiB/s 00:01 [###############################] 100%</div><div class="code_line">&nbsp;mingw32 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 312.8 KiB &nbsp; 314 KiB/s 00:01 [###############################] 100%</div><div class="code_line">&nbsp;mingw64 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 476.9 KiB &nbsp; 431 KiB/s 00:01 [###############################] 100%</div><div class="code_line">&nbsp;ucrt64 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;485.4 KiB &nbsp; 459 KiB/s 00:01 [###############################] 100%</div><div class="code_line">&nbsp;clang32 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 306.2 KiB &nbsp; 295 KiB/s 00:01 [###############################] 100%</div><div class="code_line">&nbsp;clang64 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 476.5 KiB &nbsp;1876 KiB/s 00:00 [###############################] 100%</div><div class="code_line">&nbsp;msys &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;484.4 KiB &nbsp;1357 KiB/s 00:00 [###############################] 100%</div><div class="code_line">error: failed retrieving file &#39;clangarm64.db&#39; from mirror.msys2.org : Resolving timed out after 10005 milliseconds</div><div class="code_line">error: failed retrieving file &#39;mingw32.db&#39; from mirror.msys2.org : Connection time-out</div><div class="code_line">error: failed retrieving file &#39;mingw64.db&#39; from mirror.msys2.org : Connection time-out</div><div class="code_line">warning: too many errors from mirror.msys2.org, skipping for the remainder of this transaction</div><div class="code_line">error: failed retrieving file &#39;ucrt64.db&#39; from mirror.msys2.org : Connection time-out</div><div class="code_line">error: failed retrieving file &#39;clang32.db&#39; from mirror.msys2.org : Connection time-out</div><div class="code_line">:: Starting core system upgrade...</div><div class="code_line">&nbsp;there is nothing to do</div><div class="code_line">:: Starting full system upgrade...</div><div class="code_line">&nbsp;there is nothing to do</div></ol></div></div></div></div><br>
Правда уже без UA. И через минуту наконец-то заработало :)<br>
В процессе только одна ошибка и всплыла:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">$ pacman -S --noconfirm mingw-w64-i686-qt5 mingw-w64-i686-qt5-static mingw-w64-i686-qt5-doc</div><div class="code_line">error: target not found: mingw-w64-i686-qt5</div><div class="code_line">error: target not found: mingw-w64-i686-qt5-doc</div></ol></div></div></div></div><br>
Надеюсь не критично. <br>
Ну всё, завтра настрою и опробую.]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899627</guid>
        <pubDate>Wed, 31 Jan 2024 21:29:24 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899627</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899623'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T21:05:10+00:00">31.01.24, 21:05</time></span><div class='quote '>Ни один пакет не установился без подобных ошибок, начиная с самой первой команды: pacman -Suy<br>
Как быть? Я в целом знаю как через VPN гулять по всяким ChatGPT, но вот обманывать установщики, которые напрямую лезут в инет - нас не учили </div></div><br>
Вдогонку. MSYS2 использует пакетный менеджер от ArchLinux. <a class='tag-url' href='https://blackarch.ru/?p=817' target='_blank'>Глянь эту статью</a>. Можно попробовать поиграться с зеркалами. И да ... все варианты редактирования а-ля /etc/pacman.d/mirrorlist можно редактировать средствами винды (не обязательно из терминала MSYS2). Нужно только соблюдать правильные юниксовые переводы строк. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-01-31T21:30:44+00:00">31.01.24, 21:30</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899625'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T21:22:49+00:00">31.01.24, 21:22</time></span><div class='quote '>Мне кажется дело в другом:<br>
Failed to connect to fastmirror.pp.ua port 443</div></div><br>
В таких случаях должны перебираться резервные хранилища :-? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-01-31T21:41:00+00:00">31.01.24, 21:41</time></span></span><br>
Если совсем не получается - поставь PlanetVPN на время установки. Он бесплатный без выбора сервера (что дадут). Потом удалишь или выключишь за ненадобностью. И да, самой первой командой в терминале MSYS2 сделай полное обновление:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">pacman -Syyuu</div></ol></div></div></div></div>]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899626</guid>
        <pubDate>Wed, 31 Jan 2024 21:28:35 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899626</link>
        <description><![CDATA[macomics: Тогда попробуйте способ с виртуальной машиной. Не знаю как долго вы будете скачивать 3-5 Гб образ linux, но обычно он успешно устанавливается за 20 минут на виртуальную машину. Будет у вас на Windows окошко с монитором виртуальной машины и там будете работать (при желании сможете сделать его на весь экран). Приложения на том же Ubuntu ставятся через магазин приложений - бесплатно. Там и найдете VS Code.]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899625</guid>
        <pubDate>Wed, 31 Jan 2024 21:22:49 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899625</link>
        <description><![CDATA[Eretic: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899624'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T21:17:17+00:00">31.01.24, 21:17</time></span><div class='quote '>Явно с инетом большие проблемы</div></div><br>
Мне кажется дело в другом:<br>
Failed to connect to fastmirror.pp.<strong class='tag-b'>ua</strong> port 443]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899624</guid>
        <pubDate>Wed, 31 Jan 2024 21:17:17 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899624</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899623'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T21:05:10+00:00">31.01.24, 21:05</time></span><div class='quote '>Ни один пакет не установился без подобных ошибок, начиная с самой первой команды: pacman -Suy<br>
Как быть? Я в целом знаю как через VPN гулять по всяким ChatGPT, но вот обманывать установщики, которые напрямую лезут в инет - нас не учили </div></div><br>
Явно с инетом большие проблемы  :-? Я еженедельно обновляю свой MSYS2. Он вытягивает по 300-700Mb без единой ошибки. Что посоветовать в таком случае - затрудняюсь. Может другой канал в Инет поискать, провайдера сменить ... Не знаю. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-01-31T21:20:22+00:00">31.01.24, 21:20</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899622'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T20:24:54+00:00">31.01.24, 20:24</time></span><div class='quote '>Вот элементарный пример. Для взаимодействия предложили использовать socket. Но на Windows для работы с socket надо использовать WSAStartup и WSACleanup, которых нету в linux. Т.е. с виду работоспособный код для Windows под linux просто выдаст ошибку отсутствия функций.</div></div><br>
Лучше проблемы решать по мере их появления. Этого в задании пока не было. Зачем заранее тратить время на то, чего не просили. Вопрос риторический.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899623</guid>
        <pubDate>Wed, 31 Jan 2024 21:05:10 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899623</link>
        <description><![CDATA[Eretic: С MSYS2, по мере установки, возникают проблемы:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>error: failed retrieving file &#39;python-3.11.7-1-x86_64.pkg.tar.zst&#39; from mirror.msys2.org : Failed to connect to fastmirror.pp.ua port 443 after 10011 ms: Timeout was reached<br>
error: failed retrieving file &#39;cppdap-1.58.0a-3-x86_64.pkg.tar.zst&#39; from mirror.msys2.org : Connection timeout after 10000 ms<br>
error: failed retrieving file &#39;libarchive-3.7.2-1-x86_64.pkg.tar.zst&#39; from mirror.msys2.org : Connection timeout after 10000 ms<br>
warning: too many errors from mirror.msys2.org, skipping for the remainder of this transaction<br>
error: failed retrieving file &#39;librhash-1.4.3-1-x86_64.pkg.tar.zst&#39; from mirror.msys2.org : Connection timeout after 10000 ms<br>
</div></div><br>
Ни один пакет не установился без подобных ошибок, начиная с самой первой команды: pacman -Suy<br>
Как быть? Я в целом знаю как через VPN гулять по всяким ChatGPT, но вот обманывать установщики, которые напрямую лезут в инет - нас не учили :( <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-01-31T21:16:48+00:00">31.01.24, 21:16</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899622'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T20:24:54+00:00">31.01.24, 20:24</time></span><div class='quote '>Затем, что по заданию она должна компилироваться на linux. И вот тут косяк, если из-за как-то не учтенной особенности linux, не выученной своевременно, программа просто не сможет откомпилироваться.</div></div><br>
Мне не настолько нужна эта практика, чтобы ради неё делать слишком серьезные телодвижения :) Мой ноут у меня детишки изъяли, а мне взамен подарили это чудо, на 1,1 ГГц :) Для работы хватает, а вот что серьёзнее - уже нет. Поэтому и собираю комп, 8-ми ядерник, с 32 Гб памяти. У нас ближе к весне в программе обучения будет линукс, в частности его установка на виртуалку. Вот тогда и познакомлюсь с ним поближе, тем более как раз комп будет готов.<br>
Пока же попробую в винде. Не получится - да и фиг с ней, к лету еще конторы найдутся для практики.]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899622</guid>
        <pubDate>Wed, 31 Jan 2024 20:24:54 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899622</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899621'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T20:18:47+00:00">31.01.24, 20:18</time></span><div class='quote '>Зачем сейчас всё усложнять?</div></div><br>
Затем, что по заданию она должна компилироваться на linux. И вот тут косяк, если из-за как-то не учтенной особенности linux, не выученной своевременно, программа просто не сможет откомпилироваться.<br>
<br>
Вот элементарный пример. Для взаимодействия предложили использовать socket. Но на Windows для работы с socket надо использовать WSAStartup и WSACleanup, которых нету в linux. Т.е. с виду работоспособный код для Windows под linux просто выдаст ошибку отсутствия функций.]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899621</guid>
        <pubDate>Wed, 31 Jan 2024 20:18:47 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899621</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899620'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T20:12:20+00:00">31.01.24, 20:12</time></span><div class='quote '>Если он будет использовать glibc, тогда все это не понадобится до поры до времени. Но, если программа должна работать под linux, то без изучения всех этих особенностей не обойтись. Адаптировать код под несколько операционных систем без изучения их особенностей не получится. И для кросс-платформенного проекта придется все это освоить.<br>
<br>
В любом случае начинать осваивать gcc на linux проще чем на windows. На windows отсутствует man pages (как аналог MSDN и справки по glibc) и другие ресурсы с информацией. Её приведётся откапывать в интернете. А в те же оконные менеджеры (KDE, Gnome, Mate etc) уже встроены приложения, которые позволяют удобно искать страницы man pages даже не зная их названия, а по их содержимому.</div></div><br>
Ему нужно <strong class='tag-b'>пока</strong> лишь выполнить тестовое задание. Зачем сейчас всё усложнять? Разборки с Линуксом - это отдельная тема. Полезная? Несомненно. Но это совсем другая история... Заканчиваю - решать топикстартеру.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899620</guid>
        <pubDate>Wed, 31 Jan 2024 20:12:20 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899620</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899619'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:59:47+00:00">31.01.24, 19:59</time></span><div class='quote '>шел, пакетные менеджеры, особенности ФС и пр. пр.</div></div><br>
Это так и так понадобится по заданию.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899619'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:59:47+00:00">31.01.24, 19:59</time></span><div class='quote '>Все это ты предлагаешь изучить человеку, который все время просидел на винде, лишь для того, чтобы разобраться с gcc.</div></div><br>
Если он будет использовать glibc, тогда все это не понадобится до поры до времени. Но, если программа должна работать под linux, то без изучения всех этих особенностей не обойтись. Адаптировать код под несколько операционных систем без изучения их особенностей не получится. И для кросс-платформенного проекта придется все это освоить.<br>
<br>
В любом случае начинать осваивать gcc на linux проще чем на windows. На windows отсутствует man pages (как аналог MSDN и справки по glibc) и другие ресурсы с информацией. Её приведётся откапывать в интернете. А в те же оконные менеджеры (KDE, Gnome, Mate etc) уже встроены приложения, которые позволяют удобно искать страницы man pages даже не зная их названия, а по их содержимому. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-01-31T20:15:48+00:00">31.01.24, 20:15</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899618'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:59:46+00:00">31.01.24, 19:59</time></span><div class='quote '>а ноут прочно завязан на винду (есть специфические приложения, нужные по работе).</div></div><br>
В этом случае можно поставить виртуальную машину и на нее поставить linux. <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=441866&st=0&#' target='_blank'>Я об этом способе написал еще в #3.</a> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-01-31T20:17:51+00:00">31.01.24, 20:17</time></span></span><br>
Для виртуальной машины с Linux вам достаточно: 1.5 GHz процессора (одноядерного), 2048 + 64 Мб RAM и 20 Гб на жестком диске]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899619</guid>
        <pubDate>Wed, 31 Jan 2024 19:59:47 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899619</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899617'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:35:44+00:00">31.01.24, 19:35</time></span><div class='quote '>У Linux такой же интуитивный интерфейс как у Windows и, уже давно, куда удобнее чем на Windows.</div></div><br>
 :facepalm: свои - шел, пакетные менеджеры, особенности ФС и пр. пр. Все это ты предлагаешь изучить человеку, который все время просидел на винде. Лишь для того, чтобы разобраться с gcc. Не на одном GUI свет клином сошёлся же. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-01-31T20:04:26+00:00">31.01.24, 20:04</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899618'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:59:46+00:00">31.01.24, 19:59</time></span><div class='quote '>то на счет gcc я что-то не уверен, у него ведь нет своей IDE? Тогда как происходит процесс создания makefile?<br>
</div></div><br>
Касаемо QtCreator&#39;а - там подключаются различные системы сборки, типа qmake, cmake, qbs. Вот они, в качестве промежуточного этапа, могут создавать make-файлы. На счет qmake - это 100%, остальные не пользовал, не могу утверждать.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899618</guid>
        <pubDate>Wed, 31 Jan 2024 19:59:46 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899618</link>
        <description><![CDATA[Eretic: Спасибо всем ответившим&#33;<br>
Сразу скажу - установка линукса у меня пока невозможна, чисто по техническим причинам. Комп никак не соберу (жду комплектуху с Китая), а ноут прочно завязан на винду (есть специфические приложения, нужные по работе). <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T18:54:25+00:00">31.01.24, 18:54</time></span><div class='quote '>Рекомендую почитать мою статью из раздела C/C++ FAQ &quot;Его величество MSYS2&quot;.</div></div><br>
Спасибо, сейчас гляну.<br>
VSCode я упомянул просто как бесплатную IDE, в которой учу шарп и питон. Мне в принципе несущественно из под чего работать, могу и из блокнота. Главное чтобы makefile как-то создать для проекта.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899611'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:14:24+00:00">31.01.24, 19:14</time></span><div class='quote '>Полагаю, работодатель хочет увидеть от соискателя умение получить &quot;Здравствуй, мир&#33;&quot; при помощи подручного текстового редактора и командной строки.</div></div><br>
В задании сказано, что они будут компилировать под линуксом, насколько я понял. И чтобы компиляция была простым запуском make или cmake. И если в &quot;приличных&quot; компиляторах присутствуют IDE, генерирующие makefile, то на счет gcc я что-то не уверен, у него ведь нет своей IDE? Тогда как происходит процесс создания makefile?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899613'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:21:27+00:00">31.01.24, 19:21</time></span><div class='quote '>Нет. Класс – это тип, а поток – это последовательность действий. Это совершенно разные сущности. Даже объект – экземпляр класса – это отдельно взятый комплект атрибутов, характеризующих класс, которые можно опрашивать и менять, но последовательность действий им всё равно никакой не приписывается. Можно потоком сделать какой-то метод класса, если очень хочется.</div></div><br>
Ясно. Значит проще не париться с классами и реализовать как и в винде - простой функцией. А там может и придумаю как классы прикрутить :) <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899613'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:21:27+00:00">31.01.24, 19:21</time></span><div class='quote '>Та мьютексы и семафоры и есть. Нужно только с разбегу не перепутать std::mutex с виндовыми Mutex, который std::recursive_mutex. А тот, что std::mutex, то виндовый Semaphore со счётчиком 2. Ещё вот недавно появились полноценные std::counting_semaphore и std::binary_semaphore, но я их ещё не пробовал.</div></div><br>
Спасибо. Это всё упрощает.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899615'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:29:23+00:00">31.01.24, 19:29</time></span><div class='quote '>P.S. &quot;Самый кроссплатформенный&quot; обмен данными между приложениями – сокеты на 127.0.0.1. Будет работать везде.</div></div><br>
Отличная идея&#33; Значит завтра поищу как совместить. На крайняк сделаю через #define (я студент, мне можно :) )]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899617</guid>
        <pubDate>Wed, 31 Jan 2024 19:35:44 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899617</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899616'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:29:37+00:00">31.01.24, 19:29</time></span><div class='quote '>Т.е. топикстартеру нужно сперва Линупс &quot;выучить&quot;, а потом только &quot;gcc&quot;? Не согласен.</div></div><br>
Выучить линукс? Это как? Как стихотворение, наизусть выучить исходники? У Linux такой же интуитивный интерфейс как у Windows и, уже давно, куда удобнее чем на Windows.]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899616</guid>
        <pubDate>Wed, 31 Jan 2024 19:29:37 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899616</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899612'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:21:22+00:00">31.01.24, 19:21</time></span><div class='quote '>как раз таки проще на Linux, а не на Windows</div></div><br>
Т.е. топикстартеру нужно сперва Линупс &quot;выучить&quot;, а потом только &quot;gcc&quot;? Не согласен.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899615</guid>
        <pubDate>Wed, 31 Jan 2024 19:29:23 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899615</link>
        <description><![CDATA[Qraizer: P.S. &quot;Самый кроссплатформенный&quot; обмен данными между приложениями – сокеты на 127.0.0.1. Будет работать везде. Правда, виндовые сокеты чуток отличаются от берклиевых, но там несложно найти общее поле, если нужен просто обмен данными.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899614</guid>
        <pubDate>Wed, 31 Jan 2024 19:26:10 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899614</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899611'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T19:14:24+00:00">31.01.24, 19:14</time></span><div class='quote '>Вообще-то нужно именно под линукс</div></div><br>
Читаем внимательнее&#33;<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899605'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T16:43:14+00:00">31.01.24, 16:43</time></span><div class='quote '>оно должно компилироваться cmake или make с gcc под линукс</div></div><br>
После естественной установки MSYS2 под винду - мы получаем тестовый полигон с Linux-подобным окружением сразу. Поэтому не нужно переворачивать мое высказывание с ног на голову. Нужно чтобы компилировалось под Линь, пожалуйте. Но нигде не было сказано, что компиляция должна быть именно на живой, установленный на железо Линупс.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899613</guid>
        <pubDate>Wed, 31 Jan 2024 19:21:27 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899613</link>
        <description><![CDATA[Qraizer: <ol class="tag-list" type="1"><li>Да.</li><li>Нет. Класс – это тип, а поток – это последовательность действий. Это совершенно разные сущности. Даже объект – экземпляр класса – это отдельно взятый комплект атрибутов, характеризующих класс, которые можно опрашивать и менять, но последовательность действий им всё равно никакой не приписывается. Можно потоком сделать какой-то метод класса, если очень хочется.</li><li>Та мьютексы и семафоры и есть. Нужно только с разбегу не перепутать std::mutex с виндовыми Mutex, который std::recursive_mutex. А тот, что std::mutex, то виндовый Semaphore со счётчиком 2. Ещё вот недавно появились полноценные std::counting_semaphore и std::binary_semaphore, но я их ещё не пробовал.</li><li>Тут стандартного решения нет. Стандарт не описывает взаимодействие программных комплексов, он описывает конкретную программу.</li></ol>]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899612</guid>
        <pubDate>Wed, 31 Jan 2024 19:21:22 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899612</link>
        <description><![CDATA[macomics: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T18:54:25+00:00">31.01.24, 18:54</time></span><div class='quote '>А вот это я бы не рекомендовал делать&#33; Бритва Оккама однако.</div></div><br>
И где вы это тут увидели. GNU Compiller Collection разрабатывалась как раз под Unix системы и начинать с ней работать как раз таки проще на Linux, а не на Windows. Тем более, если проект <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899605'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T16:43:14+00:00">31.01.24, 16:43</time></span><div class='quote '>И самое сложное <strong class='tag-b'>из задания</strong> - это чтобы оно должно <span class='tag-u'>компилироваться cmake или make с gcc под линукс</span>.</div></div>, тогда сам бог велел поставить Linux и проверять работоспособность на нем.]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899611</guid>
        <pubDate>Wed, 31 Jan 2024 19:14:24 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899611</link>
        <description><![CDATA[Dushevny: В задании никакой VS Code не фигурирует. Полагаю, работодатель хочет увидеть от соискателя умение получить &quot;Здравствуй, мир&#33;&quot; при помощи подручного текстового редактора и командной строки. <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T18:54:25+00:00">31.01.24, 18:54</time></span><div class='quote '>Бритва Оккама однако.  Если нужно разбираться с gcc, то можно и нужно это делать напрямую, а не через разборки с Линупсом.</div></div>Вообще-то нужно именно под линукс и бритва просится по отношению ко всяким MSYS2 и VS.]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899610</guid>
        <pubDate>Wed, 31 Jan 2024 18:54:25 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899610</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899607'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>macomics &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T17:08:19+00:00">31.01.24, 17:08</time></span><div class='quote '>А может начать с чего по &quot;проще&quot;. Например, установить под Windows Linux Ubuntu и уже с ним получить свой gcc. Или вообще установить Linux отдельно на виртуальную машину и из под нее уже писать программы (Visual Studio Code есть и на Linux и она по умолчанию находит g++/gcc).</div></div><br>
А вот это я бы не рекомендовал делать&#33;<a class='tag-url' href='https://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%82%D0%B2%D0%B0_%D0%9E%D0%BA%D0%BA%D0%B0%D0%BC%D0%B0' target='_blank'> Бритва Оккама</a> однако. ;) Если нужно разбираться с gcc, то можно и нужно это делать напрямую, а не через разборки с Линупсом.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899605'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T16:43:14+00:00">31.01.24, 16:43</time></span><div class='quote '>Собственно вопрос.<br>
Как нормально установить gcc под винду, в IDE Visual Code Studio. Просто по инету шариться - это уйму времени потеряешь, пока найдешь верный вариант. И как сделать чтобы программы (а их две, многопоточные и взаимодействующие между собой) компилировались с помощью make и cmake?</div></div><br>
Рекомендую почитать мою статью из раздела <strong class='tag-b'>C/C++ FAQ</strong> &quot;<a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=429435' target='_blank'>Его величество MSYS2</a>&quot;. Получение GCC &quot;из коробки&quot;. Ну и в дополнение полностью настроенную IDE OtCreator. Так что только останется разыскать инфу по настройке и подключению к VS Code компиляторов и отладчиков.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899607</guid>
        <pubDate>Wed, 31 Jan 2024 17:08:19 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899607</link>
        <description><![CDATA[macomics: А может начать с чего по &quot;проще&quot;. Например, <a class='tag-url' href='https://learn.microsoft.com/ru-ru/windows/wsl/install' target='_blank'>установить под Windows Linux Ubuntu</a> и уже с ним получить свой gcc. Или вообще <a class='tag-url' href='https://linux.org/pages/download/' target='_blank'>установить Linux</a> отдельно <a class='tag-url' href='https://www.virtualbox.org/wiki/Downloads' target='_blank'>на виртуальную машину</a> и из под нее уже писать программы (<a class='tag-url' href='https://code.visualstudio.com/docs/setup/linux' target='_blank'>Visual Studio Code есть и на Linux</a> и она по умолчанию находит g++/gcc).<br>
<br>
Если все же надо установить на Windows тогда смотрите в сторону <a class='tag-url' href='https://www.mingw-w64.org/downloads/' target='_blank'>MinGW</a> (<a class='tag-url' href='https://code.visualstudio.com/docs/cpp/config-mingw' target='_blank'>в комплекте содержит MSYS и g++/gcc</a>). <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2024-01-31T17:10:25+00:00">31.01.24, 17:10</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=441866&view=findpost&p=3899605'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Eretic &#064; <time class="tag-quote__quoted-time" datetime="2024-01-31T16:43:14+00:00">31.01.24, 16:43</time></span><div class='quote '>И для меня это действительно головная боль</div></div><br>
Если хотите делать самостоятельно, то разобраться в наследовании как раз будет полезным самостоятельным занятием.]]></description>
        <author>macomics</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899605</guid>
        <pubDate>Wed, 31 Jan 2024 16:43:14 +0000</pubDate>
        <title>gcc - установка и настройка</title>
        <link>https://forum.sources.ru/index.php?showtopic=441866&amp;view=findpost&amp;p=3899605</link>
        <description><![CDATA[Eretic: Всем привет&#33;<br>
У меня тут подработка наклюнулась, в одну контору на C++.<br>
Проблема даже не в том, что именно ++ я не знаю (там стажировка на лето, ещё 10 раз выучу). Проблема в том, что нужно сразу сдать тестовое задание. И самое сложное из задания - это чтобы оно должно компилироваться cmake или make с gcc под линукс.<br>
До сего дня я жил в уверенности, что <s class='tag-s'>за мкадом жизни нет</s> есть только два компилятора Visual Studio и Watcom. Которыми и пользовался время от времени. А тут сразу gcc, да еще под линукс, который я и в глаза не видел.<br>
<br>
Собственно вопрос.<br>
Как нормально установить gcc под винду, в IDE Visual Code Studio. Просто по инету шариться - это уйму времени потеряешь, пока найдешь верный вариант. И как сделать чтобы программы (а их две, многопоточные и взаимодействующие между собой) компилировались с помощью make и cmake?<br>
<br>
Задание я и сам сделаю, но остаются неясные моменты (я конечно их могу загуглить, но буду очень признателен за сэкономленное время):<br>
1) потоки в C++ создаются через std::thread? <br>
2) Потоком можно сделать класс? Точнее экземпляр класса? Есть какие то тонкости?<br>
3) какие стандартные средства есть для синхронизации доступа к данным между потоками? Просто я в винде всю жизнь использовал мьютексы и семафоры, а вот что есть в ++ даже не представляю.<br>
4) основная проблема: как передать данные из одной программы в другую, чтобы работало и на винде и на линуксе? <br>
<br>
Я не пишу что за задание, поскольку хочу сделать сам. Но если кому интересно, буду признателен за помощь в описании классов. Просто на мой взгляд задание настолько простое, что ООП там совершенно не нужно. Но в задании чётко сказано: <br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Не обязательно все размещать в одном классе. Может быть разработана иерархия классов. Чем более функционален интерфейс класса, тем лучше.<br>
</div></div>И для меня это действительно головная боль :)]]></description>
        <author>Eretic</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	