<?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[irres Konstrukt und merkwürdiger Compilerfehler]]></title><description><![CDATA[<p>Hallo erstmal!</p>
<p>Ich habe seid gestern ein Problem mit dem folgenden Konstrukt.</p>
<pre><code class="language-cpp">IF_RC
IF_QueryDBServerData (IF_HANDLE            PV_IfHandle,
                      int                 *PV_NumberDBServerData,
                      const char *const (**PV_DBServerData)[]);
</code></pre>
<p>Als Prozedur läßt es sich mit dem GCC in C wunderbar compilieren. Als C++-Methode in einer Klasse wiederrum nicht. Rufe ich den GCC auf, erscheint die folgende Fehlermeldung.</p>
<pre><code>&gt; gcc -c DCDConnect.cpp
In file included from DCDConnect.cpp:1:
DCDConnect.h:17: error: parameter `PV_DBServerData' includes pointer to array
   of unknown bound `const char* const[]'
</code></pre>
<p>Wenn ich aber die Methode ihren Argumenten nach in einer Klasse definiere, ohne die Methode an sich zu definieren, wird alles sauber compiliert. Laut der Fehlermeldung ist auch das dritte Argument der Schuldige. Zu meiner Schande muss ich gestehen, dass ich das Konstrukt</p>
<pre><code class="language-cpp">const char *const (**PV_DBServerData)[]
</code></pre>
<p>auch nicht ganz verstehe. Erschwerend hinzu kommt, dass die Prozedur zu einer API gehört, auf die ich zugreifen muss. Somit muss ich den gcc irgendwie überreden dies auch in C++ zu compilieren. Vielleicht könnt ihr mir ja helfen. Danke schonmal im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/146807/irres-konstrukt-und-merkwürdiger-compilerfehler</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 21:34:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/146807.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 May 2006 07:58:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to irres Konstrukt und merkwürdiger Compilerfehler on Thu, 11 May 2006 08:01:49 GMT]]></title><description><![CDATA[<p>Hallo erstmal!</p>
<p>Ich habe seid gestern ein Problem mit dem folgenden Konstrukt.</p>
<pre><code class="language-cpp">IF_RC
IF_QueryDBServerData (IF_HANDLE            PV_IfHandle,
                      int                 *PV_NumberDBServerData,
                      const char *const (**PV_DBServerData)[]);
</code></pre>
<p>Als Prozedur läßt es sich mit dem GCC in C wunderbar compilieren. Als C++-Methode in einer Klasse wiederrum nicht. Rufe ich den GCC auf, erscheint die folgende Fehlermeldung.</p>
<pre><code>&gt; gcc -c DCDConnect.cpp
In file included from DCDConnect.cpp:1:
DCDConnect.h:17: error: parameter `PV_DBServerData' includes pointer to array
   of unknown bound `const char* const[]'
</code></pre>
<p>Wenn ich aber die Methode ihren Argumenten nach in einer Klasse definiere, ohne die Methode an sich zu definieren, wird alles sauber compiliert. Laut der Fehlermeldung ist auch das dritte Argument der Schuldige. Zu meiner Schande muss ich gestehen, dass ich das Konstrukt</p>
<pre><code class="language-cpp">const char *const (**PV_DBServerData)[]
</code></pre>
<p>auch nicht ganz verstehe. Erschwerend hinzu kommt, dass die Prozedur zu einer API gehört, auf die ich zugreifen muss. Somit muss ich den gcc irgendwie überreden dies auch in C++ zu compilieren. Vielleicht könnt ihr mir ja helfen. Danke schonmal im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055327</guid><dc:creator><![CDATA[tyr377]]></dc:creator><pubDate>Thu, 11 May 2006 08:01:49 GMT</pubDate></item><item><title><![CDATA[Reply to irres Konstrukt und merkwürdiger Compilerfehler on Thu, 11 May 2006 10:20:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>kann Dir leider nur sagen, dass es mit dem Studio 2003 kompiliert.</p>
<p>Mich würde auch interessieren was der Parameter bedeutet.<br />
In Worten wäre meine Interpretaion<br />
Ein Zeiger auf ein Array von Zeigern auf Zeigern ???</p>
<p>Kommt das hin? Ist das Standardkonform?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055447</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Thu, 11 May 2006 10:20:45 GMT</pubDate></item><item><title><![CDATA[Reply to irres Konstrukt und merkwürdiger Compilerfehler on Thu, 11 May 2006 11:10:21 GMT]]></title><description><![CDATA[<p>templäd schrieb:</p>
<blockquote>
<p>Mich würde auch interessieren was der Parameter bedeutet.<br />
In Worten wäre meine Interpretaion<br />
Ein Zeiger auf ein Array von Zeigern auf Zeigern ???</p>
</blockquote>
<p>Nein, ein Zeiger auf einen Zeiger auf ein Array (unbestimmter Größe) von Zeigern. Ob das in C++ erlaubt ist (genauer gesagt: ob man Zeiger auf Arrays unbestimmer Größe haben kann, oder ob das nur mit VLAs ala C99 geht) weiß ich nicht genau.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055500</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 11 May 2006 11:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to irres Konstrukt und merkwürdiger Compilerfehler on Thu, 11 May 2006 14:58:48 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Nein, ein Zeiger auf einen Zeiger auf ein Array (unbestimmter Größe) von Zeigern. Ob das in C++ erlaubt ist (genauer gesagt: ob man Zeiger auf Arrays unbestimmer Größe haben kann, oder ob das nur mit VLAs ala C99 geht) weiß ich nicht genau.</p>
</blockquote>
<p>So sehe ich das mittlerweile auch. Es ist übrigens ein Zeiger-auf-Konstante-Konstrukt, wobei der Zeiger selbst auch konstant ist. Nun habe ich auch schon die Man des GCC studiert, konnte aber nichts finden, um das Probelm zu lösen. Auch die Anweisung, dass gcc es als C (über __cplusplus) handhaben soll, hat nichts gebracht.</p>
<p>Ich werde jetzt erstmal Feierabend machen und mich morgen wieder damit rumschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055728</guid><dc:creator><![CDATA[tyr377]]></dc:creator><pubDate>Thu, 11 May 2006 14:58:48 GMT</pubDate></item><item><title><![CDATA[Reply to irres Konstrukt und merkwürdiger Compilerfehler on Thu, 11 May 2006 16:25:47 GMT]]></title><description><![CDATA[<p>soweit ich es verstehe ist diese form in C++ explizit ausgeschlossen (8.3.5/6). es ist zu vermuten, dass du den parameter auch einfach als</p>
<pre><code class="language-cpp">const char *const (**PV_DBServerData)
</code></pre>
<p>ohne negative auswirkungen schreiben kannst (unterschiede ergäben sich nur in der funktionsdefinition).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055809</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 11 May 2006 16:25:47 GMT</pubDate></item><item><title><![CDATA[Reply to irres Konstrukt und merkwürdiger Compilerfehler on Thu, 11 May 2006 17:19:14 GMT]]></title><description><![CDATA[<p>So ist es doch nur noch nen Zeiger auf nen Zeiger auf nen konstanten Zeiger auf eine konstante Zeichenkette statt einem Zeiger auf nen Zeiger auf nen Array aus konstanten Zeiger auf eine konstante Zeichenkette.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055852</guid><dc:creator><![CDATA[dragon90#]]></dc:creator><pubDate>Thu, 11 May 2006 17:19:14 GMT</pubDate></item><item><title><![CDATA[Reply to irres Konstrukt und merkwürdiger Compilerfehler on Thu, 11 May 2006 17:51:39 GMT]]></title><description><![CDATA[<p>Wenn aus dem Array ein Pointer wird, dann müßte es doch</p>
<pre><code class="language-cpp">const char *const (***PV_DBServerData)
</code></pre>
<p>heißen, oder? Die Implementierung müßte eigentlich genauso wie vorher aussehen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055880</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Thu, 11 May 2006 17:51:39 GMT</pubDate></item><item><title><![CDATA[Reply to irres Konstrukt und merkwürdiger Compilerfehler on Thu, 11 May 2006 18:16:17 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>Wenn aus dem Array ein Pointer wird, dann müßte es doch</p>
<pre><code class="language-cpp">const char *const (***PV_DBServerData)
</code></pre>
<p>heißen, oder? Die Implementierung müßte eigentlich genauso wie vorher aussehen können.</p>
</blockquote>
<p>ich denke nicht.<br />
ein ausdruck **PV_DBServerData würde (mit der ursprünglichen deklaration, wenn sie denn in C++ legal wäre) ein lvalue array unbekannter größe sein (auf jeden fall ist es keine pointer auf einen konstanten pointer auf konstantes char - und da da das array unbekannte größe hat, kann man hier in der zweiten ebene eben nur * und keinen index-zugriff durchführen. der einzige weg, diesen ausdruck weiterzuverwenden, ist dann den index-operator zu benutzen:<br />
(**PV_DB_ServerData)[x]<br />
Das ergebnis ist dann eine konstanter zeiger auf einen konstanten string.<br />
<div class="plugin-markdown"><input type="checkbox" id="checkbox112788" checked="true" /><label for="checkbox112788">nichts anderes ist als:</label></div><br />
*(&amp;a[0] + x) bzw. *(a + x)<br />
also<br />
<div class="plugin-markdown"><input type="checkbox" id="checkbox112787" checked="true" /><label for="checkbox112787">&lt;=&gt; *(&amp;**PV_DB_ServerData + x)</label></div><br />
netto also nur zwei indirektionen</p>
<pre><code>!--------------------------------------------------------------------------------------!
!const char* const (0)!const char* const (1)!const char* const (2)!const char* const (3)! ...
!--------------------------------------------------------------------------------------!

  / \
   |
   |
const char* const(*)[]

  / \
   |
   |
const char* const(**)[]
</code></pre>
<p>und damit ändert sich der code in der funktionsdefinition: statt zweier * operatoren, braucht man nur noch einen im obersten level, der zweite verschmilzt mit dem indexoperator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055900</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 11 May 2006 18:16:17 GMT</pubDate></item><item><title><![CDATA[Reply to irres Konstrukt und merkwürdiger Compilerfehler on Fri, 12 May 2006 13:04:47 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>eine Änderung an dem Header-File wollte ich eigentlich vermeiden, da ich dieses nicht verbockt habe. Hier im Büro wurde auch schon die Holzhammermethode vorgeschlagen, in dem ich einfach das Argument als void-Zeiger deklariere, aber wie gesagt, ich möchte das Header-File nur ungern ändern. Ich werde jetzt eine Dummy-Bibliothek in C schreiben, die ich dann unter C++ ohne große Problem compilieren kann. Dieser Weg ist zwar nicht schön, aber selten. <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/1056448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056448</guid><dc:creator><![CDATA[tyr377]]></dc:creator><pubDate>Fri, 12 May 2006 13:04:47 GMT</pubDate></item></channel></rss>