<?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[2D-Array an Konstruktor übergeben]]></title><description><![CDATA[<p>Ich kriege von meinem Compiler folgende Fehlermeldung:</p>
<pre><code>1&gt;d:\main.cpp(10): error C2664: 'CSkin::CSkin(const char **,const short **,int,int)': Konvertierung des Parameters 1 von 'const char [2][2]' in 'const char **' nicht möglich
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;main.h&quot;
#include &quot;Skin.h&quot;

using namespace std;

const char mySkin[2][2] = {{'a', 'b'},{'c', 'd'}};
const char myColor[2][2] = {{NULL, NULL}, {NULL,NULL}};

int main(int argc, char *argv[]) {
	CSkin newSkin(mySkin, myColor, 2, 2);
	return 0;
}
</code></pre>
<p>Skin.h</p>
<pre><code class="language-cpp">#pragma once

#include &quot;main.h&quot;

using namespace std;

class CSkin
{
public:
	CSkin(const char **cSkinArray, const short **wColorArray, int iWidthArray, int iHeightArray); //die Elemente aus dem Array werden in die Vektoren kopiert ===&gt; kein Zugriff von aussen auf den Skin möglich
	~CSkin(void);
private:
	int iWidth, iHeight; //höhe und breite der bitmap
	vector&lt;vector&lt;char&gt;&gt; cSkin; //2D-array für die zeichen
	vector&lt;vector&lt;short&gt;&gt; wColor; //2D-Array für Farben
};
</code></pre>
<p>Skin.cpp</p>
<pre><code class="language-cpp">#include &quot;Skin.h&quot;

using namespace std;
CSkin::CSkin(const char **cSkinArray, const short **wColorArray, int iWidthArray, int iHeightArray) //cSkinArray und wColorArray müssen die gleiche Grösse haben
{
	vector&lt;vector&lt;char&gt;&gt;::iterator itSkin;
	vector&lt;vector&lt;short&gt;&gt;::iterator itColor;
	//================================================&gt;
	//Elemente initialisieren
	this-&gt;iWidth = iWidthArray;
	this-&gt;iHeight = iHeightArray;
	//cSkinArray kopieren
	cSkin.resize(iWidthArray);
	itSkin = cSkin.begin();
	for (int x=0;x&lt;iWidthArray;x++) {
		for (int y=0;y&lt;iHeightArray;y++) {
			itSkin-&gt;resize(iHeightArray);
			itSkin-&gt;operator[](y) = cSkinArray[x][y];
		}
		itSkin++; //nächstes Element
	}
	//========&gt;Debug ausgabe von cSkin
#ifdef DEBUG
	cout &lt;&lt; &quot;DEBUG @ CSkin(): Inhalt von cSkin&quot; &lt;&lt; endl;
	for (vector&lt;vector&lt;char&gt;&gt;::iterator it1=cSkin.begin();it1!=cSkin.end();it1++) {
		for (vector&lt;char&gt;::iterator it2=it1-&gt;begin();it2!=it1-&gt;end();it2++) {
			cout &lt;&lt; '[' &lt;&lt; it1 - cSkin.begin() &lt;&lt; '|' &lt;&lt; it2 - it1-&gt;begin() &lt;&lt; ']' &lt;&lt; '=' &lt;&lt; *it2 &lt;&lt; endl;
		}
	}
#endif
	//wColorArray kopieren
	wColor.resize(iWidthArray);
	itColor = wColor.begin();
	for (int x=0;x&lt;iWidthArray;x++) {
		for (int y=0;y&lt;iHeightArray;y++) {
			itColor-&gt;resize(iHeightArray);
			itColor-&gt;operator[](y) = wColorArray[x][y];
		}
		itColor++; //nächstes Element
	}  
}

CSkin::~CSkin(void)
{
}
</code></pre>
<p>Falls es jemanden interessiert: Das soll eine Klasse für ein Konsolenspiel werden.</p>
<p>Irgendwie verstehe ich nicht, wie ich 2-dimensionale Arrays an Funktionen übergeben kann. Das mit dem Doppelpointer scheint ja irgendwie nicht zu funktionieren... Falls ich einfach nur 2 leere Klammern angebe, will er von mir logischerweise immer die Grösse der zweiten Dimension als Konstante haben.<br />
Durch ein paar schön anzusehende Casts habe ich es schon geschafft das Problem zu lösen, aber so wirklich gefallen tut mir die Lösung nicht:</p>
<pre><code class="language-cpp">itSkin-&gt;operator[](y) = *(cSkinArray+y*iHeight+x);
</code></pre>
<p>Kann mir jemand sagen, wie man dies &quot;professionell&quot; löst?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305499/2d-array-an-konstruktor-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 14:35:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305499.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Jun 2012 17:40:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 2D-Array an Konstruktor übergeben on Sat, 30 Jun 2012 17:40:18 GMT]]></title><description><![CDATA[<p>Ich kriege von meinem Compiler folgende Fehlermeldung:</p>
<pre><code>1&gt;d:\main.cpp(10): error C2664: 'CSkin::CSkin(const char **,const short **,int,int)': Konvertierung des Parameters 1 von 'const char [2][2]' in 'const char **' nicht möglich
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;main.h&quot;
#include &quot;Skin.h&quot;

using namespace std;

const char mySkin[2][2] = {{'a', 'b'},{'c', 'd'}};
const char myColor[2][2] = {{NULL, NULL}, {NULL,NULL}};

int main(int argc, char *argv[]) {
	CSkin newSkin(mySkin, myColor, 2, 2);
	return 0;
}
</code></pre>
<p>Skin.h</p>
<pre><code class="language-cpp">#pragma once

#include &quot;main.h&quot;

using namespace std;

class CSkin
{
public:
	CSkin(const char **cSkinArray, const short **wColorArray, int iWidthArray, int iHeightArray); //die Elemente aus dem Array werden in die Vektoren kopiert ===&gt; kein Zugriff von aussen auf den Skin möglich
	~CSkin(void);
private:
	int iWidth, iHeight; //höhe und breite der bitmap
	vector&lt;vector&lt;char&gt;&gt; cSkin; //2D-array für die zeichen
	vector&lt;vector&lt;short&gt;&gt; wColor; //2D-Array für Farben
};
</code></pre>
<p>Skin.cpp</p>
<pre><code class="language-cpp">#include &quot;Skin.h&quot;

using namespace std;
CSkin::CSkin(const char **cSkinArray, const short **wColorArray, int iWidthArray, int iHeightArray) //cSkinArray und wColorArray müssen die gleiche Grösse haben
{
	vector&lt;vector&lt;char&gt;&gt;::iterator itSkin;
	vector&lt;vector&lt;short&gt;&gt;::iterator itColor;
	//================================================&gt;
	//Elemente initialisieren
	this-&gt;iWidth = iWidthArray;
	this-&gt;iHeight = iHeightArray;
	//cSkinArray kopieren
	cSkin.resize(iWidthArray);
	itSkin = cSkin.begin();
	for (int x=0;x&lt;iWidthArray;x++) {
		for (int y=0;y&lt;iHeightArray;y++) {
			itSkin-&gt;resize(iHeightArray);
			itSkin-&gt;operator[](y) = cSkinArray[x][y];
		}
		itSkin++; //nächstes Element
	}
	//========&gt;Debug ausgabe von cSkin
#ifdef DEBUG
	cout &lt;&lt; &quot;DEBUG @ CSkin(): Inhalt von cSkin&quot; &lt;&lt; endl;
	for (vector&lt;vector&lt;char&gt;&gt;::iterator it1=cSkin.begin();it1!=cSkin.end();it1++) {
		for (vector&lt;char&gt;::iterator it2=it1-&gt;begin();it2!=it1-&gt;end();it2++) {
			cout &lt;&lt; '[' &lt;&lt; it1 - cSkin.begin() &lt;&lt; '|' &lt;&lt; it2 - it1-&gt;begin() &lt;&lt; ']' &lt;&lt; '=' &lt;&lt; *it2 &lt;&lt; endl;
		}
	}
#endif
	//wColorArray kopieren
	wColor.resize(iWidthArray);
	itColor = wColor.begin();
	for (int x=0;x&lt;iWidthArray;x++) {
		for (int y=0;y&lt;iHeightArray;y++) {
			itColor-&gt;resize(iHeightArray);
			itColor-&gt;operator[](y) = wColorArray[x][y];
		}
		itColor++; //nächstes Element
	}  
}

CSkin::~CSkin(void)
{
}
</code></pre>
<p>Falls es jemanden interessiert: Das soll eine Klasse für ein Konsolenspiel werden.</p>
<p>Irgendwie verstehe ich nicht, wie ich 2-dimensionale Arrays an Funktionen übergeben kann. Das mit dem Doppelpointer scheint ja irgendwie nicht zu funktionieren... Falls ich einfach nur 2 leere Klammern angebe, will er von mir logischerweise immer die Grösse der zweiten Dimension als Konstante haben.<br />
Durch ein paar schön anzusehende Casts habe ich es schon geschafft das Problem zu lösen, aber so wirklich gefallen tut mir die Lösung nicht:</p>
<pre><code class="language-cpp">itSkin-&gt;operator[](y) = *(cSkinArray+y*iHeight+x);
</code></pre>
<p>Kann mir jemand sagen, wie man dies &quot;professionell&quot; löst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228746</guid><dc:creator><![CDATA[Buchleser1.1]]></dc:creator><pubDate>Sat, 30 Jun 2012 17:40:18 GMT</pubDate></item><item><title><![CDATA[Reply to 2D-Array an Konstruktor übergeben on Sat, 30 Jun 2012 17:57:26 GMT]]></title><description><![CDATA[<p>Ok, ein Fehler ist schon mal eliminiert. Aber trotzdem funktioniert das noch nicht.</p>
<pre><code class="language-cpp">const char myColor[2][2] = {{NULL, NULL}, {NULL,NULL}}; //falscher Datentyp gewesen
</code></pre>
<p>Ich kriege aber immer noch die selbe Fehlermeldung <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2228754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228754</guid><dc:creator><![CDATA[Buchleser1.1]]></dc:creator><pubDate>Sat, 30 Jun 2012 17:57:26 GMT</pubDate></item><item><title><![CDATA[Reply to 2D-Array an Konstruktor übergeben on Sun, 01 Jul 2012 21:35:52 GMT]]></title><description><![CDATA[<p>Wenn du mySkin und myColor als Parameter übergibst, zerfallen sie in Pointer auf const char-Array.</p>
<p>Der Konstruktor müsste dann so aussehen:</p>
<pre><code class="language-cpp">CSkin(const char (*cSkinArray)[2], const short (*wColorArray)[2], int iWidthArray, int iHeightArray);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2229072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229072</guid><dc:creator><![CDATA[einszweidrei]]></dc:creator><pubDate>Sun, 01 Jul 2012 21:35:52 GMT</pubDate></item><item><title><![CDATA[Reply to 2D-Array an Konstruktor übergeben on Mon, 02 Jul 2012 11:36:07 GMT]]></title><description><![CDATA[<p>Bitte nicht C++ und C mischen, schau dir STL-Container an (nochmal). Zwei-Dimensionale Arrays kann man genauso gut mit bspw. <code>std::vector</code> erstellen:</p>
<pre><code class="language-cpp">std::vector&lt; std::vector&lt; char &gt; &gt;
</code></pre>
<p>Dann bitte auch den Link in meiner Signatur anklicken. Bitte nicht einen Haufen Code hier rein kopieren, wo nur einige Zeilen wichtig sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229078</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 02 Jul 2012 11:36:07 GMT</pubDate></item><item><title><![CDATA[Reply to 2D-Array an Konstruktor übergeben on Mon, 02 Jul 2012 11:30:22 GMT]]></title><description><![CDATA[<blockquote>
<p>Bitte nicht C++ und C mischen, schau dir STL-Container an (nochmal). Zwei-Dimensionale Arrays kann man genauso gut mit bspw. std::vector erstellen:</p>
</blockquote>
<p>wtf? Die Arrays haben eine konstante Grösse und werden nicht verändert. Die 2D-Arrays enthalten eine Art Bitmap. Diese wird der Klasse CSkin übergeben, welche sie dann einliest und verändern kann. Der Witz an der Idee ist, dass ich die Bitmaps bequem in der CPP-Datei anhand der 2D-Arrays in einer zeile definieren kann. Bei Vektoren könnte ich das nicht so einfach. Afaik müsste ich jedes Element einzeln zuweisen.</p>
<p>@einszweidrei<br />
Die Grösse der zweiten Dimension ist nicht konstant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229183</guid><dc:creator><![CDATA[Buchleser1.1]]></dc:creator><pubDate>Mon, 02 Jul 2012 11:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to 2D-Array an Konstruktor übergeben on Mon, 02 Jul 2012 11:44:07 GMT]]></title><description><![CDATA[<p>Dann nimm ein <code>std::array</code> . Oder kombiniere <code>std::array</code> und <code>std::vector</code> . Kreativität ist gefragt <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>Außerdem geht auch mit <code>std::vector/std::array</code> folgendes (C++11):</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; a = {1, 2, 2, ...};
</code></pre>
<p>Oder, du nutzt einen Konstruktor (nicht C++11 nötig):</p>
<pre><code class="language-cpp">int a[] = {1, 2, 3, 5, ...};

std::vector&lt;int&gt; myvec(a, a + sizeof(a) / sizeof(*a) );
</code></pre>
<p>Die gezeigten Beispiele funktionieren für jeden STL-Container.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2229188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229188</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 02 Jul 2012 11:44:07 GMT</pubDate></item><item><title><![CDATA[Reply to 2D-Array an Konstruktor übergeben on Mon, 02 Jul 2012 12:59:20 GMT]]></title><description><![CDATA[<p>Joa, danke. Ich denke das war die Lösung. Ich probiere das gleich aus <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/2229224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2229224</guid><dc:creator><![CDATA[Buchleser1.1]]></dc:creator><pubDate>Mon, 02 Jul 2012 12:59:20 GMT</pubDate></item><item><title><![CDATA[Reply to 2D-Array an Konstruktor übergeben on Wed, 04 Jul 2012 12:23:57 GMT]]></title><description><![CDATA[<p>Buchleser1.1 schrieb:</p>
<blockquote>
<p>...</p>
<pre><code>Konvertierung des Parameters 1 von 'const char [2][2]' in 'const char **' nicht möglich
</code></pre>
<p>...<br />
Irgendwie verstehe ich nicht, wie ich 2-dimensionale Arrays an Funktionen übergeben kann. Das mit dem Doppelpointer scheint ja irgendwie nicht zu funktionieren... Falls ich einfach nur 2 leere Klammern angebe, will er von mir logischerweise immer die Grösse der zweiten Dimension als Konstante haben.</p>
</blockquote>
<p>Dann hast du nicht verstanden, wie C-Arrays funktionieren. Wie kommst du darauf, dass das mit dem Doppelzeiger funktionieren sollte?</p>
<pre><code class="language-cpp">char a[2][3] = {{'1','2','3'},{'A','B','C'}};
</code></pre>
<p>hat folgendes Speicherlayout:</p>
<pre><code>Adresse:     314       315       316       317       318       319
         +---------+---------+---------+---------+---------+---------+
Inhalt:  |   '1'   |   '2'   |   '3'   |   'A'   |   'B'   |   'C'   |
         +---------+---------+---------+---------+---------+---------+

         | a[0][0] | a[0][1] | a[0][2] | a[1][0] | a[1][1] | a[1][2] |
Namen:   |----------- a[0] ------------|----------- a[1] ------------|
         |---------------------------- a ----------------------------|
</code></pre>
<p>Beachte: Hier taucht nirgens ein Zeiger im Speicher auf. Deswegen kann du hier auch nicht auf einen Zeiger zeigen. <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="😉"
    /> Du kannst natürlich noch ein Zeiger-Array bauen:</p>
<pre><code class="language-cpp">char *z[2] = {a[0],a[1]};
</code></pre>
<p>Das sieht dann so aus:</p>
<pre><code>Adresse:     320       321
         +---------+---------+
Inhalt:  |   314   |   317   |
         +---------+---------+

Namen:   |-- z[0] -|-- z[0] -|
         |-------- z --------|
</code></pre>
<p>und das könntest du einer Funktion übergeben:</p>
<pre><code class="language-cpp">void foo(char** zz)
{
  assert(z[0][0] == '1');
  assert(z[1][2] == 'C');
}

   ...
   foo(z);
   ...
</code></pre>
<p>wobei der Funktionsparameter zz dann den die Adresse 320 speichern würde.</p>
<p>Der springende Punkt ist: Ein Array <strong>ist kein</strong> Zeiger. Du kannst aber einen Array-Ausdruck vom Typ T[N] an einer Stelle verwenden, wo du einen Ausdruck vom Typ T* brauchst. Da wird dann automatisch die Adresse des ersten Array-Elements eingesetzt. Das klappt aber logischerweise <strong>nur auf der ersten Ebene</strong>. Beachte, dass <code>a[b]</code> äquivalent zu <code>*(a+b)</code> ist, falls a nicht von einem benutzerdefinierten Typ ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2230006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2230006</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 04 Jul 2012 12:23:57 GMT</pubDate></item></channel></rss>