2010-12-08 20 views
3

Ich würde gerne Ihre Hilfe über Fortran-Funktion durch C-Funktionen aufrufen. Diese C-Funktionen werden in Python-Code über Cython verwendet. Putting Dinge zusammen, ich habe dieses Schema:Cython, C und Fortran

Cython-Modul -> C-Funktion -> Fortran, wo -> bedeutet "Anrufe".

Momentan habe ich es geschafft, die C-Funktion von Cython aufzurufen, aber es fällt mir schwer, die Fortran-Funktion aufzurufen. Kannst du mir helfen? (Ein einfaches Beispiel wäre toll).

Vielen Dank im Voraus. Edit: Ich benutze gcc 4.1.2. Und gfortran

+0

Eine genauere Antwort erfordert wahrscheinlich, dass Sie die spezifischen C- und Fortran-Compiler kennen, nach denen Sie fragen. – SingleNegationElimination

+0

Bearbeitet. Sorry, dass ich das vergessen habe :) – nunolourenco

+0

Kennen Sie [fwrap] (https://github.com/kwsmith/fwrap)? – ephemient

Antwort

7

Der Link in der ersten Antwort beschreibt veraltete Methoden. Es ist viel einfacher geworden, Fortran von C oder C von Fortran zu nennen, wenn die ISO C-Bindung an Fortran hinzugefügt wird. Die Verwendung dieser Fortran-Sprachfunktion weist den Fortran-Compiler an, ausführbaren Code zu senden, der binärkompatibel mit C ist. Der Programmierer muss die Verbindung nicht "hacken", und da er Teil der Sprache ist, ist er kompiler- und plattformunabhängig. Technisch gesehen ist die ISO C-Bindung Teil von Fortran 2003, ist jedoch seit mehreren Jahren in zahlreichen Compilern verfügbar, z. B. gfortran seit Version 4.3 und Intel ifort.

Um eine Fortran-Subroutine oder -Funktion von C aufzurufen, deklarieren Sie die Fortran-Subroutine oder -Funktion mit der Option bind C und verwenden die C-kompatiblen Typen in der Bindung für die Deklarationen der Argumente. Es gibt Beispiele im gfortran Handbuch unter "Mixed Language Programming". Da die ISO C-Bindung ein Teil der Sprache ist, ist dieser Abschnitt des Handbuchs weitgehend unabhängig vom Compiler. Es gibt andere Beispiele in vorherigen Antworten hier auf Stack Overflow und anderswo im Web.

Hier ist ein schnelles Codefragment (ungetestetes) eine Fortran-Subroutine Deklaration einer Subroutine aus C genannt werden:

subroutine test (varint1, varflt2) bind (C, name="MyTest") 

    use iso_c_binding 

    integer (kind=c_int32_t), intent (in) :: varint1 
    real (kind=c_float), intent (out) :: varflt2 

Der bind C name "MyTest" überschreibt den Fortran Namen - es Fall ist, empfindlich, anders als Fortran. Keine Sorge um Unterstriche! Die Variablentypen sollten offensichtlich sein ... siehe das gfortran Handbuch oder woanders für was verfügbar ist.

+0

Hmmm, ich dachte ich könnte es machen, ohne den fortran code zu ändern, da es mir als blackbox gegeben wurde. Ich habe es einfach geschafft, dank Ihrer Einsichten, vielen Dank :) – nunolourenco

0

viele Google-Treffer zu diesem (Aufruf Fortran von C). versuchen http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html

Ich rief Fortran-IV von Macro-10 vor 35 Jahren, aber habe keine aktuellen Erfahrungen von mir zu teilen.

+0

Ich habe das schon probiert. Hat nicht funktioniert :( – nunolourenco

+2

brauche weitere informationen. Was genau hast du probiert? Und wie genau ist es schiefgegangen? –

1

Es gibt ein automatisiertes Tool namens fwrap, das C-, Cython- und Python-Bindungen für Fortran-Routinen generiert. Ich denke, es hat immer noch Beta-Status, aber Sie finden es möglicherweise hilfreich, der Link ist here.

Verwandte Themen