小编Exa*_*ale的帖子

使用双冒号声明变量时是否有区别

声明变量时使用双冒号有区别吗?

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)

但除此之外,只是声明一个普通的旧的realinteger没有属性而不是初始化是否有任何区别?

此外,这与SAVE属性有关吗?在我的一些代码中有一段时间出现意外行为,我在调用之间保存函数的结果,这迫使我每次调用函数时显式地将变量设置为零,即使该SAVE属性不是由我设置的.

fortran fortran90

13
推荐指数
1
解决办法
3903
查看次数

什么是子模块以及它们是如何使用的?

我不太了解子模块的用途.我知道大多数编译器对它们的支持很少,但这个概念很有意思.我想我理解了基本概念,但我见过的所有例子(Fortran Wiki,Modern Fortran Explained,技术报告)都是简单的,使用完全相同的例子(point在同一个文件中输入所有)并且不显示它们的实际在调用函数时使用.在什么情况下你想使用子模块?如果要使用子模块,是否包含use语句?如果有人能提供一个例子,我真的很喜欢.

fortran

7
推荐指数
1
解决办法
1422
查看次数

如何缓存或预加载SKLabelNode字体?

我正在制作一个Sprite Kit应用程序,在我的场景中我添加了一个SKLabelNode.当我加载SKScene时,我注意到一个非常大的滞后尖峰.在分析应用程序后,我发现它来自创建一个带有纸莎草字体的SKLabelNode(尽管字体无关紧要).当我删除标签时,场景几乎立即启动,但使用标签需要额外的1-3秒.

我很确定这是从加载字体开始,当我回到主菜单并再次玩游戏时,它会立即重新开始.

现在是否有一种方法可以提前预加载字体,这样当玩家选择等级时就没有大的停顿?

cocoa objective-c ios sprite-kit sklabelnode

4
推荐指数
1
解决办法
1079
查看次数

可分配的数组值函数.gfortran vs ifort

为什么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)

fortran gfortran intel-fortran

4
推荐指数
1
解决办法
775
查看次数

使用OpenMP并行化嵌套循环

我有一个相对简单的循环,我正在使用蛮力方法计算粒子系统的净加速度.

我有一个工作的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)

fortran openmp

3
推荐指数
1
解决办法
1392
查看次数

公开枚举

是否可以在默认为私有的模块中公开枚举?

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)

我知道枚举只是整数参数,所以我很好奇是否可以同时为所有这些参数做这件事。

fortran

3
推荐指数
1
解决办法
740
查看次数

使用>>运算符无法从文件中正确读取数据

我有一个数据文件,每行有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)

如果我得到没有多个">>"运算符的单个变量,那么一切正常.我猜我不明白>>是如何工作的,当我将更多内容推入数组时,它会覆盖缓冲区中的数据.

c++

1
推荐指数
1
解决办法
31
查看次数