指向由映射定义的子数组的指针

2023-12-03

我想定义一个指向子数组的指针。对于一个简单的范围,这很容易完成pointer => array(i:j),但我不知道如何对这样的地图执行此操作k=[k1,k2,k3]。如果我定义另一个数组,我可以使用类似的循环array2=[(array1(k(j)),j=1,size(k,1))]。但不可能以类似的方式分配指针(pointer => [(array1(k(j)),j=1,size(k,1))])因为 r.h.s.表达式的似乎定义了另一个变量,该变量甚至没有目标属性。对于简单的任务,解决这个问题的一个技巧是首先分配一个指向总数组的指针,然后在读数上使用映射。但就我而言,这似乎不可能。

我将附上示例:第一个示例显示了我上面描述的内容。第二个是一个更复杂的例子,其中的技巧不再起作用。此外还需要二维地图。

最小的例子:

program test

integer, parameter :: n=10,n_k=3
real,target :: a(1:n)
real :: b(1:n_k)
integer :: k(1:n_k)
integer :: j
real,pointer :: p(:)

! fill array a and define map k:
a=[(real(j),j=1,n)]
k=[((j+1)*2,j=1,n_k)]

! can be used to print the arrays:
!write(*,*) a
!write(*,*) k
! can be used to write only the part of a defined by k:
!write(*,*) (a(k(j)),j=1,n_k)

! this an similar things didn't work:
!p(1:n_k) => [(a(k(j)),j=1,n_k)]

! works, but not generally:
p => a
write(*,*) (p(k(j)),j=1,n_k)

! works, only for arrays:
b=(/(a(k(j)),j=1,n_k)/)
write(*,*) b

end program

更复杂(但也是最小)的示例(希望)显示了我真正遇到的问题。为了便于理解,一些解释贯穿其中。有很多写入命令可以打印数组。我很欣赏代码量,但我真的不知道如何制作一个更短且易于理解的工作示例:

module mod1

type base
   real :: a
end type

type,extends(base) ::  type1
end type

type,extends(base) :: type2
   type(type1),allocatable :: b(:)
end type

type(type2),allocatable,target :: c(:)

contains

subroutine printer(z)
   class(*),pointer,dimension(:) :: z
   integer :: j,a_z,n_z
   character(len=40) :: f,ff='(F10.2,1x))',form_z

   ! define format for printing:
   a_z=lbound(z,1)
   n_z=ubound(z,1)
   write(f,'(I0)') (n_z-a_z+1)
   form_z="("//trim(adjustl(f))//ff

   ! writing:
   select type(z)
   class is (base)
      write(*,form_z) (z(j)%a,j=a_z,n_z)
   end select
end subroutine

end module

program test

use mod1

integer,parameter :: n_b=8,n_c=6,n_js=3,n_ls=2
integer :: js(1:n_js),ls(1:n_ls)
integer :: j,l
class(*),pointer :: p(:)
character(len=40) :: f,ff='(F10.2,1x))',form_c,form_b

! define format for printing:
write(f,'(I0)') n_b
form_b="("//trim(adjustl(f))//ff
write(f,'(I0)') n_c
form_c="("//trim(adjustl(f))//ff

! creating and filling the arrays:
allocate(c(n_c))
c%a=[(2d0*real(j),j=1,n_c)]
do j=1,n_c
   allocate(c(j)%b(n_b))
   c(j)%b%a=[(real(l)*1d1**(j-1),l=1,n_b)]
end do

! write arrays to compare later:
write(*,form_c) c%a
write(*,*)
write(*,form_b) (c(j)%b%a,j=1,n_c)
write(*,*)

! denfining two maps (size and entries will be input in the final program):
js=[1,4,6]
ls=[2,7]

! using the maps to print only the desired entries:
write(*,*) (c(js(j))%a,j=1,n_js)
write(*,*)
write(*,*) ((c(js(j))%b(ls(l))%a,j=1,n_js),l=1,n_ls)
write(*,*)

! !!! here I want to use the maps as well, but so far I only know how to use ranges:
p => c(1:4)
call printer(p)
write(*,*)
p => c(2)%b(3:6)
call printer(p)
write(*,*)

end program

编辑: 仅供记录,我现在通过使用派生类型数组(包括指针)并稍微更改调用子例程来解决该问题。


您不能通过指针关联来做到这一点(例如pointer1 => array1(vector_subscript)。 Fortran 2008 标准的第 7.2.2.2 节不允许这样做:

R733 指针赋值stmt is 数据指针对象 [ (边界规范列表) ] =>数据目标

还有其他两种形式,但它们与您的用途不符,也不会改变结果。进一步阅读:

R737 数据目标 is variable
C724 (R737) Avariable应具有 TARGET 或 POINTER 属性,并且不应是带有向量下标的数组部分。

这就是为什么您无法执行您正在尝试的指针关联的原因。但是,您可以通过指针分配来解决此问题。看这段代码:

n_k = 3
k = [((j+1)*2,j=1,n_k)] ! a vector subscript
p => a(k)               ! NOT OK. Violates C724
allocate(p(n_k))        ! Associate your pointer this way
p = a(k)                ! This is OK. 
write(*,*) p

其结果(包含在您的示例程序中):

% ./ptrtest                      
   4.00000000       6.00000000       8.00000000 

这分配p为适当的大小,然后从a带有向量下标。这解决了直接关联的问题p有一张地图a。此代码片段假设变量是根据示例代码声明和初始化的。这表明您可以将数组的向量下标分配给指针,但只能分配给已经关联的指针,而不能在关联期间分配。


正如对您的问题的评论中所述,如果您的步幅有规律,则可以直接进行指针关联。对于您的第一个测试用例,这将是等效的并且有效:

p => a(4:2:8)            ! Allocation to a strided array is allowed

但是,如果您有一个不规则的向量下标,那么您需要使用此答案中的方法来完成指针关联。


您可以使用的另一个解决方法是将指针和映射传递给过程。考虑以下代码:

program test
  implicit none

  integer, parameter :: nx = 10, nx_m = 3
  integer,dimension(nx_m) :: x_map
  integer :: i
  real, dimension(nx),target :: a
  real, dimension(:), pointer :: p

! initialize array
  a = [(real(i*2),i=1,10)]
  write (*,'(10(f5.1 x))') a

!define a map
  x_map = [1, 9, 4]

! associate pointer
  p => a

  call print_map(p, x_map)

contains

subroutine print_map(apointer, map)
  implicit none
  real, dimension(:), pointer :: apointer
  integer, dimension(:) :: map

  write (*,*) apointer(map)

   end subroutine print_map
end program test

在这种情况下,p“知道”关于a和元素图a可以在调用者中计算。而不是关联 (=>) p作为地图a(这是不可能做到的),p关联到a地图也随之过去了。

此代码产生输出:

% ./ptrtest3                       
2.0   4.0   6.0   8.0  10.0  12.0  14.0  16.0  18.0  20.0
2.00000000       18.0000000       8.00000000 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指向由映射定义的子数组的指针 的相关文章

  • “实际或正式的参数列表长度不同”

    当我尝试将某些内容放入 括号中时Friends f new Friends friendsName friendsAge 它出现错误 Friends 类中的构造函数 Friends 不能应用于给定类型 必需 无参数 发现 字符串 整数 原因
  • $0 和 $1 在 Swift 闭包中意味着什么?

    let sortedNumbers numbers sort 0 gt 1 print sortedNumbers 谁能解释一下什么 0 and 1在斯威夫特中意味着什么 另一个样本 array forEach actions append
  • 删除近排序数组中未排序/离群元素

    给定一个像这样的数组 15 14 12 3 10 4 2 1 我如何确定哪些元素乱序并删除它们 在本例中为数字 3 我不想对列表进行排序 而是检测异常值并将其删除 另一个例子 13 12 4 9 8 6 7 3 2 我希望能够删除 4 和
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 使用日期 Swift 3 对字典数组进行排序

    我有一个名为 myArray 的数组 其中添加了字典 我希望该字典按时间排序 这是字典中的键 那个时间是在 String 中 时间的日期格式为 yyyy MM dd HH mm ss 我尝试使用下面的代码解决方案 但给出了 从 字符串转换
  • 如何计算 3D 坐标的线性索引,反之亦然?

    如果我有一个点 x y z 如何找到该点的线性索引 i 我的编号方案是 0 0 0 是 0 1 0 0 是 1 0 1 0 是最大 x 维度 另外 如果我有一个线性坐标 i 我如何找到 x y z 我似乎无法在谷歌上找到这个 所有结果都充满
  • 熊猫:什么是视图?

    请帮助我理解 什么是view在熊猫中 我知道如果我们改变一些东西view我们总是对原始对象进行更改 但物体的视图和原始物体有不同id s例如 这是否意味着view是另一个对象引用原始对象吗 机制是什么 我尝试过但找不到解释 import p
  • 如何在没有副本的情况下将结构转换为字节数组?

    StructLayout LayoutKind Explicit public struct struct1 FieldOffset 0 public byte a 1 byte FieldOffset 1 public int b 4 b
  • 使用 LINQ 从字符串数组中删除“NULL 行”

    如何使用 LINQ 从字符串数组中删除 NULL 行 采用这个结构 String Hello World Foo Bar null null null null null null null null Hello World Foo Bar
  • Swift - 如何复制包含引用类型的数组

    我正在尝试复制数组及其值 为什么两个数组都引用同一个变量 您可以在 Playground 中尝试此操作 var view UIView view tag 1 var a UIView var b UIView a append view b
  • 为什么使用 reqwest 下载的 PNG 图像的字节与使用 Python 下载的不同?

    我正在尝试使用 reqwest 库来下载 PNG 文件 但是当我下载它时 我看到了其他编程语言的奇怪行为 例如 Python 例如 let content reqwest get https www google es images sea
  • AWK数组初始化

    是否可以使用常见的方法在AWK中初始化数组list syntax array val1 val2 val3 或者是否必须使用索引值 syntax array 0 val1 array 1 val2 array 2 val3 不 不 您可以这
  • 动态二维数组非连续内存C++

    假设我将二维数组的地址及其二维数组的行和列传递给函数 该函数会将二维数组的地址视为一维数组 例如 int Matrix 如果我执行下面的代码 int arr arr new int row for int i 0 i lt row i ar
  • 数组与列表的性能

    假设您需要一个需要频繁迭代的整数列表 数组 我的意思是非常频繁 原因可能有所不同 但可以说它位于大容量处理的最内层循环的核心 一般来说 人们会选择使用列表 List 因为它们的大小具有灵活性 最重要的是 msdn 文档声称列表在内部使用数组
  • 如何使用 jQuery 通过 Ajax 发送复选框数组的值?

    我有一个包含很多表单字段的表单 12 x n 行 每行中的第一个字段 代表产品 是一个类似于以下内容的复选框
  • 如何在 JavaScript 中对关联数组进行排序?

    我需要为我的一个项目通过 JS 对关联数组进行排序 我发现这个函数在 Firefox 中运行得很好 但不幸的是它在 IE8 OPERA CHROME 中不起作用 无法找到使其在其他浏览器中运行的方法 或者找到另一个适合该目的的函数 我真的很
  • 为什么java中LinkedList没有initialCapacity?

    我想知道为什么LinkedList没有initialCapacity 我知道什么时候使用ArrayList什么时候LinkedList 定义集合最终大小的好习惯是 List
  • 交换关联数组中的两个项目

    Example arr array apple gt sweet grapefruit gt bitter pear gt tasty banana gt yellow 我想调换一下柚子和梨的位置 这样数组就变成了 arr array ap
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数

随机推荐

  • 防止 Azure TableEntity 属性在 MVC 4 WebAPI 中序列化

    所以我有一个模型Subscription它继承自AzureTableEntity在 WebApi Get 方法中使用的类如下 HttpGet public IEnumerable
  • java中管道简单分割

    在将 split 与管道一起使用时遇到问题 但与其他字符一起使用时效果很好 我做错了什么 请帮助我 String s H PONumber1 1 1 String arr s split for int i 0 i
  • 如何将一组标准参数传递给 async.js 系列中的每个函数?

    给定以下 node js 模块 我将如何调用数组中的函数orderedListOfFunctions通过每一个response多变的 var async require async var one require one js var tw
  • 转换 Base64 GZipped 字符串 Objective-c 或 Swift

    我从网络服务收到一个字符串 如下所示 CAAAAB LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvv
  • IE中div宽度问题

    在发布之前 我仔细阅读了几个与此类似的问题 但没有找到适合我的解决方案 我的网站中有一个页面不适合我用于其他每个页面的模板 因为为该页面生成的信息表太宽了 为了使表格显示我使用overflow x visible 结果正是我在除 IE 之外
  • 如何在android中获取epub书籍的图像

    我试图将 epub 书读入我的 android 应用程序 并成功地将文本输入到我的应用程序中 但无法加载 epub 书的图像 实际上 当我们使用 epub 库阅读 epub 书时会发生什么 如果它存储的内容比 epub 书的图像所在的位置要
  • ANSI 转义代码在 python 解释器上不起作用 [重复]

    这个问题在这里已经有答案了 ANSI 代码无法在我的 python 解释器上运行 我想为这个项目的一些印刷品上色 我查找了如何为打印字符着色并找到了 ANSI 转义码 因此我在解释器上尝试了它 但它不起作用 例如 print 033 32m
  • Chrome 扩展程序 - 查看扩展程序选项卡是否打开

    我已经设置了当我单击 extn 图标时 我的 extnindex html opens 如果我第二次单击该图标 我不希望它打开第二个选项卡 我希望它能够聚焦已打开的选项卡 如果它已打开 问题在于if it s open部分 理想情况下 我不
  • TaskFactory.FromAsync 与 BeginGetRequestStream/EndGetRequestStream 挂起

    我有一个这样的方法 在声明时挂起responseObject使用 Task Factory FromAsync private async Task
  • 在 JavaEE 应用程序中使用 Jackson 作为 JAXB-JSON 处理器

    我看过很多关于此的文章和问题 但我就是不明白它的作用 我的目标是在 JavaEE 应用程序中使用 Jackson 作为 JSON 处理器 到目前为止我有什么 pom xml 要么这个
  • PowerShell 编码命令失败

    我试图使用 Powershell 的 EncodedCommand 标志弹出一个简单的消息框 但它一直失败 我在过去的几个小时里尝试过谷歌搜索 但似乎无法正常工作 它几乎看起来像一个编码错误 但我使用的是常规 UTF 8 和标准 ASCII
  • 执行非查询过程不工作asp.net core

    我想执行一个存储过程 该过程返回三个值 电子邮件 姓名 公司 ID 并获取一个参数 公司 ID 但它不起作用 我创建了一个具有这些属性的类和一个返回数据的存储过程 由它显示DatabaseFacade error 我的代码是 List
  • 如何计算图像的对比度?

    假设我有一个opencv BGR image img 如何计算该图像的对比度 对比度的一种定义是均方根对比度 可以按下式计算 首先 改造BGR image img到灰度 img grey cv2 cvtColor img cv2 COLOR
  • 如何水平居中对齐 div 内的文本?

    这可能是个愚蠢的问题 但我不知道如何得到这个 编辑 我只想将文本水平居中而不是图像 并且图像必须保持文本的基线 div img style width 30px height 60px display inline src http pla
  • 如何在字符级别对句子进行one-hot编码?

    我想将一个句子转换为一个 one hot 向量数组 这些向量将是字母表的独热表示 它看起来像下面这样 hello h 7 e 4 l 11 o 14 会成为 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
  • 如何将 SAX 与 Nokogiri 一起使用?

    我想解析一个非常大的文件 240Mb 并且必须使用 SAX 以避免将文件加载到内存中 我的 XML 看起来像
  • C# 泛型类型约束类可能不是

    我想排除某些类型在泛型类中使用 我知道如何进行约束以确保泛型类型是某种 接口 类型 但我似乎不知道如何exclude 多种 类型 例如 我想要一个泛型类来排除 int 和 uint 但不排除 DateTime 因此并非所有基元都可以被排除
  • 我的应用程序对 Google Play 商店中高于我的 targetSdkVersion 的设备是否可见?

    我已浏览以下链接 但它们没有为我的问题提供清晰明确的答案 这是我可以从答案中得出的结论 targetSdkVersion表示该应用程序针对目标版本进行了测试 并将在所有 Android 版本上运行minSdkVersion to targe
  • 如何编写一个每天午夜运行脚本的 cron?

    我听说 crontab 是一个不错的选择 但是我该如何编写该行以及将其放在服务器上的哪里 这是一个很好的教程关于什么是 crontab 以及如何在 Ubuntu 上使用它 您的 crontab 行将如下所示 00 00 ruby path
  • 指向由映射定义的子数组的指针

    我想定义一个指向子数组的指针 对于一个简单的范围 这很容易完成pointer gt array i j 但我不知道如何对这样的地图执行此操作k k1 k2 k3 如果我定义另一个数组 我可以使用类似的循环array2 array1 k j