Fortran編譯錯誤一例
login2.stampede(111)$ make
mpif90 -g -ffree-form -DTPV26 -O0 -c -ffixed-line-length-250 -o testInterfaceF.o -I../..//seism_io_interface-v0.2/include testInterface.f
ifort: command line warning #10006: ignoring unknown option '-ffree-form'
ifort: command line warning #10006: ignoring unknown option '-ffixed-line-length-250'
testInterface.f(1): error #5149: Illegal character in statement label field [p]
program main
^
testInterface.f(1): error #5149: Illegal character in statement label field [r]
program main
-^
testInterface.f(1): error #5149: Illegal character in statement label field [o]
program main
--^
testInterface.f(1): error #5149: Illegal character in statement label field [g]
program main
---^
testInterface.f(1): error #5149: Illegal character in statement label field [r]
program main
----^
testInterface.f(1): error #5118: First statement in file must not be continued
program main
-----^
testInterface.f(2): error #5149: Illegal character in statement label field [u]
use mpi
----^
testInterface.f(3): error #5149: Illegal character in statement label field [i]
implicit none
----^
解決辦法:
mv testInterface.f testInterface.f90
字符串Fortran與C混合調用注意事項
C/FORTRAN 混合編程時,簡單變量在兩種語言中都有直接對應的類型,堆棧調用的規則也比較簡單。
但字符串、字符串數組的傳遞可能是個特例。
由於不同的FORTRAN編譯器,對字符串的堆棧解釋不同,本文介紹的方法僅保證在gcc 與 gfortran環境下適用。
C調用Fortran例子
int main()
{
…….
char s[7];
int b[3];
…
cstrng_( s, &b[1], 7L );
…
}
Fortran中
SUBROUTINE cstrng(s, b2)
CHARACTER(*) s
INTEGER b2
END SUBROUTINE openfile
Fortran調用C例子
program main
use mpi
implicit none
…….
CHARACTER (LEN=7) :: s
integer :: b
…
cstrng( s, b);
…
end
C中
vois cstrng_(char *s, int *b2, unsigned slen)
{
char cs = (char)malloc(sizeof(char)*(slen+1));
strncpy(cs, s, slen);
strncpy(&cs[slen], “\0”, 1);
}