<?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[Übergabe eines Arrays an funktion]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte folgendes array:</p>
<pre><code class="language-cpp">float data[imax+1][jmax+1][kmax+1]
</code></pre>
<p>an eine Funktion:</p>
<pre><code class="language-cpp">int erzeugung (const int imax, const int jmax, const int kmax, float ***data)
</code></pre>
<p>wie folgt übergeben:</p>
<pre><code class="language-cpp">erzeugung (imax, jmax, kmax, data);
</code></pre>
<p>imax, jmax und kmax sind const int.</p>
<p>Ich habe es schon in vielen Varianten versucht. Das Problem liegt wahrscheinlich darin, daß ich die Konstanten imax, jmax und kmax ebenfalls übergeben muss und das array genau über diese Größen definiert ist.<br />
Ich muss die Größe des array allerdings variabel halten.<br />
Ich habe bereits versucht, so:</p>
<pre><code class="language-cpp">erzeugung (imax, jmax, kmax, ***data);
</code></pre>
<p>oder so:</p>
<pre><code class="language-cpp">erzeugung (imax, jmax, kmax, data[imax][jmax][kmax]);
</code></pre>
<p>zu übergeben, oder die Funktion auch wie folgt zu deklarieren:</p>
<pre><code class="language-cpp">int erzeugung (const int imax, const int jmax, const int kmax, float data[imax][jmax][kmax])
</code></pre>
<p>Nichts hat zum Erfolg geführt.<br />
Wie mache ich es am Besten?</p>
<p>Oder gibt es eine Möglichkeit das array global zu definieren, wenn ich die einzelnen Funktionen jeweils in eigenen Dateien habe?</p>
<p>Ich benutze Visual Studio 2005.</p>
<p>Danke<br />
floriank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180211/übergabe-eines-arrays-an-funktion</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 19:12:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180211.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 30 Apr 2007 08:32:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Mon, 30 Apr 2007 08:32:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte folgendes array:</p>
<pre><code class="language-cpp">float data[imax+1][jmax+1][kmax+1]
</code></pre>
<p>an eine Funktion:</p>
<pre><code class="language-cpp">int erzeugung (const int imax, const int jmax, const int kmax, float ***data)
</code></pre>
<p>wie folgt übergeben:</p>
<pre><code class="language-cpp">erzeugung (imax, jmax, kmax, data);
</code></pre>
<p>imax, jmax und kmax sind const int.</p>
<p>Ich habe es schon in vielen Varianten versucht. Das Problem liegt wahrscheinlich darin, daß ich die Konstanten imax, jmax und kmax ebenfalls übergeben muss und das array genau über diese Größen definiert ist.<br />
Ich muss die Größe des array allerdings variabel halten.<br />
Ich habe bereits versucht, so:</p>
<pre><code class="language-cpp">erzeugung (imax, jmax, kmax, ***data);
</code></pre>
<p>oder so:</p>
<pre><code class="language-cpp">erzeugung (imax, jmax, kmax, data[imax][jmax][kmax]);
</code></pre>
<p>zu übergeben, oder die Funktion auch wie folgt zu deklarieren:</p>
<pre><code class="language-cpp">int erzeugung (const int imax, const int jmax, const int kmax, float data[imax][jmax][kmax])
</code></pre>
<p>Nichts hat zum Erfolg geführt.<br />
Wie mache ich es am Besten?</p>
<p>Oder gibt es eine Möglichkeit das array global zu definieren, wenn ich die einzelnen Funktionen jeweils in eigenen Dateien habe?</p>
<p>Ich benutze Visual Studio 2005.</p>
<p>Danke<br />
floriank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276101</guid><dc:creator><![CDATA[floriank]]></dc:creator><pubDate>Mon, 30 Apr 2007 08:32:04 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Mon, 30 Apr 2007 08:37:44 GMT]]></title><description><![CDATA[<p>Die Größe eines Arrays muß bereits zur Compilezeit feststehen, deshalb dürften deine Ansätze, Arrays beliebiger Größe übergeben zu wollen, alle nicht funktionieren. (und auch die implizite Umwandlung Array-&gt;Zeiger funktioniert nur im eindimensionalen Fall)</p>
<p>Wirf doch mal einen Blick in die FAQ - das Thema &quot;dynamische mehrdimensionale Arrays&quot; könnte dir weiterhelfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276105</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Apr 2007 08:37:44 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Mon, 30 Apr 2007 08:43:07 GMT]]></title><description><![CDATA[<p>wie wärs mit einem vector?</p>
<p>greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276111</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Mon, 30 Apr 2007 08:43:07 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Mon, 30 Apr 2007 09:56:03 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Die Größe eines Arrays muß bereits zur Compilezeit feststehen, deshalb dürften deine Ansätze, Arrays beliebiger Größe übergeben zu wollen, alle nicht funktionieren.</p>
</blockquote>
<p>Die Größe meines arrays steht von vornherein fest. Die imax jmax und kmax sind ja const int . Ich brauche diese nur an mehreren Stellen und möchte bei einer Änderung (ich muss das Programm nachher für viele verschiedene Größen laufen lassen) nicht immer an 20 Stellen die Größen ändern (außerdem übersehe ich dann irgendwann einmal eine.</p>
<p>Oder gibt es eine Möglichkeit das array global zu definieren, wenn ich die einzelnen Funktionen jeweils in eigenen Dateien habe? Da es sich um einige Funktionen handelt, wird es sehr unübersichtlich, wenn ich einfach alles in eine Datei schreibe. Und zudem brauche ich mehrere Versionen, bei denen die Funktion gleich bleiben, aber eben unterschiedlich aufgerufen werden.</p>
<p>Mit Vectoren kann ich nicht gut arbeiten, da ich immer wieder auf Nachbarn (3-Dimensional) zugreifen muss, sich aber die Dimensionen jeweils bei jedem Versuch ändern. Ich kann also nicht sagen, daß ich genau 20 Einträge in jeder Spalte habe oder so ähnlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276168</guid><dc:creator><![CDATA[floriank]]></dc:creator><pubDate>Mon, 30 Apr 2007 09:56:03 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Mon, 30 Apr 2007 10:02:18 GMT]]></title><description><![CDATA[<p>floriank schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Die Größe eines Arrays muß bereits zur Compilezeit feststehen, deshalb dürften deine Ansätze, Arrays beliebiger Größe übergeben zu wollen, alle nicht funktionieren.</p>
</blockquote>
<p>Die Größe meines arrays steht von vornherein fest.</p>
</blockquote>
<p>Kennst du den Unterschied zwischen Laufzeit-Konstanten und Compilezeit-Konstanten? (nur so viel: als Arraygröße brauchst du letztere).</p>
<p>Wenn die Größe des Arrays wirklich konstant ist, kannst du sie auch als globale Konstanten festlegen - dann erübrigt sich auch die Übergabe als Parameter <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>
<blockquote>
<p>Mit Vectoren kann ich nicht gut arbeiten, da ich immer wieder auf Nachbarn (3-Dimensional) zugreifen muss, sich aber die Dimensionen jeweils bei jedem Versuch ändern. Ich kann also nicht sagen, daß ich genau 20 Einträge in jeder Spalte habe oder so ähnlich.</p>
</blockquote>
<p>Das hört sich nicht sonderlich konstant an - und schreit geradezu nach vector&lt;&gt;en <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="😉"
    /> (im Gegensatz zu einem Array kannst du bei einem vector nämlich festlegen, wie groß er werden soll).</p>
<p>PS: Noch einmal: Wirf einen Blick in die FAQ.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276172</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 30 Apr 2007 10:02:18 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Tue, 01 May 2007 00:06:42 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//A:
template&lt;size_t imax, size_t jmax, size_t kmax&gt;
int erzeugung(float (&amp;data)[imax][jmax][kmax])
{
    // ...
    return 0;
}

// B:
int erzeugung(size_t imax, size_t jmax, size_t kmax, float* data)
{
    // ...
    return 0;
}

void foo()
{
    float a[7][8][666];
    int rc = erzeugung(a); // call version A
    int rc2 = erzeugung(7, 8, 666, &amp;(a[0][0][0])); // call version B
}
</code></pre>
<p>Das &quot;+1&quot; hab' ich weggelassen, weil mein Compiler (MSVC8) sonst die Template Arguments von &quot;A&quot; sonst nichtmehr &quot;deducen&quot; kann, bei Version &quot;B&quot; dann genauso damit's gleich wie &quot;A&quot; ist <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/1276698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276698</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 01 May 2007 00:06:42 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Tue, 01 May 2007 00:58:33 GMT]]></title><description><![CDATA[<p>Ein Zeiger auf Dein dreidimensionales Array sieht so aus: float (<em>)[jmax+1][kmax+1]<br />
mach nicht so'n Scheiss mit drei Sternen ( float</em>**)!<br />
Schreib dir ein typedef z.B. so:</p>
<pre><code class="language-cpp">int main() 
{ 
    const int imax =  10;  // dim1
    const int jmax =  20;  // dim2
    const int kmax =  30;  // dim3

    typedef float (*Ptr)[jmax+1][kmax+1];

    float data[imax+1][jmax+1][kmax+1];  

    Ptr pointer = data;

    pointer[0][2][3] = 4711.0;

    float test = data[0][2][3];  // test = 4711.0;
   // int erzeugung (Ptr pointer, int dim1);  Übergabe an Funktion Ptr + dim1
}
</code></pre>
<p><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/1276707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276707</guid><dc:creator><![CDATA[balduin]]></dc:creator><pubDate>Tue, 01 May 2007 00:58:33 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Tue, 01 May 2007 05:53:27 GMT]]></title><description><![CDATA[<p>alternativ kannst du auch so ein array mavhen</p>
<pre><code class="language-cpp">data[imax * jmax * kmax]
</code></pre>
<p>zugriff is dann so<br />
i + j*imax + k*jmax.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1276719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1276719</guid><dc:creator><![CDATA[öko]]></dc:creator><pubDate>Tue, 01 May 2007 05:53:27 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Tue, 01 May 2007 16:05:34 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">//A:
template&lt;size_t imax, size_t jmax, size_t kmax&gt;
int erzeugung(float (&amp;data)[imax][jmax][kmax])
{
    // ...
    return 0;
}

// B:
int erzeugung(size_t imax, size_t jmax, size_t kmax, float* data)
{
    // ...
    return 0;
}

void foo()
{
    float a[7][8][666];
    int rc = erzeugung(a); // call version A
    int rc2 = erzeugung(7, 8, 666, &amp;(a[0][0][0])); // call version B
}
</code></pre>
<p>Das &quot;+1&quot; hab' ich weggelassen, weil mein Compiler (MSVC8) sonst die Template Arguments von &quot;A&quot; sonst nichtmehr &quot;deducen&quot; kann, bei Version &quot;B&quot; dann genauso damit's gleich wie &quot;A&quot; ist <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>
</blockquote>
<p>Vielen Dank. Leider funktioniert es bei mir nicht wirklich. Im Fall B, kann ich nicht die einzelnen Werte bei a (z.B. a[i][j][k] beschreiben, es kommt immer die Fehlermeldung, daß ich zuviele Argumente bei a habe, und im Fall A, akzeptiert er die globale Definition von imax... nicht. Wie gesagt, ich habe ein Hauptprogramm und die Funktionen in eigenen Dateien.</p>
<p>balduin schrieb:</p>
<blockquote>
<p>Ein Zeiger auf Dein dreidimensionales Array sieht so aus: float (<em>)[jmax+1][kmax+1]<br />
mach nicht so'n Scheiss mit drei Sternen ( float</em>**)!<br />
Schreib dir ein typedef z.B. so:</p>
<pre><code class="language-cpp">int main() 
{ 
    const int imax =  10;  // dim1
    const int jmax =  20;  // dim2
    const int kmax =  30;  // dim3

    typedef float (*Ptr)[jmax+1][kmax+1];

    float data[imax+1][jmax+1][kmax+1];  
    
    Ptr pointer = data;

    pointer[0][2][3] = 4711.0;

    float test = data[0][2][3];  // test = 4711.0;
   // int erzeugung (Ptr pointer, int dim1);  Übergabe an Funktion Ptr + dim1
}
</code></pre>
<p><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>
</blockquote>
<p>Auch hierfür danke. Ich habe es ausprobiert, aber es scheint wieder daran zu scheitern, daß ich in verschiedenen Dateien arbeite.</p>
<p>öko schrieb:</p>
<blockquote>
<p>alternativ kannst du auch so ein array mavhen</p>
<pre><code class="language-cpp">data[imax * jmax * kmax]
</code></pre>
<p>zugriff is dann so<br />
i + j*imax + k*jmax.</p>
</blockquote>
<p>So habe ich es jetzt hinbekommen (auch wenn es nicht die schönste Variante ist, aber sie klappt).</p>
<p>Jetzt wirft mir der Compiler aber immer folgende Fehlermeldung raus:</p>
<blockquote>
<p>1&gt;Lorenzo.obj : error LNK2005: &quot;unsigned int __cdecl konvertierung(float)&quot; (?konvertierung@@YAIM@Z) ist bereits in Konvertierung.obj definiert.<br />
1&gt;Main.obj : error LNK2005: &quot;int __cdecl erzeugung(int,int,int,float *)&quot; (?erzeugung@@YAHHHHPAM@Z) ist bereits in Erzeugung.obj definiert.<br />
1&gt;Main.obj : error LNK2005: &quot;unsigned int __cdecl konvertierung(float)&quot; (?konvertierung@@YAIM@Z) ist bereits in Konvertierung.obj definiert.<br />
1&gt;Main.obj : error LNK2005: &quot;int __cdecl lorenzo(int,int,int,int,float *,unsigned int *)&quot; (?lorenzo@@YAHHHHHPAMPAI@Z) ist bereits in Lorenzo.obj definiert.<br />
1&gt;Schreiben.obj : error LNK2005: &quot;int __cdecl schreiben(int,int,int,int,float *,unsigned int *)&quot; (?schreiben@@YAHHHHHPAMPAI@Z) ist bereits in Main.obj definiert.<br />
1&gt;MSVCRTD.lib(crtexew.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol &quot;_WinMain@16&quot; in Funktion &quot;___tmainCRTStartup&quot;.<br />
1&gt;C:\Dokumente und Einstellungen\FlorianK\Eigene Dateien\Visual Studio 2005\Projects\Lorenzo\Debug\Lorenzo.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.<br />
1&gt;Das Buildprotokoll wurde unter &quot;file://c:\Dokumente und Einstellungen\FlorianK\Eigene Dateien\Visual Studio 2005\Projects\Lorenzo\Lorenzo\Debug\BuildLog.htm&quot; gespeichert.<br />
1&gt;Lorenzo - 7 Fehler, 7 Warnung(en)<br />
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========</p>
</blockquote>
<p>Kann mir dabei einer helfen. Die Meldungen verstehe ich überhaupt nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1277028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1277028</guid><dc:creator><![CDATA[floriank]]></dc:creator><pubDate>Tue, 01 May 2007 16:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Tue, 01 May 2007 16:11:08 GMT]]></title><description><![CDATA[<p>floriank schrieb:</p>
<blockquote>
<p>Jetzt wirft mir der Compiler aber immer folgende Fehlermeldung raus:</p>
</blockquote>
<p>Das ist nicht der Compiler, sondern der Linker, der sich da beschwert. Er findet mehrere Definitionen der Funktionen konvertierung, erzeugung, lorenzo und schreiben, und weiß nun nicht, welche er benutzen soll. Das liegt vermutlich daran, dass du die Funktionen in einer Headerdatei definiert hast, oder .cpp-Dateien mittels Includedirektive in andere .cpp-Dateien eingebunden hast.</p>
<p>Andererseits findet der Linker keine WinMain-Funktion, was daran liegt, dass du den falschen Projekttyp erstellt hast. Du wolltest wohl ein Konsolenprojekt, hast aber ein Windows-Anwendungsprojekt angelegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1277035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1277035</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Tue, 01 May 2007 16:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Tue, 01 May 2007 16:29:06 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>Das ist nicht der Compiler, sondern der Linker, der sich da beschwert. Er findet mehrere Definitionen der Funktionen konvertierung, erzeugung, lorenzo und schreiben, und weiß nun nicht, welche er benutzen soll. Das liegt vermutlich daran, dass du die Funktionen in einer Headerdatei definiert hast, oder .cpp-Dateien mittels Includedirektive in andere .cpp-Dateien eingebunden hast.</p>
</blockquote>
<p>Headerdateien habe ich nicht, aber ich habe .cpp-Dateien in andere .cpp-Dateien eingebunden das ist richtig.</p>
<blockquote>
<p>Andererseits findet der Linker keine WinMain-Funktion, was daran liegt, dass du den falschen Projekttyp erstellt hast. Du wolltest wohl ein Konsolenprojekt, hast aber ein Windows-Anwendungsprojekt angelegt.</p>
</blockquote>
<p>Das ist richtig. Kann ich das nachträglich noch ändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1277053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1277053</guid><dc:creator><![CDATA[floriank]]></dc:creator><pubDate>Tue, 01 May 2007 16:29:06 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe eines Arrays an funktion on Tue, 01 May 2007 17:43:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15261">@floriank</a>:</p>
<p>Wenn du das template verwenden willst dann pack es in eine Header Datei, und inkludiere die überall. Der Code für das template muss (!) dann auch mit in die Header Datei, sonst geht es nicht.</p>
<p>Wenn du die andere Funktion verwenden willst musst du den Index &quot;mit Hand&quot; zusammenbasteln wie öko es geschrieben hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1277094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1277094</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 01 May 2007 17:43:34 GMT</pubDate></item></channel></rss>