Php 如何用字符串参数调用Fortran子例程?

Php 如何用字符串参数调用Fortran子例程?,php,c,fortran,Php,C,Fortran,我正在用C编写一个PHP扩展,它调用Fortran库中的子例程。我能够调用需要int或double参数的子例程,但我不知道如何传递字符串。下面是Fortran子程序源代码的一段代码(我无法更改): 下面是我在C扩展中的尝试: extern void abcdef_(char *strA, int *size); PHP_FUNCTION(abcdef) { char *_strA; int size; /* Arguments Parsing */ if (zend_parse

我正在用C编写一个PHP扩展,它调用Fortran库中的子例程。我能够调用需要
int
double
参数的子例程,但我不知道如何传递字符串。下面是Fortran子程序源代码的一段代码(我无法更改):

下面是我在C扩展中的尝试:

extern void abcdef_(char *strA, int *size);
PHP_FUNCTION(abcdef)
{
  char *_strA;
  int size;

  /* Arguments Parsing */
  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
                &_strA, &size) == FAILURE)
    {
      RETURN_NULL();
    } 

  abcdef_(_strA, &size);

  return;
}
也许我找错了东西,但我发现这方面的信息非常稀少。我认为
Character*(*)
只是指向字符数组的指针,对吗?我尝试了许多不同的参数组合,但似乎都不正确。有时,当我调用例程时,它会出错,其他时候PHP不会显示错误,但子例程没有效果


由于我能够从扩展名中调用具有int和double参数的例程,并且该例程在从Fortran调用时运行良好,因此我认为这一定是我传递字符串的方式,但无法找到正确的方式。

这是编译器特有的事情。最好是使用Fortran 2003 C互操作性。即使无法更改(为什么?)原始代码,也可以使用
bind(C)
在Fortran 2003中编写包装层

如果不能这样做,请咨询编译器的ABI。对于gfortran,建议您应该按值传递大小

这意味着:

str.f90:

subroutine str(s)
  character*(*) :: s
  print *,s
end subroutine
密码c:

void str_(char * s, int size);
int main(){
 str_("Hello",5);
}
编译并运行:

>gfortran str.f90 passstr.c
> ./a.out 
 Hello

很有魅力。

谢谢你的回答,我已经试过了。问题一定是其他原因,但至少我现在知道这是正确的,这样我就可以找出实际的问题。但是在您问题中使用的代码
&size
,我希望您注意到这一点。
>gfortran str.f90 passstr.c
> ./a.out 
 Hello