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 中字符串的长度。也许通过将其声明为常量。