2

OpenVMS (VAX ) FORTRAN 子例程可以传递character*(*)

subroutine forsub (in)
character*(*) in
type *, in
return
end

来自 C 函数:

#include<stdio.h>
#include <descrip.h>
extern void forsub();
main()
{
    auto $DESCRIPTOR(in_string, "VMS pass from c to fortran.");
    forsub(&in_string);
}

返回a的 OpenVMS (VAX) FORTRAN 函数如何character*(*)

character*(*) function forfunc (in)
character*(*) in
forfunc = in
return
end

在 C 代码中处理:

#include<stdio.h>
#include <descrip.h>
extern ?????? forfunc();
main()
{
    auto $DESCRIPTOR(in_string, "VMS fortran function return to c.");
    ??????? = forfunc(&in_string);
}
  • OpenVMS V6.2
  • 数字 Fortran 77 V6.5-188
  • DEC C V6.0-001
4

2 回答 2

2

这个(旧的?) C 用户指南中的示例 3-5可能解释了如何执行此操作:您需要已经提到的隐藏参数。一个例子是:

#include <stdio.h>
#include <descrip.h>
extern void forfunc();
main()
{
    auto $DESCRIPTOR(in_string, "VMS fortran function return to c.");
    char buffer[64];
    struct dsc$descriptor_s out_string = {
        sizeof buffer, DSC$K_DTYPE_T, DSC$K_CLASS_S, buffer};
    forfunc (&out_string, &in_string);
    printf ("%.*s\n", out_string.dsc$w_length, out_string.dsc$a_pointer);
}
于 2014-12-17T19:10:00.977 回答
2

从 DIGITAL Visual Fortran 版本 V6.0A 帮助:

使用语法 CHARACTER*(*) 返回字符串的 Fortran 函数将隐藏的字符串参数和字符串的地址放在参数列表的开头。

实现此类 Fortran 函数调用的 C 函数必须显式声明此隐藏字符串参数并使用它来返回值。C 返回类型应该是 void。但是,您更有可能通过不使用字符串返回函数来避免错误。尽可能使用子程序或将字符串放入模块或全局变量中。

于 2014-12-17T14:36:01.657 回答