<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_4_subsect_10_thread_43121"  />
<title>rulinux.net - Форум - Talks - Вещь посерьёзнее паттернов.</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Форум - Talks - Вещь посерьёзнее паттернов.</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Re:Вещь посерьёзнее паттернов.</title>
<link>https://rulinux.net/message.php?newsid=43121&amp;page=1#222557</link>
<guid>https://rulinux.net/message.php?newsid=43121&amp;page=1#222557</guid>
<pubDate>Mon, 12 Mar 2018 19:35:43 +0300</pubDate>
<description><![CDATA[<p><i>> Там ведь тоже &amp;arg используется вместо arg</i><br> Продолжи свою мысль. Какие ifdef'ы?<br><br><fieldset><legend>c</legend><div class="highlight c"><br />
vasily@vonbraun<span class="sy0">:</span>~ <span class="sy0">%</span> cat test.<span class="me1">c</span><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<br />
<span class="kw4">int</span> read_int <span class="br0">&#40;</span><span class="kw4">const</span> <span class="kw4">char</span> <span class="sy0">*</span>line<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw4">int</span> res<span class="sy0">;</span><br />
&nbsp; &nbsp; sscanf <span class="br0">&#40;</span>line<span class="sy0">,</span> <span class="st0">&quot;%i&quot;</span><span class="sy0">,</span> res<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">return</span> res<span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
vasily@vonbraun<span class="sy0">:</span>~ <span class="sy0">%</span> cc <span class="sy0">-</span>c <span class="sy0">-</span>o test.<span class="me1">o</span> test.<span class="me1">c</span><br />
test.<span class="me1">c</span><span class="sy0">:</span><span class="nu0">6</span><span class="sy0">:</span><span class="nu0">25</span><span class="sy0">:</span> warning<span class="sy0">:</span> format specifies type <span class="st0">'int *'</span> but the argument has type <span class="st0">'int'</span> <span class="br0">&#91;</span><span class="sy0">-</span>Wformat<span class="br0">&#93;</span><br />
&nbsp; &nbsp; sscanf <span class="br0">&#40;</span>line<span class="sy0">,</span> <span class="st0">&quot;%i&quot;</span><span class="sy0">,</span> res<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;~~ &nbsp; <span class="sy0">^</span>~~<br />
<span class="nu0">1</span> warning generated.<br />
&nbsp;</div></fieldset><br><br>В случае scanf компилятор видит ошибку только за счет формата. Прототип у scanf и у всей stdio пиздобратии вообще убогий:<br><br>int sscanf (const char * restrict str, const char * restrict format, ...); По ... вообще не ясно, что в неё можно пихать<br><br>Но в C++-то такое говно вполне решено с помощью &lt;&lt;. Хотя опять же если ты не мудак, который пользуется C-style печатью из C++. Как мне видится, большинство проблем с типами в C++ решено, но тем не менее оставлены какие-то дурацкие механизмы, с помощью которых можно написать по-идиотски.<br><br><i>> Надо понимать что́ ты пишешь.</i><br> Абсолютно говно аргумент. От очепяток и забывания говноапи никто не застрахован.</p>]]></description>
</item>
<item>
<title>Re:Вещь посерьёзнее паттернов.</title>
<link>https://rulinux.net/message.php?newsid=43121&amp;page=1#222554</link>
<guid>https://rulinux.net/message.php?newsid=43121&amp;page=1#222554</guid>
<pubDate>Mon, 12 Mar 2018 11:57:44 +0300</pubDate>
<description><![CDATA[<p>Может тебе ещё и в scanf-е наворотить ifdef-ов? Там ведь тоже &amp;arg используется вместо arg. Надо понимать что́ ты пишешь.</p>]]></description>
</item>
<item>
<title>Re:Вещь посерьёзнее паттернов.</title>
<link>https://rulinux.net/message.php?newsid=43121&amp;page=1#222543</link>
<guid>https://rulinux.net/message.php?newsid=43121&amp;page=1#222543</guid>
<pubDate>Sun, 11 Mar 2018 09:50:32 +0300</pubDate>
<description><![CDATA[<p>Так к Амурычу претензия в том и состоит, что в его реализации не подразумевается проверка типов. Пока в рантайме всё не наебнётся при каком-нибудь редком стечении обстоятельств - даже и не узнаешь, что проблема существует. А когда наебнётся - фиг найдёшь эту проблему.</p>]]></description>
</item>
<item>
<title>Вещь посерьёзнее паттернов.</title>
<link>https://rulinux.net/message.php?newsid=43121&amp;page=1#222531</link>
<guid>https://rulinux.net/message.php?newsid=43121&amp;page=1#222531</guid>
<pubDate>Sat, 10 Mar 2018 08:39:38 +0300</pubDate>
<description><![CDATA[<p>Вот пишу тут мелкую программу с использованием OpenCL. Решил написать на C (пока просто чтобы проверить, как ядро работает). Конечно OpenCL какая-то слишком низкоуровневая байда, чтобы на ней писать без оберток, ИМО.<br><br>Там есть тип cl_mem, нужный для обозначения объекта в памяти устройства, который представляет из себя по сути указатель. Далее есть функция, устанавливающая аргумент ядра перед запуском. Вот её прототип:<br><br><fieldset><legend>c</legend><div class="highlight c"><br />
cl_int clSetKernelArg <span class="br0">&#40;</span>cl_kernel kernel<span class="sy0">,</span> cl_uint arg_index<span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size_t arg_size<span class="sy0">,</span> <span class="kw4">const</span> <span class="kw4">void</span> <span class="sy0">*</span>arg_value<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp;</div></fieldset><br><br>Видите, void*, да? Далее я пишу: <fieldset><legend>c</legend><div class="highlight c"><br />
cl_mem mem <span class="sy0">=</span> ...<span class="sy0">;</span><br />
clSetKernelArg <span class="br0">&#40;</span>mykernel<span class="sy0">,</span> 0<span class="sy0">,</span> <span class="kw4">sizeof</span><span class="br0">&#40;</span>cl_mem<span class="br0">&#41;</span><span class="sy0">,</span> mem<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp;</div></fieldset><br><br>Программа компилируется без варнингов и исполняется, только на выходе я вижу, что сначала идут ожидаемые данные, а затем NaN. Я полез отлаживать ядро, думал, где-то накосячил с синхронизацией (характерно, что баг то появлялся, то исчезал).<br><br>После долгого дебага я решил сравнить свой код с каким-нибудь туториалом. И тут я нашел, что надо писать так:<br><br><fieldset><legend>c</legend><div class="highlight c"><br />
cl_mem mem <span class="sy0">=</span> ...<span class="sy0">;</span><br />
clSetKernelArg <span class="br0">&#40;</span>mykernel<span class="sy0">,</span> 0<span class="sy0">,</span> <span class="kw4">sizeof</span><span class="br0">&#40;</span>cl_mem<span class="br0">&#41;</span><span class="sy0">,</span> <span class="sy0">&amp;</span>mem<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp;</div></fieldset><br><br>Внезапно, всё заработало. Моя вина, да. Но скажите, это нормально, что компилятор пропускает такой косяк без единого возражения, хотя ошибка видна невооруженным глазом? ОК, создатели OpenCL могли бы сделать в заголовках что-то такое:<br><br><fieldset><legend>c</legend><div class="highlight c"><br />
<br />
<span class="co2">#ifdef _PUBLIC_</span><br />
<span class="kw4">struct</span> cl_mem<span class="sy0">;</span><br />
cl_mem<span class="sy0">*</span> clCreateBuffer <span class="br0">&#40;</span><span class="coMULTI">/* args dropped */</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="co2">#else</span><br />
<span class="kw4">struct</span> cl_mem <span class="br0">&#123;</span><br />
...<br />
<span class="br0">&#125;</span><span class="sy0">;</span><br />
<span class="co2">#endif</span><br />
&nbsp;</div></fieldset> и принимать в clSetKernelArg() указатель на struct cl_mem<br><br>Оставим это всё на совести разработчиков. Но дело не в библиотеке, дело в языке! Именно из-за того, что clSetKernelArg принимает последним элементом вообще любой указатель, и приключилась эта дребедень. Вся вина лежит на типе void*. И это ещё хуже, чем Common Lisp с динамической типизацией, который бы, вероятно, скомпилировал бы код с неверными типами, но поймал бы ошибку в рантайме и предупредил бы пользователя, а не выполнился бы с ошибками.<br><br>В C++ есть конечно шаблоны и виртуальные методы для того, чтобы не писать код с void*, но зачем там тип void* оставили вообще? Зачем там всякие dynamic_cast и reinterpret_cast? Или вообще обычные касты в C-стиле? Всё это приводит к трудноуловимым ошибкам. А вы говорите, паттерны.<br><br>Пилите свои кулстори, как вы писали типобезопасный код на C++ или напарывались на тривиальные ошибки из-за говёной системы типов</p>]]></description>
</item>
</channel>
</rss>