![]() |
1
2
您可能存在非法写入内存并损坏存储分配信息的结构的错误。更改代码可能会导致内存损坏发生在其他地方,并导致特定错误消失。通常,在Fortran中,非法内存访问通常以两种方式发生。1) 非法下标,2)实际参数和伪参数之间不匹配,即调用中的变量和过程中声明的变量之间不匹配。通过使用编译器的运行时下标检查选项,可以搜索第一种类型的错误。您可以通过将所有过程放入模块和
|
![]() |
2
0
听起来,前面的一些评论给出了一般性的解释。然而 1) StrArray(:)是否为意向(out)?也就是说,您是否正在将文件的行读入s/r中的StrArray(),希望将其作为文件的内容返回?如果是,请将其声明为(Out),或应为什么。 2) 为什么StrArray()是指针?它需要是指针吗?如果您只需要文件内容,那么最好使用非指针。 您可能仍然需要一个Allocable或Automatic等,但在很多情况下,非指针更容易。 3) 如果必须将StrArray(:)作为指针,则必须在使用前创建其大小/形状等。如果正确定义了调用序列ACTUAL Arg(如果StrArray()是Intent(In)或Intent(InOUT),则可能会这样做。 相反,如果它是(Out),那么,与所有指针数组一样,它必须是s/r中的FIRST Allcoated()。 如果早期某个地方没有分配,那么它是未定义的,因此DeAllocate()失败,因为它与DeAlloc无关,因此Stat=153。 4) 您可能希望在不首先知道要读取的行数的情况下使用它来读取文件。在这种情况下,您不能(至少不容易)提前分配StrArray(),因为您不知道大小。在这种情况下,需要其他策略。 一种可能的解决方案是一个循环,简单地读取文件中每一行的第一个字符,或以某种方式前进。让循环跟踪读取的每一行的“和”,直到EOF。然后,您将知道文件的大小(以num行表示),然后分配StrArray(SumLines)或其他东西。类似于
最好在单独的s/r中执行此操作,以便在调用FileRead位之前知道大小等(即,在FileRead s/r调用之前设置文件大小)。 然而,这仍然给您留下了使用什么角色(Len)的问题。有许多可能的解决方案。其中三个是: a) 使用最大长度,如字符(Len=2048)、意向(Out),或者更好的一些编译时间常数参数,称为MaxLineWidth 这对<=MaxLineWidth,当有许多“短线”等时,内存使用量可能会过大。 b) 使用单个字符数组,如Character(Len=1)、Intent(Out)::StrArrayChar(:,:) 这是二维的,因为每行中的字符需要1个D,而每行需要第二个D。 与a)相比,这有点更好,因为它可以控制线宽。 c) 更一般的方法可能依赖于用户定义的类型,例如:
然后,创建此类型的数组,例如:
然后,将MyFile分配到Size=num行 ……无论如何,有多种选择,每种选择都适合不同的环境(我省略了很多关于DeAlloc等的“内务管理”,您需要实现这些)。 顺便说一句,对于许多不明确支持“可变长度字符串”的Fortran编译器,c)也是一个可能的原型。 |
![]() |
elfsummer · 英特尔Fortran错误“未分配可分配数组或指针” 10 年前 |
![]() |
Dylan · 将指向设备分配矩阵的指针从C返回到Fortran 11 年前 |
![]() |
DaPhil · gfortran线路长度限制 11 年前 |
![]() |
DaPhil · gfortran:名称列表和变量初始化 11 年前 |