【问题标题】:Changing long variables to int type in large program在大型程序中将长变量更改为 int 类型
【发布时间】:2019-06-21 15:25:46
【问题描述】:

在将大型代码库迁移到 x64 系统时,我遇到了整数类型的兼容性问题。

期望 INTEGER*4 的 Fortran 例程会传递在 C/C++ 端定义为 long 的整数。这是一些示例代码:

Fortran 接口:

SUBROUTINE FOO(N)
    INTEGER*4 N
    !! DO SOME WORK
END

C/C++ 代码:

long n = 1;
FOO(&n);

当然,这在为 x64 编译时不起作用,整数需要定义为 int。这些类型的调用被打了无数次,而手动替换它们将需要很长时间。

有没有更有效的方法来进行这些更改?

【问题讨论】:

  • 用 awk 或类似的方式编写脚本。另外,如果它们需要固定大小,它们应该是 int32_t。
  • 现在提供帮助为时已晚,但这就是我们拥有并且应该使用固定类型的原因。 int32_t 将始终为 32 位。如果您的代码需要使用特定的大小,使用整数固定会使这变得容易得多。
  • 这与将代码迁移到 x86 几乎没有关系。上面的代码可能从未在sizeof(long) != sizeof(int) 的任何系统上工作过。修复代码的正确方法是使用现代 Fortran 的 ISO C 绑定功能。不太正确的方法是使用 sed 和适当的正则表达式模式将非标准 INTEGER*4 转换为非标准 INTEGER*8
  • 特别是考虑到即使在今天的 64 位系统中,这些约定也远非通用。参见 LP64 LLP64 ILP64 等。在你让它在 Unix 上运行之后,如果你继续使用 long 而不是其他人推荐的,你可能会在 MS Windows 上得到一个非常不愉快的惊喜。

标签: c++ fortran migration 64-bit


【解决方案1】:

首先尝试像史蒂夫在 cmets 中建议的那样进行查找和替换,这应该可行:

sed -i 's/integer\*4/integer\*8/gI' *.f90

-i 在文件中提供替换,I 在末尾提供不区分大小写的搜索,* 符号用\* 转义。您可能希望将*.f90 更改为您拥有的扩展名或*.f*

【讨论】:

    猜你喜欢
    • 2021-01-08
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 2015-09-06
    • 1970-01-01
    相关资源
    最近更新 更多