<?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[Call by Reference TypeCast Verständnis]]></title><description><![CDATA[<p>Ich übergebe einer Funktion eine Addresse eines Pointers.<br />
Den ich ungefähr so angelegt habe:</p>
<pre><code class="language-cpp">MeineKlasse *Pointer
</code></pre>
<p>Nun übergebe ich den folgendermaßen meiner Funktion:</p>
<pre><code class="language-cpp">void Funktion(&amp;Pointer)
</code></pre>
<p>Die Funktion übernimmt die addresse als void*</p>
<p>Wenn ich nun die Daten aus der Klasse in der Funktion erreichen möchte muss ich den<br />
dereferenzieren und casten:</p>
<pre><code class="language-cpp">Funktion(void* p)
{
   //so funktioniert es! aber warum?
   ((MeineKlasse*)(*(int*))-&gt;...
}
</code></pre>
<p>Warum muss ich in einen int* casten wenn ich void * mache funktioniert das nicht?<br />
Wenn ich das schon so mache müsste ich dann nicht in UINT* casten?</p>
<p>Gibts da nicht ne bessere Lösung?</p>
<p>muli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/212075/call-by-reference-typecast-verständnis</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 15:58:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/212075.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 May 2008 03:09:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Call by Reference TypeCast Verständnis on Thu, 01 May 2008 03:09:06 GMT]]></title><description><![CDATA[<p>Ich übergebe einer Funktion eine Addresse eines Pointers.<br />
Den ich ungefähr so angelegt habe:</p>
<pre><code class="language-cpp">MeineKlasse *Pointer
</code></pre>
<p>Nun übergebe ich den folgendermaßen meiner Funktion:</p>
<pre><code class="language-cpp">void Funktion(&amp;Pointer)
</code></pre>
<p>Die Funktion übernimmt die addresse als void*</p>
<p>Wenn ich nun die Daten aus der Klasse in der Funktion erreichen möchte muss ich den<br />
dereferenzieren und casten:</p>
<pre><code class="language-cpp">Funktion(void* p)
{
   //so funktioniert es! aber warum?
   ((MeineKlasse*)(*(int*))-&gt;...
}
</code></pre>
<p>Warum muss ich in einen int* casten wenn ich void * mache funktioniert das nicht?<br />
Wenn ich das schon so mache müsste ich dann nicht in UINT* casten?</p>
<p>Gibts da nicht ne bessere Lösung?</p>
<p>muli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1501511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501511</guid><dc:creator><![CDATA[muli]]></dc:creator><pubDate>Thu, 01 May 2008 03:09:06 GMT</pubDate></item><item><title><![CDATA[Reply to Call by Reference TypeCast Verständnis on Thu, 01 May 2008 04:54:45 GMT]]></title><description><![CDATA[<p>Was willst du da machen? Warum nimmt deine Funktion nicht einfach nen Pointer auf deine Klasse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1501512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501512</guid><dc:creator><![CDATA[äh]]></dc:creator><pubDate>Thu, 01 May 2008 04:54:45 GMT</pubDate></item><item><title><![CDATA[Reply to Call by Reference TypeCast Verständnis on Thu, 01 May 2008 05:57:10 GMT]]></title><description><![CDATA[<p>muli schrieb:</p>
<blockquote>
<p>Gibts da nicht ne bessere Lösung?</p>
</blockquote>
<p>Ja, nicht mit void* arbeiten... Damit gibst Du jede Typsicherheit auf. Theoretisch könnte man beliebigen Datenmüll übergeben.</p>
<p>Damit verlagerst Du vor allem Compilerfehler (z.B. falscher Typ übergeben = Fehlermeldung vom Compiler) in Laufzeitfehler die dann zum Absturz des Programms führen -&gt; very bad idea.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1501513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501513</guid><dc:creator><![CDATA[loks]]></dc:creator><pubDate>Thu, 01 May 2008 05:57:10 GMT</pubDate></item><item><title><![CDATA[Reply to Call by Reference TypeCast Verständnis on Thu, 01 May 2008 07:15:54 GMT]]></title><description><![CDATA[<p>äh: Die Funktion ist ein Konstruktor. Die Klasse soll einen Zeiger auf die andere Klasse haben. Eine Instanz ist aber nicht immer schon bei Instanzierung geschaffen. deshalb kann ich keinen Zeiger übergeben. Aber die Adresse eines Zeiges!</p>
<p>loks: Die Frage war:<br />
Warum muss ich eine Speicheraddresse in ein Int casten bevor ich dann ins richtige caste?<br />
Ich &quot;zeige&quot; niemals auf einen Int!<br />
Warum funktioniert es nicht wenn ich einen void* verwende?</p>
<p>Hoffe man kann verstehen was ich meine wenn nicht sagt mir bescheid dann versuch ich das alles nochmal umzuformulieren<br />
schonmal danke für eure Bemühungen</p>
<p>muli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1501521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501521</guid><dc:creator><![CDATA[muli]]></dc:creator><pubDate>Thu, 01 May 2008 07:15:54 GMT</pubDate></item><item><title><![CDATA[Reply to Call by Reference TypeCast Verständnis on Thu, 01 May 2008 07:48:00 GMT]]></title><description><![CDATA[<p>muli schrieb:</p>
<blockquote>
<p>dereferenzieren und casten:</p>
</blockquote>
<p>umgekehrt, schließlich hast du ursprünglich zuerst den Pointer ermittelt, der <em>anschließend</em> implizit in void* konvertiert wurde. Eine Aktion machen wir im Allgemeinen dadurch rückgängig, dass wir die jeweils inversen Einzeloperationen in umgekehrter Reihenfolge durchführen. Der korrekte Weg wäre daher</p>
<pre><code class="language-cpp">(*static_cast&lt;MeineKlasse**&gt;(p)-&gt;
</code></pre>
<p>Nicht, dass ich erkennen kann, weshalb du nicht gleich MeineKlasse** als Parametertyp der Funktion verwendest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1501526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501526</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 01 May 2008 07:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to Call by Reference TypeCast Verständnis on Thu, 01 May 2008 12:22:36 GMT]]></title><description><![CDATA[<p>Ja da hast du recht! Vorallem das mit dem ** ist natürlich besser. Danke!<br />
Trotz allem frag ich mich warum meine Methode Funktioniert!</p>
<p>Danke an alle die versucht haben zu helfen.</p>
<p>muli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1501606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501606</guid><dc:creator><![CDATA[muli]]></dc:creator><pubDate>Thu, 01 May 2008 12:22:36 GMT</pubDate></item><item><title><![CDATA[Reply to Call by Reference TypeCast Verständnis on Thu, 01 May 2008 15:16:42 GMT]]></title><description><![CDATA[<p>muli schrieb:</p>
<blockquote>
<p>Trotz allem frag ich mich warum meine Methode Funktioniert!</p>
</blockquote>
<p>Ich schreibe mal lieber auf, wo Probleme entstehen können. Ich splitte die einzelnen Vorgänge deshalb mal auf, aus</p>
<pre><code class="language-cpp">(MeineKlasse*)(*(int*)p)
</code></pre>
<p>wird damit</p>
<pre><code class="language-cpp">int* q = static_cast&lt; int* &gt;( p ); // (1)
int&amp; i = *q; // (2)
int address = i; // (3)
MeineKlasse* r = reinterpret_cast&lt; MeineKlasse* &gt;( address ); // (4)
</code></pre>
<p>(1) ist undefiniert, falls p nicht hinreichend ausgerichtet für int* ist. Auf einem PC ist das allerdings häufig unproblematisch und auch generell ist zu erwarten, dass Zeigerobjekte wenigstens die Ausrichtung eines ints benötigen.<br />
(2) ist unproblematisch, da wir wissen, dass p tatsächlich auf ein Objekt zeigt (wenn auch vom falschen Typ)<br />
(3) Hier geht es darum, dass von der Stelle i ein int gelesen wird, um den Cast durchführen zu können. Das verletzt die Aliasing-Regeln (3.10/15), da das tatsächlich an dieser Stelle existierende Objekt ein MeineKlasse* ist - somit undefiniertes Verhalten. Was vermutlich erwartet wird, ist, dass der gelesene Wert dem an dieser Stelle stehenden Speicherinhalt entspricht (und das kann mit viel Glück auch so sein - irgendwann schreib ich mal was für die faq), also das etwas passiert, dass äquivalent zu</p>
<pre><code class="language-cpp">int address; memcpy( &amp;address, &amp;i, sizeof address );
</code></pre>
<p>ist. Zudem muss dieser Speicherinhalt natürlich noch einem gültigen int-Wert entsprechen - auf exotischer Hardware könnte es hier zu traps kommen, aber das ist ein weniger bedeutsames Detail.<br />
(4) ist unproblematisch, sofern die entsprechende Plattform über diesen Cast verfügt und dieser einigermaßen das tut, was man an dieser Stelle erwartet. Damit das am Ende äquivalent zu der korrekten Form</p>
<pre><code class="language-cpp">*static_cast&lt; MeineKlasse** &gt;( p )
</code></pre>
<p>ist, muss zusätzlich noch die Bedingung erfüllt sein, dass die Repräsentation der beteiligten Typen gleich ist, also</p>
<pre><code class="language-cpp">int i = ...
foo* p = reinterpret_cast&lt; foo* &gt;( i );
assert( sizeof i == sizeof p );
assert( memcmp( &amp;i, &amp;p, sizeof i ) == 0 );
</code></pre>
<p>Das klapp auf einem PC bei 32-bit zufällig, im Allgemeinen kann es ganz anders sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1501673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1501673</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 01 May 2008 15:16:42 GMT</pubDate></item></channel></rss>