<?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 zum Übergeben von Arrays an Funktionen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte ein Array an eine Funktion übergeben, ich bekomme allerdings die folgende Fehlermeldung:</p>
<p>invalid types `float[int]' for array subscript</p>
<p>...und ich weiß nicht warum; da ich ja eigentlich den index vom array als integer definiert habe. Ich kann mir höchstens vorstellen, dass es an der fehlerhaften verwendung (oder nicht-verwendung) von pointern liegt (kann man einer funktion ein array als argument geben?), nen bischen rumprobieren hat mich aber nicht weitergebracht....</p>
<p>Hier mal der entsprechende Code aus meinem Programm:</p>
<pre><code class="language-cpp">float lattice_energy (float lattice) {
      int n = sizeof(lattice)/(sizeof(int)*sizeof(int));
      float energy=0.;
      for (int i=n-1; i&gt;=0; i--){
        for (int j=n-1; j&gt;=0; j--){
            if ((j==n-1) &amp;&amp; (i==n-1)) {
               energy=energy-lattice[i][j]*lattice[i][0]-lattice[i][j]*lattice[0][j];
               }
            else if (j==n-1) {
               energy=energy-lattice[i][j]*lattice[i][0]-lattice[i][j]*lattice[i+1][j];
               }
            else if (i==n-1) {
               energy=energy-lattice[i][j]*lattice[i][j+1]-lattice[i][j]*lattice[i+1][j];
               }
            else {
               energy=energy-lattice[i][j]*lattice[i][j+1]-lattice[i][j]*lattice[0][j];
               }
        };
      };
      return energy;
}
</code></pre>
<p>Vielen Dank,</p>
<p>Immortalis</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/232552/frage-zum-übergeben-von-arrays-an-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 07:37:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/232552.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 24 Jan 2009 01:21:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 01:24:51 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte ein Array an eine Funktion übergeben, ich bekomme allerdings die folgende Fehlermeldung:</p>
<p>invalid types `float[int]' for array subscript</p>
<p>...und ich weiß nicht warum; da ich ja eigentlich den index vom array als integer definiert habe. Ich kann mir höchstens vorstellen, dass es an der fehlerhaften verwendung (oder nicht-verwendung) von pointern liegt (kann man einer funktion ein array als argument geben?), nen bischen rumprobieren hat mich aber nicht weitergebracht....</p>
<p>Hier mal der entsprechende Code aus meinem Programm:</p>
<pre><code class="language-cpp">float lattice_energy (float lattice) {
      int n = sizeof(lattice)/(sizeof(int)*sizeof(int));
      float energy=0.;
      for (int i=n-1; i&gt;=0; i--){
        for (int j=n-1; j&gt;=0; j--){
            if ((j==n-1) &amp;&amp; (i==n-1)) {
               energy=energy-lattice[i][j]*lattice[i][0]-lattice[i][j]*lattice[0][j];
               }
            else if (j==n-1) {
               energy=energy-lattice[i][j]*lattice[i][0]-lattice[i][j]*lattice[i+1][j];
               }
            else if (i==n-1) {
               energy=energy-lattice[i][j]*lattice[i][j+1]-lattice[i][j]*lattice[i+1][j];
               }
            else {
               energy=energy-lattice[i][j]*lattice[i][j+1]-lattice[i][j]*lattice[0][j];
               }
        };
      };
      return energy;
}
</code></pre>
<p>Vielen Dank,</p>
<p>Immortalis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651241</guid><dc:creator><![CDATA[Immortalis]]></dc:creator><pubDate>Sat, 24 Jan 2009 01:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 09:05:43 GMT]]></title><description><![CDATA[<p>[quote=&quot;Immortalis&quot;]Hallo,</p>
<p>ich möchte ein Array an eine Funktion übergeben, ich bekomme allerdings die folgende Fehlermeldung:</p>
<p>invalid types `float[int]' for array subscript</p>
<p>...und ich weiß nicht warum; da ich ja eigentlich den index vom array als integer definiert habe. Ich kann mir höchstens vorstellen, dass es an der fehlerhaften verwendung (oder nicht-verwendung) von pointern liegt (kann man einer funktion ein array als argument geben?), nen bischen rumprobieren hat mich aber nicht weitergebracht....</p>
<p>Hier mal der entsprechende Code aus meinem Programm:</p>
<pre><code class="language-cpp">float lattice_energy (float lattice[])
</code></pre>
<p>oder das gleiche aber netter</p>
<pre><code class="language-cpp">float lattice_energy (float* lattice)
</code></pre>
<p>und ups, jetzt geht</p>
<pre><code class="language-cpp">int n = sizeof(lattice)/(sizeof(int)*sizeof(int));
</code></pre>
<p>nicht mehr!</p>
<p>also</p>
<pre><code class="language-cpp">float lattice_energy (float* lattice,int n)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1651261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651261</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 24 Jan 2009 09:05:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 09:54:50 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">float lattice_energy (float lattice[])
</code></pre>
<p>oder das gleiche aber netter</p>
<pre><code class="language-cpp">float lattice_energy (float* lattice)
</code></pre>
<p>...</p>
</blockquote>
<p>Übergabe eines Zeigers auf ein eindimensionales Array - ich frag mich was das soll?</p>
<p>Der Threadersteller arbeitet in seiner Funktion mit einem zweidimensionalen Array.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651276</guid><dc:creator><![CDATA[otto8]]></dc:creator><pubDate>Sat, 24 Jan 2009 09:54:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 10:08:56 GMT]]></title><description><![CDATA[<p>Einfacher wäre es doch sicherlich hier mit den STL-Containern zu arbeiten, die kann man auch ohne Probleme an eine Funktion übergeben und brauch sich für den Moment erstmal nicht mit den Zeigern rum quälen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651279</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 24 Jan 2009 10:08:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 10:38:28 GMT]]></title><description><![CDATA[<p>otto8 schrieb:</p>
<blockquote>
<p>Übergabe eines Zeigers auf ein eindimensionales Array - ich frag mich was das soll?</p>
<p>Der Threadersteller arbeitet in seiner Funktion mit einem zweidimensionalen Array.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Das ist genau dasselbe. Du musst lediglich dem Compiler ein wenig arbeit abnehmen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>:<br />
Ich habe ja im anderen Thread gesagt, dass die Frage oft kommt. <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="😉"
    /> ( und ich habe diesen nach dem anderen gelesen. )</p>
<p>Und hier ist auch schon mein Standardlink:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-212469-and-highlight-is-array+2+dimensionales.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-212469-and-highlight-is-array+2+dimensionales.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651286</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 24 Jan 2009 10:38:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 11:01:38 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>otto8 schrieb:</p>
<blockquote>
<p>Übergabe eines Zeigers auf ein eindimensionales Array - ich frag mich was das soll?</p>
<p>Der Threadersteller arbeitet in seiner Funktion mit einem zweidimensionalen Array.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Das ist genau dasselbe. Du musst lediglich dem Compiler ein wenig arbeit abnehmen.</p>
</blockquote>
<p>Du rätst mir innerhalb der Funktion mit reinterpret_cast zu casten, nein danke!<br />
<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/1651291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651291</guid><dc:creator><![CDATA[otto8]]></dc:creator><pubDate>Sat, 24 Jan 2009 11:01:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 11:09:55 GMT]]></title><description><![CDATA[<p>otto8 schrieb:</p>
<blockquote>
<p>Du rätst mir innerhalb der Funktion mit reinterpret_cast zu casten, nein danke!<br />
<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><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Nö, tue ich nicht. Aber ein 2 Dimensionales Array ist eigentlich ein 1 Dimensionales Array, bei welchem die Zeilen und Spalten vom Compiler ausgerechnet werden und so ein 1 dimensionaler Zugriff generiert wird.<br />
Und ob du das jetzt selbst machst, oder nicht spielt überhaupt keine Rolle. (Vor allem brauchst du da keinen cast.. keine Ahung, wie du da drauf kommst..)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651295</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 24 Jan 2009 11:09:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 11:25:00 GMT]]></title><description><![CDATA[<p>otto8 schrieb:</p>
<blockquote>
<p>Der Threadersteller arbeitet in seiner Funktion mit einem zweidimensionalen Array.</p>
</blockquote>
<p>uih, das hab ich übersehen.<br />
dann entweder</p>
<pre><code class="language-cpp">float lattice_energy (float** lattice)
</code></pre>
<p>und er hat glück. nämlich wenn er das array genau so angelegt hat, oder er muß was anderes nehmen.<br />
sowas wie ne klasse Array2D zu benutzen, wäre super.</p>
<p>ich würde gerne sehen, wie das array erzeugt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651307</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 24 Jan 2009 11:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 12:14:57 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>otto8 schrieb:</p>
<blockquote>
<p>Du rätst mir innerhalb der Funktion mit reinterpret_cast zu casten, nein danke!<br />
<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><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Nö, tue ich nicht. Aber ein 2 Dimensionales Array ist eigentlich ein 1 Dimensionales Array, bei welchem die Zeilen und Spalten vom Compiler ausgerechnet werden und so ein 1 dimensionaler Zugriff generiert wird.<br />
Und ob du das jetzt selbst machst, oder nicht spielt überhaupt keine Rolle. (Vor allem brauchst du da keinen cast.. keine Ahung, wie du da drauf kommst..)</p>
</blockquote>
<p>Ich will ein zweidimensionales Array als solches ansprechen können und nicht erst alles auf ein eindimensionales Array<br />
wärend der Laufzeit umrechnen müssen.<br />
Was heisst denn dem Compiler Arbeit abnehmen anderes, als während der Laufzeit Berechnungen durchzuführen, die zur<br />
Compilezeit hätten erledigt werden können. Wenn ein Zeiger auf ein zweidimensionales Array übergeben werden kann,<br />
dann macht man das auch. Übrigens ein reinterpret_cast auf so einen Zeiger ist immernoch besser als Berrechnungen<br />
während der Laufzeit - diese sind nur zumutbar wenn die Dimensionen (speziell der 2. Dim) des Arrays zur Compilezeit<br />
nicht verfügbar sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651342</guid><dc:creator><![CDATA[otto8]]></dc:creator><pubDate>Sat, 24 Jan 2009 12:14:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 12:54:48 GMT]]></title><description><![CDATA[<p>otto8 schrieb:</p>
<blockquote>
<p>Ich will ein zweidimensionales Array als solches ansprechen können und nicht erst alles auf ein eindimensionales Array<br />
wärend der Laufzeit umrechnen müssen.</p>
</blockquote>
<p>Okay, dann der C++ Weg:</p>
<pre><code class="language-cpp">// Fixe Dimensionen (Am Beispiel 4*4 Array):
// [TR1]
#include &lt;array&gt;

typedef std::tr1::array&lt;std::tr1::array&lt;float, 4&gt;, 4&gt; floatarray4_4;
float lattice_energy(floatarray4 const &amp; lattice);

// Variable Dimensionen (Am Beispiel x*y Array):
#include &lt;vector&gt;

typedef std::vector&lt;std::vector&lt;float&gt; &gt; floatarrayXY;
float lattice_energy(floatarrayXY const &amp; lattice);
</code></pre>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651365</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sat, 24 Jan 2009 12:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 13:10:57 GMT]]></title><description><![CDATA[<p>otto8 schrieb:</p>
<blockquote>
<p>Ich will ein zweidimensionales Array als solches ansprechen können und nicht erst alles auf ein eindimensionales Array<br />
wärend der Laufzeit umrechnen müssen.<br />
Was heisst denn dem Compiler Arbeit abnehmen anderes, als während der Laufzeit Berechnungen durchzuführen, die zur<br />
Compilezeit hätten erledigt werden können. Wenn ein Zeiger auf ein zweidimensionales Array übergeben werden kann,<br />
dann macht man das auch. Übrigens ein reinterpret_cast auf so einen Zeiger ist immernoch besser als Berrechnungen<br />
während der Laufzeit - diese sind nur zumutbar wenn die Dimensionen (speziell der 2. Dim) des Arrays zur Compilezeit<br />
nicht verfügbar sind.</p>
</blockquote>
<p>Das ist zur Compile Zeit nicht schon fertig. Zur Laufzeit muss auch jedesmal eine Berechnung gemacht werden. Die Frage ist nur, was Immortalis hat. Ein 2 Dimensionales Array im Sinne von <code>int a[..][..]</code> oder ein 2 dimensionales new-Array.</p>
<p>Wenn du ein Array hast, dass zur Laufzeit bekannt ist, kann man das ja direkt in der Funktion so implementieren (siehe auch den Link, den ich gepostet habe). Aber der Vorteil, wenn du einen Zeiger auf den Anfang übergibst ist halt, dass du dann nicht auf konstante Arrays angewiesen bist und auch ein dynamische angefordertes Array genau gleich behandeln kannst.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void foo (int* a , int l , int b )
{
	for (int x = 0; x &lt; l ; x++ )
	{
		for (int y = 0; y &lt; b ; y++ )
			std::cout &lt;&lt; a[x*b+y];
		std::cout &lt;&lt; &quot;\n&quot;;
	}
}

void init (int* a , int l , int b )
{
	for (int x = 0; x &lt; l ; x++ )
		for (int y = 0; y &lt; b ; y++ )
			a[x*b+y] = y;
}

int main ()
{
	//2 dimensionales new-Array
	int** a = new int*[5];
	for (int x = 0; x &lt; 5; x++ )
		a[x] = new int[10];

	//2 dimensionales Array (ist eigentlich 1 dimensional)
	int b[5][10];

	//eindimensionales Array
	int* c = new int[5*10];

	//initialisierung von a
	for (int x = 0; x &lt; 5; x++ )
		for (int y = 0; y &lt; 10; y++)
			a[x][y] = 2;

	//initialisierung von b und c
	init ( b[0] , 5, 10);
	init ( c , 5 , 10);

	//ausgabe von a
	for (int x = 0; x &lt; 5 ; x++ )
	{
		for (int y = 0; y &lt; 10 ; y++ )
			std::cout &lt;&lt; a[x][y];
		std::cout &lt;&lt; &quot;\n&quot;;
	}

	//ausgabe von b und c
	foo ( b[0] , 5 , 10 );
	foo ( c , 5, 10 );

	//freigeben
	for (int x = 0; x &lt; 5; x++)
		delete[] a[x];
	delete[] a;

	delete[] c;
}
</code></pre>
<p>Hier siehst du, dass a der einzige Fall ist, wo du wirklich [][] brauchst. Bei den anderen beiden Fällen ist das Array immer eindimensional im Speicher abgebildet und kann somit auch so angesprochen werden. Ob du da jetzt [x][y] oder [x*10+y] hast spielt am Ende keine Rolle, da das der Compiler einfach selbst hinschreibt. Berechnet muss der Zeiger auf den int genau gleich. Ausser mit dem Nachteil, dass du dich mit deiner Variante jedem dynamischen Array schon mal verwehrst, was mit der gezeigten Variante nicht ist.</p>
<p>Und siehe da. Kein einziger (expliziter) cast.</p>
<p>EDIT:<br />
Natürlich ist eine Variante, die das ganze wrappt eleganter und sollte vorgezogen werden. Aber für das Verständnis von Arrays ist das imo schon wichtig, dass man da den Unterschied kennt zwischen den Varianten von multidimensionalen Arrays. (und welche eigentlich keine sind).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651373</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 24 Jan 2009 13:10:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 13:46:17 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int main ()
{
	//2 dimensionales new-Array
	int** a = new int*[5];
	for (int x = 0; x &lt; 5; x++ )
		a[x] = new int[10];
</code></pre>
</blockquote>
<p>Hab jetzt nicht voll die Zeit...<br />
aber warum holst Du Dir dieses Array nicht einfach so:</p>
<pre><code class="language-cpp">int(*a)[10] = new int [5][10];
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651406</guid><dc:creator><![CDATA[otto8]]></dc:creator><pubDate>Sat, 24 Jan 2009 13:46:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 13:54:01 GMT]]></title><description><![CDATA[<p>Weils dann nicht voll dynamisch wäre. (du kannst da die Grössen beide zur Laufzeit bestimmen und musst sie nicht schon zur Kompilierzeit bekannt sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651411</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 24 Jan 2009 13:54:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 18:02:04 GMT]]></title><description><![CDATA[<p>Hallo und danke erstmal für die zahlreichen antworten :).</p>
<p>Ich habe das Ganze jetzt mit float** gemacht, dann kommt die entsprechende Fehlermeldung nicht mehr. Dazu habe ich dann noch meine Arraygröße global festgelegt, was zwar nicht schön ist, aber in diesem Falle auch nicht weiter schlimm.</p>
<pre><code class="language-cpp">int n=10;

float create_lattice (int k) {
    float z[k][k];
    for (int y=k-1; y&gt;=0; y--){
        for (int x=k-1; x&gt;=0; x--){
            float random = createrandom12 ();
            if (random &gt;=0.5){
               z[y][x]=1;}
            else {
               z[y][x]=-1;}
            };
        };
    return z[k][k];
}

float lattice_energy (float** lattice) {
      //int n = sizeof(lattice)/(sizeof(int)*sizeof(int));
      float energy=0.;
      for (int i=n-1; i&gt;=0; i--){
        for (int j=n-1; j&gt;=0; j--){
            if ((j==n-1) &amp;&amp; (i==n-1)) {
               energy=energy-lattice[i][j]*lattice[i][0]-lattice[i][j]*lattice[0][j];
               }
            else if (j==n-1) {
               energy=energy-lattice[i][j]*lattice[i][0]-lattice[i][j]*lattice[i+1][j];
               }
            else if (i==n-1) {
               energy=energy-lattice[i][j]*lattice[i][j+1]-lattice[i][j]*lattice[i+1][j];
               }
            else {
               energy=energy-lattice[i][j]*lattice[i][j+1]-lattice[i][j]*lattice[0][j];
               }
        };
      };
      return energy;
}

int main() 
{ 
    float initial_lattice=create_lattice(n);
}
</code></pre>
<p>Wenn ich jetzt aber mit Zeigern arbeite und nicht mit Kopien, wie bei normalen Variablen, bekomme ich ein neues Problem. Was mache ich, wenn ich nicht mein Original modifizieren will, sondern eine Kopie erstellen möchte, die ich modifizieren kann? Gibts dafür irgendeine einfache Lösung?</p>
<pre><code class="language-cpp">float change_lattice (float** lattice){
      float new_lattice = lattice;
      //int n = sizeof(lattice)/(sizeof(int)*sizeof(int));
      for (int y=n-1; y&gt;=0; y--){
        for (int x=n-1; x&gt;=0; x--){
            if (lattice[x][y]==1){
               new_lattice[x][y]==-1;
               float d_energy=lattice_energy (lattice)-lattice_energy (new_lattice);
               if (accept_reject(d_energy)=true)
                  new_lattice=lattice;
               else
                  new_lattice[x][y]=1;
            }
            else {
               new_lattice[x][y]==-1;
               float d_energy=lattice_energy (lattice)-lattice_energy (new_lattice);
               if (accept_reject(d_energy)=true)
                  new_lattice=lattice;
               else
                  new_lattice[x][y]=1;
            }
        };
      };
return new_lattice;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1651605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651605</guid><dc:creator><![CDATA[Immortalis]]></dc:creator><pubDate>Sat, 24 Jan 2009 18:02:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Übergeben von Arrays an Funktionen on Sat, 24 Jan 2009 18:08:24 GMT]]></title><description><![CDATA[<p>create_lattice sollte dir crashen, wenn du das ausführst.. Du greifst da ausserhalb des Speichers zu. (beim return).</p>
<p>Wenn du ein Array kopieren willst, musst du das von Hand machen. Also Objekt erstellen und jedes einzelne Element kopieren. (in einer Schlaufe).</p>
<p>Ich habe allerdings das Gefühl, dass du dir nicht so sicher bist, was du da eigentlich machst.. Und würde dir daher eher zu einem Container der Standardbibliothek raten, wie schon mehrmals vorgeschlagen. Da kannst du das genauso machen, wie du es willst, kannst ohne Mühe kopieren und läufst nicht Gefahr irgendwie den Speicher/Programm zu zerschiessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1651608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1651608</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 24 Jan 2009 18:08:24 GMT</pubDate></item></channel></rss>