2017-03-08 3 views
2

Ich habe eine strukturierte Art in Fortran, die viele Daten einschließlich Zeiger (real * 8 Zeiger Datentyp) enthält.Übergabe eines strukturierten Datentyps von Fortran an C++

Ich entwickle eine C++ API für einige Fortran-Routine. Ich brauche den Inhalt der Struktur, um zwischen den Aufrufen der Fortran-Routine bestehen zu bleiben.

Ich dachte darüber nach, die Adresse der Struktur mit loc und die Adresse an die C++ Seite übergeben.

Wenn Fortran-Routine erneut aus C++ aufgerufen wird und die Adresse an Fortran zurückgegeben wird, wurde sie irgendwie an die ursprüngliche Struktur übergeben und dann für die Berechnung verwendet.

Welchen Ansatz kann ich verwenden, um dies zu erreichen?

Danke.

EDIT: mein Code basiert auf den Kommentaren/Anregungen. Das Programm stürzt ab, wenn C_LOC aufgerufen wird (wenn ich den Aufruf von C_LOC auskommentiere, stürzt das Programm nicht ab).

+0

Dies ist etwas breit und würde vielleicht von einer etwas konkreteren Details mit Details, die Sie im Sinn haben, profitieren. Sind Sie zufrieden damit, dass der von Fortran abgeleitete Typ völlig undurchsichtig ist, was die C++ - Seite betrifft? Wenn Sie sind, deutet das auf eine mögliche einfache Antwort hin. – francescalus

+0

Ja, ich bin froh, dass Fortran für C++ völlig undurchsichtig ist. Ich brauche den Inhalt der Struktur nicht zu kennen, brauche nur eine Möglichkeit, ein Handle für die Struktur aufrechtzuerhalten, damit ich sie zwischen nachfolgenden Aufrufen wiederverwenden kann. –

+0

Es wäre viel besser, den tatsächlichen Code zu sehen. Es sollte eigentlich keine Typumwandlung in Fortran notwendig sein. Fortran wird nur eine Adresse bekommen und sie wird sie als Referenz interpretieren. Und in C++ wird es ein 'void *' sein. –

Antwort

1

Unter Fortran 2003 (von den meisten Compilern heutzutage unterstützt) können Sie das Standardmodul ISO_C_BINDING verwenden. Wenn Sie mit der erhaltene C glücklich sind Zeiger „opaque“ (das heißt, Sie wollen einfach nur ein void*) zu sein, können Sie die C_LOC Funktion:

use, intrinsic :: ISO_C_BINDING 
type(your_struct_t), target :: your_obj 
type(C_PTR) :: p 

p = C_LOC(your_obj) 

Sie dann diesen Zeiger in einigen C Prozedur passieren kann:

interface 
    subroutine mycproc(x, n, userdata) bind(C) 
     use, intrinsic :: iso_c_binding 
     integer(c_int), intent(in), value :: n 
     real(c_double), intent(in) :: x(n) 
     type(c_ptr), intent(in), value :: userdata 
    end subroutine 
end interface 

call mycproc(x, size(x), p) 
+0

Ich folgte der Lösung der ursprünglichen Frage sowie Ihrer Lösung (die im Grunde die gleiche ist). Das Programm stürzt ab, wenn ich die C_LOC-Methode aufruft. Nicht sicher warum? Ich werde meinen Beispielcode zu meiner Frage veröffentlichen. –

Verwandte Themen