<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[String in char ** konvertieren]]></title><description><![CDATA[<p>Ich muss eine Lib einsetzten, die z.Bsp. so eine Funktion hat:</p>
<pre><code class="language-cpp">virtual HANDLE foo(/*[In]*/ char **ppszValues, 
                   /*[In]*/ unsigned long ulNumOfValues,
                   /*[In]*/ unsigned long ulUpdateRate, 
                   /*[In]*/ HandlerCallback *pUpdateCallback = NULL,
</code></pre>
<p>Wie kann ich den ersten Parameter übergeben ohne das ich das im C-Stil machen muss?</p>
<pre><code class="language-cpp">char *values[ulCyc];
for (unsigned int i=0; i&lt;ulCyc; i++)
{
    values[i]=new char[variableList-&gt;at(i).size()+1];
    strcpy(values[i], variableList-&gt;at(i).toLocal8Bit().constData());
}

for (unsigned int i=0; i&lt;ulCyc; i++)
{
    delete [] values[i];
}
</code></pre>
<p>Folgendes geht, ist aber nicht &quot;schön&quot;:</p>
<pre><code class="language-cpp">std::vector&lt;std::string&gt; list;
for (unsigned int i=0; i&lt;ulCyc; i++)
{
    list.push_back(variableList-&gt;at(i).toStdString());
}
foo(reinterpret_cast&lt;char**&gt;(&amp;list[0]),....)
</code></pre>
<p>Ich will new/delete und casts vermeiden. Gibt es Alternativen dazu?<br />
Wenn ich mich unklar ausgedrückt habe, dann bitte nachfragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274689/string-in-char-konvertieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 08:45:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274689.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Sep 2010 20:27:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 20:27:53 GMT]]></title><description><![CDATA[<p>Ich muss eine Lib einsetzten, die z.Bsp. so eine Funktion hat:</p>
<pre><code class="language-cpp">virtual HANDLE foo(/*[In]*/ char **ppszValues, 
                   /*[In]*/ unsigned long ulNumOfValues,
                   /*[In]*/ unsigned long ulUpdateRate, 
                   /*[In]*/ HandlerCallback *pUpdateCallback = NULL,
</code></pre>
<p>Wie kann ich den ersten Parameter übergeben ohne das ich das im C-Stil machen muss?</p>
<pre><code class="language-cpp">char *values[ulCyc];
for (unsigned int i=0; i&lt;ulCyc; i++)
{
    values[i]=new char[variableList-&gt;at(i).size()+1];
    strcpy(values[i], variableList-&gt;at(i).toLocal8Bit().constData());
}

for (unsigned int i=0; i&lt;ulCyc; i++)
{
    delete [] values[i];
}
</code></pre>
<p>Folgendes geht, ist aber nicht &quot;schön&quot;:</p>
<pre><code class="language-cpp">std::vector&lt;std::string&gt; list;
for (unsigned int i=0; i&lt;ulCyc; i++)
{
    list.push_back(variableList-&gt;at(i).toStdString());
}
foo(reinterpret_cast&lt;char**&gt;(&amp;list[0]),....)
</code></pre>
<p>Ich will new/delete und casts vermeiden. Gibt es Alternativen dazu?<br />
Wenn ich mich unklar ausgedrückt habe, dann bitte nachfragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959759</guid><dc:creator><![CDATA[ScyllaIllciz]]></dc:creator><pubDate>Thu, 30 Sep 2010 20:27:53 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 20:40:48 GMT]]></title><description><![CDATA[<p>Meinst du vielleicht sowas wie c_str(); ?</p>
<p>Ist eine Memberfunktion von std::string und gibt den entsprechenden c-string zurück.</p>
<p>foo(&amp;list[0].c_str()); // Was soll eigentlich immer dieses foo bedeuten das ich öfters in Beispielen lese??</p>
<p>Eventuell müsstest du diesen C-String vorher erst einmal kopieren wenn du den ändern möchtest, wird als const zurückgegeben.</p>
<p>Aber achtung, wird das std::string-Objekt zerstört ist dieser Zeiger ungültig.<br />
Auch ein Grund den Inhalt vorher zu kopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959761</guid><dc:creator><![CDATA[Ka-Mensch]]></dc:creator><pubDate>Thu, 30 Sep 2010 20:40:48 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 20:46:32 GMT]]></title><description><![CDATA[<p>foo steht für eine willkürliche Funktion <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<p>Ich weiss das c_str() gibt, dass nützt mir nur nichts. Die Funktion will ja eine &quot;Liste&quot; von Strings. Diese muss ich zusammen bauen. Dafür gibt es &quot;für mich&quot; im Moment die zwei Möglichkeiten oben. Ich suche eine Alternative, sodass ich ohne new/delete von char* und ohne Cast auskomme!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959765</guid><dc:creator><![CDATA[ScyllaIllciz]]></dc:creator><pubDate>Thu, 30 Sep 2010 20:46:32 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 20:48:08 GMT]]></title><description><![CDATA[<p>Ka-Mensch schrieb:</p>
<blockquote>
<p>Was soll eigentlich immer dieses foo bedeuten das ich öfters in Beispielen lese??</p>
</blockquote>
<p>Die genaue herkunft des Wortes &quot;foobar&quot; ist unbekannt, die verbreiteste stammt aber aus dem 2ten Weltkrieg als Amis &quot;furchtbar&quot; aufschnappten. Und sie sagten halt foobar, aus Ermangelung der Sprachweise der Deutschen.<br />
Daraus hat sich in der Programmierwelt foo und bar gebildetet als Variablennamen für kleine Beispiele.<br />
<a href="http://de.wikipedia.org/wiki/Fubar" rel="nofollow">http://de.wikipedia.org/wiki/Fubar</a></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26836">@topic</a>:</p>
<pre><code class="language-cpp">char* foo = NULL;
std::string bar(&quot;Test&quot;);
foo = bar.c_str();
funky_c_func(&amp;foo);
</code></pre>
<p>Aber wie gesagt wurde, wird bar zerstört ist der Zeiger ungültig.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959766</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 30 Sep 2010 20:48:08 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 20:53:58 GMT]]></title><description><![CDATA[<pre><code class="language-cpp"><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26836">@topic</a>: 
char* foo = NULL;
std::string bar(&quot;Test&quot;);
foo = bar.c_str();
funky_c_func(&amp;foo);
</code></pre>
<p>Wie soll mir das weiter helfen, ich brauche doch char **foo bzw. char *foo[size]?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959767</guid><dc:creator><![CDATA[ScyllaIllciz]]></dc:creator><pubDate>Thu, 30 Sep 2010 20:53:58 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 20:58:52 GMT]]></title><description><![CDATA[<p>ScyllaIllciz schrieb:</p>
<blockquote>
<pre><code class="language-cpp"><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26836">@topic</a>: 
char* foo = NULL;
std::string bar(&quot;Test&quot;);
foo = bar.c_str();
funky_c_func(&amp;foo);
</code></pre>
<p>Wie soll mir das weiter helfen, ich brauche doch char **foo bzw. char *foo[size]?</p>
</blockquote>
<p>char** ist ein zeiger auf den zeiger eines char-array bzw ein zeiger auf einen zeiger.....</p>
<p>&amp;foo ist char** in dem fall...</p>
<p>edit: Aussage korrigiert<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959769</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 30 Sep 2010 20:58:52 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 21:02:46 GMT]]></title><description><![CDATA[<p>Sofern du sicher bist, dass die Funktion nicht in den Strings rumschreibt, was mir angesichts der Signatur nicht gesichert scheint, könntest du Folgendes machen:</p>
<pre><code class="language-cpp">std::vector&lt;char const *&gt; ptr_list;

ptr_list.reserve(list.size());
for(std::size_t i = 0; i &lt; list.size(); ++i) {
  ptr_list.push_back(list[i].c_str());
}

HANDLE h = foo(const_cast&lt;char**&gt;(&amp;ptr_list[0]), ptr_list.size(), bar, baz);
</code></pre>
<p>Das Ganze ist aber natürlich ein ziemlich dreckiger Hack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959771</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 30 Sep 2010 21:02:46 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 21:15:27 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Sofern du sicher bist, dass die Funktion nicht in den Strings rumschreibt, was mir angesichts der Signatur nicht gesichert scheint, könntest du Folgendes machen:</p>
<pre><code class="language-cpp">std::vector&lt;char const *&gt; ptr_list;

ptr_list.reserve(list.size());
for(std::size_t i = 0; i &lt; list.size(); ++i) {
  ptr_list.push_back(list[i].c_str());
}

HANDLE h = foo(const_cast&lt;char**&gt;(&amp;ptr_list[0]), ptr_list.size(), bar, baz);
</code></pre>
<p>Das Ganze ist aber natürlich ein ziemlich dreckiger Hack.</p>
</blockquote>
<p>Und ich war gerade dabei ein extra Klassentemplate für 2D-C-Arrays mit überladenen Cast- und Dereferenzierungsoperatoren zu schreiben. Aber deines ist wesentlich weniger Schreibarbeit, deswegen lasse ich das Projekt mal halbfertig ruhen. Ich glaube mein Ansatz war viel zu kompliziert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959782</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 30 Sep 2010 21:15:27 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 21:18:09 GMT]]></title><description><![CDATA[<p>Das soll heissen es geht nicht ohne cast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959785</guid><dc:creator><![CDATA[ScyllaIllciz]]></dc:creator><pubDate>Thu, 30 Sep 2010 21:18:09 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 21:22:21 GMT]]></title><description><![CDATA[<p>ScyllaIllciz schrieb:</p>
<blockquote>
<p>Das soll heissen es geht nicht ohne cast?</p>
</blockquote>
<p>Irgendeine Art von Cast muss immer irgendwo stattfinden, wenn du nicht den Typen nehmen willst, der verlangt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959792</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 30 Sep 2010 21:22:21 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 21:23:42 GMT]]></title><description><![CDATA[<p>ScyllaIllciz schrieb:</p>
<blockquote>
<p>Ich muss eine Lib einsetzten, die z.Bsp. so eine Funktion hat:</p>
<pre><code class="language-cpp">virtual HANDLE foo(/*[In]*/ char **ppszValues, 
                   /*[In]*/ unsigned long ulNumOfValues,
                   /*[In]*/ unsigned long ulUpdateRate, 
                   /*[In]*/ HandlerCallback *pUpdateCallback = NULL,
</code></pre>
<p>Wie kann ich den ersten Parameter übergeben ohne das ich das im C-Stil machen muss?</p>
</blockquote>
<p>Was soll denn das /<em>[In]</em>/ ? -- Ich kann's mir denken, aber wenn der Parameter nur für die &quot;Eingabe&quot; ist, warum dann nicht doppel-const?</p>
<pre><code class="language-cpp">void nur_idioten_unterwegs(char const*const* values, ...);
</code></pre>
<p>Die Antwort auf Deine Frage hängt natürlich auch davon ab, was Du eigentlich hast, also zB nen vector&lt;string&gt; ?</p>
<p>Wenn diese Bibliotheks-Funktion hält, was sie in den Kommentaren verspricht (dass sie nur lesend auf die Daten zugreift), könnte man auch einen const_cast verwenden, so dass da nichts kopiert werden muss.</p>
<pre><code class="language-cpp">vector&lt;char*&gt; meinezeiger;
for (unsigned int i=0; i&lt;ulCyc; i++)
{
   meinezeiger.push_back(const_cast&lt;char*&gt;(
     variableList-&gt;at(i).toLocal8Bit().constData()
   ));
}
scheiss_funktion(&amp;meinezeiger[0]);
</code></pre>
<p>Ansonnsten könnte man auch alles hintereinander in einem vector&lt;char&gt; ablegen, wenn man das mit dem const_cast nicht machen will.</p>
<p>ScyllaIllciz schrieb:</p>
<blockquote>
<p>Folgendes geht, ist aber nicht &quot;schön&quot;:</p>
<pre><code class="language-cpp">std::vector&lt;std::string&gt; list;
for (unsigned int i=0; i&lt;ulCyc; i++)
{
    list.push_back(variableList-&gt;at(i).toStdString());
}
foo(reinterpret_cast&lt;char**&gt;(&amp;list[0]),....)
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Was ist Deine Definition von &quot;geht&quot;? Es lässt sich kompilieren, ja. Aber das wars auch schon.</p>
<p>ScyllaIllciz schrieb:</p>
<blockquote>
<p>Ich will new/delete und casts vermeiden. Gibt es Alternativen dazu?</p>
</blockquote>
<p>Vektoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959795</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 30 Sep 2010 21:23:42 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 21:26:15 GMT]]></title><description><![CDATA[<p>Nicht in standardkonformer Weise, ohne Kopien anzulegen. std::string garantiert weder, dass seine Daten an einem Stück gespeichert werden, noch, dass sie null-terminiert sind, dementsprechend ist alles, was &amp;mein_string[0] heißt, von vorneherein ausgeschlossen. So bleibt c_str(), und das liefert dir einen char const <em>, den du nicht ohne const_cast in einen char</em> stopfen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959799</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 30 Sep 2010 21:26:15 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 21:34:18 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>dass seine Daten an einem Stück gespeichert werden</p>
</blockquote>
<p>Ich bin mir ziemlich sicher, dass zumindest dies irgendwo garantiert ist. Ich werde mal die Stelle suchen.</p>
<p>edit: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Solch eine Stelle gibt es anscheinend tatsächlich nicht. Wobei man hier aber wohl pragmatisch annehmen darf, dass jede vernünftige Implementierung dass trotzdem so macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959801</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 30 Sep 2010 21:34:18 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 21:39:01 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a><br />
Ich kann mir die Lib nicht auswählen, die ist so da und muss so verwendet werden (und kostet richtig Geld!)</p>
<p>Das ist ein funktionierendes Beispiel (quick and dirty):</p>
<pre><code class="language-cpp">void MainWindow::on_pushButton_clicked()
{
    QStringList list2;
    std::vector&lt;std::string&gt; list;
    for(int i=0; i&lt;20; i++)
    {
        list2 &lt;&lt; tr(&quot;Das ist %1&quot;).arg(i);
        list.push_back(list2[i].toStdString());
    }

    if (writeMessage(reinterpret_cast&lt;char**&gt;(&amp;list[0]), list.size()))
        QMessageBox::information(this, &quot;Nachricht&quot;, &quot;Hat funktioniert!!!&quot;);
}

bool MainWindow::writeMessage(char **message, int size)
{
    if (message)
    {
        for (int i=0; i&lt;size; i++)
            qDebug() &lt;&lt; &quot;write Msg:&quot; &lt;&lt; message[i];
        return true;
    }
    else
        return false;
}
}
</code></pre>
<p>Ich werde aber die std::vector&lt;const char*&gt; Version wohl vorziehen, da hier &quot;nur&quot; const weg gecastet wird.</p>
<p>[edit]<br />
Die Strings kommen später aus einer QStringList, deswegen ist die Beispiel mit drinnen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959804</guid><dc:creator><![CDATA[ScyllaIllciz]]></dc:creator><pubDate>Thu, 30 Sep 2010 21:39:01 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 21:35:03 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">const char * strtocc(std::string s){return s.c_str();}

// ...

const char *chars[vec.size()];
transform(vec.begin(),vec.end(),chars,strtocc);
foo(chars, ...)
</code></pre>
<p>ohne die Funktion strtocc wäre es natürlich noch stilistischer...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959805</guid><dc:creator><![CDATA[STLilist]]></dc:creator><pubDate>Thu, 30 Sep 2010 21:35:03 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 21:44:42 GMT]]></title><description><![CDATA[<p>@STLilist<br />
hier wird aber auch ein const_cast benötigt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959816</guid><dc:creator><![CDATA[ScyllaIllciz]]></dc:creator><pubDate>Thu, 30 Sep 2010 21:44:42 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Thu, 30 Sep 2010 22:14:49 GMT]]></title><description><![CDATA[<p>STLilist schrieb:</p>
<blockquote>
<pre><code class="language-cpp">const char * strtocc(std::string s){return s.c_str();}
</code></pre>
</blockquote>
<p>Das erzeugt undefiniertes Verhalten. Meintest du</p>
<pre><code class="language-cpp">const char * strtocc(std::string const &amp;s){return s.c_str();}
</code></pre>
<p>?</p>
<p>Außerdem gibt es in C++ keine VLAs, also wird</p>
<pre><code class="language-cpp">const char *chars[vec.size()];
</code></pre>
<p>nicht verlässlich funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959825</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 30 Sep 2010 22:14:49 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Fri, 01 Oct 2010 03:54:34 GMT]]></title><description><![CDATA[<p>ScyllaIllciz schrieb:</p>
<blockquote>
<p>Das ist ein funktionierendes Beispiel (quick and dirty):</p>
<pre><code class="language-cpp">void MainWindow::on_pushButton_clicked()
{
    QStringList list2;
    std::vector&lt;std::string&gt; list;
    for(int i=0; i&lt;20; i++)
    {
        list2 &lt;&lt; tr(&quot;Das ist %1&quot;).arg(i);
        list.push_back(list2[i].toStdString());
    }

    if (writeMessage(reinterpret_cast&lt;char**&gt;(&amp;list[0]), list.size()))
        QMessageBox::information(this, &quot;Nachricht&quot;, &quot;Hat funktioniert!!!&quot;);
}
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /><br />
&amp;list[0] ist vom Typ std::string* und Du reinterpretierst den Zeiger als char**. Das kann gar nicht funktionieren. string und char* haben nicht viel miteinander zu tun. string ist eine non-POD-Klasse, deren genauer Aufbau nicht festgelegt ist. Nicht einmal sizeof(char*)==sizeof(string) wird garantiert. Die Repräsentierung eines string-Objekts als Zeiger auf char zu interpretieren ist mit Abstand die schlechteste Idee, die ich je in C++ ausgedrückt gesehen habe.</p>
<p>Mit welchem/r Compiler/Standardbibliothek soll dass denn angeblich funktionieren? Das kann ja nur funktionieren, wenn string zufällig so definiert wurde:</p>
<pre><code class="language-cpp">class string {
  char* meinzeiger; // &lt;- erstes und einziges Datenelement
public:
  ...
};
</code></pre>
<p>und selbst in diesem Fall ist ein Reinterpret-Cast Pfui, da string kein POD ist. Ich wüsste auch nicht, wo bei so einer Implementierung die Größe und die Kapazität des strings gespeichert wäre...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959874</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 01 Oct 2010 03:54:34 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Fri, 01 Oct 2010 04:07:39 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Das kann ja nur funktionieren, wenn string zufällig so definiert wurde:</p>
<pre><code class="language-cpp">class string {
  char* meinzeiger; // &lt;- erstes und einziges Datenelement
public:
  ...
};
</code></pre>
<p>und selbst in diesem Fall ist ein Reinterpret-Cast Pfui, da string kein POD ist. Ich wüsste auch nicht, wo bei so einer Implementierung die Größe und die Kapazität des strings gespeichert wäre...</p>
</blockquote>
<p>falls dann rtti iwie aktiviert wird geht nichts mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> oder etwa doch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959875</guid><dc:creator><![CDATA[rtti]]></dc:creator><pubDate>Fri, 01 Oct 2010 04:07:39 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Fri, 01 Oct 2010 04:26:36 GMT]]></title><description><![CDATA[<p>@krümelkackcker<br />
läuft hier auf 'nem Mac mit gcc 4.2.1 und 'nem Linux mit gcc 4.4.2.<br />
Aber Du hast natürlich Recht mit string*. Ich hatte gestern Abend viel ausprobiert und irgendwie ist das ein Überbleibsel gewesen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959876</guid><dc:creator><![CDATA[ScyllaIllciz]]></dc:creator><pubDate>Fri, 01 Oct 2010 04:26:36 GMT</pubDate></item><item><title><![CDATA[Reply to String in char ** konvertieren on Fri, 01 Oct 2010 14:25:28 GMT]]></title><description><![CDATA[<p>ScyllaIllciz schrieb:</p>
<blockquote>
<p>@krümelkackcker<br />
läuft hier auf 'nem Mac mit gcc 4.2.1 und 'nem Linux mit gcc 4.4.2.<br />
Aber Du hast natürlich Recht mit string*. Ich hatte gestern Abend viel ausprobiert und irgendwie ist das ein Überbleibsel gewesen!</p>
</blockquote>
<p>Du hast einfach Glück gehabt. Der C++ Standard definiert nicht, wie die string-Klasse genau implementiert werden soll. die libstdc++ Implementierung scheint äquivalent zu dem hier zu sein:</p>
<pre><code class="language-cpp">class string
{
  char* anfang; // &lt;-- einziges Datenelement
public:
  ...
};

int main() {
  string wtf = &quot;hello!&quot;;
  wtf.reserve(80);
  string s2 = wtf;
  char* p = reinterpret_cast&lt;char*&amp;&gt;(wtf);
}
</code></pre>
<p>und im Speicher sieht das dann so aus:</p>
<pre><code>p
                                                  |
                                                  V
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|       6       |      80       |       1       |'h'|'e'|'l'|'l'|'o'|'!'| 0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
     (size)        (capacity)     (ref_count-1)
</code></pre>
<p>Wie gesagt, Du hast Glück gehabt, dass in <em>deinem Fall</em> sizeof(string)==sizeof(char*) gilt und dass der char-Zeiger direkt auf das erste Zeichen der nullterminierten Zeichenkette zeigt. Aus der Dokumentation im Quelltext geht hervor, dass man das so gemacht hat, damit man schön im Debugger sehen kann, was für eine Zeichenkette das string-Objekt speichert.</p>
<p>Unter'm Microsoft Compiler ist sizeof(string) soweit ich weiß irgendwas bei 32 (wegen der &quot;small string optimization&quot;).</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959943</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 01 Oct 2010 14:25:28 GMT</pubDate></item></channel></rss>