<?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[Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?)]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Der Titel ist ggf. etwas verwirrend, denn auch ich weiß nicht genau wie ich es besser beschreiben könnte. Folgender Codeausschnitt:</p>
<pre><code>typedef struct MainStruct {

	struct SubStruct1 {
		int Value;
	} SubStruct1;

	struct SubStruct2 {
		int Value;
	} SubStruct2;

	struct SubStruct3 {
		int Value;
	} SubStruct3;

} MainStruct_t;
</code></pre>
<p>In meinem Fall ist diese Struktur extern <strong>generiert</strong> worden und darf daher nicht weiter verändert werden. Das hier gezeigte Beispiel ist allerdings stark vereinfacht.</p>
<p>Diese Struktur kann ich auch problemlos verwenden:</p>
<pre><code>MainStruct_t *mp_mainStruct;
mainStruct = (MainStruct_t*) calloc(1, sizeof(MainStruct_t));

mp_mainStruct-&gt;SubStruct1.Value;
mp_mainStruct-&gt;SubStruct2.Value;
mp_mainStruct-&gt;SubStruct3.Value;
</code></pre>
<p>Jetzt habe ich drei Funktionen, die den Wert 'Value' in der jeweiligen Substruktur ändern:</p>
<pre><code>void setSubStruct1(MainStruct_t &amp;ms, int newValue)
{
	ms-&gt;SubStruct1.Value = newValue;
	return;
}

void setSubStruct2(MainStruct_t &amp;ms, int newValue)
{
	ms-&gt;SubStruct2.Value = newValue;
	return;
}

void setSubStruct3(MainStruct_t &amp;ms, int newValue)
{
	ms-&gt;SubStruct3.Value = newValue;
	return;
}
</code></pre>
<p>Wie man sieht ist der Code eigentlich identisch, nur die Substruktur ist jeweils anders. Kann ich den Code irgendwie zusammenfassen?<br />
Ungefähr so:</p>
<pre><code>void setSubStruct(????? &amp;subStruct, int newValue)
{
	subStruct.Value = newValue;
	return;
}

// Aufruf:
setSubStruct (mp_mainStruct-&gt;SubStruct1, 5);
</code></pre>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/336060/unterschiedliche-strukturnamen-mit-gleichem-inhalt-optimale-funktionsübergabe</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 17:55:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/336060.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 31 Dec 2015 11:44:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Thu, 31 Dec 2015 11:44:58 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Der Titel ist ggf. etwas verwirrend, denn auch ich weiß nicht genau wie ich es besser beschreiben könnte. Folgender Codeausschnitt:</p>
<pre><code>typedef struct MainStruct {

	struct SubStruct1 {
		int Value;
	} SubStruct1;

	struct SubStruct2 {
		int Value;
	} SubStruct2;

	struct SubStruct3 {
		int Value;
	} SubStruct3;

} MainStruct_t;
</code></pre>
<p>In meinem Fall ist diese Struktur extern <strong>generiert</strong> worden und darf daher nicht weiter verändert werden. Das hier gezeigte Beispiel ist allerdings stark vereinfacht.</p>
<p>Diese Struktur kann ich auch problemlos verwenden:</p>
<pre><code>MainStruct_t *mp_mainStruct;
mainStruct = (MainStruct_t*) calloc(1, sizeof(MainStruct_t));

mp_mainStruct-&gt;SubStruct1.Value;
mp_mainStruct-&gt;SubStruct2.Value;
mp_mainStruct-&gt;SubStruct3.Value;
</code></pre>
<p>Jetzt habe ich drei Funktionen, die den Wert 'Value' in der jeweiligen Substruktur ändern:</p>
<pre><code>void setSubStruct1(MainStruct_t &amp;ms, int newValue)
{
	ms-&gt;SubStruct1.Value = newValue;
	return;
}

void setSubStruct2(MainStruct_t &amp;ms, int newValue)
{
	ms-&gt;SubStruct2.Value = newValue;
	return;
}

void setSubStruct3(MainStruct_t &amp;ms, int newValue)
{
	ms-&gt;SubStruct3.Value = newValue;
	return;
}
</code></pre>
<p>Wie man sieht ist der Code eigentlich identisch, nur die Substruktur ist jeweils anders. Kann ich den Code irgendwie zusammenfassen?<br />
Ungefähr so:</p>
<pre><code>void setSubStruct(????? &amp;subStruct, int newValue)
{
	subStruct.Value = newValue;
	return;
}

// Aufruf:
setSubStruct (mp_mainStruct-&gt;SubStruct1, 5);
</code></pre>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481233</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Thu, 31 Dec 2015 11:44:58 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Thu, 31 Dec 2015 12:13:12 GMT]]></title><description><![CDATA[<p>Dein Code ist kein C, aber da du hier gepostet hast gehe ich auf keine möglichen C++ Lösungen ein:</p>
<pre><code>//Inline Ersetzung
#define setSubStructGenericVersion1(TYPE, ms, newValue) ms-&gt;TYPE.Value = newValue;

//Generierung der Methoden per Präprozessor
#define setSubStructGenericVersion2Def(Number)\
	void setSubStruct##Number(MainStruct_t *ms, int newValue)\
	{\
		ms-&gt;SubStruct##Number.Value = newValue;\
	}

setSubStructGenericVersion2Def(1); //äquivalent zu setSubStruct1
setSubStructGenericVersion2Def(2); //äquivalent zu setSubStruct2
setSubStructGenericVersion2Def(3); //äquivalent zu setSubStruct3

void main()
{
	MainStruct_t* ms = (MainStruct_t*)malloc(sizeof(MainStruct_t));
	memset(ms, 0, sizeof(MainStruct_t));

        //Nutz Inline-Ersetzung
	setSubStructGenericVersion1(SubStruct3, ms, 45);

        //Nutzt generierte generische Methode
	setSubStruct1(ms, 67);
}
</code></pre>
<p>Je nachdem was genau deine Ansprüche sind kannst du dir eine der beiden Lösungen raussuchen. Du hst ja gemeint dass dein Beispiel nur vereinfacht ist, drum kann ich nicht genau sagen was sinnvoll ist. <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/2481234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481234</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Thu, 31 Dec 2015 12:13:12 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Thu, 31 Dec 2015 12:23:58 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Dein Code ist kein C, aber da du hier gepostet hast gehe ich auf keine möglichen C++ Lösungen ein</p>
</blockquote>
<p>verdammt :). Hatte ich bewusst hier gepostet um mögliches Verschieben durch einen Moderator zu aus dem C++ Forum zu verhindern. Woran hast du denn erkannt, dass es für C++ ist? An '(MainStruct_t*)' vor calloc? <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="😕"
    /> . Würde es für C++ eine bessere alternative geben?</p>
<p>Auf jeden Fall erstmal danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Ich schaue es mir mal an. Hatte leider schon befürchtet, dass es auf Makros hinauslaufen wird.</p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481235</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Thu, 31 Dec 2015 12:23:58 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Thu, 31 Dec 2015 12:39:13 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Dein Code ist kein C, aber da du hier gepostet hast gehe ich auf keine möglichen C++ Lösungen ein</p>
</blockquote>
<p>verdammt :). Hatte ich bewusst hier gepostet um mögliches Verschieben durch einen Moderator zu aus dem C++ Forum zu verhindern.</p>
</blockquote>
<p>Hä??? Extrem seltsames Verhalten.</p>
<p>SBond schrieb:</p>
<blockquote>
<p>Woran hast du denn erkannt, dass es für C++ ist? An '(MainStruct_t*)' vor calloc?</p>
</blockquote>
<p>Nee, es gibt viel deutlichere Zeichen. Aber wozu sie verraten? Damit Du besser Fremdsprachenforen benutzen kannst?</p>
<p>SBond schrieb:</p>
<blockquote>
<p>Würde es für C++ eine bessere alternative geben?</p>
</blockquote>
<p>Kriegste idealerweise nicht in diesem Forum beantwortet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481237</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 31 Dec 2015 12:39:13 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Thu, 31 Dec 2015 12:49:44 GMT]]></title><description><![CDATA[<p>...ok. also einen Mod bitten diesen Thread in das C++-Forum zu verschieben? Ein zweiten thread nachträglich zu eröffnen ist wohl nicht so toll.<br />
sorry war ja nicht böse gemeint <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2481238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481238</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Thu, 31 Dec 2015 12:49:44 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Thu, 31 Dec 2015 13:33:42 GMT]]></title><description><![CDATA[<p>Die Referenz &quot;&amp;&quot; outet dich als C++ler und damit als C Laie.</p>
<blockquote>
<p>irgendwie <strong>zusammenfassen</strong></p>
</blockquote>
<p>gibt schon einen Hinweis: union</p>
<p>Jedenfalls keine Makros, die benutzt kein vernünftiger C Entwickler (bzw. nur im äußersten Notfall und vor allen Dingen: <strong>selten</strong>, jedenfalls nicht als grundsätzliche Implementierung, so wie C-Laie DarkShadow44).</p>
<p>Sind die substructs ähnlich bzw. sogar identisch (wie bei dir) könnte das dann so aussehen (der aufrufende Kontext übernimmt einen (den wichtigsten!) Teil der Separierung).<br />
Deine gesuchte Universal-Funktion sieht dann doch schon sehr einfach aus:</p>
<pre><code>typedef union {
    int Value;
    struct SubStruct1 {
        int Value;
    } SubStruct1;

    struct SubStruct2 {
        int Value;
    } SubStruct2;

    struct SubStruct3 {
        int Value;
    } SubStruct3;
} T;

void print( T *t )
{
    printf(&quot;%d\n&quot;,t-&gt;Value);
}

int main()
{
    T t;
    t.SubStruct1.Value = 1;
    print(&amp;t);
    t.SubStruct2.Value = 2;
    print(&amp;t);
    t.SubStruct3.Value = 3;
    print(&amp;t);

    return 0;
}
</code></pre>
<p><a href="http://ideone.com/nqgqvm" rel="nofollow">http://ideone.com/nqgqvm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481247</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Thu, 31 Dec 2015 13:33:42 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Thu, 31 Dec 2015 15:13:58 GMT]]></title><description><![CDATA[<p>Danke für die Tipps <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Auf 'union' bin ich während meiner Suche auch ein paar mal gestoßen. Allerdings werden die Variablen gewisserweise zusammengefasst. Bei mir sollten die Variablen schon individuell bleiben, da jede SubStruct ihre eigenen Werte hat. Ich versuche quasi per Parameter einer Funktion zu sagen, in welcher Substruktur etwas verarbeitet werden soll.</p>
<p>Als Übersicht:<br />
Hauptstruktur-&gt;Substruktur_1-&gt;SubSubstruktur-&gt;...-&gt;Variable</p>
<p>Der Name 'Substruktur_1' kann variieren, aber die enthaltene Struktur (-&gt;SubSubstruktur-&gt;...-&gt;Variable) ist immer gleich. Ein Array wäre da sinnvoll gewesen, aber meine Struktur isr generiert, daher ist eine Änderung nicht empfehlenswert.<br />
Ich werde mal morgen schauen, ob ich eine Lösung finde.</p>
<p>Wünsche euch allen noch einen guten Rutsch ins neue Jahr <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/2481254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481254</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Thu, 31 Dec 2015 15:13:58 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Thu, 31 Dec 2015 16:55:34 GMT]]></title><description><![CDATA[<p>Wutz schrieb:</p>
<blockquote>
<p>Sind die substructs ähnlich bzw. sogar identisch (wie bei dir) könnte das dann so aussehen (der aufrufende Kontext übernimmt einen (den wichtigsten!) Teil der Separierung).</p>
</blockquote>
<p>Das ist doch was ganz anderes, und nichtmal sinnvoll.</p>
<ol>
<li>Die Struct darf laut TS nicht verändert werden</li>
<li>Es klingt eher so als ob der TS den Code einfacher haben will. Mit der Union erzwingst du dass alle Sub-structs die selben Werte habe, das ist logisch etwas ganz anderes. Da könnte man sich die verschiedenen Substructs gleich sparen.</li>
</ol>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/2311">@TS</a><br />
Was du eigentlich willst ist soetwas:</p>
<pre><code>struct SubStruct { 
	int Value; 
};

typedef struct MainStruct { 

	int test;
    struct SubStruct SubStruct1; 
    struct SubStruct SubStruct2; 
    struct SubStruct SubStruct3; 

} MainStruct_t;

void setSubStruct(SubStruct*s, int newValue)
{
    s-&gt;Value = newValue;
}
</code></pre>
<p>Vorausgesetzt die SubStructs sind wirklich gleich. Aber dafür müsstest du die Struct abändern.<br />
Sonst fällt mir außer Makros nichts ein.</p>
<p>C++ Version:</p>
<pre><code>template&lt;typename T&gt;
void setSubStruct(T &amp;s, int newValue)
{
	s.Value = newValue;
}

void main()
{
	MainStruct_t ms;

	setSubStruct(ms.SubStruct1, 12);
	setSubStruct(ms.SubStruct2, 24);
}
</code></pre>
<p>Das ist recht elegant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481267</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Thu, 31 Dec 2015 16:55:34 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Thu, 31 Dec 2015 19:04:37 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>...ok. also einen Mod bitten diesen Thread in das C++-Forum zu verschieben? Ein zweiten thread nachträglich zu eröffnen ist wohl nicht so toll.<br />
sorry war ja nicht böse gemeint <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>
</blockquote>
<p>???<br />
Welche Sprache soll es denn nun sein? Du musst doch wohl selber wissen, welche Sprache du hier sprechen <em>möchtest</em>, es kann nicht gleichzeitig C und C++ sein. Entweder soll das C sein und du hast versehentlich etwas auf C++ gesagt (Weil dein C nicht so gut ist); oder es soll C++ sein und du hast bewusst ins falsche Forum gepostet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481281</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 31 Dec 2015 19:04:37 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Thu, 31 Dec 2015 23:59:27 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Wutz schrieb:</p>
<blockquote>
<p>Sind die substructs ähnlich bzw. sogar identisch (wie bei dir) könnte das dann so aussehen (der aufrufende Kontext übernimmt einen (den wichtigsten!) Teil der Separierung).</p>
</blockquote>
<p>Das ist doch was ganz anderes, und nichtmal sinnvoll.</p>
<ol>
<li>Die Struct darf laut TS nicht verändert werden</li>
<li>Es klingt eher so als ob der TS den Code einfacher haben will. Mit der Union erzwingst du dass alle Sub-structs die selben Werte habe, das ist logisch etwas ganz anderes. Da könnte man sich die verschiedenen Substructs gleich sparen.</li>
</ol>
</blockquote>
<p>Du redest Unsinn. Du hast die Intention meines Vorschlages nicht verstanden.<br />
Nirgendwo wird bei mir der Ausgangs-struct-Typ geändert, der Frager will den Code einfacher haben, und genau das hat er auch bekommen.<br />
Wenn es um C geht überlasse bitte mir die Einschätzung, ob etwas sinnvoll ist.<br />
Ich habe von dir hier noch keine Beiträge gelesen, die tiefschürfende C-Kenntnisse vermuten lassen.<br />
Also, wer lesen kann ist klar im Vorteil.<br />
Und da es offensichtlich auch für langjährige Forumsleser schwierig zu sein scheint, meinen Vorschlag eben als solchen zu betrachten (der einen <strong>prinzipiellen</strong> Lösungsweg vorschlägt) und stattdessen unsinnige Annahmen getroffen werden, was mein Beispielcode wohl tut, hier mal die weitergeführte Vorschlagslösung als Komplettlösung:</p>
<pre><code>typedef struct MainStruct {

    struct SubStruct1 {
        int Value;
    } s1;

    struct SubStruct2 {
        int Value;
    } s2;

    struct SubStruct3 {
        int Value;
    } s3;

} MainStruct_t;

typedef union {
    struct SubStruct1 *s1;
    struct SubStruct2 *s2;
    struct SubStruct3 *s3;
    int Value;
} T;

void setValue( T **t, int i )
{
  (*t)-&gt;Value=i;
}

int main()
{
    MainStruct_t x;
    T t;

    setValue( (t.s1=&amp;x.s1,&amp;t), 1);
    setValue( (t.s2=&amp;x.s2,&amp;t), 2);
    setValue( (t.s3=&amp;x.s3,&amp;t), 3);

    printf( &quot;%d %d %d&quot;,x.s1.Value,x.s2.Value,x.s3.Value);

    return 0;
}
</code></pre>
<p><a href="http://ideone.com/BNnH5t" rel="nofollow">http://ideone.com/BNnH5t</a></p>
<p>Und bevor du gleich antwortest, es läge hier UB vor weil dein Compiler was von incomp. pointertypes erzählt, befrage zuvor dein tiefschürfendes C-Wissen, was dir dann antworten wird, dass dem nicht so ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481285</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Thu, 31 Dec 2015 23:59:27 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 03:50:51 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24273">@Wutz</a><br />
Zwei Fragen zu deinem Code:</p>
<ol>
<li>Wieso zum Geier compiliert das? &amp;t müsste ein T* sein, wie kann man das dann an eine Funktion übergeben die nen T** Parameter hat?</li>
<li>Bist du sicher dass das keine strict-aliasing Verletzung ist? Gibt es in C da ne Ausnahme für Zeigertypen oder wie geht das?</li>
</ol>
<p>Der Code ist für mich als &quot;habe ursprünglich mal C gelernt&quot; C++ Programmierer auf jeden Fall überhaupt nicht leicht nachvollziehbar. Mag sein dass es in C nicht ganz ganz unüblich ist so zu schreiben, aber ich finde es grässlich. GRÄSSLICH.</p>
<p>Und nochwas: Angenommen laut Standard ist hier alles A-OK. Dann müsstest du es immer noch erklären wenn du es einem Anfänger vorschlägst. Also warum es OK ist und in welchen Fällen man es machen darf und in welchen nicht. Sonst schadet ein solcher Vorschlag vermutlich viel viel mehr als er hilft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481319</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 01 Jan 2016 03:50:51 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 10:57:34 GMT]]></title><description><![CDATA[<p>Hallo Leute und ein frohes neues Jahr.</p>
<p>vielen Dank für die Zahlreichen Antworten :).</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Ja ich hätte es im C++-Forum stellen sollen. Ich war etwas unsicher wo ich den Thread erstelle und habe wohl die falsche Entscheidung getroffen. Sorry, das war keine böse Absicht.</p>
<p>Die Lösung von Wutz habe ich noch nicht ganz verstanden, bzw. die Zeile &quot;setValue( (t.s1=&amp;x.s1,&amp;t), 1);&quot; konnte ich noch nicht ganz nachvollziehen. Ich muss erstmal wieder einen klaren Kopf von gestern haben und melde mich heute abend nochmal. Aber erstmal vielen Dank euch allen, dass ihr mit helft :).</p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481325</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Fri, 01 Jan 2016 10:57:34 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 18:05:46 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/u109509" rel="nofollow">SeppJ</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/f10" rel="nofollow">C (alle ISO-Standards)</a> in das Forum <a href="http://www.c-plusplus.net/forum/f15" rel="nofollow">C++ (alle ISO-Standards)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481353</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Fri, 01 Jan 2016 18:05:46 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 19:18:18 GMT]]></title><description><![CDATA[<p>So hier bin ich wieder.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Danke, dass du diesen Thread verschoben hast <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Habe mir nochmal den Code von Wutz angeschaut. Muss gestehen, dass ich mit der Zeile &quot;setValue( (t.s1=&amp;x.s1,&amp;t), 1);&quot; noch so meine Verständnisprobleme habe. So etwas habe ich auch noch nie gesehen, aber unter C funktioniert es schon mal ;). Wenn ich das richtig verstehe, referenzierst du mit Hilfe der union auf die Adresse der Substruktur in der MainStruct (&quot;t.s1=&amp;x.s1&quot;). Ist schon clever. Aber was macht dieses '&amp;t' noch im ersten Parameter? <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>
<p>Unter C++ läuft das Ganze nicht so ohne weiteres. Habe es irgendwie noch nicht hinbekommen und kriege als Fehler: &quot;cannot convert ‘MainStruct::SubStruct1*’ to ‘SubStruct1*’ in assignment&quot;. Muss ich hier irgendwie noch ein cast im Parameter einsetzen?</p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481358</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Fri, 01 Jan 2016 19:18:18 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 20:04:36 GMT]]></title><description><![CDATA[<p>Der Code von Wutz ist auch scheiße. Was soll dieser ganze Umweg über doppelt Dereferenzieren und die Union, wenn das den gleichen Effekt hat wie:</p>
<pre><code>int* p = (int*)&amp;x.s1;  // Compiler dazu zwingen den Pointer auf unser struct zu einem Pointer auf ein int zu konvertieren
*p = 1;
</code></pre>
<p>Das funktioniert gerade noch wenn man einen int direkt am Anfang des structs setzen möchte (aber vermutlich auch nicht garantiert durch den Standard). Wenn es woanders steht braucht man weitere Anpassungen und wenn man structs hat wo der zu überschreibende Wert an verschiedenen Stellen steht hat man ganz verloren. Da du jetzt ja C++ zu programmieren scheinst verwende bitte die Lösung von DarkShadow44 mit Templates:</p>
<pre><code>template&lt;typename T&gt;
void setSubStruct(T &amp;s, int newValue)
{
    s.Value = newValue;
}

void main()
{
    MainStruct_t ms;

    setSubStruct(ms.SubStruct1, 12);
    setSubStruct(ms.SubStruct2, 24);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2481359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481359</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 01 Jan 2016 20:04:36 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 21:10:54 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>Der Code von Wutz ist auch scheiße.</p>
</blockquote>
<p>Du hast keine Ahnung wovon du redest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481362</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Fri, 01 Jan 2016 21:10:54 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Sat, 02 Jan 2016 06:57:46 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>Muss gestehen, dass ich mit der Zeile &quot;setValue( (t.s1=&amp;x.s1,&amp;t), 1);&quot; noch so meine Verständnisprobleme habe.</p>
</blockquote>
<p>Tja, was soll man da machen?<br />
2 Hinweise mit lauffähigen Codes gegeben und du hast es immer noch nicht geschnallt.<br />
Man kann statt einem auch mehrere Objekte spendieren und die dann in deren Scope jederzeit verwenden, und kommt immer noch ohne irgendwelchen Makro- oder Template-Quatsch aus:</p>
<pre><code>int main()
{
    MainStruct_t x;
    printf(&quot;%d %d %d\n&quot;,x.s1.Value,x.s2.Value,x.s3.Value);

    {
        T t1={&amp;x.s1},t2={.s2=&amp;x.s2},t3={.s3=&amp;x.s3};

        setValue( &amp;t1, 1);
        setValue( &amp;t2, 2);
        setValue( &amp;t3, 3);
    }

    printf(&quot;%d %d %d\n&quot;,x.s1.Value,x.s2.Value,x.s3.Value);

    return 0;
}
</code></pre>
<p><a href="http://ideone.com/ds0bSP" rel="nofollow">http://ideone.com/ds0bSP</a><br />
Das ist nun wirklich auch für C Laien verständlich, wenn du das auch nicht schnallst, such dir ein anderes Hobby.</p>
<p>P.S. In jedem Fall musst du sicherstellen, dass das Padding der structs im Fremdmodul das Gleiche wie in deinem eigenen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481363</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Sat, 02 Jan 2016 06:57:46 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 21:26:19 GMT]]></title><description><![CDATA[<p>Wutz schrieb:</p>
<blockquote>
<p>sebi707 schrieb:</p>
<blockquote>
<p>Der Code von Wutz ist auch scheiße.</p>
</blockquote>
<p>Du hast keine Ahnung wovon du redest.</p>
</blockquote>
<p>Bitte demonstriere deinen Code für structs wo <code>'int Value;'</code> nicht an erster Stelle steht. Und dann noch als Extra für structs wo Value in allen structs an verschiedenen Stellen steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481364</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 01 Jan 2016 21:26:19 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 21:49:31 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Zwei Fragen zu deinem Code:</p>
</blockquote>
<ol>
<li>weil du die Eigenschaft von union bzgl. des Member- und Gesamtzugriffs nicht verstanden hast</li>
<li>da bin ich mir sehr sicher</li>
</ol>
<p>Nur weil du den Gebrauch von union nicht verstanden hast musst du nicht davon ausgehen, dass andere das auch nicht verstehen werden bzw. verstanden haben.<br />
Mit dem von mir gezeigten union-Gebrauch kann man komplette vtable-Hierarchien inkl. Mehrfachvererbung in blankem ANSI C nachbilden und das ist in jedem Fall besser als dem Anfänger irgendwelchen Makro/Template-Quatsch an die Hand zu geben und womöglich auch noch dynamic_cast und Konsorten nebst virtual-Quatsch zu zeigen mit dem Hinweis, dass so und nicht anders professionell C++ programmiert wird.<br />
In blankem ANSI C gibts bei solchen Versuchen, innerhalb der vtable-Nachbildung wild rumzucasten dann gleich was vom Compiler auf die Finger und nicht erst zur Laufzeit wie bei den C++-üblichen Unsinns-Casts.<br />
(Den Begriff vtable habe ich jetzt mal zur Veranschaulichung für dich gewählt, damit du einfacher den C-Hintergrund verstehen kannst; der kommt natürlich im C-Sprachgebrauch so nicht vor)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481365</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Fri, 01 Jan 2016 21:49:31 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 22:01:56 GMT]]></title><description><![CDATA[<p>Dann erkläre mit bitte union. Ich programmieren zwar schon eine Weile aber vielleicht bin ich ja missinformiert. Für mich beduetet eine union das alle Member der union im gleichen Speicherbereich gespeichert werden. Allerdings hat der Compiler nach meinem Wissen keine Ahnung was für eine Variable ich dort wirklich gerade drin gespeichert habe. Wie man damit virtual Function Calls nachbilden können soll ist mir auch ein Rätsel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481366</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 01 Jan 2016 22:01:56 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 23:18:09 GMT]]></title><description><![CDATA[<p><a href="https://xkcd.com/1053/" rel="nofollow">Was dieser Thread nicht ist.</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481375</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 01 Jan 2016 23:18:09 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Fri, 01 Jan 2016 23:46:59 GMT]]></title><description><![CDATA[<p>Wutz schrieb:</p>
<blockquote>
<ol>
<li>weil du die Eigenschaft von union bzgl. des Member- und Gesamtzugriffs nicht verstanden hast</li>
</ol>
</blockquote>
<p>Aha.<br />
Super.<br />
Das hilft. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481381</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 01 Jan 2016 23:46:59 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Sat, 02 Jan 2016 00:07:06 GMT]]></title><description><![CDATA[<p>vielen Dank für eure Unterstützung.</p>
<p>Sowohl die Lösung von Wutz, als auch von sebi707 funktioniert. Aber bitte keinen Streit anfangen. Ihr habt wahrscheinlich beide sehr gute Kenntnisse und jeder hat so seinen Stil und seine Vorzüge. Ich bin als Anfänger da noch sehr unvoreingenommen und ich frage nicht, weil ich zu faul bin selbst nach einer Lösung zu suchen. Das ich hier und da etwas noch nicht so schnell verstehe, ist nun mal leider so. Ich habe zuvor mit AutoIt, PureBasic und etwas C programmiert und daher ist es auch eine Phase der Umgewöhnung. ...gerade in Richtung OOP ist da vieles anders.</p>
<p>Ich bin auf jeden Fall für jede Hilfe und Tipps dankbar, die ich hier bekomme und ich weiß es zu schätzen. Schließlich ist es ja auch eure Zeit und es steht euch frei zu Helfen.</p>
<p>nochmals Danke an euch allen <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>
<p>Ich sehe somit die anfangs gestellte Frage als beantwortet <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>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481386</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Sat, 02 Jan 2016 00:07:06 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Sat, 02 Jan 2016 07:03:48 GMT]]></title><description><![CDATA[<p>In jedem Fall musst du sicherstellen, dass das Padding der structs im Fremdmodul das Gleiche wie in deinem eigenen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481398</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Sat, 02 Jan 2016 07:03:48 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Sat, 02 Jan 2016 10:49:36 GMT]]></title><description><![CDATA[<p>Hallo Wutz,</p>
<p>dein Code funktioniert aber nur bei exakt gleichem Layout der Substrukturen.<br />
Hier ein Gegenbeispiel:</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

typedef struct MainStruct {

    struct SubStruct1 {
    	int x;
    	int y;
        int Value;
    } s1;

    struct SubStruct2 {
    	int y;
        int Value;
        int x;
    } s2;

    struct SubStruct3 {
        int Value;
        int x;
        int y;
    } s3;

} MainStruct_t;

typedef union {
    struct SubStruct1 *s1;
    struct SubStruct2 *s2;
    struct SubStruct3 *s3;
    int Value;
} T;

void setValue( T **t, int i )
{
  (*t)-&gt;Value=i;
}

int main()
{
    MainStruct_t x;
    T t;

    setValue( (t.s1=&amp;x.s1,&amp;t), 1);
    setValue( (t.s2=&amp;x.s2,&amp;t), 2);
    setValue( (t.s3=&amp;x.s3,&amp;t), 3);

    printf( &quot;%d %d %d&quot;,x.s1.Value,x.s2.Value,x.s3.Value);

    return 0;
}
</code></pre>
<p><a href="http://ideone.com/I9Wqg3" rel="nofollow">http://ideone.com/I9Wqg3</a></p>
<p>Beispielausgabe:</p>
<pre><code>47 134513954 3
</code></pre>
<p>Der Makro-Code oder die C++-Lösung mittels Template würde aber auch dann korrekt funktionieren (der Code vom OT bezieht sich ja nur auf den Zugriff auf die Membervariable 'Value').</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481405</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sat, 02 Jan 2016 10:49:36 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschiedliche Strukturnamen mit gleichem Inhalt (optimale Funktionsübergabe?) on Sat, 02 Jan 2016 14:28:38 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>Sowohl die Lösung von Wutz, als auch von sebi707 funktioniert. Aber bitte keinen Streit anfangen. Ihr habt wahrscheinlich beide sehr gute Kenntnisse und jeder hat so seinen Stil und seine Vorzüge.</p>
</blockquote>
<p>Es sind hier nicht bloß verschiedene Stile. Der Code von Wutz ist der komplizierteste hier vorgeschlagene und funktioniert nur in den seltensten Fällen. Zumindest glaube ich das solange Wutz mir seinen Code nicht erklärt oder ein compilierbares Beispiel liefert, welches richtig funktioniert für structs wo Value an unterschiedlichen Stellen steht (siehe vorheriger Beitrag von Th69). Mich ärgert, dass Wutz einen solch verwirrenden Code einem Anfänger, der noch nicht zwischen einem unnötig komplizierten Code und einer cleveren Lösung für ein tatsächlich kompliziertes Problem unterscheiden kann, präsentiert.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Wieso zum Geier compiliert das? &amp;t müsste ein T* sein, wie kann man das dann an eine Funktion übergeben die nen T** Parameter hat?</p>
</blockquote>
<p>Der compiliert aufgrund der laxen Konvertierungsregeln in C. In C kann ich einer Funktion, die ein Pointer auf ein int akzeptiert, auch ein Pointer auf ein double geben und alles was man kriegt ist eine Warnung. In C++ wäre das ein Fehler und ohne Cast compiliert der Code nicht. Ich nehme aber an, dass du das eh schon wusstest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2481420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2481420</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Sat, 02 Jan 2016 14:28:38 GMT</pubDate></item></channel></rss>