<?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[Pointer auf mehrdimensionalen Array]]></title><description><![CDATA[<p>Ich weiß, dass es eine ähnliche Fragestellung schon gibt. Die habe ich mir angesehen, aber bin daraus leider nicht schlauer geworden.</p>
<p>Ich programmiere gerade Snake mit Klassen.<br />
Mein Feld dafür steht, meine Wand und mein Kopf auch und die Ausgabe dafür funktioniert auch so weit.</p>
<p>Jetzt gilt es diesen Kopf zu bewegen,wenn eine Taste gedrückt wird, sprich dann den Kopf auf ein neues Feld zu setzen.<br />
Die Header-Datei für mein Spiel sieht folgendermaßen aus:</p>
<pre><code>class Spiel
{
private:
	Feld* f[60][60]; //Zeiger auf Feldobjekte, logisch
	View* v;
	Wand* w;
	Kopf* k;
	int refreshRate;
	bool running;
	bool goLeft;
	bool goRight;
	bool goDown;
	bool goUp;
public:
	Spiel(); //stellt Wände und Kopf korrekt auf
	~Spiel(); //löscht wieder alles
	int getKeyboardInput();
	void gameLoop(); //Spieleschleife
	void bewegeKopf();
	void show();
};
</code></pre>
<pre><code>void Spiel::bewegeKopf()
	{
		int x = k-&gt;getKopfx();
		int y = k-&gt;getKopfy();
		int keyIn = getKeyboardInput();
		if(keyIn != 0) // Es wurde eine Taste gedrückt
	{
		switch(keyIn)
		{
		case 27: // [ESC]
			running = false;
			break;
		case 224: // Special key
		int keyIn2= getKeyboardInput(); // Wenn es eine Spezialtaste ist, den zweiten Code holen
		switch(keyIn2)
			{
			case 75:  // [&lt;-] 
					y = y--;
					k-&gt;setFeld(x,y); //!!!!!!!!!//
					goLeft = true;	
					goRight = false;
					goUp = false;
					goDown = false;
				// Stein bewegen...
				break;
			case 77: // [-&gt;]
					y = y++;
					k-&gt;setFeld(x,y); //!!!!!!!!!//
					goRight = true;
					goLeft = false;
					goUp = false;
					goDown = false;
				// Stein bewegen...
				break;
			case 80: // [ v ]
					x = x++;
					k-&gt;setFeld(x,y); //!!!!!!!!//
					goDown = true;
					goLeft = false;
					goUp = false;
					goRight = false;
				// Stein bewegen...
				break;
			case 72: y = y--;// [ ^ ]
					k-&gt;setFeld(x,y); //!!!!!!!!!!//
					goUp = true;
					goDown = false;
					goLeft = false;
					goRight = false;
					break;
			}
				break;
		}
	}
	}
</code></pre>
<p>An den Stellen 19, 28, 37 und 45 rufe ich meine Methode setFeld(int x, int y) auf, die in der Kopf-Klasse steht. Die Header-Datei wie folgt:</p>
<pre><code>class Kopf
{
private:
	Feld* f;
	Kopf* k;
	char zeichen;

public:
	Kopf(Feld*, char);
	~Kopf();
	void setFeld(int x, int y);
	int getKopfx();
	int getKopfy();
	void setZeichen (char);
	Feld* getFeld();
	char getZeichen();
	void show (View* v); //zeichnet zeichen auf View v an der angegebenen Feldposition
};
</code></pre>
<p>setFeld sieht folgendermaßen aus:</p>
<pre><code>void Kopf::setFeld(int x, int y)
	{
	f[x][y]-&gt;setKopf(k);
	}
</code></pre>
<p>Genau bei dieser Methode liegt jetzt mein Problem. Ich arbeite mit Visual-Studio.<br />
Folgende Fehlermeldung ist an der eckigen Klammerauf von [y] zu sehen:<br />
--&gt; Kein &quot;[]&quot;-Operator stimmt mit diesen Operanden überein. Operandentypen sind Feld [int]</p>
<p>Man sagte mir, das Problem wäre, dass der Array &quot;dumm&quot; ist und nicht weiß, dass er es hier mit einem zweidimensionalen Feld zu tun hat. Aber was kann ich tun, damit er kapiert, dass es sich um ein zweidimensionales Feld handelt? Also, dass ich die Werte von x und y so übergeben kann und er an der Stelle dann auch meinen Kopf setzt?</p>
<p>Ich weiß, dass es wesentlich einfachere Lösungen gibt, Snake zu programmieren, aber unser Kurs sollte es auf die kompliziertere Weise tun.</p>
<p>Ich hoffe sehr, dass mir hier jemand weiterhelfen kann. Wenn der Code nicht ausreichend ist, um das Problem nachvollziehen zu können, kann ich meinen gesamten Code posten. (wird aber recht viel)<br />
Bin über jede Antwort sehr dankbar!</p>
<p>Viele Grüße<br />
Blubbi4</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323059/pointer-auf-mehrdimensionalen-array</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 10:24:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323059.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Jan 2014 13:32:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer auf mehrdimensionalen Array on Thu, 16 Jan 2014 13:32:02 GMT]]></title><description><![CDATA[<p>Ich weiß, dass es eine ähnliche Fragestellung schon gibt. Die habe ich mir angesehen, aber bin daraus leider nicht schlauer geworden.</p>
<p>Ich programmiere gerade Snake mit Klassen.<br />
Mein Feld dafür steht, meine Wand und mein Kopf auch und die Ausgabe dafür funktioniert auch so weit.</p>
<p>Jetzt gilt es diesen Kopf zu bewegen,wenn eine Taste gedrückt wird, sprich dann den Kopf auf ein neues Feld zu setzen.<br />
Die Header-Datei für mein Spiel sieht folgendermaßen aus:</p>
<pre><code>class Spiel
{
private:
	Feld* f[60][60]; //Zeiger auf Feldobjekte, logisch
	View* v;
	Wand* w;
	Kopf* k;
	int refreshRate;
	bool running;
	bool goLeft;
	bool goRight;
	bool goDown;
	bool goUp;
public:
	Spiel(); //stellt Wände und Kopf korrekt auf
	~Spiel(); //löscht wieder alles
	int getKeyboardInput();
	void gameLoop(); //Spieleschleife
	void bewegeKopf();
	void show();
};
</code></pre>
<pre><code>void Spiel::bewegeKopf()
	{
		int x = k-&gt;getKopfx();
		int y = k-&gt;getKopfy();
		int keyIn = getKeyboardInput();
		if(keyIn != 0) // Es wurde eine Taste gedrückt
	{
		switch(keyIn)
		{
		case 27: // [ESC]
			running = false;
			break;
		case 224: // Special key
		int keyIn2= getKeyboardInput(); // Wenn es eine Spezialtaste ist, den zweiten Code holen
		switch(keyIn2)
			{
			case 75:  // [&lt;-] 
					y = y--;
					k-&gt;setFeld(x,y); //!!!!!!!!!//
					goLeft = true;	
					goRight = false;
					goUp = false;
					goDown = false;
				// Stein bewegen...
				break;
			case 77: // [-&gt;]
					y = y++;
					k-&gt;setFeld(x,y); //!!!!!!!!!//
					goRight = true;
					goLeft = false;
					goUp = false;
					goDown = false;
				// Stein bewegen...
				break;
			case 80: // [ v ]
					x = x++;
					k-&gt;setFeld(x,y); //!!!!!!!!//
					goDown = true;
					goLeft = false;
					goUp = false;
					goRight = false;
				// Stein bewegen...
				break;
			case 72: y = y--;// [ ^ ]
					k-&gt;setFeld(x,y); //!!!!!!!!!!//
					goUp = true;
					goDown = false;
					goLeft = false;
					goRight = false;
					break;
			}
				break;
		}
	}
	}
</code></pre>
<p>An den Stellen 19, 28, 37 und 45 rufe ich meine Methode setFeld(int x, int y) auf, die in der Kopf-Klasse steht. Die Header-Datei wie folgt:</p>
<pre><code>class Kopf
{
private:
	Feld* f;
	Kopf* k;
	char zeichen;

public:
	Kopf(Feld*, char);
	~Kopf();
	void setFeld(int x, int y);
	int getKopfx();
	int getKopfy();
	void setZeichen (char);
	Feld* getFeld();
	char getZeichen();
	void show (View* v); //zeichnet zeichen auf View v an der angegebenen Feldposition
};
</code></pre>
<p>setFeld sieht folgendermaßen aus:</p>
<pre><code>void Kopf::setFeld(int x, int y)
	{
	f[x][y]-&gt;setKopf(k);
	}
</code></pre>
<p>Genau bei dieser Methode liegt jetzt mein Problem. Ich arbeite mit Visual-Studio.<br />
Folgende Fehlermeldung ist an der eckigen Klammerauf von [y] zu sehen:<br />
--&gt; Kein &quot;[]&quot;-Operator stimmt mit diesen Operanden überein. Operandentypen sind Feld [int]</p>
<p>Man sagte mir, das Problem wäre, dass der Array &quot;dumm&quot; ist und nicht weiß, dass er es hier mit einem zweidimensionalen Feld zu tun hat. Aber was kann ich tun, damit er kapiert, dass es sich um ein zweidimensionales Feld handelt? Also, dass ich die Werte von x und y so übergeben kann und er an der Stelle dann auch meinen Kopf setzt?</p>
<p>Ich weiß, dass es wesentlich einfachere Lösungen gibt, Snake zu programmieren, aber unser Kurs sollte es auf die kompliziertere Weise tun.</p>
<p>Ich hoffe sehr, dass mir hier jemand weiterhelfen kann. Wenn der Code nicht ausreichend ist, um das Problem nachvollziehen zu können, kann ich meinen gesamten Code posten. (wird aber recht viel)<br />
Bin über jede Antwort sehr dankbar!</p>
<p>Viele Grüße<br />
Blubbi4</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377622</guid><dc:creator><![CDATA[Blubbi456]]></dc:creator><pubDate>Thu, 16 Jan 2014 13:32:02 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf mehrdimensionalen Array on Fri, 17 Jan 2014 07:25:38 GMT]]></title><description><![CDATA[<p>Hmm - das sind ziemlich viele Pointer. Das ist wahrscheinlich gar nicht nötig.<br />
Besonders das <code>Spiel::f</code> ein <code>Feld*[][60</code> ] ist finde ich gar nicht logisch.</p>
<p>Wie dem auch sei: irgendwo geht die Typinformation verloren. Das ist aber bei Arrays üblich.<br />
Zeig mal die Konstruktoren von Spiel und Kopf.<br />
Apropos &quot;Kopf&quot;: das <code>Kopf::f</code> ein <code>Feld*</code> und nichtmal ein <code>Feld**</code> ist verwundert mich.</p>
<p>Und das hier:</p>
<pre><code class="language-cpp">y=y--;
</code></pre>
<p>sollte wohl ein einfaches</p>
<pre><code class="language-cpp">--y;
</code></pre>
<p>sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377802</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Fri, 17 Jan 2014 07:25:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf mehrdimensionalen Array on Fri, 17 Jan 2014 21:55:11 GMT]]></title><description><![CDATA[<p>Hey, danke für deine Antwort.<br />
Dass es mehr Pointer als nötig sind, ist mir bewusst, aber das war praktisch vorgegeben, damit wir den Umgang damit verstehen ... wobei mich das eher verwirrt muss ich ja sagen ^^;</p>
<p>Mit &quot;logisch&quot; ist gemeint, dass ich einmal ein &quot;physikalisches&quot; Feld habe (in der view), wo praktisch alles optisch dann auch ausgegeben wird und ein &quot;logisches&quot; Feld mit Pointern. Auf diesen Feldern kann dann alles mögliche drauf stehen (Wand, Kopf, leer)</p>
<p>Hier der Konstruktor von Kopf:</p>
<pre><code>Kopf::Kopf(Feld* f, char zeichen)
	{
		this-&gt;f=f;
		this-&gt;zeichen=zeichen;
	}
</code></pre>
<p>Und hier der Konstruktor von Spiel:</p>
<pre><code>Spiel::Spiel()
	{
		running = true;
		refreshRate = 200;

		v = new View();
		for(int i=0; i&lt;60; i++)
			{
				for (int j=0; j&lt;60; j++)
				{
					f[i][j] = new Feld(i, j);
				}
			}
		//Erstellung der Wand
		int i;
		int j;
		for (i=0; i&lt;60; i++) //höhe
		{
			for (j=0; j&lt;60; j++) //weite//
			{
				if(j==0)
				{
					w = new Wand(f[i][0], '#');
					f[i][0]-&gt;setWand(w); //Spalte1
					//v-&gt;zeichne(3,4,'b');
				}
				if(i==0)
				{
					w= new Wand(f[0][j], '#');
					f[0][j]-&gt;setWand(w);
				}
				if(j==(60-1)) //spalte2
				{
					w= new Wand(f[i][60-1], '#');
					f[i][60-1]-&gt;setWand(w);
				//weite
				}
				if(i==(60-1))
				{
					w= new Wand(f[60-1][j], '#');
					f[60-1][j]-&gt;setWand(w); //höhe
				}

			}

		}
		k= new Kopf(f[30][30], '@');
		f[30][30]-&gt;setKopf(k);
		show();
		gameLoop();
	}
</code></pre>
<p>Also, wir haben das ganze auch schon mal ohne Klassen und Pointern gemacht.<br />
Da hat das mit y++ oder y-- aber eigentlich so funtkioniert, wie ich es mir vorgestellt hatte. Wieso sollte es denn --y heißen? Mir ist klar, dass der Wert von y bei der Postfixnotation erst nach dem &quot;;&quot; erniedrigt wird, aber spielt das hier eine Rolle?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377945</guid><dc:creator><![CDATA[Blubbi456]]></dc:creator><pubDate>Fri, 17 Jan 2014 21:55:11 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf mehrdimensionalen Array on Fri, 17 Jan 2014 22:26:20 GMT]]></title><description><![CDATA[<p>Ach ne, jetzt versteh ich, worauf du anspielst. Sorry, lange Leitung.<br />
Ja, da hast du wohl recht, die Zuweisung y= ist unnötig ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377946</guid><dc:creator><![CDATA[Blubbi456]]></dc:creator><pubDate>Fri, 17 Jan 2014 22:26:20 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf mehrdimensionalen Array on Sat, 18 Jan 2014 07:29:36 GMT]]></title><description><![CDATA[<p>Blubbi456 schrieb:</p>
<blockquote>
<p>Da hat das mit y++ oder y-- aber eigentlich so funtkioniert,</p>
</blockquote>
<p>Pures Glück, wenn y=y-- geht.</p>
<p>Blubbi456 schrieb:</p>
<blockquote>
<p>bei der Postfixnotation erst nach dem &quot;;&quot; erniedrigt wird, aber spielt das hier eine Rolle?</p>
</blockquote>
<p>Zwei Wertänderungen in einem Ausdruck sind pöse. Siehe <a href="http://en.wikipedia.org/wiki/Sequence_point" rel="nofollow">Sequence Point</a> und <a href="http://de.urbandictionary.com/define.php?term=nasal%20demons" rel="nofollow">Nasendämonen</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377971</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 18 Jan 2014 07:29:36 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf mehrdimensionalen Array on Sat, 18 Jan 2014 10:09:33 GMT]]></title><description><![CDATA[<p>Danke, ich hab's jetzt umgeändert. Aber leider bleibt mein eigentliches Problem bestehen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2377981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2377981</guid><dc:creator><![CDATA[blubbi456]]></dc:creator><pubDate>Sat, 18 Jan 2014 10:09:33 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf mehrdimensionalen Array on Sat, 18 Jan 2014 12:15:18 GMT]]></title><description><![CDATA[<p>Blubbi456 schrieb:</p>
<blockquote>
<p>Dass es mehr Pointer als nötig sind, ist mir bewusst, aber das war praktisch vorgegeben, damit wir den Umgang damit verstehen ... wobei mich das eher verwirrt muss ich ja sagen ^^;</p>
</blockquote>
<p>Hmm - aber ganz so extrem muss es ja nicht sein.<br />
Ausserdem brauchst Du ja nicht lernen, wie man es nicht macht, um zu begreifen, wie man es richtig macht.</p>
<p>Wie dem auch sei: ein zweidimensionales Feld von Pointern ist ineffizient und unnötig kompliziert.<br />
Schau mal, wie sehr sich Dein Code vereinfacht, wenn Dein Spielfeld ein <code>Feld*</code> ist, dass Du im Konstruktor von Spiel allozierst.</p>
<pre><code class="language-cpp">struct Feld{
  //...
};
struct Spiel{
  Feld* f;
  Spiel(){
    f = new Feld[60*60];
    // ....
  }
  ~Spiel() { delete[] f; }
  Feld&amp; feld(int zeile, int spalte) { return f[zeile*60+spalte]; }
  const Feld&amp; feld(int zeile, int spalte) const { return f[zeile*60+spalte]; }
  // ...
};
</code></pre>
<p>Zeile 11 und 12 ist ein allgemein bekannter Trick um den Zugriff über Zeile und Spalte auf ein eindimensionales Array zu ermöglichen. Nimm Dir ein Stück Karopapier und einen Bleistift um das nachzuvollziehen.<br />
Referenzen ( <code>Feld&amp;</code> als Rückgabe) kennst Du, oder?</p>
<p>Wirklich: Dein Ansatz mit der ganzen manuellen Speicherverwaltung ist nicht mit vernünftigen Aufwand korrekt hinzubekommen.</p>
<p>Viel Erfolg!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378008</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Sat, 18 Jan 2014 12:15:18 GMT</pubDate></item></channel></rss>