<?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[Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik]]></title><description><![CDATA[<p>Guten Tag!</p>
<p>Ich habe hier eine C-Bibliothek, die ich in einem C++-Projekt verwenden will. Jetzt habe ich 6 Fehler, die ein kompilieren verhindern. Hier der Code:</p>
<pre><code class="language-cpp">void *vsector;  // Irgendwo am Anfang der Funktion 
        [...]

	vsector+=8;  // So wie ich das verstanden habe in C erlaubt, in C++ nicht

	// low word	von cluster (20,2)
	*(uint16_t*)vsector=(cluster&amp;0xffff0000)&gt;&gt;16;
	vsector+=6;

	// high word von cluster (26,2)
	*(uint16_t*)vsector=(cluster&amp;0x0000ffff);
	vsector+=2;

	// laenge (28,4)
	*(uint32_t*)vsector=length;
</code></pre>
<p>Sind meine Modifikationen korrekt?</p>
<pre><code class="language-cpp">uint8_t *vsector; // Wurde nachfolgend als uint8 behandelt, daher der Typ
       [...]
       vsector+=8;

       // CHANGE:
       uint16_t* vsector_16 = (uint16_t*)vsector;

	// low word	von cluster (20,2)
	*vsector_16=(cluster&amp;0xffff0000)&gt;&gt;16;
	vsector_16+=6;

	// high word von cluster (26,2)
	*vsector_16=(cluster&amp;0x0000ffff);
	vsector_16+=2;

	// laenge (28,4)
	*(uint32_t*)vsector_16=length;
</code></pre>
<p>Über eure Hilfe freue ich mich <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/topic/307901/frage-zur-pointerkonvertierung-pointerarithmetik</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 15:59:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307901.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 08 Sep 2012 12:26:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 12:26:05 GMT]]></title><description><![CDATA[<p>Guten Tag!</p>
<p>Ich habe hier eine C-Bibliothek, die ich in einem C++-Projekt verwenden will. Jetzt habe ich 6 Fehler, die ein kompilieren verhindern. Hier der Code:</p>
<pre><code class="language-cpp">void *vsector;  // Irgendwo am Anfang der Funktion 
        [...]

	vsector+=8;  // So wie ich das verstanden habe in C erlaubt, in C++ nicht

	// low word	von cluster (20,2)
	*(uint16_t*)vsector=(cluster&amp;0xffff0000)&gt;&gt;16;
	vsector+=6;

	// high word von cluster (26,2)
	*(uint16_t*)vsector=(cluster&amp;0x0000ffff);
	vsector+=2;

	// laenge (28,4)
	*(uint32_t*)vsector=length;
</code></pre>
<p>Sind meine Modifikationen korrekt?</p>
<pre><code class="language-cpp">uint8_t *vsector; // Wurde nachfolgend als uint8 behandelt, daher der Typ
       [...]
       vsector+=8;

       // CHANGE:
       uint16_t* vsector_16 = (uint16_t*)vsector;

	// low word	von cluster (20,2)
	*vsector_16=(cluster&amp;0xffff0000)&gt;&gt;16;
	vsector_16+=6;

	// high word von cluster (26,2)
	*vsector_16=(cluster&amp;0x0000ffff);
	vsector_16+=2;

	// laenge (28,4)
	*(uint32_t*)vsector_16=length;
</code></pre>
<p>Über eure Hilfe freue ich mich <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/2249551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249551</guid><dc:creator><![CDATA[HelfendeHand]]></dc:creator><pubDate>Sat, 08 Sep 2012 12:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 12:46:42 GMT]]></title><description><![CDATA[<p>welche</p>
<p>HelfendeHand schrieb:</p>
<blockquote>
<p>Guten Tag!</p>
<p>Ich habe hier eine C-Bibliothek, die ich in einem C++-Projekt verwenden will. Jetzt habe ich 6 Fehler, die ein kompilieren verhindern.</p>
</blockquote>
<p>wie waere es wenn du uns verraetst welche fehlermeldungen du bekommst und in welchen zeilen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249559</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sat, 08 Sep 2012 12:46:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 12:55:29 GMT]]></title><description><![CDATA[<p>Meep Meep schrieb:</p>
<blockquote>
<p>welche</p>
<p>HelfendeHand schrieb:</p>
<blockquote>
<p>Guten Tag!</p>
<p>Ich habe hier eine C-Bibliothek, die ich in einem C++-Projekt verwenden will. Jetzt habe ich 6 Fehler, die ein kompilieren verhindern.</p>
</blockquote>
<p>wie waere es wenn du uns verraetst welche fehlermeldungen du bekommst und in welchen zeilen ?</p>
</blockquote>
<p>Oh klar:</p>
<p>Überall dort, wo der void-Pointer inkrementiert wird, gibt/gab es einen Fehler:</p>
<blockquote>
<p>expression must be a pointer to a complete object type</p>
</blockquote>
<p>Weil das wohl nur in C geht, nicht in C++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249560</guid><dc:creator><![CDATA[HelfendeHand]]></dc:creator><pubDate>Sat, 08 Sep 2012 12:55:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 16:43:49 GMT]]></title><description><![CDATA[<p>Grundsätzlich mal (zu deinem gewählten Beitragstitel):<br />
Reine Zeiger-Casts in C (&quot;Zeigerkonvertierung&quot;) ist immer sehr fraglich, lässt meistens auf fehlerhaftes Design schließen, bei Anfängern immer auf Unkenntnis.<br />
<strong>C</strong> trotz des relativ kleinen Sprachumfanges <strong>Nichts für Anfänger</strong>.<br />
Es sind viele implizite Abhängigkeiten zu beachten, C ist von Praktikern für Praktiker entwickelt worden, nicht für Schüler.</p>
<p>HelfendeHand schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void *vsector;  // Irgendwo am Anfang der Funktion 
        [...]

	vsector+=8;  // So wie ich das verstanden habe in C erlaubt, in C++ nicht
</code></pre>
<pre><code class="language-cpp">uint8_t *vsector; // Wurde nachfolgend als uint8 behandelt, daher der Typ
       [...]
       vsector+=8;
</code></pre>
</blockquote>
<p>Warum hast du es denn geändert, wenn es &quot;erlaubt&quot; wäre?<br />
Deine o.g. Vermutung ist falsch.<br />
Man kann (standardkonform) keinen void-Zeiger inkrementieren. Woher soll der Compiler denn wissen, um wieviele Bytes er die Speicheradresse hochzählen soll?<br />
Du hast Zeiger nicht verstanden, etwas ganz Essentielles in C und dein Problem hier ist C und nicht C++.</p>
<pre><code class="language-cpp">uint8_t *vsector; /* Zeiger hat einen gültigen Typ, d.h. es kann fleißig de/inkrementiert werden */
       [...]
       vsector = Ausgangsadresse;           

    // low word    von cluster (20,2)
    vsector += 20;  /* &quot;Hochzählen&quot; der Adresse um 20*sizeof(uint8_t), d.h. 20*8 Bit */
    *(uint16_t*)vsector = (cluster&amp;0xffff0000)&gt;&gt;16; /* hier werden sizeof(uint16_t) == 16 Bit zugewiesen */

    // high word von cluster (26,2)
    vsector += 6;  /* &quot;Hochzählen&quot; der Adresse um 6*sizeof(uint8_t), d.h. 6*8 Bit */
    *(uint16_t*)vsector = (cluster&amp;0x0000ffff); /* hier werden sizeof(uint16_t) == 16 Bit zugewiesen */

    // laenge (28,4)
    vsector += 2;  /* &quot;Hochzählen&quot; der Adresse um 2*sizeof(uint8_t), d.h. 2*8 Bit */
    *(uint32_t*)vsector=length; /* hier werden sizeof(uint32_t) == 32 Bit zugewiesen */
</code></pre>
<p>Bei solchen Multibyte-Rumfrickeleien musst du natürlich noch die aktuelle Bytereihenfolge deines Systems beachten, wenn du mit Daten arbeitest, die von außerhalb deines Prozesses kommen (Dateien, Netzwerk, Shared Memory, ...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249589</guid><dc:creator><![CDATA[Wutz]]></dc:creator><pubDate>Sat, 08 Sep 2012 16:43:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 17:04:17 GMT]]></title><description><![CDATA[<p>Wutz schrieb:</p>
<blockquote>
<p>HelfendeHand schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void *vsector;  // Irgendwo am Anfang der Funktion 
        [...]

	vsector+=8;  // So wie ich das verstanden habe in C erlaubt, in C++ nicht
</code></pre>
<pre><code class="language-cpp">uint8_t *vsector; // Wurde nachfolgend als uint8 behandelt, daher der Typ
       [...]
       vsector+=8;
</code></pre>
</blockquote>
<p>Warum hast du es denn geändert, wenn es &quot;erlaubt&quot; wäre?<br />
Deine o.g. Vermutung ist falsch.<br />
Man kann (standardkonform) keinen void-Zeiger inkrementieren.</p>
</blockquote>
<p>Also irgendwie fühle ich mich gänzlich missverstanden. War mein Post so scheisse? Ich habe das ganze angepasst, weil die Bibliothek in C ist, ich aber in C++ entwickle. Und siehe stackoverflow:</p>
<p><a href="http://stackoverflow.com/questions/3523145/pointer-arithmetic-for-void-pointer-in-c" rel="nofollow">http://stackoverflow.com/questions/3523145/pointer-arithmetic-for-void-pointer-in-c</a></p>
<p>Void-Pointer-Arithmetik soll, wenn ich das aus diesem Thema richtig verstanden habe, in C gehen. Aber AUSSCHLIESSLICH in C. Ich entwickle aber in C++! Deswegen MUSS ich diese Lib anpassen. Ich weiß, was Pointer sind.</p>
<p>Meine Frage ist nur, ob meine Anpassung korrekt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249595</guid><dc:creator><![CDATA[HelfendeHand]]></dc:creator><pubDate>Sat, 08 Sep 2012 17:04:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 17:07:23 GMT]]></title><description><![CDATA[<p>HelfendeHand schrieb:</p>
<blockquote>
<p>Und siehe stackoverflow:</p>
<p><a href="http://stackoverflow.com/questions/3523145/pointer-arithmetic-for-void-pointer-in-c" rel="nofollow">http://stackoverflow.com/questions/3523145/pointer-arithmetic-for-void-pointer-in-c</a></p>
<p>Void-Pointer-Arithmetik soll, wenn ich das aus diesem Thema richtig verstanden habe, in C gehen. Aber AUSSCHLIESSLICH in C. Ich entwickle aber in C++! Deswegen MUSS ich diese Lib anpassen. Ich weiß, was Pointer sind.</p>
</blockquote>
<p>Dann musst du aber auch einen C-Compiler benutzen. Ob dein C++ Zeugs dann noch funktioniert, ist die nächste Frage...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249596</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sat, 08 Sep 2012 17:07:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 18:38:44 GMT]]></title><description><![CDATA[<p>HelfendeHand schrieb:</p>
<blockquote>
<p>Sind meine Modifikationen korrekt?</p>
</blockquote>
<p>Nein. <code>vsector_16+=6;</code> bewegt den Zeiger um 6 uint16_t, d.h. 12 Bytes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249617</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 08 Sep 2012 18:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 20:40:14 GMT]]></title><description><![CDATA[<p>Man kann übrigens relativ problemlos einen Teil eines Programms mit einem C-Compiler übersetzen, den anderen mit einem C++-Compiler und das ganz dann vom Linker zu einem einzigen Programm zusammenbauen lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249647</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 08 Sep 2012 20:40:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 21:06:39 GMT]]></title><description><![CDATA[<p>HelfendeHand schrieb:</p>
<blockquote>
<p>Und siehe stackoverflow:</p>
<p><a href="http://stackoverflow.com/questions/3523145/pointer-arithmetic-for-void-pointer-in-c" rel="nofollow">http://stackoverflow.com/questions/3523145/pointer-arithmetic-for-void-pointer-in-c</a></p>
<p>Void-Pointer-Arithmetik soll, wenn ich das aus diesem Thema richtig verstanden habe, in C gehen.</p>
</blockquote>
<p>Das hast du falsch verstanden, und etwas anderes geht auch aus dem Link nicht hervor.</p>
<p>C99 schrieb:</p>
<blockquote>
<p>6.5.6/2<br />
For addition, either both operands shall have arithmetic type, or one operand shall be a<br />
<strong>pointer to an object type</strong> and the other shall have integer type. (Incrementing is<br />
equivalent to adding 1.)</p>
</blockquote>
<p>C99 schrieb:</p>
<blockquote>
<p>6.2.5 Types<br />
1 The meaning of a value stored in an object or returned by a function is determined by the<br />
type of the expression used to access it. (An identifier declared to be an object is the<br />
simplest such expression; the type is specified in the declaration of the identifier.) Types<br />
are partitioned into object types (types that fully describe objects), function types (types<br />
that describe functions), and <strong>incomplete types</strong> (types that describe objects but lack<br />
information needed to determine their sizes).<br />
[...]<br />
19 The void type comprises an empty set of values; it is an <strong>incomplete type</strong> that cannot be<br />
completed.</p>
</blockquote>
<p>void* ist zwar ein <em>object pointer type</em>; void selbst aber kein <em>object type</em> und somit void* kein <em>pointer to an object type</em>.</p>
<p>(<em>object pointer type</em> kommt im C-Standard nur in einer Fußnote vor und wird dort nicht formal definiert). In C++ existiert eine formale Definition (3.9.2/2) in genau diesem Sinne.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249652</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 08 Sep 2012 21:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 21:25:33 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>HelfendeHand schrieb:</p>
<blockquote>
<p>Sind meine Modifikationen korrekt?</p>
</blockquote>
<p>Nein. <code>vsector_16+=6;</code> bewegt den Zeiger um 6 uint16_t, d.h. 12 Bytes.</p>
</blockquote>
<p>Ich hab das jetzt nochmal in Ruhe nachvollzogen anhand eines separaten Miniprogramms. Ja, ist richtig, das ist nicht korrekt.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Man kann übrigens relativ problemlos einen Teil eines Programms mit einem C-Compiler übersetzen, den anderen mit einem C++-Compiler und das ganz dann vom Linker zu einem einzigen Programm zusammenbauen lassen.</p>
</blockquote>
<p>Danke für den Denkanstoß. Die Idee gefällt mir eigentlich ganz gut. Und danke auch an Camper. Void kann also nicht inkr/dekr werden. Wäre interessant, was der Ersteller der Bibliothek für einen Compiler hatte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249656</guid><dc:creator><![CDATA[HelfendeHand]]></dc:creator><pubDate>Sat, 08 Sep 2012 21:25:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur Pointerkonvertierung &#x2F; Pointerarithmetik on Sat, 08 Sep 2012 22:28:51 GMT]]></title><description><![CDATA[<p>Caste ihn einfach nach std::uintptr_t .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2249663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2249663</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 08 Sep 2012 22:28:51 GMT</pubDate></item></channel></rss>