Fortran指针算术

时间:2013-10-17 19:54:49

标签: pointers fortran

这是我的第一个问题...请不要残忍,请。

我的问题如下。我想指定一个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

我知道有很多方法可以解决这个问题,但在实际的程序中,所有这些都出现在我的脑海中,会导致更长的计算时间和/或相当错误的代码。

非常感谢,提前!

最好,彼得

4 个答案:

答案 0 :(得分:1)

来自Michael Metcalf

  

指针是具有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)等)非常有用。