Fortran 90 - 具有可扩展 3D 数组的“分段错误 - 无效内存引用”

2024-01-26

我用 gfortran 编译了一个 fortran 90 程序,它以我想要的方式构建了一个可扩展的 3D 数组。运行后,我收到以下错误:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x10542ee42
#1  0x10542f60e
#2  0x7fff8d7895a9
#3  0x10542575e
#4  0x105425975
#5  0x105425d0e
Segmentation fault: 11

我相信这是大型 3D 阵列的内存问题,因为如果我减小尺寸,它就会起作用,但有什么办法可以解决这个问题吗?这是我的代码:

PROGRAM phantomtest
IMPLICIT NONE
  INTEGER, PARAMETER:: columns=34, rows=34, diags=((4*columns)-6),  m=(4*columns)-6+(2*columns)
  REAL, ALLOCATABLE, DIMENSION(:,:,:)::phantom
  INTEGER :: i, j, k
  CHARACTER (LEN=3) :: nstring, nullstring=''

ALLOCATE(phantom(columns,rows,m))
phantom=0

CALL Phantom_Making(phantom,columns,rows,diags,m)

WRITE(nstring,FMT="(I3)"), columns
PRINT*, nullstring
DO k=1,m
  DO i=1,columns
    WRITE(*,FMT="("//nstring//"I2)") phantom(i,:,k)
  END DO
  PRINT *, nullstring
END DO

END PROGRAM phantomtest
!---------------------------
SUBROUTINE Phantom_Making(phantom,columns,rows,diags,m)
IMPLICIT NONE
  INTEGER, INTENT(IN):: columns, rows, diags, m
  REAL, DIMENSION(columns,rows,m), INTENT(INOUT) :: phantom
  INTEGER :: i, j, k, l

!Vertical and horizontal rays
DO i=1,rows
  phantom(:,i,i) = 1
  phantom(i,:,i+(columns)+(diags/2)) = 1
END DO

!Diagonal rays
phantom(1,2,1+columns) = 1
phantom(2,1,1+columns) = 1
phantom(1,columns-1,1+columns+(diags/2)+rows) = 1
phantom(2,columns,1+columns+(diags/2)+rows) = 1
j = columns-1

DO k=2+columns, (diags/2)+columns
  phantom(2:columns,:,k) = phantom(1:(columns-1),:,k-1)
  IF (((k+1)-columns).LE.columns) phantom(1,k+1-columns,k)=1
END DO

DO l=columns+(diags/2)+rows+2, columns+(diags/2)+rows+1+(diags/2)
  j = j-1
  phantom(2:columns,:,l) = phantom(1:(columns-1),:,l-1)
  IF (j.GT.0) phantom(1,j,l) = 1
END DO

END SUBROUTINE

许多编译器的检查可以帮助您进行调试。以 gfortran 为例:

gfortran -g -fcheck=all -Wall segf.f90
segf.f90:5.17:

  INTEGER :: i, j, k
                 1
Warning: Unused variable 'j' declared at (1)
~/f/testy/stackoverflow> ./a.out 
At line 50 of file segf.f90
Fortran runtime error: Index '199' of dimension 3 of array 'phantom' outside of expected range (1:198)

其他编译器也有类似的选项。

你的循环运行在这样的值上l您正在访问该数组phantom出界。

确保l具有正确的值,1:m,或者数组幻影的维度被正确指定为这个范围(1:m).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fortran 90 - 具有可扩展 3D 数组的“分段错误 - 无效内存引用” 的相关文章

  • 如何从数组中获取唯一的项?

    我是 Java 初学者 我发现了一些关于这个主题的主题 但没有一个适合我 我有一个像这样的数组 int numbers 1 1 2 1 3 4 5 我需要得到这个输出 1 2 3 4 5 该数组中的每个项目仅一次 但如何获得呢 最简单的解决
  • 在 T-SQL 中解析 JSON 数组

    在我们的 SQL Server 表中 我们有一个存储有字符串数组的 json 对象 我想以编程方式将该字符串拆分为几列 但是 我似乎无法让它发挥作用 或者即使有可能 是否可以在WITH子句中创建多个列 或者在select语句中创建多个列是更
  • 如何在 JavaScript 中将数组拆分为数组对?

    我想将一个数组拆分为数组对 var arr 2 3 4 5 6 4 3 5 5 would be var newarr 2 3 4 5 6 4 3 5 5 你可以使用jsreduce https developer mozilla org
  • Oracle存储过程使用数组作为表插入的参数

    我一直在寻找一个明显的例子 但没有运气 抱歉 如果已经回答了 我正在尝试做一些非常简单的事情 一个存储过程 它将获取输入并将它们插入到表中 我希望它获取多行数组并一次全部插入 我认为这很简单 但我还没有找到一个可以展示我的例子 在很多例子中
  • C# LINQ 方法确定数组是否是另一个数组的子集(包括重复项)?

    考虑两个数组 int a1 new int 1 1 1 2 3 4 5 6 7 8 9 10 10 int a2 new int 1 3 4 7 5 10 1 我希望能够确定 a2 是否是 a1 的子集 考虑重复项目的数量 换句话说 如果a
  • 将 redux 数据保存为 state 中的对象数组,如果 state 有先前的状态可用,则更新状态

    我收到的回复如下格式示例 const response data name abc age 10 id 10 name def age 15 id 20 name abc 我想将其保存在我的 redux 状态中 如果 response na
  • Java的数组indexOf在哪里?

    我一定错过了一些非常明显的东西 但我已经搜索遍了 但找不到这个方法 有几种方法可以使用Arrays http download oracle com javase 1 5 0 docs api java util Arrays html实用
  • JSON 为 foreach() 提供的参数无效

    我在从 JSON 检索数据时遇到一些问题 它总是说为 foreach 提供的参数无效 这是 url php 中的 JSON nama IT SERVICE SOLUTION nilai 0 periode 11 tahun 2014 nam
  • 匹配数组中的对象并合并

    UPDATE 我有一个名为的对象数组cars包含 li 标签 其中包含有关汽车的属性数据 例如价格 汽车类型等 我的目标是 如果这些汽车符合某些标准 则将它们合并到一个列表中 要求 快速性能 保持相同的汽车数组结构 Main Goal Ma
  • 查找所有数组的长度多维数组,Java

    我想使用多维数组来存储数据网格 但是 我还没有找到一种简单的方法来查找长度2nd数组的一部分 例如 boolean array new boolean 3 5 System out println array length 只会输出3 是否
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • Firestore 更新后仅获取文档一次

    我有一个 tableView 它从 Firestore 集合中获取所有文档 并且我只想在用户刷新 tableView 后将最后一个文档添加到 Firestore 时获取一次 然后我想删除侦听器 以便当用户刷新 tableView 时仅获取文
  • 从 C 数组中删除大量元素的最快方法

    我有包含数千个甚至更多元素的动态数组 为了不消耗大量内存 我可以从中删除不需要的元素 即元素已被使用 不再需要它们 所以从一开始我可以通过估计每次删除元素后所需的最大大小来分配较小的内存大小 我用这个方法但是需要很长很长的时间才能完成 有时
  • .push() 将多个对象放入 JavaScript 数组中返回“未定义”

    当我将项目添加到beats数组然后console log用户时 我得到了数组中正确的项目数 但是当我检查 length 时 我总是得到 1 尝试调用索引总是会给我 未定义 如下所示 Tom beats 1 我想我错过了一些明显的东西 但这让
  • 标准转换:数组到指针的转换

    这是ISO的观点 标准转换 数组到指针的转换 4 2 1 数组 类型的左值或右值 N T 或 未知边界的数组 T 可以转换为右值 类型为 指向 T 的指针 结果是 指向第一个元素的指针 数组 如果可能的话 任何人都可以用一个示例程序来解释这
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 比较数组中的文件、从文本文件中删除行、函数、日志记录

    所以我创建了这两个数组 Approved Shares 和 Current Shares Reads Approvedshare txt and makes the txt file into an array public objFSO
  • 如何在单击事件时向数组添加值

    我想要实现的是读取单击事件的值并将其保存到数组中 我的代码 a href class hotel Add to favourites a var hotelName hotel on click function e e preventDe
  • “实际或正式的参数列表长度不同”

    当我尝试将某些内容放入 括号中时Friends f new Friends friendsName friendsAge 它出现错误 Friends 类中的构造函数 Friends 不能应用于给定类型 必需 无参数 发现 字符串 整数 原因
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va

随机推荐