<?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[vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double*]]></title><description><![CDATA[<p>Hallo Leute</p>
<p>Komme leider nicht drumherum einen (recht großen) vector&lt;complex&lt;double&gt; &gt; in einen double-Array umzuwandeln, da ich mit der nag-Library arbeite und die nur mit double-Array's arbeiten kann.</p>
<p>Hatte überlegt einfach eine neue Klasse zu defniern, die von complex erbt und eine zusätzliche Funktion hat die Zeiger auf die Daten in complex zurückgibt.<br />
Leider weis ich aber nicht in welcher Art die Datein innerhalb der Classe complex gespeichert werden</p>
<p>Hat irgendeiner eine Idee?</p>
<p>Lg duwan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/228117/vector-lt-complex-lt-double-gt-gt-umwandeln-in-double</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 17:29:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228117.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Nov 2008 10:24:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 10:24:33 GMT]]></title><description><![CDATA[<p>Hallo Leute</p>
<p>Komme leider nicht drumherum einen (recht großen) vector&lt;complex&lt;double&gt; &gt; in einen double-Array umzuwandeln, da ich mit der nag-Library arbeite und die nur mit double-Array's arbeiten kann.</p>
<p>Hatte überlegt einfach eine neue Klasse zu defniern, die von complex erbt und eine zusätzliche Funktion hat die Zeiger auf die Daten in complex zurückgibt.<br />
Leider weis ich aber nicht in welcher Art die Datein innerhalb der Classe complex gespeichert werden</p>
<p>Hat irgendeiner eine Idee?</p>
<p>Lg duwan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619804</guid><dc:creator><![CDATA[duwan]]></dc:creator><pubDate>Mon, 24 Nov 2008 10:24:33 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 10:31:51 GMT]]></title><description><![CDATA[<p>duwan schrieb:</p>
<blockquote>
<p>Komme leider nicht drumherum einen (recht großen) vector&lt;complex&lt;double&gt; &gt; in einen double-Array umzuwandeln, da ich mit der nag-Library arbeite und die nur mit double-Array's arbeiten kann.</p>
</blockquote>
<p>Ich gehe davon aus das du nicht um eine explizite Umwandlung drum herum kommst. Davon abgesehen frage ich mich ohnehin wie du eine komplexe Zahl in ein double umwandeln willst.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619810</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 24 Nov 2008 10:31:51 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 10:43:18 GMT]]></title><description><![CDATA[<p>Nun ich dachte daran aus einem complex&lt;double&gt; ein double[2] zu machen.<br />
also irgendwas wie</p>
<p>complex&lt;double&gt; test = complex&lt;double&gt;(1.2,3.4);<br />
double *erg;</p>
<p>erg = umwandlung(test);</p>
<p>cout &lt;&lt; erg[0] &lt;&lt; &quot; &quot; &lt;&lt; erg[1] &lt;&lt; endl;</p>
<p>mit einer Ausgabe von:</p>
<p>1.2 3.4</p>
<p>Wenn complex&lt;double&gt; das intern bereits als Array speichert bräuchte ich ja nur einen Zeiger zurückgeben.</p>
<p>Lg duwan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619815</guid><dc:creator><![CDATA[duwan]]></dc:creator><pubDate>Mon, 24 Nov 2008 10:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 11:57:09 GMT]]></title><description><![CDATA[<p>duwan schrieb:</p>
<blockquote>
<p>Nun ich dachte daran aus einem complex&lt;double&gt; ein double[2] zu machen....</p>
</blockquote>
<p>Ist das denn das Format, in dem die Bibliothek die komplexen Zahlen verarbeitet?<br />
DAS ist IMHO die zweite entscheidende Frage.<br />
Die erste ist: Soll/Kann die Lib überhaupt mit komplexen Zahlen arbeiten ? Oder möchtest Du nur die Realteile bearbeiten? Oder ...</p>
<p>Das ist übrigens in erster Linie ein fachliches Problem und kein technisches....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619851</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 24 Nov 2008 11:57:09 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 13:18:34 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>[...]</p>
</blockquote>
<p>Ne, das ist schon ein technisches Problem. Es soll ein Vektor aus std::complex&lt;T&gt; ist ein Array der Form <code>[Re Im Re Im ...]</code> umgewandelt werden.<br />
Ich würde da eine Kopie erstellen. Also einen neuen Vektor anlegen, und den complexen Vektor in ein entsprechend gepacktes Array kopieren. Alles andere ist unsicher und bestenfalls von der Implementation Deines Compilers abhängig und schlimstenfalls (und das ist wahrscheinlicher) undefiniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619886</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 24 Nov 2008 13:18:34 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 13:18:38 GMT]]></title><description><![CDATA[<p>vermutlich erwartet die library ein arry von doubles, wobei jeweils zwei aufeinanderfolgende doubles den real/imaginärteil ausmachen.<br />
Wie std::complex aufgebaut ist findest du im entsprechenden Header deiner Standardbibliothek. Da die beiden Elemente aber private sind, wird ableiten nicht viel bringen (mal abgesehen davon dass complex nicht für Ableitungen vorgesehen ist).</p>
<p>Ich hab mal was gebastelt (ist zwar vllt. bissl overkill, aber dafür recht allgemein)</p>
<pre><code class="language-cpp">//iteratorklasse die mit einem iterator auf std::complex über die real- und imaginaerteile iteriert
template&lt;class ComplexIter&gt;
struct ComplexToTypeIterator
{
  typedef iterator_traits&lt;complexIter&gt;::value_type cplx_type;
  typedef cplx_type::value_type value_type;

  ComplexToTypeIterator() : iter(), real(true) {}
  ComplexToTypeIterator(ComplexIter const&amp; rhs) : iter(rhs), real(true) {}

  ComplexToTypeIterator&amp; operator++ () //Preinc
  {
    increment();
    return *this;
  }

  ComplexToTypeIterator const operator++ (int) //Postinc
  {
    ComplexToTypeIterator const ret(*this);
    increment();
    return ret;
  }

  bool operator==(ComplexToTypeIterator const&amp; rhs)
  {
    return (iter == ths.iter) &amp;&amp; (real == rhs.real);
  }

  value_type operator*()
  {
     return real ? iter-&gt;real() : iter-&gt;imag();
  }
private:
  void increment()
  {
    if (!real)
    {
      ++iter;
    }
    real = !real;
  }

  bool real;
  ComplexIter iter;
};

//Creator-Funktion á la std::make_pair()
template &lt;class ComplexIter&gt;
ComplexToTypeIterator&lt;ComplexIter&gt; complexToTypeIter(ComplexIter const&amp; arg)
{
  return ComplexToTypeIterator&lt;ComplexIter&gt;(arg);
}
</code></pre>
<p>Usw., Details müssten noch ausgefeilt werden</p>
<p>Benutzung:</p>
<pre><code class="language-cpp">std::vector&lt;std::complex&lt;double&gt; &gt; cplxvec;
//vector fuellen
double* arr = new double[2*cplxvec.size()];
std::copy(complexToTypeIter(cplxvec.begin()), complexToTypeIter(cplxvec.end()), arr);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1619887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619887</guid><dc:creator><![CDATA[pumuckl@logged_off]]></dc:creator><pubDate>Mon, 24 Nov 2008 13:18:38 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 13:50:35 GMT]]></title><description><![CDATA[<p>Hab zwar noch nie was mit complex&lt;&gt; gemacht aber mal schauen:</p>
<pre><code class="language-cpp">struct ComplexSplit{
  double *target;

  ComplexSlit(double *tar) : target(tar){}

  void operator()(std::complex&lt;double&gt; &amp;c){ 
    *target = c-&gt;real();
    target++;
    *target = c-&gt;imag();
    target++;
  }

};

// ...

double target[vec.size()*2];

ComplexSplit split = ComplexSplit(target);
std::for_each(vec.begin(), vec.end(),
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1619906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619906</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 24 Nov 2008 13:50:35 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 14:14:33 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht ganz sicher wie weit das in dem Fall zutrifft, aber Sutter schreibt in <a href="http://www.gotw.ca/gotw/052.htm" rel="nofollow">GOTW#52</a> was über stateful predicates. Wenn in einer Implementation von for_each unter Umständen der Funktor kopiert wird, und sowohl mit der Kopie als auch mit dem Original weitergearbeitet wird, gibts unter Umständen ein Problem, da dann beide Funktoren einen Pointer auf das selbe Arrayelement haben und sich gegenseitig die Ergebnisse überschreiben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619923</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 24 Nov 2008 14:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 14:30:40 GMT]]></title><description><![CDATA[<p>Hallo Leute</p>
<p>Irgendwie wurde ich nach dem ersten Eintrag nicht mehr per e-mail benachrichtigt deswegen antworte ich leider erst jetzt. Sorry deswegen.</p>
<p>Also bei meinem Problem ist die Anordnung der Real und Imaginärteile total egal, da die Routine der NAG-Bibliothek sowieso nur mit real-Teilen arbeitet, allerdings kann ich ihr durch einen kleinen Trick vorgaukeln das sie Reele-Zahlen hat.</p>
<p>Naja habe in der Zwischenzeit mein Problem selber gelöst:</p>
<pre><code>int main ()
{
        vector&lt; complex &lt;double&gt; &gt; t;
        t.push_back(complex&lt;double&gt; (1.,2.5));
        t.push_back(complex&lt;double&gt; (4.5,6.7));
        double *d;

        d = reinterpret_cast&lt;double*&gt; (&amp;t[0] );

        for(unsigned int count = 0;count &lt; 4&lt;;count++)
        {
                cout &lt;&lt; d[count] &lt;&lt; endl;
                cout.flush();
        }

        return (0);
}
</code></pre>
<p>Die ausgabe ist:<br />
duwan@duwan-laptop:~/Documents/c/Diplom-Arbeit/test$ ./exe<br />
1<br />
2.5<br />
4.5<br />
6.7</p>
<p>Die Frage die sich jetzt stellt ist die folgende: Ist der Speicher eines Vectors zusammenhängend? Denn wenn nicht kann ich bei dieser Herrangehensweise bei größeren Vectoren ziemliche Probleme kriegen.<br />
Lese dazu gerade im Stroustrup aber habe dazu leider noch keine genau Aussage aber einige Hinweise dahingegen gefunden dass der Speicherbereich in der Tat zusammenhängend ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619937</guid><dc:creator><![CDATA[duwan]]></dc:creator><pubDate>Mon, 24 Nov 2008 14:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 14:41:58 GMT]]></title><description><![CDATA[<p>japp, vector ist ein einziges &quot;stück speicher&quot;...</p>
<p>edit:</p>
<p>aber warum so umständlich?</p>
<pre><code class="language-cpp">typedef std::vector &lt;complex &lt;float&gt; &gt; TCXVector;
TCXVector CXVector; //kA, ob das stimmt ^^
//füllen

for (TCXVector::const_iterator iter(CXVector.begin()), end (CXVector.end()); iter != end; ++iter)
{
 std::cout &lt;&lt; iter-&gt;Real() &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1619941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619941</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 24 Nov 2008 14:41:58 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 14:39:06 GMT]]></title><description><![CDATA[<p>duwan schrieb:</p>
<blockquote>
<p>Die Frage die sich jetzt stellt ist die folgende: Ist der Speicher eines Vectors zusammenhängend?</p>
</blockquote>
<p>Ja, ist er.<br />
Aber dennoch ist dein Code ein wenig russisches Roulette: Es ist nirgendwo garantiert, dass ein complex&lt;double&gt; auch wirklich nur aus zwei doubles besteht (das ist Implementationssache). Daher ist der reinterpret_cast eine recht unsichere Sache.</p>
<p>Wenn du eh nur die Realteile haben möchtest ist die Sache natürlich deutlich einfacher:</p>
<pre><code class="language-cpp">std::vector&lt;std::complex&lt;double&gt; &gt; cplxvec;
//fuellen
std::vector&lt;double&gt; doubles;
std::transform(cplxvec.begin(), cplxvec.end(), std::back_inserter(doubles), std::mem_fun(&amp;std::complex&lt;double&gt;::real));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1619942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619942</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 24 Nov 2008 14:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 14:45:39 GMT]]></title><description><![CDATA[<p>Habe mir gerade mal alle Beiträge überflogen:</p>
<p>Also habe mich in der Zwischenzeit mal mit einem Studienkollegen unterhalten, und er sagte, dass es nicht sinnvoll ist eine abgeleitete Klasse zu schrieben, da die ganzen Operatoren complex-Variablen erwarten. Das bedeutet das man halt alle Operatoren neu bzw. umschreiben müsste.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a><br />
Bin mir nicht sicher wie du das meinst. Wenn ich dich richtig verstanden habe dann willst du den Inhalt des vectors in dein Array kopieren. Das kommt bei mir aber nicht in Frage, da die Umwandlung wahrscheinlich SEHR häufig durchgeführt werden müsste und der vector so bis 10000 complexe Zahlen enthalten soll.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>,Fellhuhn<br />
Äh danke für eure Antwort allerdings verstehe ich euren Code leider nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619947</guid><dc:creator><![CDATA[duwan]]></dc:creator><pubDate>Mon, 24 Nov 2008 14:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 14:48:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a><br />
Sorry da habe ich mich wohl etwas unverständlich ausgedrück. Brauche beide Teile allerdings gaugkle ich der NAG-Routine vor es mit einem reelen Array doppelter Länge zu tun zu haben. Also werden die Imaginär-Teile einfach als zusätzliche Dimension in der NAG-Routine behandelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619951</guid><dc:creator><![CDATA[duwan]]></dc:creator><pubDate>Mon, 24 Nov 2008 14:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 14:56:45 GMT]]></title><description><![CDATA[<p>wie wärs damit: du implementierst es genau so, wie es richtig wäre und am saubersten ist (mit array umkopieren etc) und guckst dann mit nem profiler, wie viel das stück code denn nun ausmacht - da das rechnen vermutlich wesentlich komplexer ist, wird das umkopieren nicht wirklich ins gewicht fallen - falls es dann iwo viel zu lange dauert, musst du das dann halt ein wenig abändern - aber wie in letzter zeit sehr häufig in diesem forum geschrieben wurde: vorzeitige optimierung ist sinnlos - was nützt dir (falls es extrem viel ist) ne 10tel sekunde beim umkopieren, wenn du für`s rechnen eh ein vielfaches dieser zeit benötigst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619957</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 24 Nov 2008 14:56:45 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 15:00:18 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a><br />
Okay glaube ich weiß was du meinst. Allerdings ist das in meinem Programm schon berügsichtigt, da ich den reinterpret_cast&lt;double*&gt; (&amp;t[0] ) genommen habe. reinterpret_cast&lt;double*&gt; (&amp;t ) funktioniert nicht. Das habe ich als erstes ausprobier. Offensichtlich scheint intern die Variablen DIRECT aneinander zu hängen, so dass wenn man einmal den Anfang richtig gefunden hat ....<br />
Trotztdem bekomme ich natürlich Bödsinn wenn ich die Schleife mehr als 4 mal durchlaufen lasse.</p>
<p>Auch muss ich das ganze in einen echten double-Array umwandeln. Und soweit ich weis kann der nicht mit Iteratoren umgehen. Allerdings habe ich mich noch nie so richtig mit Iteratoren befasst <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/1619963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619963</guid><dc:creator><![CDATA[duwan]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:00:18 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 15:04:09 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a><br />
Im Prinzip hast du recht, allerdings geht es mir auch darum eleganten und guten Code abzuliefer und noch was dabei zu lehrnen damit ich es in zukunft besser und schneller programmieren kann. Auch führt eleganter Code zu weniger Programmierfehlern die am Ende, wenn man erhlich ist, doch am meisten Zeit kosten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619966</guid><dc:creator><![CDATA[duwan]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:04:09 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 15:09:25 GMT]]></title><description><![CDATA[<p>duwan schrieb:</p>
<blockquote>
<p>...Auch muss ich das ganze in einen echten double-Array umwandeln...</p>
</blockquote>
<p>Das war mir eigentlich schon von vorne herein klar - Typuminterpretationen bringen nur dann etwas wenn man wirklich 100%ig sicher ist wie diese Typen sich im Speicher verhalten. Alles Andere als umkopieren ist hier, wenn überhaupt nur mit sehr viel Glück (und unportabel) möglich.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619970</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 15:32:34 GMT]]></title><description><![CDATA[<p>Habe mal ein kleines Programm geschrieben um meine Idee auf Fehler zu überprüfen:</p>
<pre><code class="language-cpp">vector&lt; complex &lt;double&gt; &gt; t;
        t.clear();
        double *d;

        //Füllen

        for(unsigned int count = 0; count &lt; 10000000 ; count ++)
        {
                t.push_back(complex&lt;double&gt;(count,count));
        }

        d = reinterpret_cast&lt;double*&gt; (&amp;t[0] );

        for(unsigned int count = 0;count &lt; t.size(); count ++)
        {
                if(t[count] != complex&lt;double&gt;(d[count*2],d[count*2 +1]))
                {
                        break;
                        cout &lt;&lt; &quot;Fehler&quot; &lt;&lt; endl;
                }
        }

        cout &lt;&lt; &quot;Ende&quot; &lt;&lt; endl;
</code></pre>
<p>Läuft bei mir ohne Probleme durch. Ich glaube ich bin auf der Sicheren Seite<br />
Danke für eure Hilfe.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14941">@asc</a><br />
Da nach den Aussagen der Anderen scheint mir der Speicher des Vectors innerhalb des c++ Standard zusammenhängend zu sein, und das ist das einzige was ih hier benutzte. Ich denke das solle daher keine Probleme mit der Portierung machen. Ich habe unter Kubuntu den g++ benutzt. Wenn du einen anderen Compiler benutzt kannst du das ganze ja auch mal bei dir versuchen. Das Ergebn is würde ich wirklich interresieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619987</guid><dc:creator><![CDATA[duwan]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:32:34 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 15:36:36 GMT]]></title><description><![CDATA[<p>duwan schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a><br />
Okay glaube ich weiß was du meinst. Allerdings ist das in meinem Programm schon berügsichtigt, da ich den reinterpret_cast&lt;double*&gt; (&amp;t[0] ) genommen habe. reinterpret_cast&lt;double*&gt; (&amp;t ) funktioniert nicht. Das habe ich als erstes ausprobier. Offensichtlich scheint intern die Variablen DIRECT aneinander zu hängen, so dass wenn man einmal den Anfang richtig gefunden hat ....<br />
Trotztdem bekomme ich natürlich Bödsinn wenn ich die Schleife mehr als 4 mal durchlaufen lasse.</p>
<p>Auch muss ich das ganze in einen echten double-Array umwandeln. Und soweit ich weis kann der nicht mit Iteratoren umgehen. Allerdings habe ich mich noch nie so richtig mit Iteratoren befasst <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>Dass das mit dem reinterpret_cast&lt;double*&gt; (&amp;t ) nicht funktioniert ist klar, dabei nimmst du die Adresse des vector-Objekts und nicht des Datenarrays das vom vector verwaltet wird (im Grunde verwaltet ein std::vector intern nur ein dynamisches Array).<br />
Was ich aber meinte ist was anderes: Mit dem reinterpret_cast gehst du davon aus, dass ein complex im Speicher aus genau zwei doubles besteht und nichts weiter. Das ist aber nicht garantiert. Es könnten z.B. irgendwelche zusätzliche Elemente vorhanden sein (z.B. zu Debug-Zwecken), dann gibts Dinge wie padding/alignment die evtl. querschießen können usw. Nicht zuletzt greifst du mit dem reinterpret_cast auf die privaten Member der complex-Objekte zu, brichst also mutwillig die Kapselung und das ist so oder so möglichst zu vermeiden (manch einer würde sagen verabscheuungswürdig ;))</p>
<p>Was Arrays und Iteratoren angeht: ein Iterator für ein Array ist ganz einfach ein Pointer.</p>
<p>Ums mal pragmatisch zu machen, zwei Versionen wie du die Werte umkopieren kannst, ganz ohne große &lt;algorithm&gt;-Spielereien:</p>
<pre><code class="language-cpp">typedef std::vector&lt;std::complex&lt;double&gt; &gt; ComplexVector;
ComplexVector cplxvec;
//vector fuellen

//version 1: dynamisches double-array
double* arr = new double[2*cplxvec.size()];
double* dptr = arr;
for (ComplexVector::iterator it = cplxvec.begin(), end = cplxvec.end(); it != end; ++it)
{
  *dptr++ = it-&gt;real();
  *dptr++ = it-&gt;imag();
}

//version 2: std::vector&lt;double&gt;
std::vector&lt;double&gt; dblvec;
dblvec.reserve(2*cplxvec.size());
for (ComplexVector::iterator it = cplxvec.begin(), end = cplxvec.end(); it != end; ++it)
{
  dblvec.push_back(it-&gt;real());
  dblvec.push_back(it-&gt;imag());
}
</code></pre>
<p>Am Ende kannst du dann jeweils das Array <code>arr</code> oder den Datenbereich des double-vectors <code>&amp;dblvec[0]</code> an deine entsprechende Funktion übergeben.</p>
<p>(Falls Fragen oder Verständnisprobleme zum Code da sind, einfach fragen...)</p>
<p>/edit: Nachtrag: Dass dein Programm ohne Fehler durchläuft ist wie gesagt Glück (auch wenns bei den meisten Implementationen von complex so sein wird). Es ist aber nicht garantiert, dass es immer geht, d.h. es ist nicht portabel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619989</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:36:36 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 15:38:55 GMT]]></title><description><![CDATA[<p>duwan schrieb:</p>
<blockquote>
<p>Läuft bei mir ohne Probleme durch. Ich glaube ich bin auf der Sicheren Seite Danke für eure Hilfe.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14941">@asc</a><br />
Da nach den Aussagen der Anderen scheint mir der Speicher des Vectors innerhalb des c++ Standard zusammenhängend zu sein, und das ist das einzige was ih hier benutzte...</p>
</blockquote>
<p>Nein, du benutzt mehr als nur die Tatsache das der Speicher zusammenhängend vorliegt. Du gehst auch davon aus das im std::complex die doublewerte an exakt den selben Stellen und in der gleichen Reihenfolge liegen.</p>
<p>Nachtrag:<br />
Du verletzt eine wirklich sinnvolle Regel: Programmiere immer gegen die Schnittstelle, nie gegen die Implementierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619992</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:38:55 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 15:50:24 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a></p>
<p>Ich glaube ich habe deinen code verstanden bis auf folgendes:</p>
<pre><code class="language-cpp">{
  *dptr++ = it-&gt;real();
  *dptr++ = it-&gt;imag();
}
</code></pre>
<p>warum das ++ bei *dptr++ ??</p>
<p>Ach ja muss jetzt in ein Seminar. bin in spätestens 1.5 Stunden wieder da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619999</guid><dc:creator><![CDATA[duwan]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 15:54:35 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>[...]</p>
</blockquote>
<p>Ne, das ist schon ein technisches Problem. Es soll ein Vektor aus std::complex&lt;T&gt; ist ein Array der Form <code>[Re Im Re Im ...]</code> umgewandelt werden....</p>
</blockquote>
<p>Das vermutest <em>Du</em>. Aber meine Frage bleibt, ob es das ist, was gewollt ist.<br />
... und inzwischen hat duwan das schon beantwortet:</p>
<p>duwan schrieb:</p>
<blockquote>
<p>...Also bei meinem Problem ist die Anordnung der Real und Imaginärteile total egal, da die Routine der NAG-Bibliothek sowieso nur mit real-Teilen arbeitet, ...</p>
</blockquote>
<p>Ergo: Doch nicht &quot;egal&quot;, weil nur die Realteile interessieren (die man nur rausbekommt, wenn man weiß, wo sie &quot;liegen&quot; (= ihre Anordnung kennt) :p ;).</p>
<p><strong>Und</strong> es bleibt in erster Linie eine <em>fachliche</em> Aufgabe, aus einer komplexen Zahl den Realteil zu extrahieren. Es ist halt nich einfach ein &quot;cast&quot;, bei dem eine technische Repräsentation in eine andere deselben Wertes umgewandelt wird, sondern es ist eine echte Abbildung, die den Wert verändert (jedenfall im Allgemeinen).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620003</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:54:35 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 15:58:38 GMT]]></title><description><![CDATA[<p>duwan schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a></p>
<p>Ich glaube ich habe deinen code verstanden bis auf folgendes:</p>
<pre><code class="language-cpp">{
  *dptr++ = it-&gt;real();
  *dptr++ = it-&gt;imag();
}
</code></pre>
<p>warum das ++ bei *dptr++ ??</p>
</blockquote>
<p>Der operator++ ist der sogenannte Inkrement-Operator. Je nachdem ob er vor oder hinter dem Objekt steht auf das er angewandt wird, wird der Wert vor der Erhöhung (postinkrement, das ++ steht dahinter) oder nach der erhöhung (präinkrement, das ++ steht davor) zurückgegeben.<br />
dptr++ heißt also &quot;erhöhe den Pointer dptr um eins und gib den alten (Adress-)Wert zurück&quot;. Die erste der beiden Zeilen heißt also insgesamt &quot;schreibe den realwert an die Stelle, auf die dptr zeigt und erhöhe diesen&quot;.<br />
Das ist im Grunde nichts anderes als bei Iteratoren (wie oben geschrieben, SIND Pointer die Iteratoren eines Arrays): wenn ich den operator ++ mehrfach auf einen Pointer anwende, gehe ich Schritt für Schritt durch das Array, in das der pointer zeigt (oder durch irgendwelchen kruden Speicher, wenn der Pointer nicht in ein Array zeigt - das wird dann irgendwann vermutlich mit Zugriffsfehlern quittiert...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620006</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:58:38 GMT</pubDate></item><item><title><![CDATA[Reply to vector&amp;lt;complex &amp;lt;double&amp;gt; &amp;gt; umwandeln in double* on Mon, 24 Nov 2008 17:23:00 GMT]]></title><description><![CDATA[<p>Alles klar. Wuste schon was ein Increment ist, nur nicht das man es auch auf Pointer anwenden kann</p>
<p>Also denke ich werde das ganze noch mal überdenken wie ich das jetzt mache. Vielen Dank für eure Hilfe.</p>
<p>Lg Duwan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620073</guid><dc:creator><![CDATA[duwan]]></dc:creator><pubDate>Mon, 24 Nov 2008 17:23:00 GMT</pubDate></item></channel></rss>