声明变量时使用双冒号有区别吗?
real(8) :: a
real(8) b
Run Code Online (Sandbox Code Playgroud)
这两个显然都做同样的事情.这些除了风格之间有什么区别吗?
我知道我们可以初始化变量并添加属性,如下所示
real(8), intent(in), parameter :: a = 4, b = 2
Run Code Online (Sandbox Code Playgroud)
但除此之外,只是声明一个普通的旧的real或integer没有属性而不是初始化是否有任何区别?
此外,这与SAVE属性有关吗?在我的一些代码中有一段时间出现意外行为,我在调用之间保存函数的结果,这迫使我每次调用函数时显式地将变量设置为零,即使该SAVE属性不是由我设置的.
我不太了解子模块的用途.我知道大多数编译器对它们的支持很少,但这个概念很有意思.我想我理解了基本概念,但我见过的所有例子(Fortran Wiki,Modern Fortran Explained,技术报告)都是简单的,使用完全相同的例子(point在同一个文件中输入所有)并且不显示它们的实际在调用函数时使用.在什么情况下你想使用子模块?如果要使用子模块,是否包含use语句?如果有人能提供一个例子,我真的很喜欢.
我正在制作一个Sprite Kit应用程序,在我的场景中我添加了一个SKLabelNode.当我加载SKScene时,我注意到一个非常大的滞后尖峰.在分析应用程序后,我发现它来自创建一个带有纸莎草字体的SKLabelNode(尽管字体无关紧要).当我删除标签时,场景几乎立即启动,但使用标签需要额外的1-3秒.
我很确定这是从加载字体开始,当我回到主菜单并再次玩游戏时,它会立即重新开始.
现在是否有一种方法可以提前预加载字体,这样当玩家选择等级时就没有大的停顿?
为什么ifort和gfortran之间有不同的行为?用ifort编译它返回false并且gfortran为true.我之前在自己的代码中遇到了这个问题并决定使用子程序,但最近的一个问题让我质疑这种行为.
function allocateArray(size)
integer, allocatable, dimension(:) :: allocateArray
integer size
allocate(allocateArray(size))
end function allocateArray
Run Code Online (Sandbox Code Playgroud)
从主程序
integer, allocatable, dimension(:) :: a
a = allocateArray(10)
print *, allocated(a)
Run Code Online (Sandbox Code Playgroud) 我有一个相对简单的循环,我正在使用蛮力方法计算粒子系统的净加速度.
我有一个工作的OpenMP循环,循环遍历每个粒子并将其与其他每个粒子进行比较,以获得n ^ 2复杂度:
!$omp parallel do private(i) shared(bodyArray, n) default(none)
do i = 1, n
!acc is real(real64), dimension(3)
bodyArray(i)%acc = bodyArray(i)%calcNetAcc(i, bodyArray)
end do
Run Code Online (Sandbox Code Playgroud)
哪个工作得很好.
我现在要做的是通过仅使用F(a-> b)= -F(b-> a)的力来计算每个物体上的力来减少计算时间,减少数量交互计算的一半(n ^ 2/2).我在这个循环中做了什么:
call clearAcceleration(bodyArray) !zero out acceleration
!$omp parallel do private(i, j) shared(bodyArray, n) default(none)
do i = 1, n
do j = i, n
if ( i /= j .and. j > i) then
bodyArray(i)%acc = bodyArray(i)%acc + bodyArray(i)%accTo(bodyArray(j))
bodyArray(j)%acc = bodyArray(j)%acc - bodyArray(i)%acc
end if
end do …Run Code Online (Sandbox Code Playgroud) 是否可以在默认为私有的模块中公开枚举?
module mod
private
enum, (public,) bind(c) !Doesn't work
enumerator(, public) :: ENUM1, ENUM2,... !Doesn't work
end enum
end module
Run Code Online (Sandbox Code Playgroud)
我想默认保持模块数据私有,但希望枚举是公开的,而不必像这样单独列出它们:
public :: ENUM1, ENUM2,... !Works
Run Code Online (Sandbox Code Playgroud)
我知道枚举只是整数参数,所以我很好奇是否可以同时为所有这些参数做这件事。
我有一个数据文件,每行有3列:两个3个字符的字符串和一个像这样的浮点数.
AAA BBB 699.25
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用ifstream读取数据,如下所示:
ifstream input;
char str1[3], str2[3];
float num;
input.open("data.txt");
input >> str1 >> str2 >> num;
cout << str1 << endl;
cout << str2 << endl;
cout << num << endl;
Run Code Online (Sandbox Code Playgroud)
然而,我得到Clang的输出是:
(blank)
BBB
699.25
Run Code Online (Sandbox Code Playgroud)
或英特尔C++:
AAABBB
BBB
699.25
Run Code Online (Sandbox Code Playgroud)
如果我得到没有多个">>"运算符的单个变量,那么一切正常.我猜我不明白>>是如何工作的,当我将更多内容推入数组时,它会覆盖缓冲区中的数据.
fortran ×5
c++ ×1
cocoa ×1
fortran90 ×1
gfortran ×1
ios ×1
objective-c ×1
openmp ×1
sklabelnode ×1
sprite-kit ×1