<?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[range-checked vector]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hätte gerne einen range-checked vector, bei dem bei Aufruf des []-Operators automatisch at() aufgerufen wird. Muss man das sich per Hand programmieren oder gibt es das schon in der Boost/STL/sonstwo?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/225964/range-checked-vector</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 03:01:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/225964.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Oct 2008 15:39:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 15:39:05 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hätte gerne einen range-checked vector, bei dem bei Aufruf des []-Operators automatisch at() aufgerufen wird. Muss man das sich per Hand programmieren oder gibt es das schon in der Boost/STL/sonstwo?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605613</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Mon, 27 Oct 2008 15:39:05 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 15:39:49 GMT]]></title><description><![CDATA[<p>Was spricht dagegen, at() aufzurufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605615</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 27 Oct 2008 15:39:49 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 16:11:48 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Was spricht dagegen, at() aufzurufen?</p>
</blockquote>
<p>Das wird mir zu unübersichtlich und ich möchte per Präprozessoranweisung im ganzen Programm zwischen normalen und range-checked Vektoren umschalten können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605631</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Mon, 27 Oct 2008 16:11:48 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 16:30:34 GMT]]></title><description><![CDATA[<p>ingobulla schrieb:</p>
<blockquote>
<p>Das wird mir zu unübersichtlich</p>
</blockquote>
<p>Dann bleibt dir vermutlich nichts anderes übrig als die Funktionalität selber einzubauen.</p>
<blockquote>
<p>und ich möchte per Präprozessoranweisung im ganzen Programm zwischen normalen und range-checked Vektoren umschalten können.</p>
</blockquote>
<p>Warum nicht per typedef?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605639</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 27 Oct 2008 16:30:34 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 16:35:45 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<blockquote>
<p>und ich möchte per Präprozessoranweisung im ganzen Programm zwischen normalen und range-checked Vektoren umschalten können.</p>
</blockquote>
<p>Warum nicht per typedef?</p>
</blockquote>
<p>stimmt, das wäre natürlich das angemessenere Sprachelement</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605641</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Mon, 27 Oct 2008 16:35:45 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 17:03:25 GMT]]></title><description><![CDATA[<p>ingobulla schrieb:</p>
<blockquote>
<p>...ich möchte per Präprozessoranweisung im ganzen Programm zwischen normalen und range-checked Vektoren umschalten können.</p>
</blockquote>
<p>Dann nimm doch den Compilerschalter &quot;-O&quot; (oder was Dein Compiler gerade so hergibt).... es kann gut sein, dass Deine STL das bereits anbietet (vector::operator[] in &quot;Debug-Modus&quot; checked - und sonst unchecked).</p>
<p>Warum das Rad neu erfinden ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605652</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 27 Oct 2008 17:03:25 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 17:22:34 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Dann nimm doch den Compilerschalter &quot;-O&quot; (oder was Dein Compiler gerade so hergibt).... es kann gut sein, dass Deine STL das bereits anbietet (vector::operator[] in &quot;Debug-Modus&quot; checked - und sonst unchecked).</p>
</blockquote>
<p>Ich benutze gcc und verwende den maximalen Debug-Level, ohne dass ein Range-Check erfolgt. Von daher scheint das mit gcc nicht zu funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605661</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Mon, 27 Oct 2008 17:22:34 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 17:40:02 GMT]]></title><description><![CDATA[<p>Leite von vector ab, und überlade den [] - Operator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605675</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 27 Oct 2008 17:40:02 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 18:06:39 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Leite von vector ab, und überlade den [] - Operator.</p>
</blockquote>
<p>Schlechte Idee, da <code>std::vector</code> nicht als Basisklasse konzipiert ist (z.B. kein virtueller Destruktor).</p>
<p>Benutze <code>at()</code> , wenn du Range-Checks willst, dafür ist die Funktion da. Oder programmier halt so, dass es keine Checks braucht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605685</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 27 Oct 2008 18:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 18:07:06 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Leite von vector ab, und überlade den [] - Operator.</p>
</blockquote>
<p>Der wird dann aber eher überdeckt und net überladen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605686</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 27 Oct 2008 18:07:06 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 18:19:59 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>Leite von vector ab, und überlade den [] - Operator.</p>
</blockquote>
<p>Schlechte Idee, da <code>std::vector</code> nicht als Basisklasse konzipiert ist (z.B. kein virtueller Destruktor).</p>
</blockquote>
<p>Stroustrup empfiehlt das in &quot;Die C++ Programmiersprache&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605694</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 27 Oct 2008 18:19:59 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 18:26:50 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>Leite von vector ab, und überlade den [] - Operator.</p>
</blockquote>
<p>Schlechte Idee, da <code>std::vector</code> nicht als Basisklasse konzipiert ist (z.B. kein virtueller Destruktor).</p>
</blockquote>
<p>btw ... spielt das nicht nur dann eine Rolle, wenn ich einen Zeiger auf einen Vektor anlege und den dann auf ein Objekt meiner abgeleiteten Klasse zeigen lasse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605700</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 27 Oct 2008 18:26:50 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 18:56:22 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>spielt das nicht nur dann eine Rolle, wenn ich einen Zeiger auf einen Vektor anlege und den dann auf ein Objekt meiner abgeleiteten Klasse zeigen lasse?</p>
</blockquote>
<p>Jupp und wenn das abgeleitete Objekt keine zusätzlichen Member-Variablen beinhaltet und einen &quot;leeren&quot; Destruktor hat, sollte es bei allen gängigen Compilern meiner Meinung nach keine Probleme geben (schön ist's trotzdem nicht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605717</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 27 Oct 2008 18:56:22 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Mon, 27 Oct 2008 19:11:07 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Stroustrup empfiehlt das in &quot;Die C++ Programmiersprache&quot;.</p>
</blockquote>
<p>Okay, dann kann wohl kein Gegenargument mehr gebracht werden. :p</p>
<p>Wenn schon, würde ich den <code>std::vector</code> wrappen, also als Member verwenden. Aber beide Ansätze sind weitaus übertrieben, wenn man bedenkt, was deren Anstoss war - aus Ästhetikgründen nicht <code>at()</code> statt <code>operator[]</code> verwenden zu wollen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605733</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 27 Oct 2008 19:11:07 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 07:32:49 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>...aus Ästhetikgründen nicht <code>at()</code> statt <code>operator[]</code> verwenden zu wollen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Naja, nucht NUR das.<br />
Er wollte ja auch &quot;...per Compilerschalter range checking an- und ausschalten...&quot; (nicht, dass ich das ein erstrebenswerteres Ziel fände, aber das ist schon ein wenig mehr als reine Kosmetik <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>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605877</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 28 Oct 2008 07:32:49 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 07:48:41 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#ifdef MIT_CHECK
#define LIPPENSTIFT .at(
#define WIMPERNTUSCHE )
#else
#define LIPPENSTIFT [
#define WIMPERNTUSCHE ]
#endif

// ...

meinVector LIPPENSTIFT 3 WIMPERNTUSCHE = meinVector LIPPENSTIFT 10 WIMPERNTUSCHE;
</code></pre>
<p>Dann passt das auch mit der Kosmetik.</p>
<p>SCNR</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605884</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Tue, 28 Oct 2008 07:48:41 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 08:01:48 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Belli schrieb:</p>
<blockquote>
<p>Stroustrup empfiehlt das in &quot;Die C++ Programmiersprache&quot;.</p>
</blockquote>
<p>Okay, dann kann wohl kein Gegenargument mehr gebracht werden. :p</p>
<p>Wenn schon, würde ich den <code>std::vector</code> wrappen, also als Member verwenden. Aber beide Ansätze sind weitaus übertrieben, wenn man bedenkt, was deren Anstoss war - aus Ästhetikgründen nicht <code>at()</code> statt <code>operator[]</code> verwenden zu wollen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Also für diesem konkreten Fall würde ich wohl <code>private</code> von Vektor erben (was ja ebenfalls einer Aggregation entspricht), und alles, was benötigt wird über using Direktiven wieder sichtbar machen bzw. den <code>operator[]</code> überdecken.</p>
<p>Ganz prinzipiell halte ich das aber immer noch für einen schlechten Ansatz. Ich würde die Rangechecks wohl eher über das <code>assert()</code> -Makro lösen. Das kann man dann auch einfach im Release-Mode per Makro ausschalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605891</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 28 Oct 2008 08:01:48 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 10:59:34 GMT]]></title><description><![CDATA[<p>Mal abgesehn von den bisherigen Diskussionen mal eine kleine Betrachtung ob das überhaupt sinnvoll ist:</p>
<p>- Wenn Range-Checks eingeschaltet sind, muss eine Exceptionbehandlung her, sonst hat man gegenüber der Version ohne Range-checks keine nennenswerten Vorteile: so oder so schmiert das Programm ab.<br />
- Hat man die Range-Checks dann ausgeschaltet, braucht man die Exceptionbehandlung auch nicht mehr. auf der anderen Seite hat man dann wohl durch andere Methoden sichergestellt, dass die Indizes jeweils gültig sind (sonst würd einem das Programm ja um die Ohren fliegen)</p>
<p>Die Entscheidung, ob man at() oder op[] benutzt, ist also eine Designentscheidung die sich auch auf den umliegenden Code auswirkt, nicht nur auf die Aufrufe selbst. Das mit einem #define &quot;mal eben&quot; hin- und hertriggern zu wollen ist also recht sinnfrei.</p>
<p>Wenns dir nur darum geht während der Entwicklung die Range zu überprüfen, nutz assert(), dazu ist das da (und wird im Releasemodus automatisch weggetriggert)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1605981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1605981</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 28 Oct 2008 10:59:34 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 11:31:47 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Warum nicht per typedef?</p>
</blockquote>
<p>Ich habe es gerade mit typedef versucht und dabei festgestellt, dass der Standard ja so was wie</p>
<pre><code class="language-cpp">template&lt;class T&gt; typedef vector&lt;T&gt; RVec;
</code></pre>
<p>gar nicht erlaubt. Kann man das irgendwie anders mit typedef umsetzen oder muss man doch Präprozessor-Direktiven nutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606000</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Tue, 28 Oct 2008 11:31:47 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 11:35:26 GMT]]></title><description><![CDATA[<p>Hast Du die letzten paar Posts auch mal gelesen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606003</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 28 Oct 2008 11:35:26 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 12:24:06 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Hast Du die letzten paar Posts auch mal gelesen?</p>
</blockquote>
<p>nein, der letzte Beitrag von pumuckl war noch nicht da, als ich meinen Beitrag geschrieben habe, der beantwortet dann ja eigentlich alle Fragen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606021</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Tue, 28 Oct 2008 12:24:06 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 13:00:25 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>...<br />
- Wenn Range-Checks eingeschaltet sind, muss eine Exceptionbehandlung her, sonst hat man gegenüber der Version ohne Range-checks keine nennenswerten Vorteile: so oder so schmiert das Programm ab....</p>
</blockquote>
<p>Obwohl ich Dir im Grunde zustimme, würde ich in dem Detail widersprechen wollen: Wenn bei range violations Programme zuverlässig &quot;abschmierten&quot;, wären sie viel ungefährlicher.<br />
So gesehen hätte IMHO ein range-checking auch ohne exception handling Wert. Man könnte sogar überlegen, statt einer exception direkt ein assert() &quot;zuschlagen zu lassen&quot; (wie jemand oben bereits vorschlug, glaube ich).</p>
<p>Trotzdem bin ich im Kern immer noch Deiner Meinung.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606031</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 28 Oct 2008 13:00:25 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 13:16:00 GMT]]></title><description><![CDATA[<p>ingobulla schrieb:</p>
<blockquote>
<p>Kann man das irgendwie anders mit typedef umsetzen oder muss man doch Präprozessor-Direktiven nutzen?</p>
</blockquote>
<p>template typedefs gehn leider wirklich nicht, daher muss man zu einem kleinen Kniff greifen:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct Container
{
  typedef std::vector&lt;T&gt; type;
  //oder typedef std::list&lt;T&gt; type;
  //oder typedef MyOwnVectorImpl&lt;T&gt; type;
};

//später:

void blub()
{
  Container&lt;int&gt;::type values;
  Container&lt;myClass&gt;::type myCont;

  //usw.
}
</code></pre>
<p>Sieht auf den ersten Blick nicht ganz so hilfreich aus, man spart schließlich kaum Tipparbeit - aber man kann den zugrundeliegenden Contyinertyp mit einer Zeile austauschen: im typedef im struct Container&lt;T&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606040</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 28 Oct 2008 13:16:00 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 15:18:59 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Mal abgesehn von den bisherigen Diskussionen mal eine kleine Betrachtung ob das überhaupt sinnvoll ist:</p>
<p>- Wenn Range-Checks eingeschaltet sind, muss eine Exceptionbehandlung her, sonst hat man gegenüber der Version ohne Range-checks keine nennenswerten Vorteile: so oder so schmiert das Programm ab.</p>
</blockquote>
<p>Das wäre schön, ist aber nicht zwangsläufig der Fall. Der VC++ hat in seiner STL-Implementierung range checks, sogar im Release build, <strong>da</strong> schmiert das Programm ab. Bei anderen STL-Implementierungen ist das nicht zwangsläufig der Fall.</p>
<p>Ich bin auch nicht der Meinung, dass man bei der Verwendung von at() zwangsläufig ein Exception-Handling einbauen muss. Oft genug ist es akzeptabler, ein Programm abstürzen zu lassen als einen buffer overflow zu riskieren. Oft ist in der Nähe von main() einfach ein Exception Handler für alles, dann kann man wenigstens noch was ins logfile schreiben. An Ort und Stelle lassen sich diese Art von Fehlern imho kaum sinnvoll behandeln, da jede Alternative (zum Beispiel size() prüfen) einfacher zu implementieren ist.</p>
<blockquote>
<p>Wenns dir nur darum geht während der Entwicklung die Range zu überprüfen, nutz assert(), dazu ist das da (und wird im Releasemodus automatisch weggetriggert)</p>
</blockquote>
<p>Dieses assert bei jedem Zugriff auf den Vector einzubauen ist eben unpraktikabel. Ich vermute, der Threadersteller wünscht, dass der Test Teil des operator[] ist. Keine Ahnung ob du das gemeint hast, sollte man aber mal dazu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606116</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 28 Oct 2008 15:18:59 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 17:24:20 GMT]]></title><description><![CDATA[<p>Ich habe das jetzt mal versucht umzusetzen, im folgenden der Code. Erläuternd sei erstmal gesagt, dass</p>
<ul>
<li>LoggerPtr ein Zeiger auf ein logger-Objekt der Logging-Bibliothek log4cxx ist</li>
<li>SAFE eine globale Konstante ist, die festlegt, ob das Programm in einem abgesicherten Modus betrieben werden soll</li>
<li>ERROR ein Makro ist, dass dafür sorgt, dass eine Fehlermeldung ausgegeben und geloggt wird</li>
</ul>
<pre><code class="language-cpp">#ifndef VECTOR_H_
#define VECTOR_H_

#include &quot;control_consts.h&quot;
#include &quot;error.h&quot;

#include &lt;log4cxx/logger.h&gt;

#include &lt;vector&gt;
#include &lt;list&gt;

using namespace log4cxx;
using namespace std;

template&lt;class T&gt; class RVec : private vector&lt;T&gt;
{
private:
	static LoggerPtr m_logger;
	static LoggerPtr&amp; logger() { return m_logger; }
public:
	using vector&lt;T&gt;::size;
	using vector&lt;T&gt;::resize;
	using vector&lt;T&gt;::front;
	using vector&lt;T&gt;::back;
	using vector&lt;T&gt;::push_back;
	using vector&lt;T&gt;::pop_back;
	using vector&lt;T&gt;::begin;
	using vector&lt;T&gt;::end;
	using vector&lt;T&gt;::rbegin;
	using vector&lt;T&gt;::rend;
	using vector&lt;T&gt;::iterator;
	using vector&lt;T&gt;::reverse_iterator;
	using vector&lt;T&gt;::const_iterator;
	using vector&lt;T&gt;::const_reverse_iterator;
	using vector&lt;T&gt;::reference;
	using vector&lt;T&gt;::const_reference;
	using vector&lt;T&gt;::clear;

	RVec() : vector&lt;T&gt;() { }
	RVec(int s) : vector&lt;T&gt;(s) { }
	RVec(int s, T t) : vector&lt;T&gt;(s, t) { }
	RVec(typename vector&lt;T&gt;::iterator it, typename vector&lt;T&gt;::iterator jt) : vector&lt;T&gt;(it, jt) { }
	RVec(typename list&lt;T&gt;::iterator it, typename list&lt;T&gt;::iterator jt) : vector&lt;T&gt;(it, jt) { }
	RVec(T* p, T* q) : vector&lt;T&gt;(p, q) { }

	T&amp; operator[](int i);
	const T&amp; operator[](int i) const;
};

template&lt;class T&gt; LoggerPtr RVec&lt;T&gt;::m_logger(Logger::getLogger(&quot;rvec&quot;));

template&lt;class T&gt; T&amp; RVec&lt;T&gt;::operator[](int i)
{
	if (SAFE &amp;&amp; (i &lt; 0 || i &gt;= size())) {
		stringstream ss;
		ss &lt;&lt; &quot;Index out of range: index = &quot; &lt;&lt; i &lt;&lt; &quot;, size = &quot; &lt;&lt; size();
		throw ERROR(logger(), ss.str());
	}
	T&amp; t = vector&lt;T&gt;::operator[](i);
	return t;
}

template&lt;class T&gt; const T&amp; RVec&lt;T&gt;::operator[](int i) const
{
	if (SAFE &amp;&amp; (i &lt; 0 || i &gt;= size())) {
		stringstream ss;
		ss &lt;&lt; &quot;Index out of range: index = &quot; &lt;&lt; i &lt;&lt; &quot;, size = &quot; &lt;&lt; size();
		throw ERROR(logger(), ss.str());
	}
	const T&amp; t = vector&lt;T&gt;::operator[](i);
	return t;
}

#endif
</code></pre>
<p>Wenn ich nun aber den Code</p>
<pre><code class="language-cpp">RVec&lt;bool&gt; is_act_site(Base_Nd&lt;N, C, T&gt;::num_sites());
	...
	for (int i = 0; i &lt; left_most_act_site; ++i)
		is_act_site[i] = false;
</code></pre>
<p>ausführe, erhalte ich die Fehlermeldung</p>
<blockquote>
<p>../src/rvec.h: In member function ‘T&amp; RVec&lt;T&gt;::operator[](int) [with T = bool]’:<br />
../src/node/base_nd_def.h:92: instantiated from ‘Base_Nd&lt;N, C, T&gt;::Base_Nd(T*, N*, N*, boost::variant&lt;int, Empty, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_&gt;) [with N = Rev_Nd, C = Rev_NC, T = Rev_Tree]’<br />
../src/node/base_nd.cpp:16: instantiated from here<br />
../src/rvec.h:65: error: invalid initialization of non-const reference of type ‘bool&amp;’ from a temporary of type ‘std::_Bit_reference’</p>
</blockquote>
<p>bzgl. Zeile 65 des obigen Codes und der Zeile</p>
<pre><code class="language-cpp">is_act_site[i] = false;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1606201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606201</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Tue, 28 Oct 2008 17:24:20 GMT</pubDate></item><item><title><![CDATA[Reply to range-checked vector on Tue, 28 Oct 2008 19:11:26 GMT]]></title><description><![CDATA[<p>hmpf. bau halt einfach ein assert im code vom vector ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1606262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1606262</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 28 Oct 2008 19:11:26 GMT</pubDate></item></channel></rss>