2016-07-12 8 views
-2

Jetzt habe ich so etwas wie diesesBringen Sie Strings in Dateinamen

program prova 
CHARACTER (LEN=4) :: mvalue 
common mvalue 
mvalue='01.0' 
call funzione(var1, var2,...) 
end 

subroutine funzione() 
common mvalue 
*(stuff with var1, var2, ...)* 
open(10,file="./prova_"//mvalue//"_.res") 
end 

und der Compiler gibt

open(10,file="./prova_"//mvalue//"_.res")       
             1 
Error: Operands of string concatenation operator at (1) are CHARACTER(1)/INTEGER(4) 

Ich weiß nicht, ob ich die "implizite keine" Anweisung verwenden können, in der echte Code, denn vielleicht würde es etwas anderes vermasseln ... Es tut mir leid, wenn ich nicht genauer sein kann, aber wie ich Ihnen sagte, ich bin neu in FORTRAN, und der Code ist irgendwie erweitert (und EXTREM geschrieben schlecht). Ich würde es vorziehen, die mvalue Variable auf die Routine zu übergeben, aber wenn ich

program prova 
CHARACTER (LEN=4) :: mvalue 
mvalue="01.0" 
call func(mvalue) 
end 


subroutine func(mvalue) 
open(10,file="./prova_"//mvalue//"_.res") 
end 

zu tun versuchen, gibt es

open(10,file="./prova_"//mvalue//"_.res")       
          1 
Error: Operands of string concatenation operator at (1) are CHARACTER(1)/INTEGER(4) 

prova.f:4.16: 
call func(mvalue)             
Warning: Type mismatch in argument 'mvalue' at (1); passed CHARACTER(1) to INTEGER(4) 
+1

deklariert wird '' oder ' '' „_R00.res'' Hat nicht richtig angezeigt werden, müssen Sie die gleiche' verwenden“. –

+0

''unknown" 'ist ebenfalls ungültig. –

+0

Noch eine Empfehlung: Ich sehe keinen Grund, jemals' status = 'unknown'' zu verwenden.Lass es einfach aus. Oder verwenden Sie einen bekannten Statuswert, wenn Sie einen Grund dazu haben. –

Antwort

0

Da die commen bereits darauf hingewiesen haben, werden Sie zwei verschiedene Zitate mit Markierungen so, dass sie die Kompilierzeit bestehen, aber zur Laufzeit fehlschlagen.

Das Dummy-Argument file= erwartet einen String, der sehr lang wird: ./results/file_01.0_R00.res',status='unknown. Aber wenn es versucht, diese Datei zu öffnen, schlägt es fehl: Dies ist einfach kein gültiger Dateiname.

einfach die ' mit " in beiden Fällen zu ersetzen (nach .res und vor unknown) soll den Fehler weggehen.

2

Ihr Unterprogramm:

subroutine funzione() 
common mvalue 
*(stuff with var1, var2, ...)* 
open(10,file="./prova_"//mvalue//"_.res") 
end 

fehlt implicit none! Verwenden Sie es immer in jeder Scoping-Einheit ohne Ausnahme!

Der Typ mvalue ist nicht deklariert und daher implizit Integer.

Sie müssen den Typ in jeder Bereichseinheit angeben. Teilen mit der common ist nicht genug!

In Fortran 90 ist die richtige Sache, Module und nicht gemeinsame Blöcke zu verwenden. In jeder Programmiersprache im Allgemeinen besteht der richtige Weg nicht darin, globale Variablen gemeinsam zu nutzen (egal ob sie common, modules oder andere Wege verwenden), sondern die Zeichenkette als Argument an die Subroutine zu übergeben.


Um die neuen bearbeiten ist der gleiche Rat nach wie vor gültig: Ihr Unterprogramm fehlt implicit none! Verwenden Sie es immer in jeder Scoping-Einheit ohne Ausnahme!

Wenn Sie nicht verwenden können implicit none dann Sie MÜSSEN !!!!! bereit sein, Fehler von nicht deklarierten Variablen zu diagnostizieren. Es ist absolut notwendig!

Ein Zeichen Scheinargument als character*(*) mvalue

Verwandte Themen