<?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[Zeiger auf Referenz als Funktionsparameter]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich habe folgendes Problem:<br />
Ich nutze die Programmierschnittstelle eines CAD-Systems (Visual Basic 6) und bin nun auf DLLs einer externen Firma angewiesen. Diese DLLs sind in C++ programmiert.</p>
<pre><code class="language-cpp">//#######Definition der Funktion in der DLL########
#define dll_intern extern &quot;C&quot; __declspec(dllimport) 
//##################################################
dll_intern bool _cdecl LoadSTL (const char* fnm, 
                                T3DVECF  *&amp; P,
                                int32     &amp; n, 
                                TRIANGLE *&amp; T, 
                                int32     &amp; m); 
//##################################################
typedef   signed    long  int32;   // 32 Bit  mit Vorzeichen

struct T3DVECF 
{
public:
  float x;
  float y;
  float z;
};
</code></pre>
<p>Betrachtet man z.B. die oben dargestellte Funktion, so erkennt man, dass der Funktion ein String und des Weiteren ein Zeiger auf eine Referenz auf T3DVECF übergeben wird. T3DVECF ist dabei eine Struktur, bestehend aus drei float.</p>
<p>Im Programm wird anschließend mittels</p>
<pre><code class="language-cpp">P = new T3DVECF [n];
</code></pre>
<p>Speicher für P allokiert. P ist also vielmehr ein Array aus Strukturen, welche wiederum aus drei float bestehen. Die Elementanzahl des Array steht erst zur Laufzeit des Programms fest. Da Visual Basic keine Pointer kennt, möchte ich den Umweg über eine eigene C++-DLL gehen. Diese C++-DLL soll dann die VB-gerechte Datenaufbereitung übernehmen. Aber wie kann ich nun von meinem C++-Programm auf dieses Array zugreifen? Die oben definierte Funktion ist vorgegeben, d.h. ich muss einen Doppelzeiger (oder ist es etwa keiner?) nutzen. Wie müsste der Funktionsaufruf in meiner Applikation aussehen? Wie müssen die Daten an dieser Stelle definiert werden?<br />
Gibt es hierzu elegantere Alternativen? Intensive Internet-Recherche brachte hierzu keine Lösung.</p>
<p>Für ein ganz simples Beispiel zur Veranschaulichung wäre ich wirklich sehr dankbar (z.B. hochzählen eines Werts, also P[1].x += 1;).</p>
<p>Ich bin absoluter C++-Anfänger und bitte um Entschuldigung für etwaigen Missbrauch von C++-Begriffen. Ich bin wirklich für jede Form der Anregung dankbar und hoffe, dass mir jemand bei diesem für mich sehr wichtigen Problem helfen kann. Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/225249/zeiger-auf-referenz-als-funktionsparameter</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 14:28:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/225249.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 21 Oct 2008 12:30:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf Referenz als Funktionsparameter on Tue, 21 Oct 2008 12:30:18 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Ich habe folgendes Problem:<br />
Ich nutze die Programmierschnittstelle eines CAD-Systems (Visual Basic 6) und bin nun auf DLLs einer externen Firma angewiesen. Diese DLLs sind in C++ programmiert.</p>
<pre><code class="language-cpp">//#######Definition der Funktion in der DLL########
#define dll_intern extern &quot;C&quot; __declspec(dllimport) 
//##################################################
dll_intern bool _cdecl LoadSTL (const char* fnm, 
                                T3DVECF  *&amp; P,
                                int32     &amp; n, 
                                TRIANGLE *&amp; T, 
                                int32     &amp; m); 
//##################################################
typedef   signed    long  int32;   // 32 Bit  mit Vorzeichen

struct T3DVECF 
{
public:
  float x;
  float y;
  float z;
};
</code></pre>
<p>Betrachtet man z.B. die oben dargestellte Funktion, so erkennt man, dass der Funktion ein String und des Weiteren ein Zeiger auf eine Referenz auf T3DVECF übergeben wird. T3DVECF ist dabei eine Struktur, bestehend aus drei float.</p>
<p>Im Programm wird anschließend mittels</p>
<pre><code class="language-cpp">P = new T3DVECF [n];
</code></pre>
<p>Speicher für P allokiert. P ist also vielmehr ein Array aus Strukturen, welche wiederum aus drei float bestehen. Die Elementanzahl des Array steht erst zur Laufzeit des Programms fest. Da Visual Basic keine Pointer kennt, möchte ich den Umweg über eine eigene C++-DLL gehen. Diese C++-DLL soll dann die VB-gerechte Datenaufbereitung übernehmen. Aber wie kann ich nun von meinem C++-Programm auf dieses Array zugreifen? Die oben definierte Funktion ist vorgegeben, d.h. ich muss einen Doppelzeiger (oder ist es etwa keiner?) nutzen. Wie müsste der Funktionsaufruf in meiner Applikation aussehen? Wie müssen die Daten an dieser Stelle definiert werden?<br />
Gibt es hierzu elegantere Alternativen? Intensive Internet-Recherche brachte hierzu keine Lösung.</p>
<p>Für ein ganz simples Beispiel zur Veranschaulichung wäre ich wirklich sehr dankbar (z.B. hochzählen eines Werts, also P[1].x += 1;).</p>
<p>Ich bin absoluter C++-Anfänger und bitte um Entschuldigung für etwaigen Missbrauch von C++-Begriffen. Ich bin wirklich für jede Form der Anregung dankbar und hoffe, dass mir jemand bei diesem für mich sehr wichtigen Problem helfen kann. Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602193</guid><dc:creator><![CDATA[stevieda]]></dc:creator><pubDate>Tue, 21 Oct 2008 12:30:18 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Referenz als Funktionsparameter on Wed, 22 Oct 2008 08:08:07 GMT]]></title><description><![CDATA[<p>P ist ein Array von T3DVECF. Und der Zugriff funktioniert genau so, wie du ihn als Beispiel hingeschrieben hast.. Wo ist das Problem?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602640</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 22 Oct 2008 08:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Referenz als Funktionsparameter on Wed, 22 Oct 2008 08:22:51 GMT]]></title><description><![CDATA[<p>Ich weiß einfach nicht wie ich in meiner Applikation das Array definiere und anschließend als Übergabeparameter an meine Funktion <em>LoadSTL</em> weiterreiche. Es ist wahrscheinlich ganz simpel, aber ich weiß es einfach nicht.</p>
<p>Mein Vorschlag für den Funktionsaufruf:</p>
<pre><code class="language-cpp">bool retval;
const char* path;
T3DVECF* punkteliste;
T3DVECF* dreiecksliste;
int32 a;
int32 b;

retval = LoadSTL(path, punkteliste, a, dreiecksliste, b);
</code></pre>
<p>Aber das stimmt doch sicherlich hinten und vorne nicht. Tut mir leid, aber ich habe da momentan echte Schwierigkeiten mit. Vielen Dank für evtl. Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602648</guid><dc:creator><![CDATA[stevieda]]></dc:creator><pubDate>Wed, 22 Oct 2008 08:22:51 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Referenz als Funktionsparameter on Wed, 22 Oct 2008 08:37:18 GMT]]></title><description><![CDATA[<p>Mal abgesehen davon, dass es nicht viel Sinn macht einen Zeiger per Referenz zu übergeben stimmt das so.</p>
<pre><code class="language-cpp">int foo ( int* list , int count)
{
...
}

int main ()
{
   int l[500];
   foo (l , 500); 
}
</code></pre>
<p>Wichtig ist nur, dass du, wenn du ein Array übergibst auch noch die Anzahl der Objekte mitübergibst, da das alleine durch den Zeiger nicht (immer) absehbar ist.</p>
<p>btw:<br />
Warum probierst du so Zeugs nicht einfach mal an einem kleinem Beispiel aus? - Und wenn es das macht, was du erwartest, (respektive überhaupt kompilieren lässt), dann ist gut, ansonsten kannst du hier nachfragen, warum etwas wie funktioniert, oder wie nicht..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602669</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 22 Oct 2008 08:37:18 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Referenz als Funktionsparameter on Wed, 22 Oct 2008 09:23:28 GMT]]></title><description><![CDATA[<p>Okay, Du hast natürlich Recht mit dem Testen. Aber das habe ich auch schon zig mal probiert. Bin wie gesagt absolut unbedarft in Sachen C++. Ich muss es aber lösen. Ich habe nun mal ein kleines Beispiel versucht:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &quot;stdio.h&quot;
#include &lt;iostream&gt;

using namespace std;

typedef   signed    long  int32;   // 32 Bit  mit Vorzeichen

struct T3DVECF
{
public:
  float x;
  float y;
  float z;
};

struct TRIANGLE
{
public:
  int32 i;
  int32 j;
  int32 k;
};

bool LoadSTL (const char* fnm, T3DVECF *&amp; P, int32 &amp;n, TRIANGLE *&amp; T, int32 &amp;m)
{
    P = new T3DVECF[10];
    P[1].x = 1;
    return true;
}

int _tmain()
{
    const char* fnm;
    T3DVECF* P = new T3DVECF[4];
    TRIANGLE* T = new TRIANGLE[2];
    int n;
    int m;

    LoadSTL(fnm, &amp;P[4], n, &amp;T[2], m);

    std::cout &lt;&lt; P[1].x &lt;&lt; &quot;\n\n&quot;;
    delete[] P;
    delete[] T;

    std::cin.get();
    return 0;
}
</code></pre>
<p>Wenn ich das kompiliere, erhalte ich folgende Fehlermeldung:<br />
&quot;error C2664: 'LoadSTL': Konvertierung des Parameters 2 von 'T3DVECF *__w64 ' in 'T3DVECF *&amp;' nicht möglich&quot;</p>
<p>Muss ich bei der Übergabe der Arrays bereits die Größe mit übergeben? Denn in der Funktion (später wird es eine DLL. Hab es jetzt nur mal versucht einfach zu halten.) wird später noch der Speicherbereich erweitert.</p>
<p>Vielen Dank schon einmal für die bisherige Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602705</guid><dc:creator><![CDATA[stevieda]]></dc:creator><pubDate>Wed, 22 Oct 2008 09:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Referenz als Funktionsparameter on Wed, 22 Oct 2008 11:54:35 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">LoadSTL(fnm, &amp;P[4], n, &amp;T[2], m);
</code></pre>
</blockquote>
<p>Das hier ist schon mal ziemlicher Käse. <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>mal schauen, was du da machst.</p>
<pre><code class="language-cpp">&amp;P[4]
</code></pre>
<p>Ergibt dir die Adresse des 5ten Elementes aus dem Array. Selbst wenn sich das kompilieren lassen lässe, würdest du einen ziemlich heftigen Laufzeit Fehler an den Kopf geschmissen bekommen. <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="😉"
    /> - Schau dir nochmal mein Beispiel an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602770</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 22 Oct 2008 11:54:35 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Referenz als Funktionsparameter on Wed, 22 Oct 2008 11:53:37 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">&amp;P[4]
</code></pre>
<p>Ergibt dir die Adresse des 4ten Elementes aus dem Array.</p>
</blockquote>
<p>Du meinst wohl des 5ten Elementes <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="😉"
    /> (nanana drakon, setzt die Verkalkung ein *duck*)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602780</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 22 Oct 2008 11:53:37 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Referenz als Funktionsparameter on Wed, 22 Oct 2008 11:58:02 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">&amp;P[4]
</code></pre>
<p>Ergibt dir die Adresse des 4ten Elementes aus dem Array.</p>
</blockquote>
<p>Du meinst wohl des 5ten Elementes <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="😉"
    /> (nanana drakon, setzt die Verkalkung ein *duck*)</p>
</blockquote>
<p>Was den? - Habe ich ja geschrieben.. :p</p>
<p>btw:<br />
throw something_at_asc (&quot;kröte&quot;); <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>Es ist einfach schon viel zu spät.. <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="🙂"
    /><br />
Bei Verwunderung und Fragezeichen ob dieses Satzes bitte kontaktiere deinen Artzt, oder <a href="http://www.drakon.ch" rel="nofollow">...</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602787</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 22 Oct 2008 11:58:02 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Referenz als Funktionsparameter on Wed, 22 Oct 2008 12:11:50 GMT]]></title><description><![CDATA[<p>Hmmm, ja stimmt...<br />
Okay, wie sieht es denn dann hiermit aus?</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &quot;stdio.h&quot;
#include &lt;iostream&gt;

using namespace std;

typedef   signed    long  int32;   // 32 Bit  mit Vorzeichen

struct T3DVECF 
{
public:
  float x;
  float y;
  float z;
};

struct TRIANGLE 
{
public:
  int32 i;
  int32 j;
  int32 k;
};

bool LoadSTL (const char* fnm, T3DVECF *&amp; P, int32 &amp;n, TRIANGLE *&amp; T, int32 &amp;m)
{
    P = new T3DVECF[2];
    T = new TRIANGLE[3];
    P[0].x = 1;
    P[1].x = 2;
    T[0].i = 100;
    n = 1000;
    m = 200;
    return true;
}

int _tmain()
{
    const char* fnm;
    fnm = &quot;&quot;;

    T3DVECF* P = 0;
    TRIANGLE* T = 0;
    int32 n;
    int32 m;

    LoadSTL(fnm, P, n, T, m); 

    std::cout &lt;&lt; &quot;P[0].x = &quot; &lt;&lt; P[0].x &lt;&lt; &quot;\n&quot;;
    std::cout &lt;&lt; &quot;P[1].x = &quot; &lt;&lt; P[1].x &lt;&lt; &quot;\n&quot;;
    std::cout &lt;&lt; &quot;T[0].i = &quot; &lt;&lt; T[0].i &lt;&lt; &quot;\n&quot;;
    std::cout &lt;&lt; &quot;n = &quot; &lt;&lt; n &lt;&lt; &quot;\n\n&quot;;
    delete[] P;
    delete[] T;

    std::cin.get();
    return 0;
}
</code></pre>
<p>Zumindest läuft es und mir werden die richtigen Werte ausgegeben. Oder ist hier trotzdem noch was falsch? Wie sieht es mit dem Bereinigen des Speichers aus? P und T werden ja in der Funktion allokiert, aber ich kann sie ja erst am Ende des Programms wieder löschen. Ist das so richtig?</p>
<p>Vielen Dank für die Hinweise!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602802</guid><dc:creator><![CDATA[stevieda]]></dc:creator><pubDate>Wed, 22 Oct 2008 12:11:50 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Referenz als Funktionsparameter on Wed, 22 Oct 2008 12:20:00 GMT]]></title><description><![CDATA[<p>Direkt falsch ist das nicht. Es ist nur nicht besonders schön. Da würde ich dir eher zur Benutzung von smart Pointern raten. (siehe boost).<br />
Das Problem ist einfach, dass im Falle einer anderen Terminierung des Programmes, als durch normalen Fluss, z.B durch eine exception der Speicher nicht freigeben wird, wenn der Code nicht erreicht wird. Das passiert dir mit smart Pointer nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1602812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1602812</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 22 Oct 2008 12:20:00 GMT</pubDate></item></channel></rss>