我正在努力将一小段Fortran代码翻译成C语言。我有一个以二进制格式编写的文件和一个可以读取这种格式的Fortran程序。我的目标是拥有一个能够读取相同格式的C程序。我对Fortran完全陌生,并且我没有该格式的原始规范。所以,这是一种逆向工程的过程。
filename = 'file'
integer :: status
integer, parameter :: di=selected_int_kind(9)
integer(di) :: nn
OPEN(11,file = filename, status = 'old', action = 'read', form = 'unformatted', iostat = status)
if(status /= 0) then
write(*,*) 'FILE ERROR: '//filename
stop
endif
read(11) nn
CLOSE(11)真正让我感到困惑的一件事是selected_int_kind()语句。它到底是做什么的?在C语言中,什么是等价的?
实际上,我第一次尝试翻译的结果与@JohnBode的答案几乎相同,但并不起作用。它读取了一个完全不正确的值。
经过几次尝试,我找到了一个可行的解决方案,然而,我不明白为什么会这样。由于某些原因,正确的值被写入第5-8个字节。因此,我既可以读取两个int值(其中第二个将是正确的值),也可以读取一个long值,然后右移32位。你知道为什么Fortran可以如此轻松地检索正确的值吗?
发布于 2016-02-11 01:49:18
Fortran中的类型有一种类型,因为相同的类型(在本例中为整型)可能具有不同的“风格”(有点像C中的short、long、signed、unsigned等)。这些类型都是整数:例如,请参阅列表here。表达式种类的意思是:最小整数种类的种类数是什么,它可以包含-1e9到1e9之间的值(参见解释here)。
在C语言中,我猜signed int应该没问题,因为即使是4个字节(32位)也会从-2^31到2^31-1,这比所需的要宽一点。
发布于 2016-02-11 02:19:27
这接近于1:1的转换。
const char *filename = "file"; // or const char filename[] = "file";
long nn;
FILE *input = fopen( filename, "rb" ); // open as binary
if ( !input ) // or if ( input == NULL )
{
fprintf( stderr, "FILE ERROR: %s\n", filename );
exit(0);
}
if ( fread( &nn, sizeof nn, 1, input ) < 1 )
{
fprintf( stderr, "Error while reading input\n" );
}
fclose( input ); C没有与上面的"selected_int_kind“等价的类型;相反,您可以选择适当的类型来表示预期的值范围(即,short、int、long、long long等)。如果您需要能够表示9个十进制数字,那么普通的int可能不够宽(尽管在实践中应该足够宽),因此您可能应该使用long。
https://stackoverflow.com/questions/35322254
复制相似问题