<?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[Fortran Arrays in C++ ausdrücken]]></title><description><![CDATA[<p>Guten Morgen @ all,</p>
<p>ich bin dabei ein paar alte Codes von Fortran nach C++ zu übersetzen. Dabei habe ich das Gefühl das meine Lösung für Arrays höchst ineffizient ist. Vieleicht könnt ihr mir ein paar Tips geben wie man es besser machen kann.</p>
<p>Es handelt sich um Konstrukte wie diesen</p>
<pre><code>PROGRAM
REAL*8 A(-1:nx+1,-1:ny+1,10)
INTEGER nx, ny

CALL FOO(A(-1,-1,5), nx, ny)
END

SUBROUTINE FOO(Arr2D, nx, ny)
INTEGER nx, ny
REAL*8 Arr2D(-1:nx+1, -1,ny+1)

...

RETURN
END
</code></pre>
<p>Nun das die Indizes nicht bei 0 Anfangen habe ich über eine Klasse mit dem operator() gelöst. Das ist aber schon unschön da ich für je für 1D, 2D, ..., 7D eine eigene Klasse bauche.<br />
Für die Übergabe an FOO ist mir nicht dümmeres eingefallen als die Referenz von A(-1, -1, 5) zu übergeben und den Zeiger in FOO auf eine 2D Klasse zuzuweisen. Die Klasse ist im Konstruktor so geschrieben, das wenn sie einen Zeiger als letztes Argument erhält den Speicher als gegeben annimmt und nicht allokiert/deallokiert.</p>
<p>Das sieht dann etwa so aus</p>
<pre><code>int main()
{
  int nx = 5;
  int ny = 5;
  FtnArr3D(-1, nx+1, -1, ny+1, 1, 10); // allokiert den Speicher

  FOO(&amp;A(-1, -1, 5));
}

void FOO(void* __a, int nx, int ny)
{
  FtnArr2D(__a, -1, nx+1, -1, ny+1); // Speicher wird nicht allokiert
}
</code></pre>
<p>Wie könnte das besser vor allem effiezienter gestaltet werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317358/fortran-arrays-in-c-ausdrücken</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 01:19:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317358.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Jun 2013 07:18:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fortran Arrays in C++ ausdrücken on Thu, 06 Jun 2013 07:18:31 GMT]]></title><description><![CDATA[<p>Guten Morgen @ all,</p>
<p>ich bin dabei ein paar alte Codes von Fortran nach C++ zu übersetzen. Dabei habe ich das Gefühl das meine Lösung für Arrays höchst ineffizient ist. Vieleicht könnt ihr mir ein paar Tips geben wie man es besser machen kann.</p>
<p>Es handelt sich um Konstrukte wie diesen</p>
<pre><code>PROGRAM
REAL*8 A(-1:nx+1,-1:ny+1,10)
INTEGER nx, ny

CALL FOO(A(-1,-1,5), nx, ny)
END

SUBROUTINE FOO(Arr2D, nx, ny)
INTEGER nx, ny
REAL*8 Arr2D(-1:nx+1, -1,ny+1)

...

RETURN
END
</code></pre>
<p>Nun das die Indizes nicht bei 0 Anfangen habe ich über eine Klasse mit dem operator() gelöst. Das ist aber schon unschön da ich für je für 1D, 2D, ..., 7D eine eigene Klasse bauche.<br />
Für die Übergabe an FOO ist mir nicht dümmeres eingefallen als die Referenz von A(-1, -1, 5) zu übergeben und den Zeiger in FOO auf eine 2D Klasse zuzuweisen. Die Klasse ist im Konstruktor so geschrieben, das wenn sie einen Zeiger als letztes Argument erhält den Speicher als gegeben annimmt und nicht allokiert/deallokiert.</p>
<p>Das sieht dann etwa so aus</p>
<pre><code>int main()
{
  int nx = 5;
  int ny = 5;
  FtnArr3D(-1, nx+1, -1, ny+1, 1, 10); // allokiert den Speicher

  FOO(&amp;A(-1, -1, 5));
}

void FOO(void* __a, int nx, int ny)
{
  FtnArr2D(__a, -1, nx+1, -1, ny+1); // Speicher wird nicht allokiert
}
</code></pre>
<p>Wie könnte das besser vor allem effiezienter gestaltet werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2328922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2328922</guid><dc:creator><![CDATA[andreasgeorg]]></dc:creator><pubDate>Thu, 06 Jun 2013 07:18:31 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Arrays in C++ ausdrücken on Thu, 06 Jun 2013 08:06:54 GMT]]></title><description><![CDATA[<p>andreasgeorg schrieb:</p>
<blockquote>
<p>Wie könnte das besser vor allem effiezienter gestaltet werden?</p>
</blockquote>
<p>Indem man nicht versucht, in C++ FORTRAN zu programmieren. Es ist zwar bekannt, dass man <a href="http://www.google.com/search?q=program+fortran+in+any+language" rel="nofollow">in jeder Sprache FORTRAN</a> programmieren kann, aber ich bin mir nicht so ganz sicher, ob das so 100% ernst gemeint 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>
<p>Was ist denn deine Motivation, Iteratoren, Templates &amp; Co. gegen selbstgefrickelte Arrays zu tauschen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2328930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2328930</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 06 Jun 2013 08:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Arrays in C++ ausdrücken on Thu, 06 Jun 2013 09:09:20 GMT]]></title><description><![CDATA[<p>Die Frage ist schon ernst gemeint.</p>
<p>Der Hintergrund ist das wir hier z.T. sehr alte Fortran Codes haben aber diese aber nicht komplet neu entwickeln wollen.</p>
<p>Das mit den selbst <em>gefrickelten</em> Arrays war mein erster Versuch mit der aus FORTRAN gegebenen Speicherstruktur umzugehen. Das das keine gute Lösung wird hatte ich ja Eingangs schon geschrieben. Mir fehlt halt nur so der Ansatz wie ich mit Indizes ungleich 0 und der Übergabe eines z.B. 3D Arrays als 2D Array umgehen soll/kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2328947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2328947</guid><dc:creator><![CDATA[andreasgeorg]]></dc:creator><pubDate>Thu, 06 Jun 2013 09:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Arrays in C++ ausdrücken on Thu, 06 Jun 2013 09:51:10 GMT]]></title><description><![CDATA[<p>andreasgeorg schrieb:</p>
<blockquote>
<p>Der Hintergrund ist das wir hier z.T. sehr alte Fortran Codes haben aber diese aber nicht komplet neu entwickeln wollen.</p>
</blockquote>
<p>Man kann durchaus Fortran und C++ in einem Programm mischen. Wird schließlich alles compiliert. Man muss bloß einen gemeinsamen Nenner bei den Datenstrukturen finden.</p>
<blockquote>
<p>Das mit den selbst <em>gefrickelten</em> Arrays war mein erster Versuch mit der aus FORTRAN gegebenen Speicherstruktur umzugehen. Das das keine gute Lösung wird hatte ich ja Eingangs schon geschrieben. Mir fehlt halt nur so der Ansatz wie ich mit Indizes ungleich 0 und der Übergabe eines z.B. 3D Arrays als 2D Array umgehen soll/kann.</p>
</blockquote>
<p>Ist das denn so schwer, Arraycode leicht anzupassen, dass er bei 0 anfängt und dass die Übergaben im C++-Stil sind? Du musst doch sowieso Zeile für Zeile übersetzen, wenn du den Fortrancode nach C++ übertragen möchtest. Da kann man doch auch ein paar Indizes anpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2328953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2328953</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 06 Jun 2013 09:51:10 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Arrays in C++ ausdrücken on Thu, 06 Jun 2013 12:21:13 GMT]]></title><description><![CDATA[<p>Bitte auch daran denken, dass FORTRAN Arrays in Column Order (also Spalte zuerst und dann Zeilen) ablegt und C/C++ etc als Row Order (Zeile zuerst, dann Spalte). Du solltest also externe Daten transponieren, bevor Du sie in C++ verarbeitest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2328980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2328980</guid><dc:creator><![CDATA[RowOrder]]></dc:creator><pubDate>Thu, 06 Jun 2013 12:21:13 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Arrays in C++ ausdrücken on Thu, 06 Jun 2013 13:00:54 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/doc/libs/1_53_0/libs/multi_array/doc/index.html" rel="nofollow">multi_array</a> oder auch std::valarray sind ggf. einen Blick wert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2328990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2328990</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 06 Jun 2013 13:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Fortran Arrays in C++ ausdrücken on Fri, 07 Jun 2013 05:06:00 GMT]]></title><description><![CDATA[<p>RowOrder schrieb:</p>
<blockquote>
<p>Bitte auch daran denken, dass FORTRAN Arrays in Column Order (also Spalte zuerst und dann Zeilen) ablegt und C/C++ etc als Row Order (Zeile zuerst, dann Spalte). Du solltest also externe Daten transponieren, bevor Du sie in C++ verarbeitest.</p>
</blockquote>
<p>Vielen Dank für den Hinweis, das ist mir bewußt - habe ich auch in meiner <em>Frickellösung</em> beachtet.</p>
<p>camper schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_53_0/libs/multi_array/doc/index.html" rel="nofollow">multi_array</a> oder auch std::valarray sind ggf. einen Blick wert.</p>
</blockquote>
<p>Danke, werde ich mir mal ansehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2329142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2329142</guid><dc:creator><![CDATA[andreasgeorg]]></dc:creator><pubDate>Fri, 07 Jun 2013 05:06:00 GMT</pubDate></item></channel></rss>