2012-03-23 5 views
1

Ich versuche, einige Fortran 90-Code aus einem C++ - Hauptprogramm aufzurufen. Die Fortran-Subroutine nimmt ein Array von double (nennen Sie es X) als Parameter und fährt fort, die Größe (X) an vielen Stellen im Code zu verwenden. Ich nenne die Routine mit einem C-Array erstellt durchFortran90 und Größe der in C++ erstellten Arrays

double *x = new double[21] 

aber wenn ich das Ergebnis der Größe (X) in der Fortran-Code drucke ich bekommen 837.511.505, oder einige andere große Zahlen.

Im Moment habe ich die Fortran-Code ändern, so schlimmsten Fall ist die Funktion neu zu schreiben, um die Größe als Parameter übergeben. Aber ich würde es lieber nicht tun.

Weiß jemand, ob es einen Weg gibt ich die C-Array derart schaffen, dass die Fortran-Routine seiner Größe herausfinden können?

+0

Offensichtlich erwartet Fortran vermutlich, dass die Größe des Arrays im Speicher relativ zum Zeiger gespeichert ist, den Sie übergeben, aber C++ verpflichtet es nicht. –

Antwort

1

Dies ist eine implementierungsspezifische Funktion. Viele Implementierungen (z. B. RSX und OpenVMS) definieren eine Struktur zum Übergeben eines Zeigers an die Daten sowie eine Beschreibung der Dimensionen, Typen usw. Andere Implementierungen bestehen keine solche Sache, es sei denn, die externe Deklaration ruft explizit einen Mechanismus zum Generieren von auf Beschreibung. Die meisten anderen bieten keinen solchen Mechanismus.

Ohne die Umsetzung im Einsatz zu wissen:

a) haben die Compiler-Dokumentation lesen
b) der Compiler Baugruppe erzeugen, und kontrollieren Sie es, um zu sehen, was es

+0

Danke für die Antwort. Wahrscheinlich mit den Intel und GNU Compilern und nur für kleinere Teile des Projekts. Wenn ich den Fortran-Code benutze, werde ich wahrscheinlich nur einen Wrapper darum schreiben. – Alain

0

Intel F95 erwartet Arraydeskriptor Struktur verwendet, die neben dem Array-Zeiger auch die Grenzen und Dimensionsinformationen speichern. size() ruft die Informationen aus dem Deskriptor ab.

Da Sie von C nur Zeiger vorbei sind, kein Beschreiber Info zur Verfügung steht, so Größe() gibt Kauderwelsch.

Im Allgemeinen sind Sie in dem rauen Gebiet von gemischter Sprachenprogrammierung, wo Arrays und Strukturen sind oft ein Schmerz des Programmierers. Intel-Compiler-Benutzerdokument hat einen separaten Abschnitt über C < => F95 gemischte Anrufe.

Insbesondere überprüfen Sie über Schnittstellen und Bindung - eine nette F95-Funktion, die in Inter-Sprache Anrufe hilft.

Die gute Nachricht, C < => F95 Berufung funktioniert sehr gut, wenn Sie an die Konventionen halten.

0

Ich persönlich benutze eine Tonne Mischcodierung von C++ bis Fortran 90/95/2003. Ich verwende normalerweise gfortran als meinen Compiler, aber um dieses Problem zu vermeiden, ist es üblich, immer die Größe der Arrays zu senden. Dadurch können Sie sogar die Form ändern. Betrachten wir ein 2-dimensionalen Array mit x, y Punkte:

double* x = new double[2*21] 

real(8),intent(in),dimension(2,21)::x 

Dies ist eine sehr praktische Funktion und wird dann können Sie die Größe Befehl verwenden. Die Antworten zu Compiler-Spezifika sind korrekt. Um Ihren Code für die meisten Compiler nutzbar zu machen, sollten Sie die Länge angeben, wenn Sie mehrsprachige Schnittstellen verwenden.