我正在研究VS2010混合编程,并使用英特尔编译器/ VisualStudio( Intel Parallel 2015 )在VS 2010中编译我的项目。
console - c source:
#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 );
有可能吗?如何在没有字符串长度的情况下调用?
答案 0 :(得分:1)
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中字符串的长度。也许通过宣布它不变。