<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Проблема с заполнением контейнера в C++</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/6992.html</link>
    <description>Приветствую всех!&lt;br&gt;&lt;br&gt;Данная тема относиться к C++ но немножко будет нестадартна тем, что для ее расмотрения нужна звуковая система OSS ( http://developer.opensound.com )&lt;br&gt;Ближе к делу.&lt;br&gt;&lt;br&gt;OSS - когда-то проприетарные, сейчас Open Source GPL v.2 звуковые драйвера для всех видов UNIX.&lt;br&gt;Избрал именно их - ибо единственные в своем роде которые пашут на разных UNIX.&lt;br&gt;&lt;br&gt;Нужно заполнить контейнер  неякими данными.&lt;br&gt;Проблема в том, что если использовать &lt;br&gt;std::map&amp;lt;std::string, int&amp;gt; список создаеться нормально.&lt;br&gt;А вот при std::map&amp;lt;const char*, int&amp;gt; не хочет.&lt;br&gt;&lt;br&gt;Мне нужно как раз char* и не std::string...&lt;br&gt;Пробывал заполнять другими данными - без проблем с char* и с std::string.&lt;br&gt;Какой-то полтергейст. Не понятно почему не хочет именно в моем случае:&lt;br&gt;&lt;br&gt;Ниже выкладываю текст.&lt;br&gt;Компилил с использованием OSS v.4 и gcc 4.1.2&lt;br&gt;&lt;br&gt;Проверял в GNU/Linux, должно работать также и в *BSD.&lt;br&gt;ВНИМАНИЕ: OSS v.4! OSS &amp;lt; v.4 не подойдет... Там совершенно другой API. Хотя все может быть..&lt;br&gt;&lt;br&gt;Если нужна помощь в установке самых драйверов в</description>

<item>
    <title>Проблема с заполнением контейнера в C++ (elvenic)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/6992.html#5</link>
    <pubDate>Thu, 29 Nov 2007 22:41:35 GMT</pubDate>
    <description>&amp;gt;Заметил что многие API куда чаще используют const char* в замен std::string. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;О части из-за того что std::string нету в C? &lt;br&gt;&lt;br&gt;Скорее потому что многие C++ API были задуманы до того как STL получила распостранение.&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt;У меня в мапе привязаное имя устройства к его идентификатору в системе, &lt;br&gt;&amp;gt;и оно не обезательно идет по порядку, то есть может быть &lt;br&gt;&amp;gt;так: &lt;br&gt;&amp;gt;vol =&amp;gt; 2&lt;br&gt;&amp;gt;pcm =&amp;gt; 4&lt;br&gt;&amp;gt;gain =&amp;gt;7&lt;br&gt;&lt;br&gt;Ну да, как я и думал: на логическом уровне, это мап из строки (содержания строки) в некие данные, тут - в число.&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt; у меня есть сомнения не только по поводу std::map&amp;lt;char *, ...&amp;gt;, но и по поводу&lt;br&gt;&amp;gt;&amp;gt; правомочности сохранения в мапе указателя который возвращает c_str().&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;А что не так?&lt;br&gt;&amp;gt;Но как бы там небыло, у меня работает :))&lt;br&gt;&lt;br&gt;Как я уже говорил, std::map&amp;lt;char *, ...&amp;gt; - это мап не из содержания строки в некие данные, а из значения указателя в некие данные.&lt;br&gt;&lt;br&gt;Пример:&lt;br&gt;&lt;br&gt;std::map&amp;lt;char *, int&amp;gt; myMap;&lt;br&gt;myMap&#091;&quot;vol&quot;&#093; = 1;&lt;br&gt;myMap&#091;&quot;pcm&quot;&#093; = 2;&lt;br&gt;std::cout &amp;lt;&amp;lt; myMap&#091;&quot;vol&quot;&#093; &amp;lt;&amp;lt; &quot;&#092;n&quot;&lt;br&gt;std::cout &amp;lt;&amp;lt; myMap&#091;&quot;pcm&quot;&#093; &amp;lt;&amp;lt; &quot;&#092;n</description>
</item>

<item>
    <title>Проблема с заполнением контейнера в C++ (siegerstein)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/6992.html#4</link>
    <pubDate>Thu, 29 Nov 2007 21:24:48 GMT</pubDate>
    <description>&amp;gt; А почему такое странное требование - получить в результате именно std::map&amp;lt;char *, int&amp;gt;?&lt;br&gt;&lt;br&gt;Все просто, не раз сталкивался с тем, что приходилось все время переводить потом с std::string в const char*.&lt;br&gt;Вот к примеру мой случай:&lt;br&gt;&lt;br&gt;QLabel *mixDevLabel = new QLabel;&lt;br&gt;mixDevLabel -&amp;gt; setText ( DEV_NAME );&lt;br&gt;&lt;br&gt;Благо что DEV_NAME const char*, а то пришлось бы переводить. И таких случаев много.&lt;br&gt;Заметил что многие API куда чаще используют const char* в замен std::string.&lt;br&gt;О части из-за того что std::string нету в C?&lt;br&gt;&lt;br&gt;&amp;gt; Мап существует для того чтобы в него класть данные с ключами и потом находить положенные данные по этим ключам.&lt;br&gt;&lt;br&gt;У меня в мапе привязаное имя устройства к его идентификатору в системе, и оно не обезательно идет по порядку, то есть может быть так:&lt;br&gt;vol =&amp;gt; 2&lt;br&gt;pcm =&amp;gt; 4&lt;br&gt;gain =&amp;gt;7&lt;br&gt;&lt;br&gt;&amp;gt; у меня есть сомнения не только по поводу std::map&amp;lt;char *, ...&amp;gt;, но и по поводу правомочности сохранения в мапе указателя который возвращает c_str().&lt;br&gt;&lt;br&gt;А что не так?&lt;br&gt;Но как бы там небыло, у меня работает :))&lt;br&gt;</description>
</item>

<item>
    <title>Проблема с заполнением контейнера в C++ (elvenic)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/6992.html#3</link>
    <pubDate>Thu, 29 Nov 2007 20:36:50 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;  &#125; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;for (std::map&amp;lt;std::string, int&amp;gt;::iterator it = tmpCont.begin(); it != tmpCont.end(); ++it) &#123;&lt;br&gt;&amp;gt;const char * tmpVal = it-&amp;gt;first.c_str();&lt;br&gt;&amp;gt;NOT_AVAIBLE_MIX_DEV&#091;tmpVal&#093; = it-&amp;gt;second;&lt;br&gt;&amp;gt;  &#125; &lt;br&gt;&amp;gt;Решение банальное, но лутшего способа пока что не вижу... &lt;br&gt;&amp;gt;Сначала заполняем map тот что std::string а потом нормальные значения уже сново &lt;br&gt;&amp;gt;через цикл запихиваем уже во второй map но уже с const &lt;br&gt;&amp;gt;char*. &lt;br&gt;&lt;br&gt;А почему такое странное требование - получить в результате именно std::map&amp;lt;char *, int&amp;gt;? Если можно это требование убрать, то можно использовать std::map&amp;lt;std::string, int&amp;gt; полученный после первого цикла. Действительно, зачем нужен второй цикл?&lt;br&gt;&lt;br&gt;Хм, если подумать немного, то, вообще говоря, std::map&amp;lt;char *, int&amp;gt; в большинстве случаев вообще не имеет смысла. Мап существует для того чтобы в него класть данные с ключами и потом находить положенные данные по этим ключам. Если ключ - значение указателя (т.е, 32- или 64-битовое число), то содержание строки на которую указывает </description>
</item>

<item>
    <title>Проблема с заполнением контейнера в C++ (siegerstein)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/6992.html#2</link>
    <pubDate>Thu, 29 Nov 2007 17:51:11 GMT</pubDate>
    <description>Спасибо elvenic за ответ. Очень выручил.&lt;br&gt;Даже в списках рассылки OSS не кто не ответил...&lt;br&gt;&lt;br&gt;&amp;gt; но могу предположить что значение указателя ext.extname каждый раз одно и то же&lt;br&gt;&lt;br&gt;Действительно это верно, поменял &lt;br&gt;std::map&amp;lt;std::string, int&amp;gt; NORM_AVAIBLE_MIX_DEV &lt;br&gt;на&lt;br&gt;std::map&amp;lt;int, std::string&amp;gt; NORM_AVAIBLE_MIX_DEV&lt;br&gt;и map сразу заполнился нужным количеством значений (но к сожалению не верными значениями ).&lt;br&gt;&lt;br&gt;&amp;gt; создается новый обьект std::string значение которого и используется как ключ мапа. &lt;br&gt;&lt;br&gt;В конечном итоге решил проблему вот так:&lt;br&gt;&lt;br&gt;std::map&amp;lt;const char*, int&amp;gt; NOT_AVAIBLE_MIX_DEV;&lt;br&gt;std::map&amp;lt;std::string, int&amp;gt; tmpCont;&lt;br&gt;&lt;br&gt;for ( int i = 1; i &amp;lt; nrext; i++ ) &#123;&lt;br&gt;ext.dev = mixer_dev;&lt;br&gt;ext.ctrl = i;&lt;br&gt;ioctl(mixer_fd, SNDCTL_MIX_EXTINFO, &amp;ext);&lt;br&gt;if ( ( ext.type == MIXT_MONOSLIDER ) &amp;#124;&amp;#124; ( ext.type == MIXT_STEREOSLIDER ) &amp;#124;&amp;#124; (ext.type == MIXF_RECVOL ) ) &#123;&lt;br&gt;if ( ext.extname != NULL ) &#123;&lt;br&gt;tmpCont&#091;ext.extname&#093; = i;&lt;br&gt;&#125;&lt;br&gt;&#125;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;for (std::map&amp;lt;std::string, int&amp;gt;::itera</description>
</item>

<item>
    <title>Проблема с заполнением контейнера в C++ (elvenic)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/6992.html#1</link>
    <pubDate>Thu, 29 Nov 2007 15:55:52 GMT</pubDate>
    <description>&lt;br&gt;&amp;gt; oss_mixext ext; &lt;br&gt;&lt;br&gt;&amp;lt;skip&amp;gt;&lt;br&gt;&lt;br&gt;&amp;gt; if (ioctl(mixer_fd, SNDCTL_MIX_EXTINFO, &amp;ext) == -1) &#123; &lt;br&gt;&amp;gt;  perror(&quot;SNDCTL_MIX_EXTINFO&quot;); &lt;br&gt;&amp;gt;  return 1; &lt;br&gt;&amp;gt;&#125; &lt;br&gt;&lt;br&gt;&amp;lt;skip&amp;gt;&lt;br&gt;&lt;br&gt;/*******************************************************************************************/ &lt;br&gt;&amp;gt; /*  NOT WORKING */ &lt;br&gt;&amp;gt;std::map&amp;lt;const char*, int&amp;gt; NOT_AVAIBLE_MIX_DEV;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;  for ( int i = 1; i &amp;lt; nrext; i++ &lt;br&gt;&amp;gt;) &#123; &lt;br&gt;&lt;br&gt;&amp;lt;skip&amp;gt; &lt;br&gt;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;     NOT_AVAIBLE_MIX_DEV&#091;ext.extname&#093; = i; &lt;br&gt;&lt;br&gt;NOT_AVAIBLE_MIX_DEV обьявлен как мап с ключем &quot;указатель на const char&quot;. ext.extname - это  тот самый указатель. Насколько я понимаю, структура ext создана одна и при каждом вызове ioctl() все та же структура заполняется заново. Я не знаю точно как она заполняется внутри ioctl(), но могу предположить что значение указателя ext.extname каждый раз одно и то же - и, соответственно, значение внутри квдратных скобок в операторе присваивания &lt;br&gt;&lt;br&gt;    NOT_AVAIBLE_MIX_DEV&#091;ext.extname&#093; = i; &lt;br&gt;&lt;br&gt;то же одно и тоже на каждой итерации цикла (нет, это не содержание строки, это адрес строки (32-б</description>
</item>

</channel>
</rss>
