这是我的第一个问题...请不要残忍,请。
我的问题如下。我想指定一个fortran指针作为表达式。我认为简单的fortran技术是不可能的。但是因为新的fortran版本似乎提供了处理C和C ++中使用的东西的方法(比如c_ptr和c_f_pointer ......),也许有人知道解决我的问题的方法。 (我还没有真正了解C,但我读到C中的指针算法是可能的) 为了使事情更清楚,这里是我立即想到但不起作用的代码:
program pointer
real(8),target :: a
real(8),pointer :: b
b=>a*2.0d0 ! b=>a is of course working
do i=1,10
a=dble(i)*2.0d0
write(*,*)b
end do
end program
我知道有很多方法可以解决这个问题,但在实际的程序中,所有这些都出现在我的脑海中,会导致更长的计算时间和/或相当错误的代码。
非常感谢,提前!
最好,彼得
答案 0 :(得分:1)
指针是具有POINTER属性的变量;它们不是一种独特的数据类型(所以没有“指针算法”是可能的)。
它们在概念上是一个描述符,列出了指针可能指向的对象(目标)的属性,以及目标的地址(如果有的话)。在分配或以其他方式关联之前,它们没有相关的存储(通过指针分配,见下文):
所以你对b=>a*2
的想法不起作用,因为b
被分配到a
而没有给出值 of a
。
答案 1 :(得分:1)
表达式,一般(有两个半非常重要的例外),不是有效的指针目标。表达式的评估(通常)产生一个值,而不是一个对象。
(例外情况与整体表达式导致对具有数据指针结果的函数的引用的情况有关 - 在这种情况下,表达式可以在指针赋值语句的右侧使用,或者作为实际过程引用中的参数,对应于指针伪参数或[可能 - 和F2008仅]在任何可能需要变量的上下文中,例如普通赋值语句的左侧。但是你的表达式不会导致这样的函数参考,我不认为用例与你想做的事情有关。)
我认为您希望b的值根据初始表达式的形式更改为更改的“基础”值。除了有效的指针目标问题之外,这需要违反语言基本原则之一的行为(实际上大多数语言) - 表达式的评估在表达式评估时使用其原色的值 - 这些原色的后续变化确实如此不会导致历史评估值的变化。
相反,考虑编写一个基于a。
计算b的函数program pointer
IMPLICIT NONE
real(8) :: a
do i=1,10
a=dble(i)*2.0d0
write(*,*) b(a)
end do
contains
function b(x)
real(kind(a)), intent(in) :: x
real(kind(a)) :: b
b = 2.0d0 * x
end function b
end program
答案 2 :(得分:1)
更新:我越来越接近我想要的东西(对于那些感兴趣的人):
module test
real,target :: a
real, pointer :: c
abstract interface
function func()
real :: func
end function func
end interface
procedure (func), pointer :: f => null ()
contains
function f1()
real,target :: f1
c=>a
f1 = 2.0*c
return
end function f1
end module
program test_func_ptrs
use test
implicit none
integer::i
f=>f1
do i=1,10
a=real(i)*2.0
write(*,*)f()
end do
end program test_func_ptrs
如果我能找到避免虚假参数的方法,我会完全满意(至少在我调用f时)。
附加信息:关键是我想在开始循环之前定义不同的函数f1和deside,循环内部将是f(取决于任何输入)。
答案 3 :(得分:0)
在Fortran中不允许使用指针算法计算地址偏移量。指针算法很容易导致内存错误,Fortran的作者认为没有必要。 (可以通过与C的互操作性的后门来实现。)
Fortran中的指针对于将过程作为参数传递,设置数据结构(如链接列表(例如How can I implement a linked list in fortran 2003-2008)等)非常有用。