对于我的新项目,我必须使用数组而不是临时文件来存储来自用户的信息.为此,我还需要创建派生类型.
但是,我还没有理解数组是什么,派生类型是什么,如何使用它们,它们可以做什么,以及其他一些基本想法.任何人都可以给我一些关于数组和派生类型的信息吗?
我为他们编写了代码,但我不知道它是否写得正确.如果有人能为我检查这个,我将不胜感激.
这是我的数组和派生类型:
! derived type
TYPE Bank
INTEGER :: acNumber, acChecks
REAL :: acBlance, acRate
CHARACTER :: acType*1, acLName*15, acFName*15
END TYPE
! array
INTEGER, PARAMETER :: MaxRow, MaxColum = 7
INTEGER, DIMENSION(MaxRow:MaxColum) :: AccountData
Run Code Online (Sandbox Code Playgroud) 这个Fortran代码的含义是什么:
IF (J1-3) 20, 20, 21
21 J1 = J1 - 3
20 IF (J2-3) 22, 22, 23
23 J2 = J2 - 3
22 CONTINUE
Run Code Online (Sandbox Code Playgroud)
我在旧项目中看到过,我不知道带有数字(标签)的IF是什么意思.
我正在开发一个需要在FORTRAN中实现很少数值方法的项目.为此,我需要编写一些递归函数.这是我的代码.
!
! File: main.F95
!
RECURSIVE FUNCTION integrate(n) RESULT(rv)
IMPLICIT NONE
DOUBLE PRECISION :: rv
INTEGER, INTENT(IN) :: n
DOUBLE PRECISION, PARAMETER :: minusone = -1.0
IF (n == 1) THEN
rv = 10 !exp(minusone)
RETURN
ELSE
rv = 1 - (n * integrate(n - 1))
RETURN
END IF
END FUNCTION integrate
RECURSIVE FUNCTION factorial(n) RESULT(res)
INTEGER res, n
IF (n .EQ. 0) THEN
res = 1
ELSE
res = n * factorial(n - 1)
END IF
END
PROGRAM …Run Code Online (Sandbox Code Playgroud) 我们如何逐行读取特定文件,同时跳过其中的某些列?
例如,我有一个文本文件,其中有数据,分为5列,但我只需要读取两列,它们可以是前两个或任何其他随机组合(我的意思是,需要一个可行的解决方案)与任何列的组合,如第一和第三列).
代码是这样的
open(1, file=data_file)
read (1,*) ! to skip first line, with metadata
lmax = 0
do while (.true.)
! read column 1 and 3 here, either write
! that to an array or just loop through each row
end do
99 continue
close (1)
Run Code Online (Sandbox Code Playgroud)
任何解释或示例都会有所帮助.
我在我的Ubuntu 15.04系统上安装了gfortran.在编译Fortran代码时,DO循环仅要求获取整数参数,而不是实数值或变量.这包括循环变量和步骤表达式.为什么它也不能采取真正的价值观呢?
以下是从这里开始的程序,练习3.5的嵌套do循环部分.
program xytab
implicit none
!constructs a table of z=x/y for values of x from 1 to 2 and
!y from 1 to 4 in steps of .5
real :: x, y, z
print *, ' x y z'
do x = 1,2
do y = 1,4,0.5
z = x/y
print *, x,y,z
end do
end do
end program xytab
Run Code Online (Sandbox Code Playgroud)
编译后显示的错误是:
xytab.f95:8.4:
do y = 1,4,0.5
1
Warning: Deleted feature: Loop variable at (1) …Run Code Online (Sandbox Code Playgroud) 我试图减去矩阵的向量.换句话说,假设我有A元素矩阵
x1 x2 x3 x4
y1 y2 y3 y4
z1 z2 z3 z4
Run Code Online (Sandbox Code Playgroud)
我希望能够减去矢量
x1
y1
z1
Run Code Online (Sandbox Code Playgroud)
和
x2
y2
z2
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?我试过了
implict none
real, dimension(3,4) :: A
real,dimension(3) :: vector
vector(1)=A(1,1)-A(1,2)
vector(2)=A(2,1)-A(2,2)
vector(3)=A(3,1)-A(3,2)
Run Code Online (Sandbox Code Playgroud)
然而,这是相当粗糙的.此外,如果我需要计算几个总和或残差,这种方法是不切实际的,特别是当矩阵非常大时.我希望能够更优雅地做到这一点.
有没有办法在矩阵中指定向量?或者有一种迂回的方式来做到这一点?
我不熟悉导致以下警告的原因:
warning #5117: Bad # preprocessor line
#include "rtt_alloc_rad.interface"
Run Code Online (Sandbox Code Playgroud)
我已经看过一些明显的问题,比如#include左边是红色的.我想知道在哪里寻找可能的原因的一些提示.
我正在使用英特尔编译器:ifort版本15.0.1
该代码具有与外部库相关联的大型气候模型.很难知道要发布什么,但警告来自以下代码段:
MODULE rtt_interface
use rtt_types, only : rtt_options, rtt_coefs, profile_Type, &
transmission_Type, radiance_Type,rtt_coef_scatt_ir,rtt_optpar_ir, &
rtt_chanprof, rtt_emissivity, rtt_reflectance
use rtt_const, only : errorstatus_success, errorstatus_fatal, &
platform_name,inst_name
use rtt_unix_env, only : rtt_exit
use cosp_kinds, only : wp,wi,wl
IMPLICIT NONE
real(wp), parameter :: tmin_baran = 193.1571_wp
#include "rtt_alloc_rad.interface"
#include "rtt_alloc_transmission.interface"
#include "rtt_alloc_prof.interface"
#include "rtt_dealloc_coefs.interface"
#include "rtt_direct.interface"
#include "rtt_print_opts.interface"
! snip...
END MODULE rtt_interface
Run Code Online (Sandbox Code Playgroud)
我用标志编译: f90flags=-g -fp-model precise -traceback -r8 -O0
我经常使用名称列表功能将参数列表灵活输入到 FORTRAN 程序,但前几天在搜索以提醒自己使用它们时,我遇到了以下语句:
它(f77 的名单语言扩展)现已包含在 Fortran 90 语言中。但是,NAMELIST 是一个设计不佳的功能,应尽可能避免使用。
我只是想知道
Fortran有,stop并且error stop都过早地退出程序并且可以返回错误代码.
这两者之间有什么区别,什么时候应该使用?(另外,这里有实现/编译器问题吗?)
我从英特尔的文档中了解到stop终止程序,但error stop似乎做了一些.那个页面很有用,但并不能完全回答我的问题,因为1)它对我来说有点太技术了,2)我知道Fortran标准在实现中为"艺术表达"留下了空间,所以我不这样做相信该页面能够完美地反映标准.
我注意到这个问题与Fortran中"stop"和"exit"之间的区别有什么关系?- 事实上,我的问题是受到这个问题答案的启发.而这个问题问的区别stop和exit,我专门在看的基本事实的差异stop和error stop.回想起来,我的问题在这个问题上是一个有用的补充,但由于事实并非如此,这是一个单独的问题.
我想在Chapel中尝试类和多态,所以我试着让以下示例代码工作:
module SomeAnimals {
class Animal {
}
class Bird: Animal {
}
class Fish: Animal {
}
proc Bird.fly() {
writeln("Flying ...!");
}
proc Fish.swim() {
writeln("Swimming ...!");
}
} // module SomeAnimals
proc main() {
use SomeAnimals;
var anim: Animal;
anim = new Fish();
select (anim.type) {
when Fish do anim.swim();
}
delete anim;
anim = new Bird();
select (anim.type) {
when Bird do anim.fly();
}
delete anim;
} // proc main
Run Code Online (Sandbox Code Playgroud)
这个编译,但运行它,它只是退出而不产生任何打印输出.显然,由于某些原因,对select语句中包含的anim.swim()和anim.fly()方法的调用不会被执行.在不使用这些select语句来检查多态变量"anim"的实际类型的情况下,代码当然不会编译.
上面的例子实际上是一个使用Fortran的"选择类型"语句的Fortran 2008代码的相当直译.Chapel是否提供了类似的陈述,或者为了在Chapel工作,这个例子是否必须以完全不同的方式编码?我在Chapel文档中找不到任何相关内容.