<?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[Eigenen Datentyp definieren]]></title><description><![CDATA[<p>Hallo, ich habe ein Funktion mit einem Parameter x. x ist ein unsigned integer mit einer Schranke S(z.B. S=64).</p>
<p>Statt jetzt sowas zu schreiben:</p>
<pre><code class="language-cpp">void Funktion(unsigned int x) {
   _ASSERT(x&lt;=S); //Sicherstellen das die Schranke eingehalten wird
   x=sqrt(x); //Irgendwas mit x machen
}
</code></pre>
<p>möchte ich das man garnicht erst ein Falsches x eingeben kann/sollte.</p>
<p>Ich habe mir gedacht ich &quot;definiere mir einen eigenen Typ&quot;</p>
<pre><code class="language-cpp">struct UnsignedMax64 {
	unsigned int Value;
	UnsignedMax64(unsigned int Value) {
		_ASSERT(Value&lt;=64);
		this-&gt;Value = Value;
	}
};
</code></pre>
<p>und schreib dann sowas</p>
<pre><code class="language-cpp">void Funktion(UnsignedMax64 x) {
   x.Value=sqrt(x.Value); //Irgendwas mit x machen
}
</code></pre>
<p>Man sieht jetzt zumindest ein wenig am Typ was man eingeben kann und was nicht.<br />
Zudem spar ich mir nun jedesmal die Abfrage ob der Wert von x zuslässig ist.<br />
Findet ihr das Sinnvoll? Wie würdet ihr das Lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306928/eigenen-datentyp-definieren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 03:02:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306928.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Aug 2012 21:19:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigenen Datentyp definieren on Fri, 10 Aug 2012 21:19:00 GMT]]></title><description><![CDATA[<p>Hallo, ich habe ein Funktion mit einem Parameter x. x ist ein unsigned integer mit einer Schranke S(z.B. S=64).</p>
<p>Statt jetzt sowas zu schreiben:</p>
<pre><code class="language-cpp">void Funktion(unsigned int x) {
   _ASSERT(x&lt;=S); //Sicherstellen das die Schranke eingehalten wird
   x=sqrt(x); //Irgendwas mit x machen
}
</code></pre>
<p>möchte ich das man garnicht erst ein Falsches x eingeben kann/sollte.</p>
<p>Ich habe mir gedacht ich &quot;definiere mir einen eigenen Typ&quot;</p>
<pre><code class="language-cpp">struct UnsignedMax64 {
	unsigned int Value;
	UnsignedMax64(unsigned int Value) {
		_ASSERT(Value&lt;=64);
		this-&gt;Value = Value;
	}
};
</code></pre>
<p>und schreib dann sowas</p>
<pre><code class="language-cpp">void Funktion(UnsignedMax64 x) {
   x.Value=sqrt(x.Value); //Irgendwas mit x machen
}
</code></pre>
<p>Man sieht jetzt zumindest ein wenig am Typ was man eingeben kann und was nicht.<br />
Zudem spar ich mir nun jedesmal die Abfrage ob der Wert von x zuslässig ist.<br />
Findet ihr das Sinnvoll? Wie würdet ihr das Lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240869</guid><dc:creator><![CDATA[Dudeldu]]></dc:creator><pubDate>Fri, 10 Aug 2012 21:19:00 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenen Datentyp definieren on Sat, 11 Aug 2012 05:58:45 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">UnsignedMax64 foo(57);
foo.Value += 30;
Funktion(foo);
</code></pre>
<p><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/2240905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240905</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sat, 11 Aug 2012 05:58:45 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenen Datentyp definieren on Sat, 11 Aug 2012 08:02:29 GMT]]></title><description><![CDATA[<p>Dudeldu schrieb:</p>
<blockquote>
<p>Findet ihr das Sinnvoll? Wie würdet ihr das Lösen?</p>
</blockquote>
<p>Ganz einfach: Exceptions. Das ist genau was du willst.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
std::string tostr(T const&amp; t)  ///ACHTUNG! Nur für die Fehlermeldung!
{
    std::ostringstream stream;
    stream &lt;&lt; t;
    return stream.str();
}

void Funktion(unsigned x) 
{
   if(x &gt; S) //Sicherstellen das die Schranke eingehalten wird
       throw std::out_of_range(&quot;Funktion(&quot; + tostr(x) + &quot;) called with value greater &quot; + tostr(S) + &quot;!&quot;);

   x=sqrt(x); //Irgendwas mit x machen
}
</code></pre>
<p>Wenn der Fehler den weiteren Verlauf des Programms unsinnig oder unmöglich macht, kommen Assertions in Frage. Diese sind allerdings nur im Debugmode &quot;aktiv&quot;. <strong>Also eigentlich abhängig vom Code</strong>, denn wenn der dann letzten Endes Bugfrei ist, braucht man keine Assertions mehr (-&gt; sie würden sowieso nie aktiviert).</p>
<p>Also merke dir: Ist ein Fehler <strong>unvorhersehbar</strong> (bspw. Input, Filestreams, o.ä.) dann kommen immer Exceptions in Frage. Ist ein Fehler abhängig von deinem <strong>Code</strong>, nimm Assertions (denn wenn die Bedingung dann fehlschlägt, heißt das, dass es einen Bug gibt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240926</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 11 Aug 2012 08:02:29 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenen Datentyp definieren on Sat, 11 Aug 2012 12:38:44 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12051">@Dobi</a><br />
Ja, meine Lösung ist z.Z. sehr Fehleranfällig. Deshalb wollte ich wissen wie man das besser macht. Müsste natürlich bei jeder Änderung von Value sicherstellen das es die Schranke nicht überschreitet innerhalb des Structs, wäre wohl ein ziemlicher overkill.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28547">@Sone</a><br />
Ok, dann wird wohl ein anderer Programmiere einmal auf die Nase fallen müssen(_ASSERT), wenn er einen ungültigen Parameter eingibt.</p>
<p>Dachte man könnte das irgendwie so hinbiegen das andere direkt sehen welche Werte<br />
unsinn sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240979</guid><dc:creator><![CDATA[Dudeldu]]></dc:creator><pubDate>Sat, 11 Aug 2012 12:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenen Datentyp definieren on Sat, 11 Aug 2012 12:49:11 GMT]]></title><description><![CDATA[<p>Dudeldu schrieb:</p>
<blockquote>
<p>Man sieht jetzt zumindest ein wenig am Typ was man eingeben kann und was nicht.<br />
Zudem spar ich mir nun jedesmal die Abfrage ob der Wert von x zuslässig ist.<br />
Findet ihr das Sinnvoll? Wie würdet ihr das Lösen?</p>
</blockquote>
<p>Sehr sinnvoll!<br />
Das ist so ziemlich das Gegenteil von &quot;Garbage in, Garbage out&quot; und Du bewahrst die Benutzer Deines Interfaces vor allerlei Schwierigkeiten und Mißverständnissen.<br />
B. Stroustrup betont in seiner Keynote zur Going Native 2012 genau diesen Punkt in der modernen C++ Entwicklung.<br />
Irgendwo bei channel9 gibt's seinen Vortrag als Video zum Download.</p>
<p>Nachteil: nochmehr Kopfzerbrechen beim Interfacedesign...(Verfolgt man Deinen Ansatz konsequent macht das echt Arbeit....)<br />
Vorteil, den Du noch nicht genannt hast: weniger Dokumentation (die nachher eh keiner liest...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240984</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Sat, 11 Aug 2012 12:49:11 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenen Datentyp definieren on Sat, 11 Aug 2012 12:58:11 GMT]]></title><description><![CDATA[<p>Wie wäre denn folgendes?</p>
<pre><code class="language-cpp">//internal_typedefs.h
typedef unsigned int uint_max_value_64;

//public_interface.h
#include &quot;internal_typedefs.h&quot;

void foo(uint_max_value_64 val);
</code></pre>
<p>Eine vermutlich überdesignte Alternative wäre ein eigener Integertyp, für den alle Operatoren (natürlich inline) überladen sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2240986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240986</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sat, 11 Aug 2012 12:58:11 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenen Datentyp definieren on Sat, 11 Aug 2012 13:56:11 GMT]]></title><description><![CDATA[<p>Simpel, frei von Exceptions und Assertions, dafür aber eher unkomfortabel zu benutzen wäre sowas:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
class UnsignedMax64 {
public:
    UnsignedMax64(unsigned int value) : value_(Clamp(value)) {}
    unsigned int Get() { return value_; }
    void Set(unsigned int value) { value_ = Clamp(value); }
    static unsigned int Clamp(unsigned int value) {
        return std::min(value, 64U);
    }
private:
    unsigned int value_;
};
int main()
{
    UnsignedMax64 v(123);
    std::cout &lt;&lt; v.Get() &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>Und damit's ein Bischen mehr Spaß macht: <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
template &lt;typename T, T MIN, T MAX&gt;
class Clamped {
public:
    Clamped(const T&amp; value) : value_(Clamp(value)) {}
    const T&amp; Get() { return value_; }
    void Set(const T&amp; value) { value_ = Clamp(value); }
    static T Clamp(const T&amp; value) {
        return std::max(MIN, std::min(value, MAX));
    }
private:
    T value_;
};
int main()
{
    Clamped&lt;int, 0, 64&gt; v(123);
    std::cout &lt;&lt; v.Get() &lt;&lt; &quot;\n&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2240999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2240999</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sat, 11 Aug 2012 13:56:11 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenen Datentyp definieren on Mon, 13 Aug 2012 18:47:23 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12051">@Dobi</a></p>
<p>Die Funktion kann zwar nun nicht mehr falsche Eingaben bekommen, aber letztendlich wurde das Problem nur eine Ebene davor verfrachtet.</p>
<p>Der Nutzer der Funktion merkt u.U. nicht das es keinen Unterschied macht ob er 64, 123 oder 999 eingibt, wenn er nicht geschnallt hat das UnsignedMax64 Falscheingaben willkürlich auf 64 biegt.</p>
<p>Ich bin für's verbieten Falscher eingaben(am besten zur Compilezeit) oder für's Ohrfeigen mit Fehlermeldung/Exception o.ä. Aber nicht unsinnige Eingaben durch Geradebiegen verstecken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241577</guid><dc:creator><![CDATA[Dudeldu]]></dc:creator><pubDate>Mon, 13 Aug 2012 18:47:23 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenen Datentyp definieren on Mon, 13 Aug 2012 18:58:25 GMT]]></title><description><![CDATA[<p>Joa, kommt halt immer drauf an, wofür man es braucht. Falls es um einen Slider (also das Eingabelement), dem man statt ihn umherzuschieben auch eine Zahl eingeben kann, geht, ist Clampen gar nicht so verkehrt. In anderen Situationen ist es der größte Müll und das Programm muss dem Benutzer natürlich ins Gesicht springen. Um was für eine Situation es sich hier handelt, kannst du nur wissen. <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="😉"
    /><br />
Also setz' ne Assertion davor wenn der Programmierer doof war, oder schmeiss ne Exception/zeig ne Meldung/sonstwas wenn der Benutzer schuld ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241578</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Mon, 13 Aug 2012 18:58:25 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenen Datentyp definieren on Mon, 13 Aug 2012 19:09:31 GMT]]></title><description><![CDATA[<p>Dudeldu schrieb:</p>
<blockquote>
<p>Ich bin für's verbieten Falscher eingaben(am besten zur Compilezeit)</p>
</blockquote>
<p>Das geht nur mit non-type Template-Parametern (oder evt. Makros).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241583</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 13 Aug 2012 19:09:31 GMT</pubDate></item></channel></rss>