相关疑难解决方法(0)

Fortran 77中的局部变量是静态还是堆栈动态?

对于我的编程语言类,一个小问题问:

FORTRAN中的局部变量是静态的还是堆栈动态的?局部变量是INITIALIZED的默认值是静态还是堆栈动态?向我展示一些代码,并附上解释以备份您的答案.提示:检查此方法的最简单方法是让程序测试子程序的历史敏感度.看看将局部变量初始化为某个值时会发生什么,而不是.您可能需要调用多个子程序才能放心地锁定答案.

我写了几个子程序: - 创建一个变量 - 打印变量 - 将变量初始化为一个值 - 再次打印变量

对子变量进行的每次连续调用都会在变量未初始化时打印出相同的随机值,然后打印出初始值.

当变量未初始化时,这个随机值是多少?

这是否意味着Fortran对每个子例程调用使用相同的内存位置,或者它是否动态创建空间并随机初始化变量?

我的第二个子程序也创建了一个变量,但随后调用了第一个子程序.结果是相同的,除了未初始化变量的随机数打印不同.我很迷茫.请帮忙!

非常感谢.

variables static fortran scope dynamic

8
推荐指数
2
解决办法
9460
查看次数

从多个Java线程调用不可重入的本机共享库

我有一些Java代码调用一些本机代码,最初是用Fortran编写的,使用JNA.(这是一个数值库,很多数学人在Fortran中编写代码.)它被编译成一个.so库,见下文:

在我的代码中测试了所有单元,我得到了很好的结果,但后来我尝试使用来自多个线程的代码,一切都开始失败,出现了奇怪的错误.然后我研究了一些关于重入Fortran代码的东西,并意识到我使用的库有一些全局变量(SAVEFortran中的关键字,当再次调用函数时,它记住变量的值:fortran SAVE语句)

现在我正在用synchronized块包装调用库,但这显着地阻碍了性能.在我看来,重新设计库可能需要付出很大的努力才能重入(它有几千行数字代码,并且不清楚当子程序运行时值如何延续.)有谁知道解决问题的最佳方法是什么?我的想象力表明......

  • 有没有办法让每个Java线程在内存中加载共享库的单独副本,以便全局变量有效地是线程本地的?这甚至可能吗?我不确定JNA的直接绑定或库绑定是如何工作的,如果有办法以这种方式使用它.
  • 即使从不同的VM调用它,它仍然会被搞砸吗?我该如何检查以确定?
  • 有没有办法让get gfortran(gcc)以可重入的方式编译Fortran代码?
  • 是否有一些快速而肮脏的方法使Fortran代码可以重入?我搜索了RECURSIVE关键字,它显然将变量保存在堆栈中,但这似乎与现有代码不兼容.
  • 还有其他可能的解决方

我确认多个虚拟机可以正常运行; 这是有道理的,因为他们不共享记忆.仍然是一个PITA,虽然比线程更不方便.

java fortran shared-libraries jna reentrancy

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

标签 统计

fortran ×2

dynamic ×1

java ×1

jna ×1

reentrancy ×1

scope ×1

shared-libraries ×1

static ×1

variables ×1