相关疑难解决方法(0)

如何将先前未知的数组作为Fortran中函数的输出

Python中:

def select(x):
    y = []
    for e in x:
        if e!=0:
            y.append(e)
    return y
Run Code Online (Sandbox Code Playgroud)

适用于:

x = [1,0,2,0,0,3]
select(x)
[1,2,3]

被翻译成Fortran:

function select(x,n) result(y)
    implicit none
    integer:: x(n),n,i,j,y(?)
    j = 0
    do i=1,n
        if (x(i)/=0) then
            j = j+1
            y(j) = x(i)
        endif
    enddo
end function
Run Code Online (Sandbox Code Playgroud)

问题出在Fortran中:

  1. 如何申报y(?)
  2. 如何声明x的预定义值
  3. 如何避免尺寸信息

对于1如果定义为y(n),则输出将为:

x = (/1,0,2,0,0,3/)
print *,select(x,6)
1,2,3,0,0,0

这是不希望的!
!-------------------------------
评论:
1-所有给出的答案在本文中都很有用.特别是MSB和eryksun的.
2-我试图调整我的问题的想法,并编译,F2Py但它没有成功.我已经使用GFortran对它们进行了调试,所有这些都是成功的.它可能是一个错误F2Py或我不知道正确使用它的东西.我将尝试在另一篇文章中介绍此问题.

更新: 可以在此处找到链接的问题.

python arrays fortran dynamic-arrays

15
推荐指数
3
解决办法
9032
查看次数

读取未知形状的多维数组

我想从文件中获取数据,该文件的数据内容可以具有可变大小。然而,结构非常简单。3 列和未定义的行数。我认为使用可分配的多维数组和显式 DO 循环可以解决我的问题。到目前为止,这是我的代码

program arraycall
    implicit none

    integer, dimension(:,:), allocatable :: array
    integer :: max_rows, max_cols, row, col

    allocate(array(row,col))

    open(10, file='boundary.txt', access='sequential', status='old', FORM='FORMATTED')

     DO row = 1, max_rows
       DO col = 1, max_cols
            READ (10,*) array (row, col)
       END DO
     END DO

     print *, array (row,col)

     deallocate(array)

 end program arraycall 
Run Code Online (Sandbox Code Playgroud)

现在我面临的问题是我不知道应该如何定义这些 max_rows 和 max_cols ,这与它的大小未知的事实产生共鸣。

示例文件可能看起来像

11 12 13

21 22 23

31 32 33

41 42 43
Run Code Online (Sandbox Code Playgroud)

所以我想出了一种动态(动态)估计文件记录长度的方法。更新一下,方便以后给其他人参考

!---------------------------------------------------------------------
! Estimate the number of records in the …
Run Code Online (Sandbox Code Playgroud)

arrays fortran dynamic-arrays fortran90

5
推荐指数
1
解决办法
3503
查看次数

如何在 Fortran 90 中向动态数组添加新元素

当我最初无法预测数组的确切大小时,我需要在 Fortran 90 中使用动态数组。所以我编写了一段代码,每次将新元素添加到数组末尾时,该代码都应该扩展可分配数组:

  subroutine DArray()

  double precision, dimension(:), allocatable :: list

  allocate(list(1))

  list(1) = 1.1

  call AddToList(list, 2.2)
  call AddToList(list, 3.2)
  call AddToList(list, 4.2)
  call AddToList(list, 5.2)

  print *, list(1)
  print *, list(2)
  print *, list(3)
  print *, list(4)
  print *, list(5)


  end



  subroutine AddToList(list, element)

  double precision :: element
  double precision, dimension(:), allocatable :: list
  double precision, dimension(:), allocatable :: clist

  if(allocated(list)) then
    isize = size(list)
    allocate(clist(isize+1))
    do i=1,isize
        clist(i) = list(i)
    end do
    clist(i+1) = element

    deallocate(list) …
Run Code Online (Sandbox Code Playgroud)

fortran dynamic-arrays fortran90 intel-fortran

5
推荐指数
1
解决办法
2万
查看次数

添加值时Fortran阵列会自动增长

有没有现成的方法来模拟Fortran中不断增长的数组?就像C++中的vector一样.当我在互联网上没有找到关于这个主题的任何内容时,我感到非常惊讶.

作为一个动机示例,假设我计算一些递归关系,我想存储我得到的所有中间数.我的停止标准是相邻结果之间的差异,所以我事先不知道应该为此分配多少内存.

fortran vector dynamic-allocation

2
推荐指数
1
解决办法
687
查看次数

在fortran90中填充未知大小的数组

我想在 fortran90 中填充一个未知大小的数组。这是 MATLAB 中的等效代码:

for i=1:10
 A[i] = i
end
Run Code Online (Sandbox Code Playgroud)

我知道我可以传递大小,但是如何在 fortran90 中执行此操作而不传递数组的大小。我读到我们可以使用指针,但我真的不知道如何处理指针

fortran gfortran fortran90

0
推荐指数
1
解决办法
6408
查看次数