我遇到了使用英特尔Fortran编译器编译的Fortran代码的问题。
我遇到的具体问题是OPEN
语句。我试图重写源代码,所以我可以使用免费的编译器编译它,即GNU Fortran,我成功了,但我有一些问题。
OPEN(access = 'direct', form = 'binary', status = 'replace'...)
有一些临时文件输出,但form = 'binary'
不是标准的,GNU Fortran编译器不支持。
在网上寻找解决方案后,我发现form = 'unformatted'
应该是等价的,GNU Fortran可以处理它。是的,这是真的,我能够编译并且代码正确运行。但是,代码是一种科学计算,在这些文件中以这种方式生成大量数据。我的问题是form = 'unformatted'
导致的文件比使用form = 'binary'
大4倍。
有了这个,我没有足够的硬盘空间来成功运行在某些情况下使用无格式格式,而使用二进制我可以。英特尔Fortran的'二进制'是否可以与GNU Fortran一起使用并产生类似的文件大小?
正如我们所要求的那样,我正在添加一个简短的简化示例代码:
subroutine init
use module params ! contains param1, param2, param3, ... which are inetger or real
common /params2/ maxi, maxj, maxk, limit, recnum ! integers defined elsewhere
real*8, allocatable :: x(:)
... other variables
open (unit = 5, file = 'data.txt', access = 'direct',
* form = 'binary', recl = 16*maxk+8, status = 'replace')
write(5, rec = 1) param1, param2, param3, maxi, maxj, maxk, limit, recnum ...
recnum = 2
do i = 1, maxi
do j = 2, maxj
... do some stuff with x
write(55, rec=recnum) x(0), (xt(k), xt(limit-k), k = 1, maxk)
recnum = recnum + 1
done
done
close(5)
end subroutine init
program xx
common /params2/ maxi, maxj, maxk, limit, recnum
...
call subroutine init
...
open (unit = 5, file = 'data.txt', access = 'direct',
* form = 'binary', recl = 16*maxk+8, status = 'old')
... do some stuff
read(5, rec=1) param1, param2, param3, maxi, maxj, maxk, limit, recnum, ...
... do some stuff
recnum = 1
do i = 1, maxi
do j = 2, maxj
recnum = recnum + 1
... do some stuff
read(5, rec=recnum) x(0), (xt(k), xt(limit-k), k = 1, maxk)
... do some stuff
done
done
close(5)
end program
program xx
需要读取第一条记录,因为生成的文件data.txt
subroutine init
我来自之前的运行(subroutine init
的调用可能不会在每次运行时发生),
并且需要读取一些参数来解释data.txt
中的数据。
像这样生成多个文件,并不总是需要第一条记录。
如果第一条记录被读取,即使没有必要,我认为access = stream
可能有效。
但是当我用access = direct
替换access = stream
并删除recl
并在rec =
或WRITE()
中每次出现READ()
时都会出现运行时错误文件I / O期间的不一致。
答案 0 :(得分:2)
我无法找到完全相同的副本,但之前已在此处理过。
access='stream', `form='unformatted'
完全不标准。标准方法是使用
form='binary'
将启用Fortran 2003的标准流访问,它以C语言建模,可以在所有合理的最新编译器中使用。
基本上,access
与其他语言不兼容。正确的方法是真正改变form='binary'
,这就是为什么你可能会感到困惑。
顺序和直接访问都是基于记录的,除了您的数据之外,还可能导致写入记录标记。非标准<?php
define( '_JEXEC', 1 );
define( 'JPATH_BASE', realpath(dirname(__FILE__).'/../../' ));
require_once ( JPATH_BASE .'/includes/defines.php' );
require_once ( JPATH_BASE .'/includes/framework.php' );
$db = JFactory::getApplication('site');
$search = $_REQUEST["q"];
$query = "SELECT * FROM ts_djc2_categories WHERE name LIKE '%$search%'";
$db->setQuery($query);
$result = $db->query();
$json = array();
$tt = "Nothing Found.";
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
array_push($json, $row['name']);
}
}
else
{
array_push($json, $tt);
}
echo json_encode($json);
会更改,但正确的方法是使用可以格式化和未格式化的流访问。特别是未格式化的非常方便,让您在没有任何其他标记的情况下准确保存内存中的字节。