<?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[Teil eines mehrdimensionalen Arrays an Funktion übergeben]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte einen Teil eines mehrdimensionalen Arrays an eine Funktion übergeben, die gleichzeitig auch mit statischen Arrays arbeiten soll.<br />
Funktionen, die mit jeweils einer der beiden Aufgabenstellungen klar kommen habe ich, ich bekomme nur beides nicht kombiniert - ich verstehe noch nicht einmal, warum das für den Compiler einen Unterschied macht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Was ich habe:</p>
<pre><code class="language-cpp">void f(int **pix){
	std::cout&lt;&lt;pix[2][3]&lt;&lt;std::endl;
}

void g(int pix[5][5]){
	std::cout&lt;&lt;pix[2][3]&lt;&lt;std::endl;
}

int main(){
	int ***p_pix;
	int pix[5][5];

	p_pix=new int**[5];	
	p_pix[1]=new int*[5];	
	p_pix[1][2]=new int[5];

	p_pix[1][2][3]=23;
	pix[2][3]=45;

	f( p_pix[1]);
//	f(  pix  );     ergibt Fehlermeldung 1

	g(  pix  );
//	g( p_pix[1]);   ergibt Fehlermeldung 2

	delete[] p_pix[1][2];
	delete[] p_pix[1];
	delete[] p_pix;
	return 0;
}
</code></pre>
<pre><code>Fehlermeldung 1:
test_dynarray_an_fkt.cpp: In function ‘int main()’:
test_dynarray_an_fkt.cpp:23: error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void f(int**)’

Fehlermeldung 2:
test_dynarray_an_fkt.cpp: In function ‘int main()’:
test_dynarray_an_fkt.cpp:26: error: cannot convert ‘int**’ to ‘int (*)[5]’ for argument ‘1’ to ‘void g(int (*)[5])’
</code></pre>
<p>Ideen für Workarounds habe ich auch (die Verwendung der beiden Funktionen, der Verzicht auf statische Arrays zugunsten von nur dynamischen Arrays, ...).<br />
Ich frage hier nur, weil ich gerne verstehen würde, warum der Compiler nicht von 'int**' zu 'int (*)[5]' konvertieren kann.</p>
<p>Vielen Dank schon mal</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/256044/teil-eines-mehrdimensionalen-arrays-an-funktion-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 18:12:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256044.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Dec 2009 15:54:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Teil eines mehrdimensionalen Arrays an Funktion übergeben on Mon, 07 Dec 2009 15:54:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte einen Teil eines mehrdimensionalen Arrays an eine Funktion übergeben, die gleichzeitig auch mit statischen Arrays arbeiten soll.<br />
Funktionen, die mit jeweils einer der beiden Aufgabenstellungen klar kommen habe ich, ich bekomme nur beides nicht kombiniert - ich verstehe noch nicht einmal, warum das für den Compiler einen Unterschied macht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Was ich habe:</p>
<pre><code class="language-cpp">void f(int **pix){
	std::cout&lt;&lt;pix[2][3]&lt;&lt;std::endl;
}

void g(int pix[5][5]){
	std::cout&lt;&lt;pix[2][3]&lt;&lt;std::endl;
}

int main(){
	int ***p_pix;
	int pix[5][5];

	p_pix=new int**[5];	
	p_pix[1]=new int*[5];	
	p_pix[1][2]=new int[5];

	p_pix[1][2][3]=23;
	pix[2][3]=45;

	f( p_pix[1]);
//	f(  pix  );     ergibt Fehlermeldung 1

	g(  pix  );
//	g( p_pix[1]);   ergibt Fehlermeldung 2

	delete[] p_pix[1][2];
	delete[] p_pix[1];
	delete[] p_pix;
	return 0;
}
</code></pre>
<pre><code>Fehlermeldung 1:
test_dynarray_an_fkt.cpp: In function ‘int main()’:
test_dynarray_an_fkt.cpp:23: error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void f(int**)’

Fehlermeldung 2:
test_dynarray_an_fkt.cpp: In function ‘int main()’:
test_dynarray_an_fkt.cpp:26: error: cannot convert ‘int**’ to ‘int (*)[5]’ for argument ‘1’ to ‘void g(int (*)[5])’
</code></pre>
<p>Ideen für Workarounds habe ich auch (die Verwendung der beiden Funktionen, der Verzicht auf statische Arrays zugunsten von nur dynamischen Arrays, ...).<br />
Ich frage hier nur, weil ich gerne verstehen würde, warum der Compiler nicht von 'int**' zu 'int (*)[5]' konvertieren kann.</p>
<p>Vielen Dank schon mal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819098</guid><dc:creator><![CDATA[dynArray]]></dc:creator><pubDate>Mon, 07 Dec 2009 15:54:15 GMT</pubDate></item><item><title><![CDATA[Reply to Teil eines mehrdimensionalen Arrays an Funktion übergeben on Mon, 07 Dec 2009 16:49:55 GMT]]></title><description><![CDATA[<p>dynArray schrieb:</p>
<blockquote>
<p>Ich frage hier nur, weil ich gerne verstehen würde, warum der Compiler nicht von 'int**' zu 'int (*)[5]' konvertieren kann.</p>
</blockquote>
<p>Das liegt daran, dass es sich hier um sehr verschiedene Dinge handelt.</p>
<p>Auf der rechten Seite hast du ein klassisches int-Array. Alle Elemente sind hintereinander im Speicher abgelegt. Ob es jetzt ein-, zwei- oder mehrdimensional ist, ist völlig egal. Wichtig ist, das alles am Stück ist, so dass man Pointerarithmetik machen kann.</p>
<p>Das auf der Linken sind Zeiger auf Zeiger auf int. Die konkreten int-Daten können überall im Speicher verteilt sein. Wenn du jetzt darauf Pointerarithmetik versuchen würdest (nichts anderes ist ja ein Arrayzugriff), dann geht das total schief. Deshalb lässt der Compiler das auch nicht zu.</p>
<p>Verstanden oder soll ich mich im Bildchenmalen bemühen?</p>
<p>einfache Abhilfe: Arbeite mit std::vector oder einer anderen Containerklasse.</p>
<p>etwas schwierigere Abhilfe, deren genaue Syntax ich mir jetzt nicht überlegen will: p_pix muss halt auf richtige Arrays zeigen, nicht bloß auf weitere Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819120</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 07 Dec 2009 16:49:55 GMT</pubDate></item><item><title><![CDATA[Reply to Teil eines mehrdimensionalen Arrays an Funktion übergeben on Mon, 07 Dec 2009 18:17:28 GMT]]></title><description><![CDATA[<p>theoretisch sollte auch das funktionieren (nicht getestet):</p>
<pre><code class="language-cpp">template &lt;typename ArrayTape&gt;
void f(const ArrayType&amp; pix){
    std::cout &lt;&lt; pix[2][3] &lt;&lt; std::endl;
}
</code></pre>
<p>diese Variante sollte dann<br />
int**, int [...][...] und auch vector&lt;vector&lt;int&gt; &gt; zulassen...</p>
<p>EDIT: ein Beispiel (getestet und funktioniert :D)</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

using namespace std;

template &lt;typename ArrayType&gt;
void print_array_val(const ArrayType&amp; the_array, int x, int y)
{
	cout &lt;&lt; the_array[x][y] &lt;&lt; endl;
}

int main(int argc, char** argv)
{
	vector&lt;vector&lt;int&gt; &gt; data;
	for (int n = 0; n &lt; 10; ++n)
	{
		vector&lt;int&gt; inner_data;
		for (int m = 0; m &lt; 10; ++m)
			inner_data.push_back(n * m);
		data.push_back(inner_data);
	}

	print_array_val(data, 5, 5);

	int arr[5][5];
	for (int n = 0; n &lt; 25; ++n)
		arr[n / 5][n % 5] = n;

	print_array_val(arr, 3, 2);

	int** dynarray = new int* [5];
	for (int n = 0; n &lt; 5; ++n)
	{
		dynarray[n] = new int[5];
		for (int m = 0; m &lt; 5; ++m)
			dynarray[n][m] = n + m;
	}

	print_array_val(dynarray, 2, 3);

	for (int n = 0; n &lt; 5; ++n)
		delete[] dynarray[n];
	delete[] dynarray;

	cin.get();

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1819157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819157</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Mon, 07 Dec 2009 18:17:28 GMT</pubDate></item><item><title><![CDATA[Reply to Teil eines mehrdimensionalen Arrays an Funktion übergeben on Mon, 07 Dec 2009 18:12:26 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-249196-and-view-is-previous.html" rel="nofollow">Hier</a> hatte ich schonmal viel erklärt und sogar ein Bildchen gemalt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1819162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1819162</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 07 Dec 2009 18:12:26 GMT</pubDate></item></channel></rss>