<?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[&#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot;]]></title><description><![CDATA[<p>Hallo<br />
ich habe eine template matrix-klasse, die es erlaubt eine matrix&lt;double&gt; einer matrix&lt;float&gt; zuzuweisen. bei der Zuweisung kommt es u.U. zu genauigkeitsverlusten, was hier auch selbstredend ist.</p>
<p>mit ist bewußt, dass ich hier einmach die warning für den abschnitt deaktivieren koennte. ich koennte auch einen static_cast vor der zuweisung durchführen, welcher aber mehr als gefaehrlich ist, wenn zwei matrizen mit nicht zueinander kompatiblen klassen beinhalten.</p>
<p>wie ist denn hier das allgmeine vorgehen, oder läßt man die waring einfach stehen?<br />
wie macht es std::copy (eine Zuweisung zweier std::vector mit unterschieldichen Typen istja nicht erlaubt):</p>
<pre><code class="language-cpp">template&lt; typename T&gt;
struct Matrix
{
  //  ...
  template&lt; typename T2&gt;
  Matrix operator=(const Matrix&lt; T2 &gt;&amp; rhs) 
  {
     //... verwaltungskram ...
     for(int x1=0; x1&lt;nx1; ++x1)
        for(int x2=0; x2&lt;nx1; ++x2)
           this-&gt;operator()(x1,x2) = rhs.operator()(x1,x2);
     return *this;
  }
  //...
};

int main()
{
   Matrix&lt;double&gt; m1(10,10,1);
   Matrix&lt;float&gt;  m2;
   m2 = m1; //&lt;- Waring &quot;possible loss of data&quot;

   vector&lt;double&gt; a(10);
   vector&lt;float&gt; b;
   copy(a.begin(), a.end(), back_inserter(b)); //&lt;- hier kommt keine Warning
return 0;
}
</code></pre>
<p>Anm.: ja, die Matrix-Klasse hat alle notwendigen Methoden, Kontruktoren, etc. implementiert. Mir geht es hier rein um das Beseitigen der Warnungs für den &quot;possible loss of data&quot; bei Verwednung von build-in-types</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208980/elegante-unterdrueckung-von-quot-possible-loss-of-data-quot</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 08:19:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208980.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Mar 2008 13:42:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Tue, 25 Mar 2008 13:42:52 GMT]]></title><description><![CDATA[<p>Hallo<br />
ich habe eine template matrix-klasse, die es erlaubt eine matrix&lt;double&gt; einer matrix&lt;float&gt; zuzuweisen. bei der Zuweisung kommt es u.U. zu genauigkeitsverlusten, was hier auch selbstredend ist.</p>
<p>mit ist bewußt, dass ich hier einmach die warning für den abschnitt deaktivieren koennte. ich koennte auch einen static_cast vor der zuweisung durchführen, welcher aber mehr als gefaehrlich ist, wenn zwei matrizen mit nicht zueinander kompatiblen klassen beinhalten.</p>
<p>wie ist denn hier das allgmeine vorgehen, oder läßt man die waring einfach stehen?<br />
wie macht es std::copy (eine Zuweisung zweier std::vector mit unterschieldichen Typen istja nicht erlaubt):</p>
<pre><code class="language-cpp">template&lt; typename T&gt;
struct Matrix
{
  //  ...
  template&lt; typename T2&gt;
  Matrix operator=(const Matrix&lt; T2 &gt;&amp; rhs) 
  {
     //... verwaltungskram ...
     for(int x1=0; x1&lt;nx1; ++x1)
        for(int x2=0; x2&lt;nx1; ++x2)
           this-&gt;operator()(x1,x2) = rhs.operator()(x1,x2);
     return *this;
  }
  //...
};

int main()
{
   Matrix&lt;double&gt; m1(10,10,1);
   Matrix&lt;float&gt;  m2;
   m2 = m1; //&lt;- Waring &quot;possible loss of data&quot;

   vector&lt;double&gt; a(10);
   vector&lt;float&gt; b;
   copy(a.begin(), a.end(), back_inserter(b)); //&lt;- hier kommt keine Warning
return 0;
}
</code></pre>
<p>Anm.: ja, die Matrix-Klasse hat alle notwendigen Methoden, Kontruktoren, etc. implementiert. Mir geht es hier rein um das Beseitigen der Warnungs für den &quot;possible loss of data&quot; bei Verwednung von build-in-types</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480044</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Tue, 25 Mar 2008 13:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Tue, 25 Mar 2008 14:35:12 GMT]]></title><description><![CDATA[<p>Ich nehme an, dein &quot;this-&gt;operator()(x1,x2)&quot; gibt eine nicht-konstante Referenz zurück und dieser wird dann ein anderer Datentyp zugewiesen.</p>
<p>Du könntest einfach den Datentypen konstruieren (bei den Basisdatentypen erfolgt dann vom Compiler der Cast):</p>
<pre><code class="language-cpp">this-&gt;operator()(x1,x2) = T(rhs.operator()(x1,x2));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1480095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480095</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Tue, 25 Mar 2008 14:35:12 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Tue, 25 Mar 2008 14:35:59 GMT]]></title><description><![CDATA[<p>muffmolch schrieb:</p>
<blockquote>
<p>ich koennte auch einen static_cast vor der zuweisung durchführen, welcher aber mehr als gefaehrlich ist, wenn zwei matrizen mit nicht zueinander kompatiblen klassen beinhalten.</p>
</blockquote>
<p>Wenn die beiden Klassen, wie in Matrix&lt;A&gt; und Matrix&lt;B&gt; wirklich nicht zueinander kompatibel, das heißt nicht ineinander umwandelbar sind, dann kompiliert das auch trotz eines static_cast nicht. Ein static_cast ist ja gerade dazu da, dass er nur relativ &quot;schwache&quot; Umwandlungen zulässt. Solange du also kein reinterpret_cast da reinhaust, kompiliert das ganze bei abstrusen Umwandlungen nicht.</p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480096</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Tue, 25 Mar 2008 14:35:59 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Tue, 25 Mar 2008 15:09:00 GMT]]></title><description><![CDATA[<p>Phoemuex schrieb:</p>
<blockquote>
<p>muffmolch schrieb:</p>
<blockquote>
<p>ich koennte auch einen static_cast vor der zuweisung durchführen, welcher aber mehr als gefaehrlich ist, wenn zwei matrizen mit nicht zueinander kompatiblen klassen beinhalten.</p>
</blockquote>
<p>Wenn die beiden Klassen, wie in Matrix&lt;A&gt; und Matrix&lt;B&gt; wirklich nicht zueinander kompatibel, das heißt nicht ineinander umwandelbar sind, dann kompiliert das auch trotz eines static_cast nicht. Ein static_cast ist ja gerade dazu da, dass er nur relativ &quot;schwache&quot; Umwandlungen zulässt. Solange du also kein reinterpret_cast da reinhaust, kompiliert das ganze bei abstrusen Umwandlungen nicht.</p>
<p>Felix</p>
</blockquote>
<p>nein, einen reinterpret_cast werd eich dort sicher nicht anwenden. Habe es nun mit dem static_cast und ein paar Testklassen getestet. Ist genau das, was ich gebraucht habe. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480125</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Tue, 25 Mar 2008 15:09:00 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Tue, 25 Mar 2008 19:22:44 GMT]]></title><description><![CDATA[<p>Mal noch was zu deiner Matrix Klasse. Da kommt es ja auch sehr auf Performance an. Und dazu habe ich mal was gelesen, dass man Schleife immer aufrollen soll, wenn man grössere Performance haben will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480252</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 25 Mar 2008 19:22:44 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Tue, 25 Mar 2008 19:47:10 GMT]]></title><description><![CDATA[<p>Aber erst wenn einem der Profiler sagt dass die Schleife wirklich das Bottleneck ist <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/1480271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480271</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 25 Mar 2008 19:47:10 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Tue, 25 Mar 2008 20:42:28 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Mal noch was zu deiner Matrix Klasse. Da kommt es ja auch sehr auf Performance an. Und dazu habe ich mal was gelesen, dass man Schleife immer aufrollen soll, wenn man grössere Performance haben will.</p>
</blockquote>
<p>Das war Anno 1980 auch ein total wichtiger Ratschlag. Aber du wirst es nicht glauben, knapp 30 Jahre spaeter macht das der Compiler fuer dich <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/1480311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480311</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Tue, 25 Mar 2008 20:42:28 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Tue, 25 Mar 2008 21:02:42 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Mal noch was zu deiner Matrix Klasse. Da kommt es ja auch sehr auf Performance an. Und dazu habe ich mal was gelesen, dass man Schleife immer aufrollen soll, wenn man grössere Performance haben will.</p>
</blockquote>
<p>Das war Anno 1980 auch ein total wichtiger Ratschlag. Aber du wirst es nicht glauben, knapp 30 Jahre spaeter macht das der Compiler fuer dich <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>
</blockquote>
<p>Ok, das hat was. Aber dort, wo ich das gelesen habe war es nicht soo alt. (Wenn ich mich recht erinnere nvidia..).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480329</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 25 Mar 2008 21:02:42 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Tue, 25 Mar 2008 21:19:26 GMT]]></title><description><![CDATA[<p>Soll ja Leute geben die Anno 1980 ihr letztes C++-Buch/Magazin/Artikel gelesen haben und seitdem auf dem Stand ihren Code verbreiten. So wie es auch immernoch Lehrbuchautoren geht an denen die Einführung von std::string, Headern ohne .h und anderen &quot;Neuigkeiten&quot; vorüber gegangen ist <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/1480337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480337</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 25 Mar 2008 21:19:26 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Wed, 26 Mar 2008 10:45:01 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Mal noch was zu deiner Matrix Klasse. Da kommt es ja auch sehr auf Performance an. Und dazu habe ich mal was gelesen, dass man Schleife immer aufrollen soll, wenn man grössere Performance haben will.</p>
</blockquote>
<p>Das war Anno 1980 auch ein total wichtiger Ratschlag. Aber du wirst es nicht glauben, knapp 30 Jahre spaeter macht das der Compiler fuer dich <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>
</blockquote>
<p>nein das stimmt nicht. wir haben hier an der uni oft seminare, bei denen vorträge über code-optimierungen gehalten werden. der compile rist kein wudnerkind und kann bei weitem nicht alles so optimieren, wie man es als hardcore freak per hand koennte. aber der code ist dann oftmals kaum mehr vernünftig zu lesen und selbst die vortargenden raten oftmals von optimierungen ab, die am ende &quot;nur&quot; zu 2% Leisungssteigerung bei erheblichen mehraufwand führen.</p>
<p>PS: da die matrixklasse ein weiteres template-argument besitzt (hier nicht aufgefürht), die letztlich bestimmt, wie die indizes auf EINEN vector abgebildet werden und der template operator=() auch matrix klassen mit anderen &quot;indexern&quot; konvertieren kann, muessen hier explizit die schleifendurchgänge erfolgen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1480506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480506</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 26 Mar 2008 10:45:01 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;elegante unterdrueckung von &amp;quot;possible loss of data&amp;quot; on Wed, 26 Mar 2008 11:00:59 GMT]]></title><description><![CDATA[<blockquote>
<p>PS: da die matrixklasse ein weiteres template-argument besitzt (hier nicht aufgefürht), die letztlich bestimmt, wie die indizes auf EINEN vector abgebildet werden und der template operator=() auch matrix klassen mit anderen &quot;indexern&quot; konvertieren kann, muessen hier explizit die schleifendurchgänge erfolgen!</p>
</blockquote>
<p>Das habe ich mir noch gedacht, dass du bestimmt einen Grund dazu gehabt hast. Darum war ja auch die Variabel da. Hätte ja sein können, dass es nur eine const Variabel gewesen wäre.. <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/1480516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1480516</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 26 Mar 2008 11:00:59 GMT</pubDate></item></channel></rss>