Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 如何使函数的结果成为派生类型类的元素?_Pointers_Types_Fortran - Fatal编程技术网

Pointers 如何使函数的结果成为派生类型类的元素?

Pointers 如何使函数的结果成为派生类型类的元素?,pointers,types,fortran,Pointers,Types,Fortran,我试图创建一个抽象元素,并且能够在不明确说明元素是谁的情况下工作;例如,创建一个向量并对其元素执行一些操作,而不管向量是谁 下面是一个示例代码 module reso use, intrinsic :: iso_fortran_env, only: dp => real64 implicit none type datos real(dp) :: x1,x2 integer :: longitud contains end type datos abstract interface

我试图创建一个抽象元素,并且能够在不明确说明元素是谁的情况下工作;例如,创建一个向量并对其元素执行一些操作,而不管向量是谁

下面是一个示例代码

module reso
use, intrinsic :: iso_fortran_env, only: dp => real64
implicit none

type datos  
real(dp) :: x1,x2
integer :: longitud
contains
end type datos

abstract interface
function WW(r)
import
type(datos), intent(in) :: r
real(dp),dimension(r%longitud) :: WW
end function
end interface 

type vector
contains
procedure(WW),nopass, pointer :: vec=>linspace
end type

contains
function linspace(r) result (v)
type(datos), intent(in) :: r
real(dp),dimension(r%longitud) :: v
integer :: i
real(dp) :: incremento 
incremento = (r%x2-r%x1)/(real(r%longitud-1))
forall (i=1:r%longitud) v(i) = incremento*(i-1)+r%x1
end function linspace

end module reso

module operation
use, intrinsic :: iso_fortran_env, only: dp => real64
use reso

implicit none

contains

function diff(r,c) result (dd)
type(vector),intent(in) :: r
type (datos),intent(in) :: c
real(dp), dimension(c%longitud-1) :: dd
integer:: i
do i = 1:c%longitud-1
dd(i) = r%vec(c)(i+1) - r%vec(c)(i)
end do
end function diff

end module operation


program main
use, intrinsic :: iso_fortran_env, only: dp => real64
use reso
use operation
type (datos) ::d
d%x1 = 5.0d0
d%x2 = 7.0d0
d%longitud = 3

type(vector) :: v

print*,  v%vec(d)
print*,  v%vec(d)(1)

print*, diff(v,d)

end program main
这些模块的主要思想是创建数组,我希望能够使用函数
linspace
的结果执行操作。这就是为什么我要在
type vector
中创建指针。但这并没有像我预期的那样工作,因为当我使用
gfortran-8
编译它时,出现了以下错误:
procedure(WW),nopass,pointer::vec=>linspace
1.
错误:在(1)处应为绑定属性

有没有办法做到这一点和/或更整洁

您希望
vec
是类型绑定过程还是过程指针组件?如果是前者,请删除
指针
属性;如果是后者,请删除
包含的
。除此之外,我看不清您的意图:您能提供一些您希望管理的其他示例吗?@francescalus我想创建一个类似
y%linspace
的对象,其中包含
linspace
的结果。我认为更一般的目的是生成一个参数为数组但不在函数内部创建的函数,例如
function(y)type(my_type)、intent(in)::y
y
具有我以前创建的数组,但使用函数
linspace
。尽管存在编译器错误,请注意
dd(I)=r%vec(c)(I+1)-r%vec(c)(I)
将在每个循环中执行两次函数
vec
。此处没有“abtract数据”。您希望
vec
是类型绑定过程还是过程指针组件?如果是前者,请删除
指针
属性;如果是后者,请删除
包含的
。除此之外,我看不清您的意图:您能提供一些您希望管理的其他示例吗?@francescalus我想创建一个类似
y%linspace
的对象,其中包含
linspace
的结果。我认为更一般的目的是生成一个参数为数组但不在函数内部创建的函数,例如
function(y)type(my_type)、intent(in)::y
y
具有我以前创建的数组,但使用函数
linspace
。尽管存在编译器错误,请注意
dd(I)=r%vec(c)(I+1)-r%vec(c)(I)
将在每个循环中执行两次函数
vec
。这里没有“追踪数据”。