Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在大型程序中将长变量更改为int类型_C++_Fortran_Migration_64 Bit - Fatal编程技术网

C++ 在大型程序中将长变量更改为int类型

C++ 在大型程序中将长变量更改为int类型,c++,fortran,migration,64-bit,C++,Fortran,Migration,64 Bit,在将大型代码库迁移到x64系统时,我面临整数类型的兼容性问题 期望整数*4的Fortran例程是在C/C++端被定义为长的传递整数。以下是一些示例代码: Fortran接口: SUBROUTINE FOO(N) INTEGER*4 N !! DO SOME WORK END C/C++代码: long n = 1; FOO(&n); 当然,当为x64编译时,这不起作用,整数需要定义为int。这些类型的调用被无数次地执行,手动替换它们将花费永远的时间 有没有更有效的方法

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

期望整数*4的Fortran例程是在C/C++端被定义为长的传递整数。以下是一些示例代码:

Fortran接口:

SUBROUTINE FOO(N)
    INTEGER*4 N
    !! DO SOME WORK
END
C/C++代码:

long n = 1;
FOO(&n);
当然,当为x64编译时,这不起作用,整数需要定义为int。这些类型的调用被无数次地执行,手动替换它们将花费永远的时间


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

首先尝试查找并替换,就像Steve在评论中建议的那样,这应该是可行的:

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

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

用awk或类似语言编写脚本。此外,如果它们需要固定大小,那么它们应该是int32_t.to late,以便现在提供帮助,但这就是为什么我们有,并且应该使用fixed with type
int32\t
将始终为32位。如果您的代码需要处理特定的大小,那么使用整数进行修复会更容易。这与将代码迁移到x86没有多大关系。上述代码可能从未在
sizeof(long)!=sizeof(int)
。修复代码的正确方法是使用现代Fortran的ISO C绑定功能。一种不太正确的方法是使用sed和适当的正则表达式模式将非标准的
INTEGER*4
转换为非标准的
INTEGER*8
。特别是考虑到即使在今天的64位系统中,这些约定也远不是通用的。请参阅LP64 LLP64 ILP64等。在Unix上以某种方式工作后,如果继续使用
long
而不是其他人推荐的方法,您可能会在MS Windows上得到一个非常不愉快的惊喜。