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);
}
答案 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);
}