<?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[Beispielprogramm fehlerhaft.]]></title><description><![CDATA[<p>Hallo,<br />
in dem Buch, dass ich zum lernen von C++ benutze wird als Beispiel für 2- dimensionale Arrays ein Quellcode zur Programmierung eines 2D Spielfelds angegeben, dass aus Punkten und Koordinaten oben und rechts besteht, das Speilfeld müsste so aussehen:</p>
<pre><code>1 2 3 4 5 6 7 8 9
A . . . . . . . . .
B . . . . . . . . . 
C . . . . . . . . . 
D . . . . . . . . . 
E . . . . . . . . .
F . . . . . . . . . 
G . . . . . . . . .
</code></pre>
<p>allerdings wird nur die erste Spalte in Punkten dargestellt (hier genauer: <a href="http://img5.fotos-hochladen.net/uploads/unbenanntogwup6q1fi.png" rel="nofollow">http://img5.fotos-hochladen.net/uploads/unbenanntogwup6q1fi.png</a>)</p>
<p>Dieser Quellcode wurde von mir 1:1 aus dem Buch übernommen:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

const int X=9;
const int Y=7;

int main()
{
    char Spielfeld[X][Y];
    int x, y;
    char cx, cy;
    for (x=0; x&lt;X; x++)
    {
        for (y=0; y&lt;Y; y++)
        {
            Spielfeld[x][y]= '.';
        }
    //Anzeige und Eingabe
    bool Schleifenende = false;
    int xin, yin;
    do
    {
        cout &lt;&lt; &quot;    1 2 3 4 5 6 7 8 9&quot; &lt;&lt; endl;
        for (y=0; y&lt;Y; y++)
        {
            cout &lt;&lt; (char)('A'+y) &lt;&lt; &quot;  &quot;;
            for (x=0; x&lt;X; x++)
            {
                cout &lt;&lt; &quot; &quot; &lt;&lt; Spielfeld[x][y];
            }
            cout &lt;&lt; endl;
        }  
        cin &gt;&gt; cx &gt;&gt; cy;
        xin = cx - '1';
        yin = cy - 'A';
        if (xin &gt;=0 &amp;&amp; xin&lt;X &amp;&amp; yin &gt;= 0 &amp;&amp; yin &lt; Y)
        {
                Spielfeld[xin][yin]= 'x';
        }
        else
        {
            Schleifenende = true;
        }
    }
    while(!Schleifenende);
}
}
</code></pre>
<p>Wo liegt das Problem und was muss ich ändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324649/beispielprogramm-fehlerhaft</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 09:10:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324649.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Mar 2014 18:42:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Beispielprogramm fehlerhaft. on Tue, 25 Mar 2014 18:42:57 GMT]]></title><description><![CDATA[<p>Hallo,<br />
in dem Buch, dass ich zum lernen von C++ benutze wird als Beispiel für 2- dimensionale Arrays ein Quellcode zur Programmierung eines 2D Spielfelds angegeben, dass aus Punkten und Koordinaten oben und rechts besteht, das Speilfeld müsste so aussehen:</p>
<pre><code>1 2 3 4 5 6 7 8 9
A . . . . . . . . .
B . . . . . . . . . 
C . . . . . . . . . 
D . . . . . . . . . 
E . . . . . . . . .
F . . . . . . . . . 
G . . . . . . . . .
</code></pre>
<p>allerdings wird nur die erste Spalte in Punkten dargestellt (hier genauer: <a href="http://img5.fotos-hochladen.net/uploads/unbenanntogwup6q1fi.png" rel="nofollow">http://img5.fotos-hochladen.net/uploads/unbenanntogwup6q1fi.png</a>)</p>
<p>Dieser Quellcode wurde von mir 1:1 aus dem Buch übernommen:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

const int X=9;
const int Y=7;

int main()
{
    char Spielfeld[X][Y];
    int x, y;
    char cx, cy;
    for (x=0; x&lt;X; x++)
    {
        for (y=0; y&lt;Y; y++)
        {
            Spielfeld[x][y]= '.';
        }
    //Anzeige und Eingabe
    bool Schleifenende = false;
    int xin, yin;
    do
    {
        cout &lt;&lt; &quot;    1 2 3 4 5 6 7 8 9&quot; &lt;&lt; endl;
        for (y=0; y&lt;Y; y++)
        {
            cout &lt;&lt; (char)('A'+y) &lt;&lt; &quot;  &quot;;
            for (x=0; x&lt;X; x++)
            {
                cout &lt;&lt; &quot; &quot; &lt;&lt; Spielfeld[x][y];
            }
            cout &lt;&lt; endl;
        }  
        cin &gt;&gt; cx &gt;&gt; cy;
        xin = cx - '1';
        yin = cy - 'A';
        if (xin &gt;=0 &amp;&amp; xin&lt;X &amp;&amp; yin &gt;= 0 &amp;&amp; yin &lt; Y)
        {
                Spielfeld[xin][yin]= 'x';
        }
        else
        {
            Schleifenende = true;
        }
    }
    while(!Schleifenende);
}
}
</code></pre>
<p>Wo liegt das Problem und was muss ich ändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391107</guid><dc:creator><![CDATA[benimus]]></dc:creator><pubDate>Tue, 25 Mar 2014 18:42:57 GMT</pubDate></item><item><title><![CDATA[Reply to Beispielprogramm fehlerhaft. on Tue, 25 Mar 2014 18:45:08 GMT]]></title><description><![CDATA[<p>Ich würde sagen, dass nach Zeile 17 eine } fehlt und am Ende eine zuviel ist. Sicher, dass du das 1:1 abgeschrieben hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391108</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 25 Mar 2014 18:45:08 GMT</pubDate></item><item><title><![CDATA[Reply to Beispielprogramm fehlerhaft. on Tue, 25 Mar 2014 18:50:31 GMT]]></title><description><![CDATA[<p>Jetzt klappt's... verdammt, so ein banaler Fehler... ja, ich bin davon ausgegangen, dass ich es fehlerfrei übertragen habe und hab das auch nach mehrmaligem Prüfen nicht bemerkt... danke für die schnelle Antwort!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2391110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2391110</guid><dc:creator><![CDATA[benimus]]></dc:creator><pubDate>Tue, 25 Mar 2014 18:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to Beispielprogramm fehlerhaft. on Mon, 07 Apr 2014 17:51:58 GMT]]></title><description><![CDATA[<p>Ich hab mir den Quellcode heute nach einer längeren Pause noch einmal angesehen und jetzt frage ich mich, was genau in den Zeilen 26, 34- 39 und in der Zeile 45 stattfindet.</p>
<p>Also,<br />
warum wird &quot;char&quot; und &quot;'A'+y&quot; in Klammern geschrieben?</p>
<p>Warum wird von der Eingabe der Wert 'A' bzw '1' abgezogen?</p>
<p>Was genau hat die darauf folgende Schleifenbedingung zu bedeuten? Soweit ich das erkennen kann dürfen die eingegebenen x und die y- Koordinaten nur größer gleich null sein, aber warum müssen sie kleiner als X(=9) oder Y(=7) sein?</p>
<p>Und was bewirkt das Ausrufezeichen vor der Variable &quot;Schleifenende&quot; in der Schleifenbedingung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393237</guid><dc:creator><![CDATA[benimus]]></dc:creator><pubDate>Mon, 07 Apr 2014 17:51:58 GMT</pubDate></item><item><title><![CDATA[Reply to Beispielprogramm fehlerhaft. on Mon, 07 Apr 2014 18:05:01 GMT]]></title><description><![CDATA[<p>benimus schrieb:</p>
<blockquote>
<p>warum wird &quot;char&quot; und &quot;'A'+y&quot; in Klammern geschrieben?</p>
</blockquote>
<p>Das ist ein Cast-Ausdruck. Der Ausdruck 'A'+y wird in den Datentyp char umgewandelt, damit der korrekte Ausgabeoperator aufgerufen wird.</p>
<blockquote>
<p>Warum wird von der Eingabe der Wert 'A' bzw '1' abgezogen?</p>
</blockquote>
<p>Um die Position im Alphabet zu bekommen. Das funktioniert, weil die Zeichencodes der Buchstaben und Ziffern im ASCII-Code lückenlos aufsteigend angeordnet sind, so dass beispielsweise 'C' - 'A' == 2 und '5' - '4' == 1 ist. (Im Standard ist ASCII nicht vorgeschrieben, so dass das nicht portabel ist, aber praktisch sind Ausnahmen äußerst selten. Vielleicht bei IBM-Großrechnern.)</p>
<blockquote>
<p>Was genau hat die darauf folgende Schleifenbedingung zu bedeuten? Soweit ich das erkennen kann dürfen die eingegebenen x und die y- Koordinaten nur größer gleich null sein, aber warum müssen sie kleiner als X(=9) oder Y(=7) sein?</p>
</blockquote>
<p>Weil das Feld begrenzte Größe hat.</p>
<blockquote>
<p>Und was bewirkt das Ausrufezeichen vor der Variable &quot;Schleifenende&quot; in der Schleifenbedingung?</p>
</blockquote>
<p>Das ist der logische Negationsoperator. !false ist true, !&lt;alles andere&gt; ist false.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393239</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 07 Apr 2014 18:05:01 GMT</pubDate></item><item><title><![CDATA[Reply to Beispielprogramm fehlerhaft. on Mon, 07 Apr 2014 18:32:04 GMT]]></title><description><![CDATA[<p>benimus schrieb:</p>
<blockquote>
<p>Also,<br />
warum wird &quot;char&quot; und &quot;'A'+y&quot; in Klammern geschrieben?</p>
</blockquote>
<p>Die Streams, wie cout, sind klug und erkennen den Datentyp von Sachen, die sie ausgeben sollen. So werden Datentypen, die Zahlen repraesentieren (wie z.B. int) auch als Zahl ausgegeben und solche, die Buchstaben repraesentieren (wie z.B. char) als Buchstabe.<br />
Fuer den Computer sind Zahlen und Buchstaben aber eigentlich das gleiche. Man kann daher mit Buchstaben auch rechnen (das kommt bei deinen anderen Fragen vor). In C++ ist aber vorgeschrieben, dass alle Rechnungen mindestens mit der Genauigkeit des Datentyps int durchgefuehrt werden (siehe zum Beispiel <a href="http://www.c-plusplus.net/forum/p2392848#2392848" rel="nofollow">hier</a>). Das Ergebnis einer solchen Rechnung ist daher (mindestens) auch int, selbst wenn man nur mit chars gerechnet hat. Der Stream wuerde daher einen int sehen und versuchen, das Ergebnis als Zahl auszugeben. Man moechte hier aber eine Ausgabe in Form von Buchstaben haben. Daher muss man das Ergebnis der Rechnung wieder zum Datentyp char machen. Das ist, was hier geschieht. Das nennt man einen <em>Cast</em>.<br />
Ein paar Bemerkungen dazu:<br />
-Es gibt zwei verschiedene Syntax fuer Casts, die alte C-Syntax, die hier benutzt wurde, und die neue C++-Syntax. Bei der C-Syntax schreibt man einfach den gewuenschten Datentyp in Klammern vor den Ausdruck. Bei der C++-Syntax muss man genau angeben, welche Art von Cast man wuenscht (es gibt verschiedene - siehe Lehrbuch) und welchen Typ man haben moechte. In C++-Syntax wuerde hier <code>static_cast&lt;char&gt;('A'+y)</code> stehen.<br />
-Auch wenn die C++-Syntax zunaechst umstaendlich aussehen mag, hat sie zwei Vorteile: 1. Man weiss ganz genau, was passiert. Da es verschiedene Arten von Casts gibt, kann es nicht passieren, dass man versehentlich die falsche waehlt. 2. Man sieht sofort, dass ein Cast passiert und man kann auch theoretisch mit einem Editor damit suchen. Die C-Casts gehen hingegen im Quellcode leicht unter.<br />
-Der C-Cast hat hingegen den Vorteil, bei unproblematischen Casts, wie diesem hier, kuerzer zu sein.<br />
-Anfaenger tendieren dazu, Probleme weg zu casten. Gerade mit den C-Casts kann man fast jede Compilerwarnung oder -fehler beheben, wenn man bloss genug rum probiert. Aber es ist keine echte Loesung. In den meisten Faellen bedeutet ein Cast naemlich bloss, dass der Compiler gefaelligst den Code so akzeptieren soll, wie er ist, auch wenn er falsch aussieht. Das macht einen falschen Code aber nicht richtig. Im echten Leben braucht man Casts eher selten, wenn man ganz bestimmte Effekte erzielen moechte, die so von der Sprache nicht direkt vorgesehen sind. Der Cast hier ist ein Beispiel dafuer, ein anderes, welches einem oefters begegnet, ist der Cast einer Ganzzahl in eine Fliesskommazahl, wenn man zwei Ganzzahlen dividieren moechte, aber keine Ganzzahldivision wuenscht.</p>
<blockquote>
<p>Warum wird von der Eingabe der Wert 'A' bzw '1' abgezogen?</p>
</blockquote>
<p>Damit man besser damit rechnen kann. Wie schon gesagt, sind Zeichen fuer den Computer auch nur Zahlen. Aber das Zeichen '1' hat nicht notwendigerweise den Zahlenwert 1 (das waere sogar sehr ungewoehnlich). Es ist aber garantiert, dass die Zeichen fuer '0', '1', '2', usw. aufeinander folgende Werte haben. Das heisst, wenn man von der Ziffer '0' das Zeichen '0; abzieht, bekommt man den Wert 0. Wenn man von '1' das Zeichen '0' abzieht, bekommt man den Wert 1, wenn man von '2' das Zeichen '0' abzieht, bekommt man 2, usw.<br />
Hier wurde statt der '0' das Zeichen '1' abgezogen, da die Beschriftung des Spielfelds mit einer '1' anfaengt, man dieser aber den Arrayindex 0 zuordnen moechte.</p>
<p>Aehnlich ist das mit den Buchstaben des Alphabets. Es ist zwar nicht vom Sprachstandard garantiert, dass 'A', 'B', 'C', usw. hintereinander liegen, aber bei jedem halbwegs normalem System ist das so.</p>
<p>Beachte, wie ich Zeichen und Zahlen voneinander unterscheide: '1' ist das Zeichen fuer die Ziffer &quot;Eins&quot;. 1 ist die Zahl &quot;Eins&quot;. So wird es auch im Quellcode gemacht.</p>
<blockquote>
<p>Was genau hat die darauf folgende Schleifenbedingung zu bedeuten? Soweit ich das erkennen kann dürfen die eingegebenen x und die y- Koordinaten nur größer gleich null sein, aber warum müssen sie kleiner als X(=9) oder Y(=7) sein?</p>
</blockquote>
<p>Weil das Spielfeld 9x7 Kaestchen gross ist.</p>
<blockquote>
<p>Und was bewirkt das Ausrufezeichen vor der Variable &quot;Schleifenende&quot; in der Schleifenbedingung?</p>
</blockquote>
<p>Das ist eine logische Verneinung. Ein verneinter Ausdruck wird wahr, wenn er unwahr ist und umgekehrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393243</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 07 Apr 2014 18:32:04 GMT</pubDate></item></channel></rss>