MST

星途 面试题库

面试题:Fortran指针在数组中的复杂应用

假设有一个二维数组,要求编写Fortran代码,使用指针实现对数组特定区域(如从第i行第j列开始,大小为m×n的子数组)的高效访问和修改操作,描述思路并给出具体代码实现。
18.6万 热度难度
编程语言Fortran

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 定义指向二维数组的指针。
  2. 确定子数组的起始位置,通过指针偏移来定位子数组的首元素。
  3. 利用循环对该子数组进行访问和修改操作。

代码实现

program subarray_access
    implicit none

    integer, parameter :: rows = 10
    integer, parameter :: cols = 10
    integer :: i, j, m, n
    integer, dimension(rows, cols) :: array
    integer, pointer, dimension(:,:) :: subarray
    integer :: k, l

   ! 初始化数组
    do i = 1, rows
        do j = 1, cols
            array(i, j) = i * 10 + j
        end do
    end do

   ! 定义子数组参数
    i = 3
    j = 4
    m = 3
    n = 2

   ! 关联指针到子数组
    call associate_subarray(array, i, j, m, n, subarray)

   ! 访问和修改子数组
    do k = 1, m
        do l = 1, n
            subarray(k, l) = subarray(k, l) * 2
            print *, subarray(k, l)
        end do
    end do

    contains
        subroutine associate_subarray(arr, start_row, start_col, sub_rows, sub_cols, sub_ptr)
            integer, dimension(:,:), intent(in) :: arr
            integer, intent(in) :: start_row, start_col, sub_rows, sub_cols
            integer, pointer, dimension(:,:) :: sub_ptr
            integer :: offset

           ! 计算偏移量
            offset = (start_row - 1) * size(arr, 2) + start_col - 1
           ! 关联指针
            call c_f_pointer(c_loc(arr(1,1)) + offset, sub_ptr, [sub_rows, sub_cols])
        end subroutine associate_subarray
end program subarray_access