<?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[void-pointer -- welcher cast?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich benutze eine Bibliothek, die mir einen void-pointer (hat den Bezeichner &quot;user_pointer&quot; )zur Verfügung stellt,<br />
den ich für meine Zwecke nutzen muss.<br />
Ich habe jedoch vorher nicht viel mit void-pointern gemacht.</p>
<p>Ich reserviere irgendwo in meinem Code Speicher für einen vector<br />
und weise die Adresse dem void-pointer zu, ungefähr so</p>
<pre><code>cell-&gt;set_user_pointer(  new std::vector&lt;PointHistory&lt;dim&gt; &gt;( quadrature_formula.size() )  );
</code></pre>
<p>Um nachher auf den Inhalt des void-pointers zuzugreifen,<br />
wird in dem Tutorial zu der Bibliothek ein reinterpret_cast genutzt.<br />
Ich habe vorher noch nie einen reinterpret_cast genutzt<br />
und im Netz wird er als der mächtigste und gefährlichste der cast-Operatoren<br />
bezeichnet.</p>
<p>Bei anderen Beispielen zu void-pointern im Netz wird jedoch<br />
der static_cast genutzt, z.B hier <a href="http://www.devx.com/tips/Tip/14446" rel="nofollow">http://www.devx.com/tips/Tip/14446</a></p>
<p>Welchen cast sollte man denn hier verwenden und warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270483/void-pointer-welcher-cast</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 01:15:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270483.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Jul 2010 14:00:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 14:01:28 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich benutze eine Bibliothek, die mir einen void-pointer (hat den Bezeichner &quot;user_pointer&quot; )zur Verfügung stellt,<br />
den ich für meine Zwecke nutzen muss.<br />
Ich habe jedoch vorher nicht viel mit void-pointern gemacht.</p>
<p>Ich reserviere irgendwo in meinem Code Speicher für einen vector<br />
und weise die Adresse dem void-pointer zu, ungefähr so</p>
<pre><code>cell-&gt;set_user_pointer(  new std::vector&lt;PointHistory&lt;dim&gt; &gt;( quadrature_formula.size() )  );
</code></pre>
<p>Um nachher auf den Inhalt des void-pointers zuzugreifen,<br />
wird in dem Tutorial zu der Bibliothek ein reinterpret_cast genutzt.<br />
Ich habe vorher noch nie einen reinterpret_cast genutzt<br />
und im Netz wird er als der mächtigste und gefährlichste der cast-Operatoren<br />
bezeichnet.</p>
<p>Bei anderen Beispielen zu void-pointern im Netz wird jedoch<br />
der static_cast genutzt, z.B hier <a href="http://www.devx.com/tips/Tip/14446" rel="nofollow">http://www.devx.com/tips/Tip/14446</a></p>
<p>Welchen cast sollte man denn hier verwenden und warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925624</guid><dc:creator><![CDATA[Rahul0891]]></dc:creator><pubDate>Tue, 13 Jul 2010 14:01:28 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 14:07:47 GMT]]></title><description><![CDATA[<p>Um void Pointer zu casten ist ein static_cast das richtige.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> ABER <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> : Dein Code wird krachen. Dein Pointer muss auf das erste Element des Vectors zeigen, nicht auf den vector selbst. Überhaupt ist hier der vector nicht anzuraten, denn wie willst du ihn hinterher wieder loswerden, wenn du nur das erste Element kennst? Du müsstest zwei Zeiger speichern.<br />
Besser wäre</p>
<pre><code class="language-cpp">cell-&gt;set_user_pointer(  new PointHistory&lt;dim&gt; [quadrature_formula.size()]);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1925626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925626</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 13 Jul 2010 14:07:47 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 14:17:47 GMT]]></title><description><![CDATA[<p>Hallo Rahul,</p>
<p>reinterpret_cast ist wohl das 'ehrlichere'.</p>
<p>Er bedeutet, daß der void Pointer ohne Veränderung<br />
als das interpretiert wird, was angegeben wurde.<br />
Das gilt übrigends für alle anderen Daten auch:<br />
keine Veränderung der Bits.</p>
<p>Ich glaube static_cast macht in diesem Fall (void* zu T*) das selbe.<br />
In anderen Fällen wird u.U. der Pointer geändert.</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925628</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 13 Jul 2010 14:17:47 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 14:31:43 GMT]]></title><description><![CDATA[<p>Danke für die Antworten, aber deine Warnung - SeppJ - verstehe ich nicht,</p>
<p>warum MUSS der user_pointer auf das erste Element des vectors zeigen?<br />
(Das wird übrigens in dem Tutorial gemacht, aber genau das wollte ich abändern)</p>
<p>Kann ich nicht mit dem cast auf den entsprechenden Zeiger auf die Elemente innerhalb des vectors zugreifen, also ungefähr so?</p>
<pre><code>std::vector&lt; PointHistory&lt;dim&gt; &gt; * myVector = static_cast&lt;  std::vector&lt; PointHistory&lt;dim&gt; &gt; *  &gt;( cell-&gt;user_pointer() );

PointHistory&lt;dim&gt; myQuadraturePoint = myVector-&gt;[0];
</code></pre>
<p>Oder was genau wird mir dabei um die Ohren fliegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925637</guid><dc:creator><![CDATA[Rahul0891]]></dc:creator><pubDate>Tue, 13 Jul 2010 14:31:43 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 15:23:21 GMT]]></title><description><![CDATA[<p>Hallo Rahul,</p>
<p>Gegen eine Pointer auf einen vector als 'Userpointer' spricht meiner Meinung nach nichts.</p>
<p>Du musst halt beim zurück casten von void* auf den Vector alles richtig machen,<br />
dann sollte auch ein delete möglich sein.<br />
Ich habe so etwas noch nie gebraucht ...</p>
<p>Wenn du es nicht probieren möchtest oder wenn du unsicher bist,<br />
kannst du ja auch einen mit malloc angelegten pointer verwenden ...</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925670</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 13 Jul 2010 15:23:21 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 15:40:21 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Nein, nein, nein!</p>
<p>vector sieht ungefähr so aus (stark vereinfacht):</p>
<pre><code class="language-cpp">template&lt;typename T&gt; class vector
{
 private:
  T *erstes_element;
  // anderer Verwaltungskram
 public:
 vector(size_t size): erstes_element(new T[size]){}
  // Eine Menge andere Funktionen
};
</code></pre>
<p>Wenn man nun einen Pointer auf einen vector zeigen lässt, dann zeigt er auf das Vectorobjekt (also den Verwaltungskram), <strong>nicht</strong> auf den allokierten Speicher des Vektors! Und der vector selbst ist halt nur ein paar Byte groß, der allokierte Speicher liegt irgendwo ganz woanders auf dem Heap!<br />
Wenn man dann den Speicher wo der Vector liegt überschreibt, dann schreibt man:<br />
1. Über den Verwaltungskram und nicht über die Datenelemente<br />
2. Bereits nach wenigen Bytes in Speicher der einem nicht gehört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925687</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 13 Jul 2010 15:40:21 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 16:55:50 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>:<br />
Ja, ja, ja! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Das ist ein *USER-DATA* Pointer, den kann er zeigen lassen auf was er will.</p>
<p>Die Library kümmert sich nicht darum was da drinnen steht, die bietet den Platz einfach nur an, damit der User bestimmte eigene Datenstrukturen an die Library-Objekte anhängen kann.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22802">@Rahul0891</a>:<br />
Nimm static_cast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925733</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 13 Jul 2010 16:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 17:03:34 GMT]]></title><description><![CDATA[<p>Frank Erdorf schrieb:</p>
<blockquote>
<p>reinterpret_cast ist wohl das 'ehrlichere'.</p>
</blockquote>
<p>reinterpret_cast ist IMO weder erhlicher, noch hier angebracht.</p>
<p>Der Standard garantiert explizit dass bei der Konvertierung T* -&gt; void* -&gt; T* über static_cast zum Schluss wieder das rauskommt mit was man angefangen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925745</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 13 Jul 2010 17:03:34 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 17:06:52 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void-pointer -- welcher cast?
</code></pre>
<p>Gar keiner!!! Überdenk dein Design!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925747</guid><dc:creator><![CDATA[C++ Progger]]></dc:creator><pubDate>Tue, 13 Jul 2010 17:06:52 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 17:17:37 GMT]]></title><description><![CDATA[<p>Nochmals danke für die vielen Antworten...</p>
<blockquote>
<p>Gar keiner!!! Überdenk dein Design!!!</p>
</blockquote>
<p>Hmm, wie in meinem Anfangspost steht, ist das nicht mein Design,<br />
sondern das Design der genutzten Bibliothek...</p>
<p>Von diesen Zellen (cell) gibt es nachher 50.000 oder mehr<br />
und der user_pointer ist die einzige Schnittstelle,<br />
die nir zur Verfügung steht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925753</guid><dc:creator><![CDATA[Rahul0891]]></dc:creator><pubDate>Tue, 13 Jul 2010 17:17:37 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 17:38:06 GMT]]></title><description><![CDATA[<p>Es ist häufig so, dass C Librarys Callback Funktionen mit einem Parameter (Typ void) anbieten, um eigene Daten in der Funktion verfügbar zu machen.</p>
<p>Das ganze ist also vollkommen in Ordnung und hat mit schlechtem Design rein gar nichts zu tun. Ganz im Gegenteil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925759</guid><dc:creator><![CDATA[................]]></dc:creator><pubDate>Tue, 13 Jul 2010 17:38:06 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 17:52:51 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a></p>
<p>ich weiß halt gerne ob sich beim cast die bits ändern oder nicht.<br />
Und daß wenn möglich beim Lesen des Codes, so deutlich wie es geht.</p>
<p>Tatsächlich geht hier technisch sowohl static_cast als auch reinterpret_cast.</p>
<p>Wenn ein einfaches Reinterpretieren ohne Wandlung reicht,<br />
dann darf man das auch gerne hinschreiben.</p>
<p>Wobei ich mir auch Fälle denken kann,<br />
z.B. bei Code Änderungen, die mit static_cast auffallen würden,<br />
aber mit reinterpret_cast nicht.</p>
<p>Was soll's</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925762</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 13 Jul 2010 17:52:51 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 18:03:59 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>:<br />
Ja, ja, ja! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Das ist ein *USER-DATA* Pointer, den kann er zeigen lassen auf was er will.</p>
</blockquote>
<p>Aber es ist nicht genug Platz dort, weil der vector selbst nur ein paar Byte hat! Man müsste</p>
<pre><code class="language-cpp">cell-&gt;set_user_pointer(  new std::vector&lt;PointHistory&lt;dim&gt; &gt;[ (sizeof(&lt;PointHistory&lt;dim&gt;) * quadrature_formula.size()) / sizeof (std::vector&lt;PointHistory&lt;dim&gt; &gt;)  ]  );
</code></pre>
<p>machen, damit die Menge an Speicher da ist, die der Threadersteller haben will. Und selbst dann geht dies extrem schief, denn wenn man hinterher ein delete auf diesen Pointer macht, dann muss man ihn dafür in einen vector&lt;PointHistory&lt;dim&gt; &gt;* casten. Dies ruft aber den Destructor von Vector auf, welcher dann versucht völlig unsinnige Sachen zu machen, weil die Verwaltungsdaten mit was anderem überschrieben wurden. Das gibt eine totale Katastrophe! Das musst du doch sehen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925767</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 13 Jul 2010 18:03:59 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 19:09:37 GMT]]></title><description><![CDATA[<p>Hallo SeppJ</p>
<p>Du verstehts doch eigentlich alles in diesem Zusammenhang.</p>
<p>Die Library bietet 4 Bytes User Data an.<br />
Dort kann man also einen void* speichern,<br />
einen Zeiger auf irgendwas so zusagen.<br />
Später kann man sich diese 4 Bytes, wieder holen und interpretieren.</p>
<p>Wenn ich also einen Zeiger auf einen vector in die 4 bytes rein tue,<br />
muss ich das beim Rausholen auch als Zeiger auf einen Vector interpretieren</p>
<p>Klar zeigt das dann 'nur' auf die Verwaltungsstruktur des vectors und klar liegen<br />
die eigentlichen Daten nochmals woanders.</p>
<p>Vieleicht hat es dir geholfen,<br />
wenn nicht, vieleicht hilft es morgen ...</p>
<p>Übrigends ist dieser void* für generische Programmierung erforderlich.<br />
Alternativ könnte man für soetwas boost:any einsetzten,<br />
geht in diesem Fall aber nicht...</p>
<p>Gruß Frank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925803</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 13 Jul 2010 19:09:37 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 19:27:45 GMT]]></title><description><![CDATA[<p>Ich weiß wohl was du meinst, aber guck mal auf den ersten Post, der threadersteller will garantiert nicht, dass der void* auf einen vector zeigt, sondern auf quadrature_formula.size() Instanzen von PointHistory&lt;dim&gt;. Vermutlich weil die Bibliothek ein Array von PointHistory&lt;dim&gt;[quadrature_formula.size()] erwartet. Und das geht eben nicht, wenn man auf einen vector zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925815</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 13 Jul 2010 19:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 19:40:33 GMT]]></title><description><![CDATA[<p>So wie ich das sehe hat er folgendes vor:</p>
<pre><code class="language-cpp">void* user_ptr = 0;

void foo()
{
    std::vector&lt;int&gt;* vec = static_cast&lt;std::vector&lt;int&gt;*&gt;(user_ptr);
    for (std::vector&lt;int&gt;::const_iterator i = vec-&gt;begin(); i != vec-&gt;end(); ++i)
        std::cout &lt;&lt; *i &lt;&lt; std::endl;
    delete vec;
}

int main()
{
    int tmp[] = { 1, 2, 3, 4, 5 };
    user_ptr = new std::vector&lt;int&gt;(tmp, tmp + sizeof(tmp) / sizeof(int));
    foo();
}
</code></pre>
<p>Das funktioniert sogar wunderbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925820</guid><dc:creator><![CDATA[Biolunar]]></dc:creator><pubDate>Tue, 13 Jul 2010 19:40:33 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Tue, 13 Jul 2010 19:58:48 GMT]]></title><description><![CDATA[<p>Okay, um hier weiteren Spekulationen einen Riegel vorzuschieben<br />
und da ich das Problem nicht genau erfasse, noch ein paar Zusatzinformationen.</p>
<p>Die Bibliothek sollte nix mit user_pointer veranstalten,<br />
es ist wie hustbaer geschrieben hat...</p>
<blockquote>
<p>Die Library kümmert sich nicht darum was da drinnen steht, die bietet den Platz einfach nur an, damit der User bestimmte eigene Datenstrukturen an die Library-Objekte anhängen kann.</p>
</blockquote>
<p>um es genauer zu beschreiben, soll es mir Daten über bestimmte Schleifenzyklen<br />
transportieren.</p>
<p>PointHistory ist dabei ein struct, in dem wieder eine Klasse Tensor&lt;dim&gt;<br />
eingebettet ist, das habe ich so aus dem Tutorial 1zu1 übernommen.</p>
<p>Vielleicht klärt das schon ein paar Mißverständnisse...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925826</guid><dc:creator><![CDATA[Rahul0891]]></dc:creator><pubDate>Tue, 13 Jul 2010 19:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Wed, 14 Jul 2010 01:41:58 GMT]]></title><description><![CDATA[<p>Frank Erdorf schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a></p>
<p>ich weiß halt gerne ob sich beim cast die bits ändern oder nicht.<br />
Und daß wenn möglich beim Lesen des Codes, so deutlich wie es geht.</p>
<p>Tatsächlich geht hier technisch sowohl static_cast als auch reinterpret_cast.</p>
<p>Wenn ein einfaches Reinterpretieren ohne Wandlung reicht,<br />
dann darf man das auch gerne hinschreiben.</p>
</blockquote>
<p>reinterpret_cast muss in dem Fall nicht funktionieren.<br />
void* muss gross genug sein um alle möglichen T*, U* etc. &quot;aufnehmen&quot; zu können.<br />
Zeiger auf andere Typen, eben T*, U* etc., können (dürfen) allerdings kleiner als ein void* sein.<br />
Dadurch ist auch die Bit-Kompatibilität von T* zu void* bzw. umgekehrt nicht garantiert.</p>
<p>Daher ist reinterpret_cast in dem Fall strenggenommen falsch.<br />
Daher ist static_cast angesagt.</p>
<p>Und wann und wo ein Zeiger seine &quot;interne Representation&quot; ändert, bzw. ändern kann/darf, darüber mache ich mir schon länger keine Gedanken mehr <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1925908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925908</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 14 Jul 2010 01:41:58 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Wed, 14 Jul 2010 01:48:19 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>:<br />
Doch, genau das will er <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>Ich verstehe auch nicht ganz was dich da auf eine falsche Fährte gelockt hat. Ist dir noch nie ein UserData Zeiger untergekommen?<br />
Ich hätte gedacht dass die Technik so verbreitet ist, dass sie jeder kennen sollte, und auch intuitiv verstehen.</p>
<p>Ich kenne das schon vom Amiga OS, später dann von der WinAPI (meist als &quot;dwUserdata&quot; vom Typ &quot;DWORD_PTR&quot;), und selbst im .NET Framework trifft man es an einigen Stellen (Property &quot;Tag&quot; vom Type &quot;object&quot;). Und natürlich aus diversen anderen Libraries.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925909</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 14 Jul 2010 01:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to void-pointer -- welcher cast? on Fri, 16 Jul 2010 15:59:12 GMT]]></title><description><![CDATA[<p>................ schrieb:</p>
<blockquote>
<p>Es ist häufig so, dass C Librarys Callback Funktionen mit einem Parameter (Typ void) anbieten, um eigene Daten in der Funktion verfügbar zu machen.</p>
<p>Das ganze ist also vollkommen in Ordnung und hat mit schlechtem Design rein gar nichts zu tun. Ganz im Gegenteil.</p>
</blockquote>
<p>Aus C-Sicht: Ja.</p>
<p>Aus C++-Sicht ist das schlechtes Design. Moderne Callbacks sind typsicher und viel flexibler (schau dir mal <code>boost::function</code> und <code>boost::bind</code> an). Auch abstrakte Interfaces sind eine Möglichkeit. In C++ würde ich nicht <code>void*</code> einsetzen, wenn sich das Problem besser lösen lässt. Aber zur Kompatibilität mit C- oder älteren C++-APIs hat man eben keine Wahl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1927316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1927316</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 16 Jul 2010 15:59:12 GMT</pubDate></item></channel></rss>