在Fortran 90中,我们可以通过接口重载功能.但是,根据此站点,我们无法使用相同的参数名称定义这些函数.使用gfortran,它似乎不是一个问题,因为以下代码运行良好:
interface check
module procedure check_int, check_real
end interface
contains
subroutine check_int(cur, dname, func_name, fname)
integer, allocatable, intent(in) :: cur(:)
character(*) :: dname, func_name, fname
...
end subroutine
subroutine check_real(cur, dname, func_name, fname)
real, allocatable, intent(in) :: cur(:)
character(*) :: dname, func_name, fname
...
end subroutine
Run Code Online (Sandbox Code Playgroud)
那么,这样做是不好的做法吗?
编辑:使用关键字调用函数不会改变任何内容.
我想在Makefile中检查grep搜索的结果.与此解决方案相反,我不希望使用shell命令.另外,当grep找不到字符串时,我不希望Makefile引发错误(退出代码为1被视为错误).
以下尝试忽略该错误并检查退出代码:
all:
-grep term log*
echo $$?
@case "$$?" in \
0)\
echo "found";; \
*) \
echo "not found";;\
esac;
Run Code Online (Sandbox Code Playgroud)
不幸的是,退出代码始终为0.
假设您需要一个数组列表,每个数组都具有相同的大小.使用2D数组在性能方面是否更好:
integer, allocatable :: data(:,:)
Run Code Online (Sandbox Code Playgroud)
或派生类型数组:
type test
integer, allocatable :: content(:)
end type
type(test), allocatable :: data(:)
Run Code Online (Sandbox Code Playgroud)
当然,对于不同大小的阵列,我们没有选择.但是如何在两种情况下管理内存?还有,其中一个很好的代码实践?
如果文件中没有独立函数(不在模块中),并且您使用单精度调用它,而它需要双精度数:
main.f90:
program main
call test(1.0)
end program main
Run Code Online (Sandbox Code Playgroud)
test.f90:
subroutine test(a)
double precision :: a
print *, "a", a
end subroutine
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器如何从单精度到双精度"强制转换"? 使用浮点格式,我希望在转换过程中这些位保持不变,但要追加额外的零.那是:
1 = 0 01111111 00000000000000000000000 in single-precision
Run Code Online (Sandbox Code Playgroud)
我希望最终值为2 ^( - 7):
0 01111111000 0000000000000000000000000000000000000000000000000000 in double precision
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,使用gfortran 6.4.0,最终值为5.2635442471208903E-315.
这是我目前使用TAP的测试工具:
use TAP::Harness;
my $harness = TAP::Harness->new();
$harness->runtests(['sequential.t']);
Run Code Online (Sandbox Code Playgroud)
我想避免使用测试文件并直接调用Perl函数.就像是 :
my %args = (
exec => run_all_tests(),
);
$harness->runtests();
Run Code Online (Sandbox Code Playgroud) 当我尝试发送带有"大"数组的MPI派生数据类型(每个10个浮点数的2个数组)时,我的程序会出现段错误.它通常使用较小的阵列运行.
以下是一个可重复的小例子.这个小程序段落与以下MPI实现: IntelMPI,BullXMPI.它与OpenMPI和PlatformMPI一起正常工作.这是一个带有示例回溯的日志:http://pastebin.com/FMBpCuj2
更改mpi_send到mpi_ssend于事无补.但是,mpi_send使用单个更大的2*100 000浮动阵列工作正常.在我看来,这指向派生数据类型的问题.
program struct
include 'mpif.h'
type Data
integer :: id
real, allocatable :: ratio(:)
real, allocatable :: winds(:)
end type
type (Data) :: test
integer :: datatype, oldtypes(3), blockcounts(3)
integer :: offsets(3)
integer :: numtasks, rank, i, ierr
integer :: n, status(mpi_status_size)
call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world, rank, ierr)
call mpi_comm_size(mpi_comm_world, numtasks, ierr)
if (numtasks /= 2) then
write (*,*) "Needs …Run Code Online (Sandbox Code Playgroud)