<?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[Ungültige Funktionsargumente behandeln, ja oder nein?]]></title><description><![CDATA[<p>Guten Abend,<br />
mich interessiert, was ihr macht, wenn ein Benutzer einer Funktion ungültige Argumente übergibt, obwohl der Name und/oder die Parameter bereits darauf hinweisen, welche Argumente gültig sind. Also ich mache das nicht, weil ich finde, wenn der Benutzer zu blöd ist die Schnittstellen-Definition zu lesen, dann hat er eben Pech.</p>
<p>Einfaches Beispiel: Fakultät</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

unsigned fak(unsigned n)
{
	if( n==0 || n==1 )
		return 1;
	return n*fak(n-1);
}

int main()
{
	int n = -8;
	std::cout &lt;&lt; fak(n);
}
</code></pre>
<p>a) Würdet ihr es genauso implementieren, wie oben gepostet.<br />
b) Würdet ihr den Parameter zu <code>int n</code> abändern und eine ungültiges Argument behandeln?<br />
c) Weder noch, sondern... (mit Erklärung bitte)</p>
<p>Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307420/ungültige-funktionsargumente-behandeln-ja-oder-nein</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 19:13:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307420.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Aug 2012 15:50:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 15:51:49 GMT]]></title><description><![CDATA[<p>Guten Abend,<br />
mich interessiert, was ihr macht, wenn ein Benutzer einer Funktion ungültige Argumente übergibt, obwohl der Name und/oder die Parameter bereits darauf hinweisen, welche Argumente gültig sind. Also ich mache das nicht, weil ich finde, wenn der Benutzer zu blöd ist die Schnittstellen-Definition zu lesen, dann hat er eben Pech.</p>
<p>Einfaches Beispiel: Fakultät</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

unsigned fak(unsigned n)
{
	if( n==0 || n==1 )
		return 1;
	return n*fak(n-1);
}

int main()
{
	int n = -8;
	std::cout &lt;&lt; fak(n);
}
</code></pre>
<p>a) Würdet ihr es genauso implementieren, wie oben gepostet.<br />
b) Würdet ihr den Parameter zu <code>int n</code> abändern und eine ungültiges Argument behandeln?<br />
c) Weder noch, sondern... (mit Erklärung bitte)</p>
<p>Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245653</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 26 Aug 2012 15:51:49 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 15:54:25 GMT]]></title><description><![CDATA[<p>Es kommt drauf an... Das wichtigste ist denke ich, wie leicht es dann ist, einen Fehler zu finden. Wenn ich die Parameter nicht prüfe und das Programm crasht sofort, ist es kein Problem, weil es sofort auffällt, der Zusammenhang ist klar und der Benutzer der Funktion kann seinen Fehler korrigieren. Aber wenn es dann irgendwo ganz tief im Code, den dann niemand mehr kennt, irgendwelche komischen Auswirkungen hat, die vielleicht erstmal gar nicht auffallen, aber u.U. falsch Ergebnisse produzieren, ist es besser die Parameter im Frondend zu prüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245656</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Sun, 26 Aug 2012 15:54:25 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 16:39:11 GMT]]></title><description><![CDATA[<p>N Abend.</p>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>a) Würdet ihr es genauso implementieren, wie oben gepostet.</p>
</blockquote>
<p>Nope. s.u.</p>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>b) Würdet ihr den Parameter zu <code>int n</code> abändern und eine ungültiges Argument behandeln?<br />
c) Weder noch, sondern... (mit Erklärung bitte)</p>
</blockquote>
<p>Ich würde das</p>
<pre><code class="language-cpp">unsigned fak(unsigned n)
{
    if( n==0 || n==1 )
        return 1;
    return n*fak(n-1);
}

void fak(int) = delete;
void fak(short) = delete;
void fak(long) = delete;
void fak(long long) = delete;
</code></pre>
<p>schreiben, also explizit deleten. Das funktioniert zwar teilweise, ist aber unschön und ghet besser:</p>
<pre><code class="language-cpp">unsigned fak(unsigned n)
{
    if( n==0 || n==1 )
        return 1;
    return n*fak(n-1);
}

template&lt;typename T&gt;
void fak(T) = delete;
</code></pre>
<p>Hier geht statt deleten auch einfach eine static assertion oder <code>enable_if</code> .<br />
Wieso? Nun, die Typ-falschheit wird direkt einen Compiler-Fehler produzieren.<br />
Falls der User sowieso <code>(unsigned)-8</code> da stehen hat, ist das eben sein Problem; gute Progger machen sowieso range-checks beim extrahieren von Skalaren (gerade aus <code>std::cin</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245669</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 26 Aug 2012 16:39:11 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 16:42:20 GMT]]></title><description><![CDATA[<p>Naja und sowieso: Einfach darauf vertrauen, dass der User schlau genug ist, range-checks anzuwenden.</p>
<p>Wenns wirklich kritisch ist, mach eben ne assertion/exception.</p>
<p>BTW: ist 0! nicht 0? Ich meine, 0 ist 0 oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245679</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 26 Aug 2012 16:42:20 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 16:48:11 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>b) Würdet ihr den Parameter zu <code>int n</code> abändern und eine ungültiges Argument</p>
</blockquote>
<p>Ja, und zwar in Anlehnung an die Faustregel, daß Programme, die so gestaltet sind, daß sie durch den „dümmsten“ anzunehmenden Benutzer zum Absturz gebracht werden können, schlecht geschrieben sind.</p>
<p><a href="http://de.wikipedia.org/wiki/D%C3%BCmmster_anzunehmender_User" rel="nofollow">http://de.wikipedia.org/wiki/Dümmster_anzunehmender_User</a></p>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>. Also ich mache das nicht, weil ich finde, wenn der Benutzer zu blöd ist die Schnittstellen-Definition zu lesen, dann hat er eben Pech.</p>
</blockquote>
<p>Hier wäre auch die Frage, was denn der Maßstab sein soll.<br />
Ein Hochschulprofessor könnte da wahrscheinlich noch ganz andere Geschütze<br />
auffahren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245680</guid><dc:creator><![CDATA[redrew99]]></dc:creator><pubDate>Sun, 26 Aug 2012 16:48:11 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 17:36:33 GMT]]></title><description><![CDATA[<p>Mechanics schrieb:</p>
<blockquote>
<p>Es kommt drauf an...</p>
</blockquote>
<p>Und wie würdest du es bei dem Fakultät-Beispiel machen?</p>
<p>Sone schrieb:</p>
<blockquote>
<p>static assertion oder <code>enable_if</code> .</p>
</blockquote>
<p>Stimmt, daran hab ich gerade irgendwie nicht gedacht. <code>static assertion</code> scheint allgemein oft verwendet zu werden, oder?</p>
<p>Sone schrieb:</p>
<blockquote>
<p>BTW: ist 0! nicht 0? Ich meine, 0 ist 0 oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Nein, dann würdest du am Ende ja immer mit 0 multiplizieren und es würde immer 0 herauskommen.</p>
<p>redrew99 schrieb:</p>
<blockquote>
<p>Ja, und zwar in Anlehnung an die Faustregel, daß Programme, die so gestaltet sind, daß sie durch den „dümmsten“ anzunehmenden Benutzer zum Absturz gebracht werden können, schlecht geschrieben sind.</p>
</blockquote>
<p>Stimmt, das ist auch ein Argument, daran hab ich auch nicht gedacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245696</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 26 Aug 2012 17:36:33 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 18:03:35 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>static assertion oder <code>enable_if</code> .</p>
</blockquote>
<p>Stimmt, daran hab ich gerade irgendwie nicht gedacht. <code>static assertion</code> scheint allgemein oft verwendet zu werden, oder?</p>
</blockquote>
<p>Willst du mich jetzt vera<s>rschen</s>lbern oder was?<br />
Ich wollt' nur nen Weg vorschlagen, andere Typen die implizit in unsigned konvertiert werden können, auszuschließen. Man muss nicht gleich böse werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245701</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 26 Aug 2012 18:03:35 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 18:04:45 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>BTW: ist 0! nicht 0? Ich meine, 0 ist 0 oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Nein, dann würdest du am Ende ja immer mit 0 multiplizieren und es würde immer 0 herauskommen.</p>
</blockquote>
<p>Nein, was ich meine ist:</p>
<p>Alle Zahlen kleiner als die eigentliche Zahl - da gibt es gar keine. Also 0, oder nicht? <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/2245702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245702</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 26 Aug 2012 18:04:45 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 18:20:51 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Mechanics schrieb:</p>
<blockquote>
<p>Es kommt drauf an...</p>
</blockquote>
<p>Und wie würdest du es bei dem Fakultät-Beispiel machen?</p>
</blockquote>
<p>Grad bei so &quot;mathematischen&quot; Funktionen, wo es auch (oder vor allem) auf Wertebereiche ankommt, sollte man versuchen, von vornherein so viele falsche Eingaben zu verhindern, wie möglich. Von dem her find ich die Antwort von Sone nicht verkehrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245710</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Sun, 26 Aug 2012 18:20:51 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 18:24:14 GMT]]></title><description><![CDATA[<p>wtf!? <code>0! = 1</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245712</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sun, 26 Aug 2012 18:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 18:32:42 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>static assertion oder <code>enable_if</code> .</p>
</blockquote>
<p>Stimmt, daran hab ich gerade irgendwie nicht gedacht. <code>static assertion</code> scheint allgemein oft verwendet zu werden, oder?</p>
</blockquote>
<p>Willst du mich jetzt vera<s>rschen</s>lbern oder was?<br />
Ich wollt' nur nen Weg vorschlagen, andere Typen die implizit in unsigned konvertiert werden können, auszuschließen. Man muss nicht gleich böse werden.</p>
</blockquote>
<p>Nö, das war eine ernst gemeinte Aussage und Frage.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245715</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 26 Aug 2012 18:32:42 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 19:11:33 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28547">@Sone</a><br />
Keiner will dich veralbern, wir wollen dich bloss loswerden.<br />
Weil du ein unglaublicher Depp bist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245730</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 26 Aug 2012 19:11:33 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 19:17:00 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Gugelmoser schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>static assertion oder <code>enable_if</code> .</p>
</blockquote>
<p>Stimmt, daran hab ich gerade irgendwie nicht gedacht. <code>static assertion</code> scheint allgemein oft verwendet zu werden, oder?</p>
</blockquote>
<p>Willst du mich jetzt vera<s>rschen</s>lbern oder was?<br />
Ich wollt' nur nen Weg vorschlagen, andere Typen die implizit in unsigned konvertiert werden können, auszuschließen. Man muss nicht gleich böse werden.</p>
</blockquote>
<p>Nö, das war eine ernst gemeinte Aussage und Frage.</p>
</blockquote>
<p>Na dann...</p>
<p>Wenn der Compiler genügend C++11 Unterstützung hat, nehme ich static_assert. Das ist viel besser zu lesen und erlaubt gleich eine Fehlermeldung die der Compiler ausgeben kann (und kein Kommentar, zu dem man, wenn man nicht in ner IDE kompiliert, mühselig gehen muss).</p>
<p>Aber was hat dein Thema mit static assertions zu tun? Hatte das Gefühl du willst das ins lächerliche ziehen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245733</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 26 Aug 2012 19:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 19:51:22 GMT]]></title><description><![CDATA[<p>Wie sollte der Author einer mathematischen Funktion dem Nutzer vorschreiben, welche Wertebereiche okay sind?</p>
<p>Man könnte allerhöchstens mit einem (Runtime) assert prüfen ob n groß genug ist, um mit fak den Wertebereich von unsigned zu sprengen. Aber das würde wohl auch lästig langsame Debugbuilds produzieren.</p>
<p>Andere Typen deeten ist ja wohl auch ne dumme Idee. Wieso sollte man die Funktion so aufrufen müssen?</p>
<pre><code class="language-cpp">fak(unsigned(33))
</code></pre>
<p>Nene ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245747</guid><dc:creator><![CDATA[Ethon_]]></dc:creator><pubDate>Sun, 26 Aug 2012 19:51:22 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 19:54:19 GMT]]></title><description><![CDATA[<p>Wesentlich schlimmer als negative Zahlen ist ein fehlender Test, ob ein Überlauf stattfindet. Man sieht sofort, dass fak(-1) irgendwie suboptimal ist. Das ist ein einfacher Fehler, um den man sich nicht kümmern muss, weil er sofort auffällt. Aber ob fak(125) funktioniert? Das geht eventuell durch das Review durch, ohne dass das jemand bemerkt.</p>
<p>//edit: Ethon_ war schneller <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/2245748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245748</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 26 Aug 2012 19:54:19 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 20:15:10 GMT]]></title><description><![CDATA[<p>Ethon_ schrieb:</p>
<blockquote>
<p>Andere Typen deeten ist ja wohl auch ne dumme Idee.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Jo, wie gesagt: einfach range checks, vielleicht ne assertion. Ne assertion wäre wohl das Beste.</p>
<pre><code class="language-cpp">unsigned long long fak_impl(uint8_t n) 
{ 
    if( n == 0 || n == 1 ) 
        return 1; 
    return n * fak(n-1); 
} 

unsigned long long fak(uint8_t n) 
{ 
    assert( n &lt; 26 );
    return fak_impl(n); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2245753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245753</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 26 Aug 2012 20:15:10 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 20:55:53 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Ethon_ schrieb:</p>
<blockquote>
<p>Andere Typen deeten ist ja wohl auch ne dumme Idee.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Jo, wie gesagt: einfach range checks, vielleicht ne assertion. Ne assertion wäre wohl das Beste.</p>
<pre><code class="language-cpp">unsigned long long fak_impl(uint8_t n) 
{ 
    if( n == 0 || n == 1 ) 
        return 1; 
    return n * fak(n-1); 
} 

unsigned long long fak(uint8_t n) 
{ 
    assert( n &lt; 26 );
    return fak_impl(n); 
}
</code></pre>
</blockquote>
<p>fak(258) ist ok?</p>
<p>Das muss noch geübt werden <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2245768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245768</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 26 Aug 2012 20:55:53 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Sun, 26 Aug 2012 21:03:55 GMT]]></title><description><![CDATA[<p>Man muss sich auch fragen, wann man eine Fakulatät braucht.<br />
Fakultäten werden wohl eher nicht mit negativen Argumenten verwendet werden.<br />
Also bleibt der Überlauf. Der ist ein größeres Problem.<br />
Aber ein Range-Check müsste genügen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245769</guid><dc:creator><![CDATA[IrgendeinName]]></dc:creator><pubDate>Sun, 26 Aug 2012 21:03:55 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Mon, 27 Aug 2012 09:19:03 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>wenn ein Benutzer einer Funktion ungültige Argumente übergibt,</p>
</blockquote>
<p>Das impliziert für mich folgendes: Mit &quot;Benutzer&quot; ist hier ein Entwickler gemeint, der deine Funktion aufruft, also geht es bei deiner Funktion um eine Bibliotheksfunktion. Es geht hier offenbar <em>nicht</em> um irgendeinen Vollhonk vor der Tastatur, der bei &quot;Alter&quot; irgendeinen Buchstabensalat eintippt. Letzteren müsste der Entwickler, der die Eingabe programmiert, natürlich abtesten.</p>
<p>Im Falle der Fakultätsfunktion würde ich <em>dokumentieren</em>, dass sie nur für Werte von 0..max aufgerufen werden darf. Grund: Der Entwickler entscheidet, mit welchen Werten sie aufgerufen wird. Ruft er sie mit einer Nutzereingabe auf, muss er die Nutzereingabe sowieso überprüfen. Ruft er sie mit einer passenden Konstanten auf (z.B. fak(5)), dann ist von vornherein klar, dass das ein gültiges Argument ist und ein Range-Check wäre ein unnötiger Performanceverlust. Wenn das Argument irgendeine Variable ist, ist es performancetechnisch egal, ob der Entwickler den Range-Check macht oder ob ich ihn mache. MIt der Fehlerbehandlung muss er sich so oder so rumschlagen, und dann soll ers lieber konsistent auf seine Weise machen als sich von mir irgendeine Exception vorschreiben zu lassen, die er fangen muss.</p>
<p>Es gibt Dinge, auf die man gefasst sein muss, das sind z.B. unterbrochene Netzwerkverbindungen und Fehleingaben an der Tastatur. Gegen unfähige Programmierer sollte man sich nicht kostspielig absichern, damit bestraft man nur die fähigen Programmierer. Assertions sind da eine Grauzone, in API-Funktionen kann man sie einbauen und beugt damit ggf. Flüchtigkeitsfehlern vor.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<pre><code class="language-cpp">unsigned long long fak_impl(uint8_t n) 
{ 
    if( n == 0 || n == 1 ) 
        return 1; 
    return n * fak(n-1); 
} 

unsigned long long fak(uint8_t n) 
{ 
    assert( n &lt; 26 );
    return fak_impl(n); 
}
</code></pre>
</blockquote>
<p>fak(258) ist ok?</p>
</blockquote>
<p>Die Funktion ist ok. Bei fak(258) sollte ein statischer Checker den Überlauf finden und bemängeln. Wenn ich uint8_t als Parameter festlege impliziert das Werte &lt; 256, Verstöße dagegen kann ich in der Funktion auch nicht abprüfen.<br />
Die 26 im assert ist für mich eher fraglich - kommt aber drauf an, wie groß unsigned long long ist...</p>
<p>Spielerei mit statischer LUT:</p>
<pre><code class="language-cpp">#include &lt;cstdint&gt;
#include &lt;limits&gt;
#include &lt;array&gt;
#include &lt;cassert&gt;

constexpr unsigned long long cfak(uint8_t N)
{ return N &lt;= 1 ? 1 : N * cfak(N-1); }

constexpr bool calculable(uint8_t N)
{ return N==0 ? true : (cfak(N-1) &lt; std::numeric_limits&lt;unsigned long long&gt;::max()/N); }

template &lt;uint8_t N, bool isCalculable = calculable(N)&gt;
struct fakTable
{
  typedef typename fakTable&lt;N+1&gt;::type type;
};

template &lt;uint8_t N&gt;
struct fakTable&lt;N, false&gt;
{
  typedef fakTable&lt;N, false&gt; type;

  const static uint8_t Nmax = N;
  const static std::array&lt;unsigned long long,N&gt; values;
};

template &lt;uint8_t N&gt;
const std::array&lt;unsigned long long,N&gt; fakTable&lt;N, false&gt;::values = []()
{
  std::array&lt;unsigned long long, N&gt; v;
  for (uint8_t i = 0; i &lt; N; ++i) v[i] = cfak(i);
  return v;
}();

unsigned long long fak(uint8_t n)
{
  typedef typename fakTable&lt;0&gt;::type table;
  assert(n &lt; table::Nmax);
  return table::values[n];
}

#include &lt;iostream&gt;
using std::cout;

int main()
{
  cout &lt;&lt; fak(1) &lt;&lt; '\n';
  cout &lt;&lt; fak(5) &lt;&lt; '\n';
  cout &lt;&lt; fak(10) &lt;&lt; '\n';
  cout &lt;&lt; fak(11) &lt;&lt; '\n';
  cout &lt;&lt; fak(12) &lt;&lt; '\n';
  cout &lt;&lt; fak(32) &lt;&lt; '\n';
}
</code></pre>
<p>Hab leider keinen Weg gefunden, ein Array mit compilezeit-berechneter Länge und compilezeit-berechneten Einträgen zu erstellen...<br />
Nachtrag: der gcc-4.5.1 (ideone) kann irgendweshalb fakTable&lt;0&gt;::type nicht finden <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/2245841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245841</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 27 Aug 2012 09:19:03 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Mon, 27 Aug 2012 13:06:54 GMT]]></title><description><![CDATA[<p>Hier was ideone-Compatibles</p>
<pre><code class="language-cpp">#include &lt;cstdint&gt;
#include &lt;limits&gt;
#include &lt;array&gt;
#include &lt;cassert&gt;
#include &lt;cstddef&gt;

template &lt;typename T, unsigned N&gt; struct cfak
{ static const T value = T(-1) / N &lt; cfak&lt;T, N-1&gt;::value ? 0 : N * cfak&lt;T, N-1&gt;::value; };
template &lt;typename T&gt; struct cfak&lt;T, 0&gt;
{ static const T value = 1; };

template &lt;typename T, unsigned N = 0, bool = cfak&lt;T, N&gt;::value == 0&gt;
struct max_calculable
{ static const unsigned value = max_calculable&lt;T, N+1&gt;::value; };
template &lt;typename T, unsigned N&gt;
struct max_calculable&lt;T, N, true&gt;
{ static const unsigned value = N; };

template &lt;std::size_t... i&gt; struct indexes;
template &lt;std::size_t N, typename = indexes&lt;&gt;&gt; struct make_indexes;
template &lt;std::size_t N, std::size_t... i&gt; struct make_indexes&lt;N, indexes&lt;i...&gt;&gt;
{ typedef typename make_indexes&lt;N-1, indexes&lt;0, (i+1)...&gt;&gt;::type type; };
template &lt;std::size_t... i&gt; struct make_indexes&lt;0, indexes&lt;i...&gt;&gt;
{ typedef indexes&lt;i...&gt; type; };

template &lt;typename T, typename = typename make_indexes&lt;max_calculable&lt;T&gt;::value&gt;::type&gt;
struct fakTable;

template &lt;typename T, std::size_t... i&gt;
struct fakTable&lt;T, indexes&lt;i...&gt;&gt;
{ static const T values[sizeof...(i)]; };

template &lt;typename T, std::size_t... i&gt;
const T fakTable&lt;T, indexes&lt;i...&gt;&gt;::values[sizeof...(i)] = { cfak&lt;T, i&gt;::value... };

unsigned long long fak(uint8_t n)
{
  assert(n &lt; max_calculable&lt;unsigned long long&gt;::value);
  return fakTable&lt;unsigned long long&gt;::values[n];
}

#include &lt;iostream&gt;
using std::cout;

int main()
{
  cout &lt;&lt; fak(1) &lt;&lt; '\n';
  cout &lt;&lt; fak(5) &lt;&lt; '\n';
  cout &lt;&lt; fak(10) &lt;&lt; '\n';
  cout &lt;&lt; fak(11) &lt;&lt; '\n';
  cout &lt;&lt; fak(12) &lt;&lt; '\n';
  cout &lt;&lt; fak(21) &lt;&lt; '\n';
  cout &lt;&lt; fak(22) &lt;&lt; '\n';
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2245912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245912</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 27 Aug 2012 13:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Mon, 27 Aug 2012 13:26:47 GMT]]></title><description><![CDATA[<p>Die Mehrzahl von 'index' ist 'indices' :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245925</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 27 Aug 2012 13:26:47 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Mon, 27 Aug 2012 13:51:42 GMT]]></title><description><![CDATA[<p>Im Englischen ist beides erlaubt: <a href="http://dict.leo.org/ende?lp=ende&amp;lang=de&amp;searchLoc=0&amp;cmpType=relaxed&amp;sectHdr=on&amp;spellToler=&amp;search=indexes" rel="nofollow">http://dict.leo.org/ende?lp=ende&amp;lang=de&amp;searchLoc=0&amp;cmpType=relaxed&amp;sectHdr=on&amp;spellToler=&amp;search=indexes</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245941</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Mon, 27 Aug 2012 13:51:42 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Mon, 27 Aug 2012 16:39:33 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<pre><code class="language-cpp">unsigned long long fak(uint8_t n)
{
  typedef typename fakTable&lt;0&gt;::type table;
  assert(n &lt; table::Nmax);
  return table::values[n];
}
</code></pre>
</blockquote>
<p>Wieso nicht <code>uint64_t</code> als Rückgabetyp, pumuckl?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245989</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 27 Aug 2012 16:39:33 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Mon, 27 Aug 2012 16:40:38 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<pre><code class="language-cpp">unsigned long long fak(uint8_t n)
{
  typedef typename fakTable&lt;0&gt;::type table;
  assert(n &lt; table::Nmax);
  return table::values[n];
}
</code></pre>
</blockquote>
<p>Wieso nicht <code>uint64_t</code> als Rückgabetyp, pumuckl?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Hab ich gar nicht dran gedacht.<br />
Mach aber lieber** <code>uint_least64_t</code> **draus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2245990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2245990</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 27 Aug 2012 16:40:38 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Mon, 27 Aug 2012 18:24:49 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<pre><code class="language-cpp">unsigned long long fak(uint8_t n)
{
  typedef typename fakTable&lt;0&gt;::type table;
  assert(n &lt; table::Nmax);
  return table::values[n];
}
</code></pre>
</blockquote>
<p>Wieso nicht <code>uint64_t</code> als Rückgabetyp, pumuckl?</p>
</blockquote>
<p>Weil long long mindestens(!) 64 Bit hat. Wurde mit C++11 in den Standard aufgenommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246022</guid><dc:creator><![CDATA[Cyres]]></dc:creator><pubDate>Mon, 27 Aug 2012 18:24:49 GMT</pubDate></item><item><title><![CDATA[Reply to Ungültige Funktionsargumente behandeln, ja oder nein? on Mon, 27 Aug 2012 18:39:30 GMT]]></title><description><![CDATA[<p>Cyres schrieb:</p>
<blockquote>
<p>Weil long long mindestens(!) 64 Bit hat. Wurde mit C++11 in den Standard aufgenommen.</p>
</blockquote>
<p>Ah <strong>mindestens</strong>. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> Demnach ist es also schnuppe, ob <code>unsigned long long</code> oder <code>uint_least64_t</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2246025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2246025</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 27 Aug 2012 18:39:30 GMT</pubDate></item></channel></rss>