<?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[char übergeben]]></title><description><![CDATA[<p>Ich habe folgendes ausprobiert:</p>
<pre><code class="language-cpp">private:
	char m_DeviceName[64];
public
	void setDeviceName(char* value){ m_DeviceName = value; }
</code></pre>
<p>was mir den Fehler liefert</p>
<blockquote>
<p>1&gt;e:\daten\dev\cpp\hibiscus\lightmodulator2dmat\lightmodulator2d\CameraSMX150.h(55) : error C2440: '=': 'char *' kann nicht in 'char [64]' konvertiert werden<br />
1&gt; Es gibt keine Konvertierungen von Arraytypen, obwohl es Konvertierungen von Verweisen oder Zeigern in Arrays gibt</p>
</blockquote>
<p>Nicht das ich den Fehler nicht verstehe, aber mir fällt gerade keine Lösung ein.<br />
Ich könnte natürlich mit CtTring arbeiten, aber ich muss später wieder einen char[64] übergeben. Ich wollte mir daher das umwandeln zwischendurch sparen.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/191765/char-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 04:35:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/191765.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Sep 2007 09:58:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to char übergeben on Thu, 06 Sep 2007 09:58:14 GMT]]></title><description><![CDATA[<p>Ich habe folgendes ausprobiert:</p>
<pre><code class="language-cpp">private:
	char m_DeviceName[64];
public
	void setDeviceName(char* value){ m_DeviceName = value; }
</code></pre>
<p>was mir den Fehler liefert</p>
<blockquote>
<p>1&gt;e:\daten\dev\cpp\hibiscus\lightmodulator2dmat\lightmodulator2d\CameraSMX150.h(55) : error C2440: '=': 'char *' kann nicht in 'char [64]' konvertiert werden<br />
1&gt; Es gibt keine Konvertierungen von Arraytypen, obwohl es Konvertierungen von Verweisen oder Zeigern in Arrays gibt</p>
</blockquote>
<p>Nicht das ich den Fehler nicht verstehe, aber mir fällt gerade keine Lösung ein.<br />
Ich könnte natürlich mit CtTring arbeiten, aber ich muss später wieder einen char[64] übergeben. Ich wollte mir daher das umwandeln zwischendurch sparen.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360066</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Thu, 06 Sep 2007 09:58:14 GMT</pubDate></item><item><title><![CDATA[Reply to char übergeben on Thu, 06 Sep 2007 10:07:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Nimm statt dessen std::string. Wenn du unbedingt const char* brauchst gibt es ja noch c_str();<br />
Wenn du unbedingt bei deinen char-Arrays bleiben willst nutze strcpy (oder besser strncpy).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360080</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 06 Sep 2007 10:07:04 GMT</pubDate></item><item><title><![CDATA[Reply to char übergeben on Thu, 06 Sep 2007 10:59:02 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>Nimm statt dessen std::string.</p>
</blockquote>
<p>Das wäre dann doch nicht wesentlich anders als wenn in CString nehmen?</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Wenn du unbedingt const char* brauchst gibt es ja noch c_str();</p>
</blockquote>
<p>Ist das eine funktion von string ?</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Wenn du unbedingt bei deinen char-Arrays bleiben willst nutze strcpy (oder besser strncpy).</p>
</blockquote>
<p>Schon klar das ich damit arrays kopieren kann, aber wie ich ein char in einer Funktion übergebe ist mir noch immer nicht klar.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360123</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Thu, 06 Sep 2007 10:59:02 GMT</pubDate></item><item><title><![CDATA[Reply to char übergeben on Thu, 06 Sep 2007 11:03:41 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>Nimm statt dessen std::string.</p>
</blockquote>
<p>Das wäre dann doch nicht wesentlich anders als wenn in CString nehmen?</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Wenn du unbedingt const char* brauchst gibt es ja noch c_str();</p>
</blockquote>
<p>Ist das eine funktion von string ?</p>
</blockquote>
<p>Ja, die Klassen sind vergleichbar (und ja - c_str() ist eine Methode von std::string, die die Daten als char* ausgibt - CString hat dafür einen Konvertierungsoperator).</p>
<blockquote>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Wenn du unbedingt bei deinen char-Arrays bleiben willst nutze strcpy (oder besser strncpy).</p>
</blockquote>
<p>Schon klar das ich damit arrays kopieren kann, aber wie ich ein char in einer Funktion übergebe ist mir noch immer nicht klar.</p>
<p>Matthias</p>
</blockquote>
<p>Wenn du einzelne char's hast, kannst du die auch mit = zuweisen - aber du hast dort keinen einzelnen char, sondern ein char-Array.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360127</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 06 Sep 2007 11:03:41 GMT</pubDate></item><item><title><![CDATA[Reply to char übergeben on Thu, 06 Sep 2007 11:16:19 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>...<br />
Das wäre dann doch nicht wesentlich anders als wenn in CString nehmen?...</p>
</blockquote>
<p>Vergleich selbst:</p>
<p>pospiech schrieb:</p>
<blockquote>
<p>(korrigiert)...</p>
<pre><code class="language-cpp">private:
        // wenn sich hier mal die zulässige Länge ändert, 
        // musst Du die 64 überall ändern
	char m_DeviceName[64];
public
	void setDeviceName(char* value){ 
           // Sicherheitsabfrage nötig
           if(!value) ||
             (strlen(value) &gt;= 64)) throw runtime_error(&quot;passt nicht&quot;);
           // trotzdem kann value auf ungüligen Speicher zeigen und wir haben
           // keine Chance, das zuverlässig auszuschließen
           strncpy(m_DeviceName, value, 64)
        }
</code></pre>
</blockquote>
<p>vs:</p>
<pre><code class="language-cpp">private:
        // beliebige Länge unterstützt
	string m_DeviceName;
public
	void setDeviceName(string const&amp; value) { 
            m_DeviceName = value;
        }
        // Sicherheitsabfrage nötig 

// IMHO übersichtlicher:
// 	void setDeviceName(string const&amp; value) : m_DeviceName(value) {}
</code></pre>
<p>Nachtrag: Ich verstand das so, dass hier &quot;C-Strings&quot; (char[] mit '\0' terminiert) verwendet werden sollen. Falls es sich bei CString um eine eigene Klasse handelt, kenne ich sie nicht und kann auch keinen Vergleich anführen.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360137</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 06 Sep 2007 11:16:19 GMT</pubDate></item><item><title><![CDATA[Reply to char übergeben on Thu, 06 Sep 2007 11:15:23 GMT]]></title><description><![CDATA[<p>Dein Problem ist auch garnicht die Übergabe an die Funktion, die funktioniert schon so, sondern dass du versucht den Zeiger einem Array zuzuweisen...<br />
Die normale Zuweisung m_Devicename = value würde nämlich, wenn der Compiler es denn zuließe, lediglich den Zeiger der auf dein reservierten Speicherbereich zeigt, auf den auf value zeigen lassen:</p>
<pre><code class="language-cpp">int my_function()
{
   char hello[] = &quot;Hello World&quot;;
   myObject.setDeviceName(hello); //m_DeviceName würde jetzt auf hello zeigen
   return; //hier wird hello zerstört
} 

int main()
{
   my_function();
   ... //Ab hier würden alle Zugriffe auf m_DeviceName zum Crash führen
}
</code></pre>
<p>Was du also wirklich willst, ist value zu kopieren:</p>
<pre><code class="language-cpp">void setDeviceName(char* value)
 {
    strncpy(m_DeviceName, value, 64);
 }
</code></pre>
<p>oder, vernünftig mit std::string</p>
<pre><code class="language-cpp">...
std::string m_DeviceName;
void setDeviceName(const std::string &amp;value)
{
   m_DeviceName = value;
}
...
</code></pre>
<p>Grüße,</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360139</guid><dc:creator><![CDATA[JimmydaMage]]></dc:creator><pubDate>Thu, 06 Sep 2007 11:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to char übergeben on Thu, 06 Sep 2007 13:59:04 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>pospiech schrieb:</p>
<blockquote>
<p>...<br />
Das wäre dann doch nicht wesentlich anders als wenn in CString nehmen?...</p>
</blockquote>
<pre><code class="language-cpp">// IMHO übersichtlicher:
// 	void setDeviceName(string const&amp; value) : m_DeviceName(value) {}
</code></pre>
</blockquote>
<p>Ja, das wäre das beste - aber leider funktionieren diese Initialisierungslisten nur bei Konstruktoren und nicht bei Setter-Methoden.</p>
<blockquote>
<p>Nachtrag: Ich verstand das so, dass hier &quot;C-Strings&quot; (char[] mit '\0' terminiert) verwendet werden sollen. Falls es sich bei CString um eine eigene Klasse handelt, kenne ich sie nicht und kann auch keinen Vergleich anführen.</p>
</blockquote>
<p>Bei &quot;CString&quot; fällt mir als erstes die String-Klasse der MFC ein - die ist ähnlich aufgebaut wie std::string.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360256</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 06 Sep 2007 13:59:04 GMT</pubDate></item><item><title><![CDATA[Reply to char übergeben on Thu, 06 Sep 2007 14:29:12 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>pospiech schrieb:</p>
<blockquote>
<p>...<br />
Das wäre dann doch nicht wesentlich anders als wenn in CString nehmen?...</p>
</blockquote>
<pre><code class="language-cpp">// IMHO übersichtlicher:
// 	void setDeviceName(string const&amp; value) : m_DeviceName(value) {}
</code></pre>
</blockquote>
<p>Ja, das wäre das beste - aber leider funktionieren diese Initialisierungslisten nur bei Konstruktoren und nicht bei Setter-Methoden.....</p>
</blockquote>
<p>Hopps, hatte das &quot;void&quot; übersehen und gedacht, die Klasse hieße &quot;setDeviceName&quot; (&quot;set&quot; im Sinne von &quot;Satz&quot; und nicht &quot;setze&quot;).</p>
<p>Nunja, gut, dass Du das geklärt hast.</p>
<p>Von &quot;der MFC-Klasse CString&quot; habe ich schonmal gehört, aber ich kenne sie halt nicht und assoziiere sie auch nicht als Erstes (kam erst beim 3. Mal Durchlesen auf die Idee).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1360283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360283</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 06 Sep 2007 14:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to char übergeben on Thu, 06 Sep 2007 14:43:38 GMT]]></title><description><![CDATA[<p>ehm und ist sowieso dumm, da du dann wahrscheinlich die DLLs der MFC brauchst ... also lieber bei Standardklassentemplates bleiben <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/1360297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1360297</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Thu, 06 Sep 2007 14:43:38 GMT</pubDate></item></channel></rss>