Fortran 2003通用链表模块扩展:添加list_as_array子程序问询
为Fortran 2003通用链表模块添加
list_as_array子程序 我来分享一下给@VladimirF的Fortran 2003通用链表模块补充完善后的list_as_array子程序——这个子程序能方便地把链表内容导出到数组中,直接在lists.f90的lists模块里添加即可:
subroutine list_as_array(self, arrayOut) class(list), intent(in) :: self ! 仅读取链表,用intent(in)更符合设计逻辑 class(*), dimension(:), intent(out) :: arrayOut integer :: i type(list_node), pointer :: nodeIter ! 先校验输出数组长度与链表长度是否匹配 if (size(arrayOut) /= self%length) then error stop "list_as_array: Output array size does not match list length" end if nodeIter => self%first do i = 1, self%length ! 处理多态数据的类型匹配与赋值 select type(data => nodeIter%data) type is (integer) select type(arrayOut) type is (integer(:)) arrayOut(i) = data class default error stop "list_as_array: Integer list cannot be assigned to non-integer array" end select type is (real) select type(arrayOut) type is (real(:)) arrayOut(i) = data class default error stop "list_as_array: Real list cannot be assigned to non-real array" end select ! 可根据需求扩展支持其他类型(如character、logical等) class default error stop "list_as_array: Unsupported data type in list" end select nodeIter => nodeIter%next end do end subroutine list_as_array
关键细节说明:
- Intent优化:把
self的intent(inout)改成了intent(in),因为这个子程序只是读取链表内容,完全不需要修改链表状态,更符合Fortran的编程规范。 - 长度校验:添加了数组长度和链表长度的匹配检查,避免出现数组越界或者数据不完整的问题。
- 多态类型处理:由于链表和数组都使用了
class(*)的多态类型,必须通过select type确保两边类型一致才能赋值,否则会出现编译或运行时错误,你可以根据需求继续扩展支持更多数据类型。 - 遍历逻辑:通过指针
nodeIter遍历链表的每个节点,依次将节点数据赋值到数组对应位置,遍历完成后指针自然走到链表末尾。
内容的提问来源于stack exchange,提问作者jvriesem
相关产品推荐
相关产品推荐

