<?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[Strings in Structs]]></title><description><![CDATA[<p>Hallo ich habe folgendes kompliziertes Problem:</p>
<p>Ich habe ein Struct mit std::string</p>
<pre><code class="language-cpp">struct DataEntry{
    std::string name;
    int date_d;//1-31
    int date_m;//0-11
    int date_y;//ab 1900
    int type;
    std::string type_other;
    std::string comment;
};
</code></pre>
<p>Zusätzlich habe ich ein Dialog-basiertes Projekt, sodass ich eine Dialog Callback Function habe, in der soll beim drücken des OK Buttons ein struct gefüllt werden und ein Pointer des structs an eine Funktion aus einer Klasse geleitet werden:</p>
<pre><code class="language-cpp">case IDC_BUTTON3:
    //OK
    //DataEntry de = {&quot;Der Name&quot;, 5, 0, 110, 0, &quot;KeinAndereTyp&quot;, &quot;KeinKommentar&quot;};
    DataEntry de;
    de.name = &quot;DerName&quot;;
    de.date_d = 5;
    de.date_m = 0;
    de.date_y = 110;
    de.type = 0;
    de.type_other = &quot;KeinAndereTyp&quot;;
    de.comment = &quot;KeinKommentar&quot;;
    pDataPointer-&gt;SetDataEntry(&amp;de);
    EndDialog(hwndDlg, 0);
    return TRUE;
}
</code></pre>
<p>pDataPointer ist ein globaler Zeiger auf die Klasse der in der Main initialisiert wurde...<br />
Folgendes ist der Part aus der Klasse:</p>
<pre><code class="language-cpp">void DataStorage::SetDataEntry(DataEntry* data){
    ...
    SetString(&quot;Name&quot;, (data-&gt;name).c_str(), false, container);
    SetInt(&quot;Typ&quot;, data-&gt;type, false, container);
    SetString(&quot;TypDesc&quot;, (data-&gt;type_other).c_str(), false, container);
    SetString(&quot;Comment&quot;, (data-&gt;comment).c_str(), false, container);
};
</code></pre>
<p>Bei c_str() kommt glaub ich auch der Fehler her, da der Debugger sagt:</p>
<blockquote>
<p>Program received signal SIGSEGV, Segmentation fault.<br />
In strlen () (C:\Windows\system32\msvcrt.dll)</p>
</blockquote>
<p>Es funktioniert alles, wenn ich die strings rauslasse.</p>
<p>Komischerweise funktioniert es auch, wenn ich den aufrufenden Part direkt in die Main schreibe...<br />
Wäre nett wenn mir jmd helfen könnte</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/257988/strings-in-structs</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 15:05:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257988.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 05 Jan 2010 14:40:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Strings in Structs on Tue, 05 Jan 2010 14:40:53 GMT]]></title><description><![CDATA[<p>Hallo ich habe folgendes kompliziertes Problem:</p>
<p>Ich habe ein Struct mit std::string</p>
<pre><code class="language-cpp">struct DataEntry{
    std::string name;
    int date_d;//1-31
    int date_m;//0-11
    int date_y;//ab 1900
    int type;
    std::string type_other;
    std::string comment;
};
</code></pre>
<p>Zusätzlich habe ich ein Dialog-basiertes Projekt, sodass ich eine Dialog Callback Function habe, in der soll beim drücken des OK Buttons ein struct gefüllt werden und ein Pointer des structs an eine Funktion aus einer Klasse geleitet werden:</p>
<pre><code class="language-cpp">case IDC_BUTTON3:
    //OK
    //DataEntry de = {&quot;Der Name&quot;, 5, 0, 110, 0, &quot;KeinAndereTyp&quot;, &quot;KeinKommentar&quot;};
    DataEntry de;
    de.name = &quot;DerName&quot;;
    de.date_d = 5;
    de.date_m = 0;
    de.date_y = 110;
    de.type = 0;
    de.type_other = &quot;KeinAndereTyp&quot;;
    de.comment = &quot;KeinKommentar&quot;;
    pDataPointer-&gt;SetDataEntry(&amp;de);
    EndDialog(hwndDlg, 0);
    return TRUE;
}
</code></pre>
<p>pDataPointer ist ein globaler Zeiger auf die Klasse der in der Main initialisiert wurde...<br />
Folgendes ist der Part aus der Klasse:</p>
<pre><code class="language-cpp">void DataStorage::SetDataEntry(DataEntry* data){
    ...
    SetString(&quot;Name&quot;, (data-&gt;name).c_str(), false, container);
    SetInt(&quot;Typ&quot;, data-&gt;type, false, container);
    SetString(&quot;TypDesc&quot;, (data-&gt;type_other).c_str(), false, container);
    SetString(&quot;Comment&quot;, (data-&gt;comment).c_str(), false, container);
};
</code></pre>
<p>Bei c_str() kommt glaub ich auch der Fehler her, da der Debugger sagt:</p>
<blockquote>
<p>Program received signal SIGSEGV, Segmentation fault.<br />
In strlen () (C:\Windows\system32\msvcrt.dll)</p>
</blockquote>
<p>Es funktioniert alles, wenn ich die strings rauslasse.</p>
<p>Komischerweise funktioniert es auch, wenn ich den aufrufenden Part direkt in die Main schreibe...<br />
Wäre nett wenn mir jmd helfen könnte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1832982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1832982</guid><dc:creator><![CDATA[HostedDinner]]></dc:creator><pubDate>Tue, 05 Jan 2010 14:40:53 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Structs on Tue, 05 Jan 2010 14:54:32 GMT]]></title><description><![CDATA[<p>Könnte es sein, dass der Scope endet, die Objekte zerstört werden und deine Zeiger plötzlich ins Leere zeigen?</p>
<p>Versuch mal DataEntry mit new anzulegen. Das delete kannst du zunächst weglassen, einfach um zu sehen, ob es klappt...<br />
**<br />
Wenn es dann läuft musst du natürlich an passender Stelle den Speicher wieder freigeben.**</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1832990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1832990</guid><dc:creator><![CDATA[zutzutzu]]></dc:creator><pubDate>Tue, 05 Jan 2010 14:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Structs on Tue, 05 Jan 2010 15:15:36 GMT]]></title><description><![CDATA[<p>So?</p>
<pre><code class="language-cpp">case IDC_BUTTON3:
    //OK
    //DataEntry de = {&quot;das&quot;, 5, 0, 110, 0, &quot;&quot;, &quot;Kein Kommentar&quot;};
    DataEntry *de = new DataEntry;
    de-&gt;name = &quot;DerName&quot;;
    de-&gt;date_d = 5;
    de-&gt;date_m = 0;
    de-&gt;date_y = 110;
    de-&gt;type = 0;
    de-&gt;type_other = &quot;KeinAndereTyp&quot;;
    de-&gt;comment = &quot;KeinKommentar&quot;;
    pDataPointer-&gt;SetDataEntry(de);
    EndDialog(hwndDlg, 0);
    return TRUE;
</code></pre>
<p>So besteht das Problem weiterhin... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Edit: Hab jetzt anstelle von nem Pointer die Variable de global gemacht <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="😉"
    /> geht auch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833012</guid><dc:creator><![CDATA[HostedDinner]]></dc:creator><pubDate>Tue, 05 Jan 2010 15:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Structs on Tue, 05 Jan 2010 15:17:57 GMT]]></title><description><![CDATA[<p>Wird vielleicht die Variablendeklaration durch die Case-Marke irgendwie übersprungen oder sowas?</p>
<p>Probier mal manuell den Scope zu begrenzen:</p>
<pre><code class="language-cpp">case IDC_BUTTON3:
{
    //OK
    //DataEntry de = {&quot;das&quot;, 5, 0, 110, 0, &quot;&quot;, &quot;Kein Kommentar&quot;};
    DataEntry *de = new DataEntry;
    de-&gt;name = &quot;DerName&quot;;
    de-&gt;date_d = 5;
    de-&gt;date_m = 0;
    de-&gt;date_y = 110;
    de-&gt;type = 0;
    de-&gt;type_other = &quot;KeinAndereTyp&quot;;
    de-&gt;comment = &quot;KeinKommentar&quot;;
    pDataPointer-&gt;SetDataEntry(de);
    EndDialog(hwndDlg, 0);

}
    return TRUE;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1833017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833017</guid><dc:creator><![CDATA[zutzutzu]]></dc:creator><pubDate>Tue, 05 Jan 2010 15:17:57 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Structs on Tue, 05 Jan 2010 15:27:17 GMT]]></title><description><![CDATA[<p>Nein ich glaub das würd auch nicht funktionieren, weil ja dann der Scope noch kleiner wäre, wie schon im Edit geschrieben, klappt es wenn ich die Variable global mache, weil es wird ja ein Pointer vom Struct übergeben<br />
Also danke für den Tip mit dem Scope...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833023</guid><dc:creator><![CDATA[HostedDinner]]></dc:creator><pubDate>Tue, 05 Jan 2010 15:27:17 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Structs on Tue, 05 Jan 2010 15:30:17 GMT]]></title><description><![CDATA[<p>HostedDinner schrieb:</p>
<blockquote>
<p>Nein ich glaub das würd auch nicht funktionieren, weil ja dann der Scope noch kleiner wäre, wie schon im Edit geschrieben, klappt es wenn ich die Variable global mache, weil es wird ja ein Pointer vom Struct übergeben<br />
Also danke für den Tip mit dem Scope...</p>
</blockquote>
<p>Im Falle von new wird davon der Scope <strong>nicht</strong> beeinflusst, da du das Objekt manuell mit delete zerstören musst. Mir ging es eher darum, dass ich die Vermutung hatte, dass es durch die Initialisierung in der Case-Marke zu Problem kommt. Daher die Klammern darum. Du kannst und solltest diese Variante also ruhig mal ausprobieren. Mein Compiler weist mich auf sowas sogar hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833025</guid><dc:creator><![CDATA[zutzutzu]]></dc:creator><pubDate>Tue, 05 Jan 2010 15:30:17 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Structs on Tue, 05 Jan 2010 19:21:42 GMT]]></title><description><![CDATA[<p>Was macht denn SetString genau?<br />
Ich nehme mal an, dass den Parameter behalten will und da der String, nachdem das case verlassen wurde existiert der String ja nicht mehr und der C-String Zeiger zeigt auf ungültige Daten.</p>
<p>Wenn das struct global ist, dann bleibt der Speicher ebenfalls genügend lange gültig und die Funktion macht keine Probleme.</p>
<p>Wichtig ist somit zu wissen, wie lange SetString (oder was sich da auch immer dahinter versteckt) den String beansprucht dann kannst das Objekt auch wieder korrekt zerstören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1833230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1833230</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 05 Jan 2010 19:21:42 GMT</pubDate></item></channel></rss>