2016-08-09 51 views
0

Ich habe einen dritten Teil-Code in Fortran 77, und ich habe eine Subroutine in Fortran 90 geschrieben, die ich gerne an diesen Code anschließen würde. Ich habe festgestellt, dass die Variablen nicht korrekt von einem Unterprogramm zum anderen übergeben werden. Ich denke, der Grund ist, dass die Definitionen der doppelten Genauigkeit in den beiden Programmen nicht kompatibel sind.Übergabe echte Arrays von Fortran 90 bis Fortran 77

Ich möchte, dass die Variable zu F77 zurückgegeben ist ein double precision. Welche echte Definition soll ich in f90 verwenden? Ich bin mit selected_real_kind(p=15,r=307)


EDIT: Ich habe die Erklärung zu double precision in f90 geändert, und ich habe festgestellt, dass double precision Variablen korrekt übergeben werden. Das Problem tritt auf, wenn ich zuweisbare Arrays von f90 bis f77

übergebe. Die Arrays sind ursprünglich im Code f77 zugeordnet. dann zuteilen ich einige zuweisbaren Arrays in f90 und sie dann an f77 passieren, aber das funktioniert nicht

f77 Code:

program oldprog 
    double precision da(100) 

    call sub(da) 
    end 

    subroutine sub(da) 
    double precision da(*) 
    call mynewsub(da) 
    end 

f90 Code:

subroutine mynewsub(da) 
    implicit none 
    double precision, allocatable:: da(:) 
    allocate(da(100)) 
    da = 1.0 
end subroutine mynewsub 

Ich dachte, die überspringen Zuweisung in mynewsub, aber dann bekomme ich SIGSEGV

+1

Fortran asuming Sie nicht wollen, den alten Code ändern, nur 'Doppel precision' in dem neuen Code verwenden, um seine Sie wissen konsistent. (Sie können natürlich auch den alten Code aktualisieren, um 'selected_real_kind' zu verwenden) – agentp

+1

Überprüfen Sie, was die beiden fraglichen Compiler für' double precision' verwenden, aber es ist wahrscheinlich, dass es in beiden Fällen IEEE 754 64 bit binary ist. –

+0

Ich habe versucht, 'double precision' zu verwenden, aber die Variablen werden nicht korrekt übergeben, möglicherweise weil ich zuweisbares Array übergebe? – simona

Antwort

1

Ihr mynewsub akzeptiert das Array als zuweisbares Argument.

Das erfordert explizite Schnittstelle in Fortran 95, und ist unmöglich in Fortran 90, nicht einmal über Fortran 77, die allocatable überhaupt nicht sprechen.

Sie können dies nicht tun.

in Ihrem Hauptprogramm und

program oldprog 
    double precision da(100) 

das Array ist statisch. Es kann in keiner Version von Fortran in irgendeiner Weise neu zugeordnet werden, es ist für immer fixiert.

Sie sollten darüber nachdenken, es überall ein Update relevante Teile des Codes zu machen zuordenbaren 95.

+1

Ich möchte nicht ändern F77-Code. Kann ich die F90-Subroutine mit der angenommenen Form neu schreiben, wie in http://www.fortran90.org/src/best-practices.html beschrieben? Wenn ich 'allocate' in' mynewsub' entferne, denkt fortran, dass 'da' nicht zugeordnet ist und Segmentierungsfehler – simona

+1

Nein ............. –

+0

Normalerweise finde ich, wenn ich ALLOCATE entferne, dass ich auch entfernen sollte Erwähnungen von ALLOCATABLE – Holmz