gpt4 book ai didi

fortran - 当仅将 C_LOC 地址返回给 C 程序时,Fortran 变量需要 SAVE 属性吗?

转载 作者:行者123 更新时间:2023-12-01 01:51:12 25 4
gpt4 key购买 nike

通常情况下,SAVE属性用于 Fortran 类型声明,以便变量在子程序末尾保留其值,如 SO 问题 here 的答案中所述。 .但是,我最近在 another question 上举了一个例子。了解如何编写一个仅将可分配字符串常量的 C 地址返回给 C 调用程序的 Fortran 函数,以及 F2003 的 C_LOC 内在和其他 ISO_C_BINDING 功能。如果 SAVE属性可用于 Fortran 可分配字符串常量以避免潜在问题?

虽然我没用SAVE ,函数按预期工作:C 程序使用 char*指向 Fortran 函数返回的地址,然后可以正常使用(例如,用于打印和 strlen() )。没有产生警告/错误。此外,这似乎与我所看到的 C_F_POINTER 一致。用于编译器文档和相关 SO question 中的示例(即,目标值没有 SAVE 属性)。

特别是因为从 C 调用 Fortran 函数,我不清楚这个过程是否表现出预期的行为,或者它是否可能/应该失败,或者这是否是特定于供应商的实现细节。 SAVE 的 Intel Fortran 17 文档( here )似乎表明默认情况下会保存一个字符串常量(可分配与否?),但我不确定我是否正确阅读,或者该信息如何/是否在当前上下文中成立。我是否以可移植、正确的方式执行此过程?

虽然我已经链接到代码,但这里是重要的部分:

! f_string.f90: returns the C address to an allocatable string constant:
function get_string() bind(c, name='get_string')
use, intrinsic :: iso_c_binding
implicit none
type(C_PTR) :: get_string
character(len=:), allocatable, target :: fortstring ! <- Include SAVE?

fortstring = "Hello StackOverflow" // C_NULL_CHAR ! <- NULL-terminated string constant
get_string = C_LOC(fortstring)
end function get_string
// c_string.c: uses a char* to point at the address returned by 'get_string'
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *get_string(void); // <- Fortran fcn signature
int main(){
char *mycharptr;

mycharptr = get_string();
printf("String from Fortran: %s\n", mycharptr);
printf("len = %d\n", strlen(mycharptr));
return 0;
}

编译为 ifort /c f_string.f90 , icl c_string /link f_string.obj .

最佳答案

那是对的。保存是必要的。

当程序退出时,所有可分配的实体都被解除分配,除非它们是 save。 .

您可以使用 pointer而不是 allocatable并且目标不会被自动释放。我觉得它比 save 好因为可能多次调用该过程。

你的程序可能“工作”了,因为虽然内存块被释放了,但它没有被覆盖。所以 C 程序仍然找到了有意义的数据,但是在地址上它不允许访问。但是操作系统内存保护并不总是检查这种访问。

关于fortran - 当仅将 C_LOC 地址返回给 C 程序时,Fortran 变量需要 SAVE 属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com