gpt4 book ai didi

c - 从 fortran 传递到 c 的字符串上的额外内容是什么以及如何停止它?

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:00 25 4
gpt4 key购买 nike

我正在尝试将一个字符串和一个值从 fortran 传递到 c,但结果很奇怪,我无法弄清楚发生了什么。

fortran      
integer rmat

rmat = 4
call cprint("rmat ", rmat)

END

cprint_.c

#include <stdio.h>

void cprint_( char *string, int *wtf, int *var){
printf("string: %s wtf: %s var: %d\n", string, wtf, var);
}

输出:

string: rmat convertedtest.f wtf: var: 5

最佳答案

Fortran 字符串相当于固定长度的字符数组。从语义上讲,它们不是空终止的。相反,由实现来跟踪它们的长度。从历史上看,实现通过各种不同方式通过函数调用来跟踪字符串长度,但最常见的可能是将长度作为附加的隐式参数传递。这肯定就是您所看到的。

在某些实现中,额外参数紧跟在字符串之后,而在其他实现中,所有字符串长度都出现在参数列表的末尾。不过,长度参数通常是整数,而不是指针,这与直接对应于对象的参数不同。

您的测试虽然在技术上是错误的,但强烈表明您的字符串长度作为第三个参数传递(实际上是作为 int,而不是 int *)。因此,在适当的 cprint_ 函数处的第一次切割可能如下所示:

void cprint_(char *string, int *integer, int string_len) {
printf("string: '%.*s'\ninteger: %d\n", string, string_len, *integer);
}

如果您要打印从 Fortran 接收到的字符串,而不进行修改,那么指定合适的精度是合适的,如图所示,因为不能假设该字符串已终止。实际上,您可能希望打印比实际长度更少的字符串字符,但是,因为数组的大小和其中有意义的字符数之间没有明确的区别。当分配给 Fortran 字符串的值小于它们的大小时,Fortran 字符串会用空格 (' ') 右填充,并且 Fortran 程序通常假设真实数据仅扩展到最后一个非空白字符。

但是要小心:如果您修改字符串,例如通过插入 C 字符串终止符,那么您也在更改 Fortran 端的数据。如果必须,请复制一份,但通常您可以避免这样做,如上例所示。

关于c - 从 fortran 传递到 c 的字符串上的额外内容是什么以及如何停止它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57384010/

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