Windows 中的混合编程
Mixed programming in Windows
我正在使用 VS2010 混合编程并使用英特尔编译器/VisualStudio(英特尔并行 2015)在 VS 2010 中编译我的项目。
控制台-c源:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
//#define readfile readfile_
extern void readfile(char*, int*);
int main()
{
int n, count;
char Fname[9];
char Name[10];
strcpy(Fname,"AMIN.for");
fprintf( stderr, "%s\n", Fname);
readfile( Fname, &n , strlen (Fname));
fprintf( stderr, "n = %d\n", n);
// fprintf( stderr, "%s\n", Name);
getch();
return 0;
}
子例程 - Lib fortran:
subroutine readfile( fname1, m )
character fname1*(*)
integer m
integer iounit,i
iounit=15
write(*,*) fname1
c10 format (a9)
open(iounit,file = fname1,action='read')
read (iounit,*) m
c20 format (i10)
write(*,*) m
close(iounit)
return
end subroutine
在下一行我有一个问题
readfile( Fname, &n, strlen(Fname) );
我想改成:
readfile( Fname, &n );
可以吗?没有字符串长度怎么调用?
Fortran 例程需要知道字符串的长度。
你现在正在做的是你正在使用一个隐藏的参数,这个参数在这个特定的编译器调用约定中使用。参数携带有关字符串长度的信息。
Fortran 不使用空分隔字符串,因此您必须始终知道您的字符串有多长。
现在您可以使用 bind(C)
更改 Fortran 过程以摆脱隐藏的参数,但同样,您必须以某种方式知道长度,并且必须将字符数组转换为字符串。这会使 Fortran 部分变得非常复杂。
在您使用的 Intel Fortran 中,您可以使用一些编译器指令来更改调用约定 http://www.csbi.mit.edu/technology/intel_fce/doc/main_for/mergedProjects/bldaps_for/common/bldaps_hndl_charstr.htm ,但要小心,无论如何您必须知道 Fortran 中字符串的长度。也许通过将其声明为常量。
我正在使用 VS2010 混合编程并使用英特尔编译器/VisualStudio(英特尔并行 2015)在 VS 2010 中编译我的项目。
控制台-c源:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
//#define readfile readfile_
extern void readfile(char*, int*);
int main()
{
int n, count;
char Fname[9];
char Name[10];
strcpy(Fname,"AMIN.for");
fprintf( stderr, "%s\n", Fname);
readfile( Fname, &n , strlen (Fname));
fprintf( stderr, "n = %d\n", n);
// fprintf( stderr, "%s\n", Name);
getch();
return 0;
}
子例程 - Lib fortran:
subroutine readfile( fname1, m )
character fname1*(*)
integer m
integer iounit,i
iounit=15
write(*,*) fname1
c10 format (a9)
open(iounit,file = fname1,action='read')
read (iounit,*) m
c20 format (i10)
write(*,*) m
close(iounit)
return
end subroutine
在下一行我有一个问题
readfile( Fname, &n, strlen(Fname) );
我想改成:
readfile( Fname, &n );
可以吗?没有字符串长度怎么调用?
Fortran 例程需要知道字符串的长度。
你现在正在做的是你正在使用一个隐藏的参数,这个参数在这个特定的编译器调用约定中使用。参数携带有关字符串长度的信息。
Fortran 不使用空分隔字符串,因此您必须始终知道您的字符串有多长。
现在您可以使用 bind(C)
更改 Fortran 过程以摆脱隐藏的参数,但同样,您必须以某种方式知道长度,并且必须将字符数组转换为字符串。这会使 Fortran 部分变得非常复杂。
在您使用的 Intel Fortran 中,您可以使用一些编译器指令来更改调用约定 http://www.csbi.mit.edu/technology/intel_fce/doc/main_for/mergedProjects/bldaps_for/common/bldaps_hndl_charstr.htm ,但要小心,无论如何您必须知道 Fortran 中字符串的长度。也许通过将其声明为常量。