<?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[Unterschied bei Zugriff auf C-Array]]></title><description><![CDATA[<p>Ich habe gerade eine Funktion vor mir die absichtlich auf ein 2D Array anstatt mit<br />
A[x][y] mit A[x*N+y] zugreift.</p>
<p>Hat das in irgendeiner Hinsicht Vorteile, z.B. bzgl der Geschwindigkeit ?</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/181120/unterschied-bei-zugriff-auf-c-array</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 04:02:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/181120.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 May 2007 07:08:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 07:08:02 GMT]]></title><description><![CDATA[<p>Ich habe gerade eine Funktion vor mir die absichtlich auf ein 2D Array anstatt mit<br />
A[x][y] mit A[x*N+y] zugreift.</p>
<p>Hat das in irgendeiner Hinsicht Vorteile, z.B. bzgl der Geschwindigkeit ?</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282106</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Thu, 10 May 2007 07:08:02 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 07:26:24 GMT]]></title><description><![CDATA[<p>Der Vorteil liegt vor allem in der Dynamik - Wenn du das 2D-Array als eindimensionales Array modellierst und die Indizes selber umrechnest, kannst du die Breite (N) zur Laufzeit bestimmen. Bei &quot;echten&quot; 2D-Arrays muß sie bereits zur Compilezeit feststehen (oder du benutzt Doppelzeiger, aber damit benötigst du eine zusätzliche Indirektionsebene).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282114</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 10 May 2007 07:26:24 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 07:33:04 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Der Vorteil liegt vor allem in der Dynamik - Wenn du das 2D-Array als eindimensionales Array modellierst und die Indizes selber umrechnest, kannst du die Breite (N) zur Laufzeit bestimmen.</p>
</blockquote>
<p>Das war nicht ganz meine Frage. Die Arrays sind entweder als 1D oder 2D definiert worden und werden an die Funktion als Pointer übergeben. Wie sie definiert sind spielt daher keine Rolle.</p>
<p>Ich habe mich nur gefragt ob es z.B. von der Geschwindigkeit her Sinn macht auf ein 2D Array wie auf ein 1D Array zuzugreifen über A[x*N+y].<br />
Ich habe nämlich eine Funktion die das tut und dadurch schlecht zu lesen ist.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282118</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Thu, 10 May 2007 07:33:04 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 07:44:09 GMT]]></title><description><![CDATA[<p>pospiech schrieb:</p>
<blockquote>
<p>Ich habe mich nur gefragt ob es z.B. von der Geschwindigkeit her Sinn macht auf ein 2D Array wie auf ein 1D Array zuzugreifen über A[x*N+y].</p>
</blockquote>
<p>ich glaube nicht. auch wenn du A[x][y] schreibst, wird's intern als A[x*N+y] behandelt. im normalfall ist der speicher ja sowieso eindimensional...<br />
<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/1282127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282127</guid><dc:creator><![CDATA[pale dog]]></dc:creator><pubDate>Thu, 10 May 2007 07:44:09 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 07:58:19 GMT]]></title><description><![CDATA[<p>Doch, es kommt darauf an, wie das Array definiert ist.</p>
<p>Wenn es ein <strong>echt</strong> zweidimensionales Array ist, ist der Aufruf A[x*N+y] illegal (bzw. ergibt einen Zeiger, der vermutlich außerhalb der Array-Grenzen liegt) - der kann höchstens noch mit geeigneten Casts erträglich gemacht werden (aber sowas liegt dann an der Grenze des portierbaren).</p>
<p>Wenn du ein 1D-Feld umdeutest als 2D-Array, funktioniert der Aufruf A[x][y] nicht (es sei denn, du hast irgendwelche Proxie-Objekte dazwischengeschoben, die den Aufruf möglich machen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282134</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 10 May 2007 07:58:19 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 08:10:17 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Doch, es kommt darauf an, wie das Array definiert ist.</p>
<p>Wenn es ein <strong>echt</strong> zweidimensionales Array ist, ist der Aufruf A[x*N+y] illegal (bzw. ergibt einen Zeiger, der vermutlich außerhalb der Array-Grenzen liegt) - der kann höchstens noch mit geeigneten Casts erträglich gemacht werden (aber sowas liegt dann an der Grenze des portierbaren).</p>
</blockquote>
<p>Also eine der Funktionen von denen ich rede sieht wie folgt aus (nicht von mir):</p>
<pre><code class="language-cpp">void Shift2D(double *A,long N)  
// A muss als double A[N][N] deklariert worden sein!!!
//  A[x][y] = A[x*N+y]    A[0][0]  ...  A[N][0]
//                          ...           ...
//                        A[0][N]  ...  A[N][N]
{
double swap;						
long ix,iy;							

	for (ix=0;ix&lt;N;ix++)	Cycle(A+ix*N,N);	// Spalten shiften 
	for (iy=0;iy&lt;N;iy++)	// Zeilen einzeln shiften
		for (ix=0;ix&lt;N/2;ix++)
		{
			swap=A[(ix+N/2)*N+iy];
			A[(ix+N/2)*N+iy]=A[ix*N+iy];
			A[ix*N+iy]=swap;
		}
}
</code></pre>
<p>und dort wird auf ein 2D Array nur mit A[ix*N+iy] zugegriffen.</p>
<p>Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282147</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Thu, 10 May 2007 08:10:17 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 08:11:26 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Wenn es ein <strong>echt</strong> zweidimensionales Array ist, ist der Aufruf A[x*N+y] illegal...</p>
</blockquote>
<p>seltsam, das hier scheint zu klappen:</p>
<pre><code>int main()
{
   int a[2][2];
   int *p = (int*)a;

   a[0][0] = 1;
   a[0][1] = 2;
   a[1][0] = 3;
   a[1][1] = 4;

   printf (&quot;%d %d %d %d\n&quot;, p[2*0+0], p[2*1+0], p[2*0+1], p[2*1+1]);   
   printf (&quot;%d %d %d %d\n&quot;, *p, *p+1, *p+2, *p+3);   
}
</code></pre>
<p>oder ist das 'undefined behaviour'?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282149</guid><dc:creator><![CDATA[pale dog]]></dc:creator><pubDate>Thu, 10 May 2007 08:11:26 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 08:47:30 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14053">@pospiech</a>: Die Funktion nutzt ein lineares Array, das es zweidimensional betrachtet. Das heißt, da ist diese Koordinatenumstellung notwendig.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/34745">@pale</a> dog: Ja, das ist undefiniertes Verhalten (und funktioniert auch nur, weil printf() keine Typkontrolle für seine Parameter durchführt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282185</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 10 May 2007 08:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 08:54:26 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/34745">@pale</a> dog: Ja, das ist undefiniertes Verhalten (und funktioniert auch nur, weil printf() keine Typkontrolle für seine Parameter durchführt).</p>
</blockquote>
<p>wieso printf <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 />
oben wird die adresse des 2d-arrays einem einfachen int* übergeben damit man's linear auslesen kann.<br />
ich wollte eigentlich wissen ob man auf 2d-arrays immer eindimensional zugreifen kann, oder ob jeder compiler die arrayelemente anordnen kann wie er will (so dass es nicht mehr funktioniert).<br />
<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/1282191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282191</guid><dc:creator><![CDATA[pale dog]]></dc:creator><pubDate>Thu, 10 May 2007 08:54:26 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 08:54:56 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14053">@pospiech</a>: Die Funktion nutzt ein lineares Array, das es zweidimensional betrachtet. Das heißt, da ist diese Koordinatenumstellung notwendig.</p>
</blockquote>
<p>Das heißt ich übergebe ein 2D Array an eine Funktion die ein 1D Array erwartet, was offensichtlich funktioniert, und dann arbeite ich mit dem 1D Array als wäre es 2-dimensional ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282193</guid><dc:creator><![CDATA[pospiech]]></dc:creator><pubDate>Thu, 10 May 2007 08:54:56 GMT</pubDate></item><item><title><![CDATA[Reply to Unterschied bei Zugriff auf C-Array on Thu, 10 May 2007 09:07:01 GMT]]></title><description><![CDATA[<p>Also wenn der Compiler es tatsächlich schluckt, daß du der Funktion ein 'double A[N][N]' übergibst, würde ich mich schon sehr wundern. Meiner wirft mir da einen C2664 entgegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1282202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1282202</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 10 May 2007 09:07:01 GMT</pubDate></item></channel></rss>