OpenVMS(VAX)Fortran函数将字符*(*)返回给C.

时间:2014-12-17 00:58:27

标签: c fortran openvms vax

OpenVMS(VAX)FORTRAN子例程可以传递 a 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);
}

OpenVMS(VAX)FORTRAN功能如何返回 a 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
  • Digital Fortran 77 V6.5-188
  • DEC C V6.0-001

2 个答案:

答案 0 :(得分:2)

来自DIGITAL Visual Fortran V6.0A版帮助:

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

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

答案 1 :(得分:2)

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

#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);
}