07-Fortran基础--Fortran指针(Pointer)的使用
07-Fortran基础--Fortran指针Pointer的使用
- 0 引言
- 1 指针(Poionter)的有关内容
- 1.1 一般类型指针
- 1.2 数组指针
- 1.3 派生类(type)指针
- 1.4 函数指针
- 2 可运行code

0 引言
Fortran是一种广泛使用的编程语言,特别适合科学计算和数值分析。Fortran 90引入了指针的概念,允许程序员动态地管理内存,并在程序中创建灵活的数据结构,前面已经简单介绍过指针类型的定义和赋值,这一部分详细讲下指针的几种用法。
1 指针(Poionter)的有关内容
在Fortran中,指针是一种特殊的变量类型,用于存储内存地址。指针可以指向任何类型的数据,包括标量、数组、派生类、函数和其他变量。以下是一些Fortran中使用指针的基本概念和用法:
1.1 一般类型指针
下面运行示例中包含了简单类型指针使用
的差不多😀所有情况,可以仔细阅读注释进行理解。
implicit none! - 1 简单指针定义real(8),target :: realNum1 = 5.d0, realNum2 = 100.d0real(8),pointer :: ptr real(8),pointer :: ptr2 ! - 1. 简单的单一变量指针(有以下几种使用情况)! a 简单指针赋值print *,"a:简单指针,ptr获取了realNum1的地址,此时打印ptr和realNum1是相同值"ptr => realNum1print *,"ptr=",ptr,"realNum1=",realNum1! b 在a的基础上修改print *,""print *,"b:修改realNum1的值,ptr也发生改变,因为ptr => realNum1,使ptr和realNum1指向同一处内存空间"realNum1 = 55.d0print *,"ptr=",ptr,"realNum1=",realNum1! c 在b基础上print *,""print *,"c:修改ptr的值,realNum1也发生变量,原因是ptr和realNum1地址一样"ptr = 60.d0print *,"ptr=",ptr,"realNum1=",realNum1! d 在c的基础上print *,""print *,"d:修改ptr指向realNum2,发现此时ptr的值和realNum2相同,而realNum1保持c的结果"ptr => realNum2print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1! e:如果d之后把指针ptr置空 [若要运行将e和f屏蔽]nullify(ptr)print *,""print *,"e:使ptr指向为空,发现打印ptr会报错; 仅仅ptr的指向噶了,并不影响它指向的空间"if(associated(ptr) == .true.)thenprint *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1elseprint *,"ptr=,Null ","realNum2=",realNum2,"realNum1=",realNum1endif!! f:如果d之后把指针ptr释放了(deallocate)!print *,""!print *,"f:执行这一步之前将e先屏蔽,使用deallocate释放调指针ptr,从输出结果可以看出,仅仅ptr的指向噶了,并不影响它指向的空间"!deallocate(ptr)!if(associated(ptr) == .true.)then! print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1!else! print *,"ptr=,Null ","realNum2=",realNum2,"realNum1=",realNum1!endif! g:给指针分配内存print *,""print *,"g:既然可以使用deallocate释放指针,那当然也可以用allocate分配指针内存了"allocate(ptr2)ptr2 = 200.d0 ! 给指针ptr2赋值print *,"ptr2=",ptr2! h:在g的基础上print *,""print *,"h:ptr2是指针,被allocate分配过,那是否还有指向的属性? 指向还是存在的,但这时侯会存在一个问题, ptr2和realNum1都开辟过空间,而ptr2又指向了realNum1的空间,那就有泄露产生了,因为分配的指针是不会自己释放内存的;"ptr2 => realNum1print *,"ptr2=",ptr2,"realNum1=",realNum1! i: 在h的基础上print *,""print *,"i:指针ptr和指针ptr2之间的关系是怎样的?让ptr=>ptr2打印结果,发现ptr和ptr2此时指向的为同一空间,值都为realNum1;"ptr=>ptr2 print *,"ptr=",ptr,"ptr2=",ptr2,"realNum1=",realNum1end program
运行结果

1.2 数组指针
同样,用示例说明用法,主要介绍了数组指针基础用法
、用指针进行数组截断
、分析对内存的影响
。
implicit none! - 2 指针数组定义integer,allocatable :: ind(:)real(8),target :: arr1(3),arr2(5)real(8),pointer :: p1(:) !> 指针数组 real(8),pointer :: p2(:) !> 指针数组 ! 先给arr1和arr2赋值call RANDOM_SEED()call RANDOM_NUMBER(arr1)arr2 = 5.d0! a:数组指针简单使用print *,""print *,"a:指针ptr数组简单使用,二者地址一致打印结果相同,同简单类型指针类似,p1和arr1任何一个被该,另一个也随着被改;"p1 => arr1print *,"arr1",arr1,"p1",p1! b:数组指针的特别用法print *,""print *,"b:数组指针可以指向数组中特定索引的元素(a:b),实现拆分数组,指针可以多次指向同一目标, 指向的空间/内存必须是连续的;"p1 => arr1(2:3)print *,"arr1",arr1,"p1",p1! c:分配内存print *,""print *,"c:可以使用allocate进行内存分配,分配和指向不冲突"allocate(p1(6))p1 = 6print *,"arr1",arr1,"p1",p1! d:数组指针释放print *,""print *,"c:可以使用allocate进行内存分配,分配和指向不冲突"deallocate(p1)if( associated(p1) == .true. )thenprint *,"p1未成功释放"elseprint *,"p1已释放"endifend program
运行结果

1.3 派生类(type)指针
同样,用示例说明用法,主要介绍了派生类指针的基础用法和赋值
。
program testimplicit none! - 3 派生类指针定义type :: test_type !> 定义派生类real(8) :: arr(100000)real(8) :: arr2(200000)real(8),pointer :: ptr3 end typetype(test_type),target :: typeValuetype(test_type),pointer :: ptype ! 定义派生类指针! -3. 派生类中指针使用较为常见,因为派生类中可能会同时存在多个大数组,对内存是致命伤害! - a:派生指针的赋值ptype => typeValue ! 先给指针指向目标,此时二者表示同一内存区域call RANDOM_NUMBER(ptype%arr) ! 给派生数组赋值ptype%ptr3 =>realNum1 ! 给指针的指针赋值print *print *,"派生类指针初始化"write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",ptype%arr(1)," 派生类指针的指针",ptype%ptr3! - b:指针ptype内存释放?print *deallocate(ptype)print *,"释放指针ptype,不影响派生变量typeValue前面的赋值"write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",typeValue%arr(1)," 派生类指针的指针",typeValue%ptr3! -c:派生类指针内存分配 print *allocate(ptype)call RANDOM_NUMBER(ptype%arr) ! 指针赋值ptype%ptr3 =>realNum1print *,"指针ptype分配内存,赋初值"write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",ptype%arr(1)," 派生类指针的指针",ptype%ptr3print *,"对于这样的派生类,使用指针是最高效、最省内存的了"end program
运行结果

1.4 函数指针
同样,用示例说明用法,主要介绍了调用函数指针计算
、将函数指针作为参数在函数之间传递
。
program testimplicit none! - 4 函数指针 procedure(f), pointer :: pfreal(8) :: fv,x! -4. 函数指针的使用! a: 函数指针的简单使用print *print *, "函数指针的简单使用"pf => fprint *, 'pf(2) = ', pf(2.d0) ! 调用f(2.)pf => gprint *, 'pf(2) = ', pf(2.d0) ! 调用g(2.)print *! b: 函数指针可以作为变量进行传值pf => fx = 100.d0call calfun(pf,x,fv)write( *,*),"函数指针作为参数的运算结果",fvcontainsreal function f(x)real(8), intent(in) :: xf = x**2end function freal function g(x)real(8), intent(in) :: xg = x**3end function gsubroutine calfun(fun,x,fv)procedure(f),pointer :: funreal(8),intent(in) :: xreal(8),intent(out) :: fvfv = fun(x)end subroutineend program

2 可运行code
program test_pointerimplicit none! - 1 简单指针定义real(8),target :: realNum1 = 5.d0, realNum2 = 100.d0real(8),pointer :: ptr real(8),pointer :: ptr2 ! - 2 指针数组定义integer,allocatable :: ind(:)real(8),target :: arr1(3),arr2(5)real(8),pointer :: p1(:) !> 指针数组 real(8),pointer :: p2(:) !> 指针数组 ! - 3 派生类指针定义type :: test_type !> 定义派生类real(8) :: arr(100000)real(8) :: arr2(200000)real(8),pointer :: ptr3 end typetype(test_type),target :: typeValuetype(test_type),pointer :: ptype ! 定义派生类指针! - 4 函数指针 procedure(f), pointer :: pfreal(8) :: fv,xptr2 => null() ! 指针指向空! - 1. 简单的单一变量指针(有以下几种使用情况)! a 简单指针赋值print *,"a:简单指针,ptr获取了realNum1的地址,此时打印ptr和realNum1是相同值"ptr => realNum1print *,"ptr=",ptr,"realNum1=",realNum1! b 在a的基础上修改print *,""print *,"b:修改realNum1的值,ptr也发生改变,因为ptr => realNum1,使ptr和realNum1指向同一处内存空间"realNum1 = 55.d0print *,"ptr=",ptr,"realNum1=",realNum1! c 在b基础上print *,""print *,"c:修改ptr的值,realNum1也发生变量,原因是ptr和realNum1地址一样"ptr = 60.d0print *,"ptr=",ptr,"realNum1=",realNum1! d 在c的基础上print *,""print *,"d:修改ptr指向realNum2,发现此时ptr的值和realNum2相同,而realNum1保持c的结果"ptr => realNum2print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1!! e:如果d之后把指针ptr置空!nullify(ptr)!print *,""!print *,"e:使ptr指向为空,发现打印ptr会报错,仅仅ptr的指向噶了,并不影响它指向的空间"!if(associated(ptr) == .true.)then! print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1!else! print *,"ptr=,Null ","realNum2=",realNum2,"realNum1=",realNum1!endif!!! f:如果d之后把指针ptr释放了(deallocate)!print *,""!print *,"f:执行这一步之前将e先屏蔽,使用deallocate释放调指针ptr,从输出结果可以看出,仅仅ptr的指向噶了,并不影响它指向的空间"!deallocate(ptr)!if(associated(ptr) == .true.)then! print *,"ptr=",ptr,"realNum2=",realNum2,"realNum1=",realNum1!else! print *,"ptr=,Null ","realNum2=",realNum2,"realNum1=",realNum1!endif! g:给指针分配内存print *,""print *,"g:既然可以使用deallocate释放指针,那当然也可以分配指针"allocate(ptr2)ptr2 = 200.d0 ! 给指针ptr2赋值print *,"ptr2=",ptr2! h:在g的基础上print *,""print *,"h:ptr2是指针,被allocate分配过,那是否还有指向的属性? 指向还是存在的,但这时侯会存在一个问题,&ptr2和realNum1都开辟过空间,而ptr2又指向了realNum1的空间,那就有泄露产生了,因为分配的指针是不会自己释放内存的;"ptr2 => realNum1print *,"ptr2=",ptr2,"realNum1=",realNum1! i: 在h的基础上print *,""print *,"i:指针ptr和指针ptr2之间的关系是怎样的?让ptr=>ptr2打印结果,发现ptr和ptr2此时指向的为同一空间,值都为realNum1;"ptr=>ptr2 print *,"ptr=",ptr,"ptr2=",ptr2,"realNum1=",realNum1! -2. 指针数组的使用! 先给arr1和arr2赋值call RANDOM_SEED()call RANDOM_NUMBER(arr1)arr2 = 5.d0! a:数组指针简单使用print *,""print *,"a:指针ptr数组简单使用,二者地址一致打印结果相同,同简单类型指针类似,p1和arr1任何一个被该,另一个也随着被改;"p1 => arr1print *,"arr1",arr1,"p1",p1! b:数组指针的特别用法print *,""print *,"b:数组指针可以指向数组中特定索引的元素(a:b),实现拆分数组,指针可以多次指向同一目标, 指向的空间/内存必须是连续的;"p1 => arr1(2:3)print *,"arr1",arr1,"p1",p1! c:分配内存print *,""print *,"c:可以使用allocate进行内存分配,分配和指向不冲突"allocate(p1(6))p1 = 6print *,"arr1",arr1,"p1",p1! d:数组指针释放print *,""print *,"c:可以使用allocate进行内存分配,分配和指向不冲突"deallocate(p1)if( associated(p1) == .true. )thenprint *,"p1未成功释放"elseprint *,"p1已释放"endif! -3. 派生类中指针使用较为常见,因为派生类中可能会同时存在多个大数组,对内存是致命伤害! - a:派生指针的赋值ptype => typeValue ! 先给指针指向目标,此时二者表示同一内存区域call RANDOM_NUMBER(ptype%arr) ! 给派生数组赋值ptype%ptr3 =>realNum1 ! 给指针的指针赋值print *print *,"派生类指针初始化"write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",ptype%arr(1)," 派生类指针的指针",ptype%ptr3! - b:指针ptype内存释放?print *deallocate(ptype)print *,"释放指针ptype,不影响派生变量typeValue前面的赋值"write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",typeValue%arr(1)," 派生类指针的指针",typeValue%ptr3! -c:派生类指针内存分配 print *allocate(ptype)call RANDOM_NUMBER(ptype%arr) ! 指针赋值ptype%ptr3 =>realNum1print *,"指针ptype分配内存,赋初值"write(*,"(a,f10.6,a,f10.6)"),"派生类指针下数组",ptype%arr(1)," 派生类指针的指针",ptype%ptr3print *,"对于这样的派生类,使用指针是最高效、最省内存的了"! -4. 函数指针的使用! a: 函数指针的简单使用print *print *, "函数指针的简单使用"pf => fprint *, 'pf(2) = ', pf(2.d0) ! 调用f(2.)pf => gprint *, 'pf(2) = ', pf(2.d0) ! 调用g(2.)print *! b: 函数指针可以作为变量进行传值pf => fx = 100.d0call calfun(pf,x,fv)write( *,*),"函数指针作为参数的运算结果",fvcontainsreal function f(x)real(8), intent(in) :: xf = x**2end function freal function g(x)real(8), intent(in) :: xg = x**3end function gsubroutine calfun(fun,x,fv)procedure(f),pointer :: funreal(8),intent(in) :: xreal(8),intent(out) :: fvfv = fun(x)end subroutineend program
程序中若有不理解的地方可以留言讨论,希望对需要的人有些许帮助。
🕝
🕝🕝
🕝🕝🕝
🕝🕝🕝🕝
🕝🕝🕝🕝🕝
🕝🕝🕝🕝🕝🕝
🕝🕝🕝🕝🕝🕝🕝
相关文章:

07-Fortran基础--Fortran指针(Pointer)的使用
07-Fortran基础--Fortran指针Pointer的使用 0 引言1 指针(Poionter)的有关内容1.1 一般类型指针1.2 数组指针1.3 派生类(type)指针1.4 函数指针 2 可运行code 0 引言 Fortran是一种广泛使用的编程语言,特别适合科学计算和数值分析。Fortran 9…...

日期差值,
日期差值 ac代码 #include<iostream> using namespace std; int ans0; int get(int n){int mon[14]{0,31,28,31,30,31,30,31,31,30,31,30,31};ans0;int m_dayn%100;int m_month(n/100)%100;int m_year(n/10000);ansm_day;while(m_month--){//加上月数if((m_year%40&…...

GMV ES6直流变频多联空调机组室外机工作原理
GMV ES6直流变频多联空调机组室外机工作原理如下: 内机为制冷模式运行时,室外机根据室内机的运行负荷需求启动运行,室外换热器作为系统的冷凝器,各制冷室内机的换热器并联作为系统的蒸发器,通过室内机的送回风循环实现…...

中国开源 AI 大模型之光-InternLM2
今天给大家带来 AI 大模型领域的国产之光 - InternLM2,在10B量级开源大模型领域取得了全球 Top 3 的成绩,仅次于 Meta 发布的 Llama-3,在国内则是第一名的存在! 简介 InternLM2是由上海人工智能实验室和商汤科技联合研发的一款大型…...

【嵌入式开发】Arduino人机界面及接口技术:独立按键接口,矩阵按键接口,模拟量按键接口(基础知识介绍)
“生活总是让我们遍体鳞伤,但到后来,那些受伤的地方一定会变成我们最强壮的地方。” 🎯作者主页: 追光者♂🔥 🌸个人简介: 📝[1] CSDN 博客专家📝 🏆[2] 人工智能领域优质创作者🏆 🌟[3] 2022年度博客之星人工智能领域TOP4🌟 🌿[4] …...

element ui Tree树形控件
lazy 是否懒加载子节点,需与 load 方法结合使用 boolean 默认为falseload 加载子树数据的方法,仅当 lazy 属性为true 时生效 function(node, resolve)使用懒加载load不需要再使用data,利用resolve返回值即可注意:第一层的数据要写…...

AI 绘画神器 Fooocus 图生图:图像放大或变化、图像提示、图像重绘或扩充、反推提示词、生成参数提取、所需模型下载
本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本文讲述 Fooocus 的图生图功能,主要内容包括:图像放大或变化、图像提示、图像重绘或扩充、反推…...

yolov8 模型架构轻量化 | 极致降参数量
模型轻量化加速是深度学习领域的重要研究方向,旨在减小模型的体积和计算复杂度,从而提高在资源受限设备上的运行效率,模型参数量在轻量化加速中扮演着至关重要的角色。 首先,模型参数量直接决定了模型的复杂度和存储空间需求。随…...

uniapp 小程序低功耗蓝牙配网 ble配网 物联网
1.获取蓝牙列表 bleList.vue <template><view><button touchstart"startSearch">获取蓝牙列表</button><scroll-view :scroll-top"scrollTop" scroll-y class"content-pop"><viewclass"bluetoothItem&q…...

服务器防火墙有什么用防护策略
随着互联网的飞速发展,服务器的安全问题日益凸显。为了保护服务器免受网络攻击和恶意入侵的威胁,人们引入了防火墙的概念。服务器防火墙作为保护服务器的第一道防线,具有重要的作用。那么服务器防火墙有什么用? 首先,服…...

27.哀家要长脑子了!
目录 1.316. 去除重复字母 - 力扣(LeetCode) 2. 1209. 删除字符串中的所有相邻重复项 II - 力扣(LeetCode 哎哟 烦死了 刚刚不小心退出又没保存 又要写一遍 烦死了 最近刷题不得劲啊 感觉这脑子没长一点 1.316. 去除重复字母 - 力扣&am…...

Redis实战—验证码登录注册
目录 基于Session Controller层 Service层 ServiceImpl层 编辑校验登录状态 ThreadLocal 登录拦截器 添加拦截器到Config Controller层实现 基于Redis ServiceImpl 新增刷新拦截器 添加拦截器到Config 基于Session Controller层 /*** 发送手机验证码*/PostMappi…...

对话机器人技术解说
一、RAG介绍 如何不通过微调模型来提高LLM性能,检索增强生成(RAG)是未来的发展方向。 Embedding:将文档的句子或单词块转换为数字向量。就向量之间的距离而言,彼此相似的句子应该很近,而不同的句子应该离…...

红黑树底层封装map、set C++
目录 一、框架思考 三个问题 问题1的解决 问题2的解决: 问题3的解决: 二、泛型编程 1、仿函数的泛型编程 2、迭代器的泛型编程 3、typename: 4、/--重载 三、原码 红黑树 map set 一、框架思考 map和set都是使用红黑树底层&…...

压力给到 Google,OpenAI 发布 GPT-4o 来了
北京时间5月14日凌晨1点,OpenAI 开启了今年的第一次直播,根据官方消息,这次旨在演示 ChatGPT 和 GPT-4 的升级内容。在早些时候 Sam Altman 在 X 上已经明确,「我们一直在努力开发一些我们认为人们会喜欢的新东西,对我…...

【SpringSecurity源码】过滤器链加载流程
theme: smartblue highlight: a11y-dark 一、前言及准备 1.1 SpringSecurity过滤器链简单介绍 在Spring Security中,过滤器链(Filter Chain)是由多个过滤器(Filter)组成的,这些过滤器按照一定的顺序对进…...

第9章.Keil5-MDK软件简介
目录 0. 《STM32单片机自学教程》专栏 9.1 主界面 9.2 文本格式编辑 9.3 代码提示&语法检测&代码模版 9.4 其他小技巧 9.4.1 TAB 键的妙用 9.4.2 快速定位函数/变量被定义的地方 9.4.3 快速注释与快速消注释 9.4.4 快速打开头文件 9.4.5 查找替换…...

mysql中utf8字符集中文字节长度统计如何统计到2个字节一个汉字
在 MySQL 的 utf8 字符集中(也被称为 utf8mb3),中文字符实际上并不是用2个字节来表示的,而是使用3个字节。这是 UTF-8 编码的一个特性,它使用1到4个字节来表示一个字符,具体取决于字符的 Unicode 码点。 对…...

如何实现Linux双网卡同时连接内网和外网的配置?
博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …...

ASCLL码表以及字符的相加减
ASCLL码表完整版及解释_acssll码-CSDN博客 #include <getopt.h> #include <stdio.h> #include <stdlib.h>#define MAX_PATH 256 char filename[MAX_PATH 5];int isdigit(int c) {if (c > 0 && c < 9)return 1;return 0; }int main(int argc…...

一键修复所有dll缺失,教大家解决丢失的dll文件
修复所有DLL(动态链接库)文件缺失的问题通常不可能通过单一的"一键修复"按钮来实现,因为DLL文件缺失可能由各种不同的原因导致,比如应用程序安装不正确、病毒感染、或系统文件损坏等。 使用内置的系统文件检查器&#x…...

wsl2安装rancher并导入和创建k8s集群
环境准备 安装wsl2点击此文]ubuntu20.04安装docker 点击此文,安装完成后docker镜像仓库改成阿里云镜像加速地址.如果不熟请点击此文 docker 安装rancher 启动wsl,根据官方文档以root身份执行 sudo docker run -d --restartunless-stopped -p 80:80 -p 443:443 --privileged …...

内网环境ubuntu设置静态ip、DNS、路由,不影响网络访问
内网环境通常是有线的,通过服务器的ip、mac、dns地址访问网络才生效的,如果ip地址变了,就不能访问网络了。 如果你的ip地址变了,或者要防止ip变更影响网络访问,就要设置 1、依次点击右上角的电源-设置,在打…...

学习前端第三十七天(静态属性静态方法、类检查、错误处理)
一、静态属性和静态方法 1、静态属性静态方法 在属性和方法前加上static,创建属于类自己的属性和方法 class Person {// 加static,属于类自己的static name "xc"; // 类的name属性static height 183; // 类的height属性static age 20;…...

全网最全的基于电机控制的38类simulink仿真全家桶----新手大礼包
整理了基于电机的38种simulink仿真全家桶,包含多种资料,类型齐全十分适合新手学习使用。包括但是不局限于以下: 1、基于多电平逆变器的无刷直流电机驱动simulink仿真 2、基于负载转矩的感应电机速度控制simulink仿真 3、基于滑膜观测器的永…...

Python使用asyncio包实现异步编程
1. 异步编程 异步编程是一种编程范式,用于处理程序中需要等待异步操作完成后才能继续执行的情况。异步编程允许程序在执行耗时的操作时不被阻塞,而是在等待操作完成时继续执行其他任务。这对于处理诸如文件 I/O、网络请求、定时器等需要等待的操作非常有…...

获取文件夹下的vue文件形成组件,require.context
前言:项目中现有一个文件里面包含所有需要用到的组件,如果一个个的去import,则会非常麻烦,现有require.context去实现, 1、require.context var request require.context(‘./module’, true, /.js$/) require.cont…...

2024软件测试必问的常见面试题1000问!
01、您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答:有黑盒和白盒两种测试种类,黑盒有等价类划分法,边界分析法,因果图法和错误猜测法。白盒有逻辑覆盖法&…...

C++列表实现
文章目录 一、listView相关内容主要思想实例全部代码 二、QTreeView 一、listView 相关内容 QAbstractItemModel:一个抽象的类,为数据项模型提供抽象的接口,常见的的数据模型列如:QStringListModel,QStandardItemMode,QDirModel…...

论文合集整理推荐2024.5.15
2012年论文合集:论文入口 2019年论文合集:论文入口 2022年论文合集:论文入口 2023年论文合集:论文入口 2024年论文合集:论文入口...