<?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[Fehlerhafte Variablen durch eine Funktion]]></title><description><![CDATA[<p>€: Alles Editiert!<br />
Hallo! Cpp Gemeinde!</p>
<p>Ich habe mich gestern mal mit den Funktionen von rand() vertraut gemacht, und wollte nun mein erstes Programm schreiben, es geht dabei um ein Spiel und dessen Upgradechancen.</p>
<p>Was soll das Programm können?<br />
Als erstes wird eine Meldung ausgegeben, welcher Wert (bzw. Plus im Spiel) der Gegenstand derzeit hat, und zu welchem er werden soll (im Code: Satz(0, 1) - 0 steht für das derzeitige +, die 1 ist für das Plus, welches als nächstes kommt), dazu dachte ich mir wäre es einfach eine Funktion zu schreiben, anstatt immer wieder den selben Code, so wird also eine Zahl eingelesen (Satz(0, 1)...) und diese wird danach in einem Satz ausgegeben (siehe Funktion int Satz(int a)).<br />
Nun - danach wählt das Programm eine Zufällige Zahl von 1-100, im Anschluss soll getestet werden ob die Zahl einen Wert hat, der unter 80 liegt, falls ja, soll die Anzahl der Versuche ausgegeben werden, und die while Schleife wird verlassen.<br />
Falls nicht, soll sich die Anzahl der Versuche, sowie die Anzahl der gesamt Versuche um 1 erhöhen.</p>
<p>Mein Problem:<br />
Das Programm gibt zwar die Anzahl der Versuche aus, jedoch falsch (etwas in die 4,1 millionen bei einer 80% Chance) - es liegt irgendwie an der Funktion von int Satz(int a), denn sobald ich den Typ der Funktion auf short Satz(int a) ändere, wird die Zahl der Versuche niedriger, es wird also nicht der korrekte Wert der Variable &quot;Versuche&quot; ausgegeben - warum?</p>
<p>Hier der Code:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;ctime&gt;
#include &lt;cstddef&gt;
#include &lt;conio.h&gt;

using namespace std;

int Upgr, Versuche, VersucheGes;

int CalcSp(int c);
//         Chance
int BerechneEq();
void Berechnung();
int Satz(int a);

int main(){
    srand(time(0));
    Berechnung();

}

void Berechnung(){
    Upgr = 0, Versuche = 1, VersucheGes = 0;    
    cout &lt;&lt; &quot;SP-Upgradeversuche:&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;+ \t\tVersuche&quot; &lt;&lt; endl;
    cout &lt;&lt; Satz(1) &lt;&lt; CalcSp(80) &lt;&lt; endl;
    cout &lt;&lt; &quot;\n&quot; &lt;&lt; &quot;\n&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;+ \tVersuche&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;EQ-Upgradeversuche:&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;Druecke eine beliebige Taste, um ein neues Ergebnis zu bekommen!\n&quot; &lt;&lt; endl;
    getch();
    Berechnung();
    //cout &lt;&lt; BerechneEq();
}

int CalcSp(int c){
    while(1){
        Upgr = 1+(rand()%100);
        if(Upgr &gt;= c){ // Wenn Erfolg
            return Versuche;
            Versuche = 0;
            break;
        }
        else{
            Versuche = Versuche + 1;
            VersucheGes = VersucheGes + 1;
        }
    }

}

int Satz(int a){
    cout &lt;&lt; a-1 &lt;&lt; &quot; -&gt; &quot; &lt;&lt; a &lt;&lt; &quot;\t\t&quot;;
}
</code></pre>
<p>Danke schonmal für die Hilfe! <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/topic/324081/fehlerhafte-variablen-durch-eine-funktion</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 02:13:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324081.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Mar 2014 15:10:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehlerhafte Variablen durch eine Funktion on Sun, 02 Mar 2014 16:24:23 GMT]]></title><description><![CDATA[<p>€: Alles Editiert!<br />
Hallo! Cpp Gemeinde!</p>
<p>Ich habe mich gestern mal mit den Funktionen von rand() vertraut gemacht, und wollte nun mein erstes Programm schreiben, es geht dabei um ein Spiel und dessen Upgradechancen.</p>
<p>Was soll das Programm können?<br />
Als erstes wird eine Meldung ausgegeben, welcher Wert (bzw. Plus im Spiel) der Gegenstand derzeit hat, und zu welchem er werden soll (im Code: Satz(0, 1) - 0 steht für das derzeitige +, die 1 ist für das Plus, welches als nächstes kommt), dazu dachte ich mir wäre es einfach eine Funktion zu schreiben, anstatt immer wieder den selben Code, so wird also eine Zahl eingelesen (Satz(0, 1)...) und diese wird danach in einem Satz ausgegeben (siehe Funktion int Satz(int a)).<br />
Nun - danach wählt das Programm eine Zufällige Zahl von 1-100, im Anschluss soll getestet werden ob die Zahl einen Wert hat, der unter 80 liegt, falls ja, soll die Anzahl der Versuche ausgegeben werden, und die while Schleife wird verlassen.<br />
Falls nicht, soll sich die Anzahl der Versuche, sowie die Anzahl der gesamt Versuche um 1 erhöhen.</p>
<p>Mein Problem:<br />
Das Programm gibt zwar die Anzahl der Versuche aus, jedoch falsch (etwas in die 4,1 millionen bei einer 80% Chance) - es liegt irgendwie an der Funktion von int Satz(int a), denn sobald ich den Typ der Funktion auf short Satz(int a) ändere, wird die Zahl der Versuche niedriger, es wird also nicht der korrekte Wert der Variable &quot;Versuche&quot; ausgegeben - warum?</p>
<p>Hier der Code:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;ctime&gt;
#include &lt;cstddef&gt;
#include &lt;conio.h&gt;

using namespace std;

int Upgr, Versuche, VersucheGes;

int CalcSp(int c);
//         Chance
int BerechneEq();
void Berechnung();
int Satz(int a);

int main(){
    srand(time(0));
    Berechnung();

}

void Berechnung(){
    Upgr = 0, Versuche = 1, VersucheGes = 0;    
    cout &lt;&lt; &quot;SP-Upgradeversuche:&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;+ \t\tVersuche&quot; &lt;&lt; endl;
    cout &lt;&lt; Satz(1) &lt;&lt; CalcSp(80) &lt;&lt; endl;
    cout &lt;&lt; &quot;\n&quot; &lt;&lt; &quot;\n&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;+ \tVersuche&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;EQ-Upgradeversuche:&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;Druecke eine beliebige Taste, um ein neues Ergebnis zu bekommen!\n&quot; &lt;&lt; endl;
    getch();
    Berechnung();
    //cout &lt;&lt; BerechneEq();
}

int CalcSp(int c){
    while(1){
        Upgr = 1+(rand()%100);
        if(Upgr &gt;= c){ // Wenn Erfolg
            return Versuche;
            Versuche = 0;
            break;
        }
        else{
            Versuche = Versuche + 1;
            VersucheGes = VersucheGes + 1;
        }
    }

}

int Satz(int a){
    cout &lt;&lt; a-1 &lt;&lt; &quot; -&gt; &quot; &lt;&lt; a &lt;&lt; &quot;\t\t&quot;;
}
</code></pre>
<p>Danke schonmal für die Hilfe! <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/2386068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386068</guid><dc:creator><![CDATA[Shortyoo]]></dc:creator><pubDate>Sun, 02 Mar 2014 16:24:23 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhafte Variablen durch eine Funktion on Sun, 02 Mar 2014 15:27:10 GMT]]></title><description><![CDATA[<p>Das Programm ist nicht compilierbar. Das Programm ist Spaghetticode mit goto, globalen Variablen, unerreichbarem Code und Funktionen mit komischen Nebeneffekten (z.B. Ausgabe in Funktion, deren Wert ausgegeben wird). Aus deiner Fehlerbeschreibung wird man auch nicht schlau. Deine Beschreibung dessen, was das Programm machen soll, passt ebenfalls überhaupt nicht zum Code (Satz() soll laut dir etwas lesen, aber man sieht nichts in dieser Richtung).</p>
<p>Nochmal neuen Beitrag verfassen, dieses Mal ordentlich. Siehe:<br />
<a href="http://www.c-plusplus.net/forum/200753" rel="nofollow">http://www.c-plusplus.net/forum/200753</a><br />
<a href="http://www.c-plusplus.net/forum/304133" rel="nofollow">http://www.c-plusplus.net/forum/304133</a><br />
<a href="http://www.tty1.net/smart-questions_de.html" rel="nofollow">http://www.tty1.net/smart-questions_de.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386072</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 02 Mar 2014 15:27:10 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhafte Variablen durch eine Funktion on Sun, 02 Mar 2014 16:03:29 GMT]]></title><description><![CDATA[<p>Ich werd versuchen es nocheinmal umzuschreiben, trotzdem danke! <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/2386077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386077</guid><dc:creator><![CDATA[Shortyoo]]></dc:creator><pubDate>Sun, 02 Mar 2014 16:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhafte Variablen durch eine Funktion on Sun, 02 Mar 2014 16:48:57 GMT]]></title><description><![CDATA[<p>Schon deutlich besser.</p>
<p>Der Fehler ist eine Folge der Dinge, die ich schon erwähnt habe. Hier ist die unmittelbare Ursache der Rückgabewert von Satz(). Das hat nämlich einen Rückgabewert, gibt aber nichts zurück. Daher kommt da irgendein uninitialisierter Wert bei raus. Und der wird dann ausgegeben.</p>
<p>Benutz keine globale Variablen! Wenn du den obigen Fehler berichtigt hast, wirst du feststellen, dass du noch mehr Fehler drin hast, die du ohne globale Variablen nicht hattest. Viel Spaß, diesen Fehler zu finden. Das ist bei globalen Variablen nämlich besonders schwer.</p>
<p>Keine Rekursion, ohne sie zu verstehen!</p>
<p>Möglichst keine Funktionen mit Nebeneffekten. Das ist hier die Ursache des Fehlers. Du willst etwas ausgeben, das etwas ausgibt. Das ist Unsinn!</p>
<p>Das sind keine Kleinigkeiten. Die drei Punkte (und das goto, das du vorher hattest) sind alle in den Top 10 der Programmiersünden. Sie provozieren Fehler, machen den Code unlesbar und schwer zu debuggen. Dein Programm ist ein hervorragendes Beispiel dafür. Wenn du sauber programmierst, funktionieren deine Programme praktisch von alleine fehlerfrei. Bei unsauberem Code passiert das Gegenteil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386086</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 02 Mar 2014 16:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhafte Variablen durch eine Funktion on Sun, 02 Mar 2014 17:07:16 GMT]]></title><description><![CDATA[<p>Oh mein Gott - danke ich habs!^^</p>
<p>Den Typ von Satz habe ich mehrmals versucht in void zu ändern, dies ging jedoch nicht, da er in dem cout stand.</p>
<pre><code>cout &lt;&lt; Satz(1) &lt;&lt; ...
</code></pre>
<p>Wie ich mitbekam kann eine void Funktion nicht in einer Ausgabe stehen - ein wenig zu spät, aber trotzdem. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Das mit den globalen Variablen habe ich auch behoben, ich dachte ich brauche diese in CalcSp() und in Berechnung(), brauche sie jedoch nur bei der Calc(), danke auch noch für das hinweisen des goto's bzw. der Label, werde ein Programm in Zukunft dann doch besser in einzelne Funktionen unterteilen.^^</p>
<p>Vielen Dank nochmal für die Hinweise! <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/2386091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386091</guid><dc:creator><![CDATA[Shortyoo]]></dc:creator><pubDate>Sun, 02 Mar 2014 17:07:16 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhafte Variablen durch eine Funktion on Sun, 02 Mar 2014 17:22:59 GMT]]></title><description><![CDATA[<p>Hallo Shortyoo,</p>
<p>warum nimmst du für die Sache mit den Zufallszahlen nicht die schicken <a href="http://www.cplusplus.com/reference/random/" rel="nofollow">Zufallsgeneratoren von C++11</a>. <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>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386096</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Sun, 02 Mar 2014 17:22:59 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhafte Variablen durch eine Funktion on Sun, 02 Mar 2014 17:23:05 GMT]]></title><description><![CDATA[<p>Habe leider gerade keine Zeit, das Programm sauber (und anfängerfreundlich) zu schreiben, um mal zu zeigen, wie das aussehen könnte <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="😞"
    /> . Vielleicht findet sich jemand anderes, der mal zeigt, wie man die Funktionen sauber aufteilt. Das wichtigste wäre wohl, die Zeile</p>
<pre><code>cout &lt;&lt; Satz(1) &lt;&lt; CalcSp(80) &lt;&lt; endl;
</code></pre>
<p>in eine Funktion auszulagern. Diese Zeile wiederholt sich in deinem Originalcode vielfach. Außerdem wird man so das Ausgabeproblem mit der Satz-Funktion los. Das könnte dann ungefähr so aussehen:</p>
<pre><code>void calculation_output(int to, int value)
{
   cout &lt;&lt; from-1 &lt;&lt; &quot; -&gt; &quot; &lt;&lt; from &lt;&lt; &quot;\t\t&quot; &lt;&lt; CalcSp(value) &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2386097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386097</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 02 Mar 2014 17:23:05 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhafte Variablen durch eine Funktion on Sun, 02 Mar 2014 17:51:40 GMT]]></title><description><![CDATA[<p>Ich habe mal eine Klasse entworfen, um die Sache mit den Zufallszahlen in den Hintergrund zu drücken.</p>
<p>Die Klasse <code>uprade</code> lässt sich mit dem Schwellenwert initialisieren (in diesem Fall 80% = 0.8) und gibt beim Aufruf von <code>check</code> ein true oder false zurück, also ob ein Upgradeversuche zu 80% erfolgreich war oder nicht ... zumindest verstehe ich so einen Teil des Programms.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;random&gt;
#include &lt;vector&gt;

class upgrade
{
	public:
		upgrade(double const threshold):
			_engine( 815 ), _rng(0.0,1.0), _threshold( threshold)  {}
		bool check();

	private:
		std::mt19937 _engine;
		std::uniform_real_distribution&lt;double&gt; _rng;
		double const _threshold;
};

bool upgrade::check()
{
	if( _rng( _engine ) &lt; _threshold )
		return true;

	return false;
}

int main()
{
	upgrade upgr( 0.8 );

	for(unsigned int i = 0; i &lt; 10; ++i)
	{
		if( upgr.check() )
			std::cout &lt;&lt; &quot;YES!&quot; &lt;&lt; std::endl;
		else
			std::cout &lt;&lt; &quot;NO!&quot; &lt;&lt; std::endl;
	}

	return 0;
}
</code></pre>
<p>Hope that helps.<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386104</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Sun, 02 Mar 2014 17:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhafte Variablen durch eine Funktion on Sun, 02 Mar 2014 17:57:32 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antwort, Klaus82.<br />
Leider verstehe ich davon nicht viel, bin noch ein Anfänger in C++.^^</p>
<p>SeppJ, versuche gerade genau das zu machen, die Value entnehme ich dann einem Vector <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/2386108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386108</guid><dc:creator><![CDATA[Shortyoo]]></dc:creator><pubDate>Sun, 02 Mar 2014 17:57:32 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhafte Variablen durch eine Funktion on Sun, 02 Mar 2014 18:09:56 GMT]]></title><description><![CDATA[<p>Shortyoo schrieb:</p>
<blockquote>
<p>Vielen Dank für die Antwort, Klaus82.<br />
Leider verstehe ich davon nicht viel, bin noch ein Anfänger in C++.^^</p>
</blockquote>
<p>Nicht schlimm, dann lernst du es eben. <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="😉"
    /></p>
<p>Wo du die Details zu den Zufallsgeneratoren nachlesen kannst, habe ich dir <a href="http://www.c-plusplus.net/forum/p2386096#2386096" rel="nofollow">oben</a> verlinkt. <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>Viele Grüße,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386116</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Sun, 02 Mar 2014 18:09:56 GMT</pubDate></item></channel></rss>