C++ Fortran wrapper



  • SeppJ schrieb:

    Ja, Fortran und C arbeiten zusammen, habe ich schon einmal gemacht. Aufpassen muss man vor allem bei 2 Dingen:
    1. in Fortran ist alles "by reference", aber auch nicht richtig, sondern über die selbe Krücke wie in C mittels Pointern. Man sieht es bloß nicht so leicht.
    2. Mehrdimensionale Arrays sind genau anders herum geordnet.

    OK, dann entfällt das Verändern der Größe. Das dürfte dann aber selbst in Fortran nicht gehen.

    Ich weiß nicht, ob man in C++ ein Array mit new anlegen kann, das man in Fortran deletet. Dann könntest du deinen Vektor zumindest *irgendwie* zurückbekommen.


  • Mod

    Bashar schrieb:

    Ich weiß nicht, ob man in C++ ein Array mit new anlegen kann, das man in Fortran deletet. Dann könntest du deinen Vektor zumindest *irgendwie* zurückbekommen.

    Wilde Idee: malloc/free müssten zu Fortran kompatibel sein, weil man einfach die C-Version statt dem Fortran-Äquivalent benutzen kann.

    Bei new ist das natürlich kritischer, da theoretisch nicht einmal new und free kompatibel sein müssen. Man könnte natürlich jeweils einen C-kompatiblen Wrapper um new und delete machen. edit: Hmm, man bekommt natürlich auf keine Weise die nötige Typeninformation von Fortran aus zum C++-Teil. Man müsste sich also doch auf malloc beschränken oder lauter Spezialisierungen für verschiedene Typen anbieten. Beides unbefriedigend 😞 .



  • Okay,
    ein Vorschlag zur Güte in 1. Näherung:

    Nach meinem bisherigen Verständnis der Problemstellung muss der Array wachsen. Es lässt sich allerdings schon auf der Seite von Fortran abschätzen was die maximale neue Länge sein wird, nämlich gerade das Doppelte.

    Also wäre der Fahrplan:

    Fortran gibt den Array vor.
    Fortran hängt einen Array gleicher Länge mit Nullen gefüllt dran.
    Fortran übergibt den Array doppelter Länge mittels des Wrappers an C++.
    C++ arbeitet und gibt den Array zurück.

    Das sollte doch in 1. Näherung das Problem des allokierten Speichers umgehen, oder?

    Gruß,
    -- Klaus.


  • Mod

    Denk nicht so sehr in Sprachen, sondern in Verantwortung. Du übergibst ein Objekt an eine Funktion, dadurch sollte aber niemals die Verantwortung für ein Objekt wechseln! (Außer die Funktion ist genau für diesen Zweck da, zum Beispiel der Konstruktor eines Smartpointers). Das heißt der Aufrufer ist und bleibt verantwortlich für Erzeugung und Zerstörung des Objekts und nutzt dazu die Mittel seiner Sprache. Muss die Funktion das Objekt verändern oder darauf zugreifen, so nutzt sie die Methoden des Objekts dafür (was, je nach Sprache, in der die "Klasse" des Objekts geschrieben wurde, auch durchaus freie Funktionen sein können).
    Das ist der Hintergedanke der Kapselung in der Objektorientierung. In dieser abstrakten Formulierung funktioniert das auch über Sprachgrenzen hinweg.

    P.S: Ja, dein Vorschlag sollte ok sein. Wenn ich dich richtig verstanden habe, verwaltet der Fortran-Teil deines Programms das Array (das Objekt) und ruft mit diesem Objekt eine in C++ geschriebene Funktion auf. Der C++-Code benutzt das Array aber nur, die Verantwortung bleibt aber beim Anwendungscode, also dem Fortranprogramm.



  • Puh,
    also die Aussage mit der Verantwortung habe ich noch nicht verstanden.

    Aber ich versuche mal das mit der Objektorientierung mit meinen eigenen Worten wiederzugeben:
    Bei der Planung des Codes muss überlegt werden, welche Aufgaben ein Objekt erfüllen soll und wie es verändert werden kann. Diese Funktionen müssen dann Methoden des Objekts selbst sein, die 'von-außen' nur noch aufgerufen werden.

    Beispiel vector : Für diesen ist vorgesehen, dass die Länge wächst, aus diesem Grund gibt es z.B. die Funktion push_back() .

    Gegenbeispiel array : Dies ist ein Feld konstanter Länge, d.h. wenn eine Funktion auf einmal Elemente anhängen möchte, dann tut die Funktion etwas, was nicht vorgesehen ist.
    Dann ist das allerdings nicht das Problem der Funktion, sondern ein schlechtes Design, weil array (als Objekt selbst) nicht die Methoden bereitstellt, die in der Funktion benötigt werden.

    SeppJ schrieb:

    [..] verwaltet der Fortran-Teil deines Programms das Array (das Objekt) und ruft mit diesem Objekt eine in C++ geschriebene Funktion auf. Der C++-Code benutzt das Array aber nur, die Verantwortung bleibt aber beim Anwendungscode, also dem Fortranprogramm.

    Wenn wir jetzt schon bei Wörten wie Designentscheidung sind, dann muss ich da nochmal in die Planungsphase und genau überlegen welche Aufgaben seitens welcher Programmiersprache übernommen werden.

    Gruß,
    -- Klaus.



  • Und überhaupt ist der gezeigte FORTRAN-Code kein klassischer FORTRAN-Standard mehr. FORTRAN ist älter als als C und noch einmal älter als C++.
    Will man mit auf OOP angepasstem FORTRAN arbeiten, nimmt man besser gleich C++ und braucht keinen wrapper. Ich jedenfalls war sehr froh, das
    gemischtsprachige Programmieren einmal ganz zu vergessen. Unter DOS kam man sogar kaum an Assembler vorbei.


Anmelden zum Antworten